3 분 소요

Hits

(내 블로그 여기 게시물에 이어서)

보완 기능 추가

매거진(공작물투입부)에 공작물 넣었지만
공작물 없는 경우
시스템 일시정지 시키고
사용자에게 부저 울리고
PB4 버튼 누르면 로봇이 다시 처음부터 6개 투입하는 코드

위의 PLC 코드 맨하단에 아래의 코드 추가

20250110_01

MODULE MainModule
	CONST robtarget pHome:=[[329.55,-26.08,334.47],[0.000108947,-0.556346,-0.830951,-8.14346E-05],[-1,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
	CONST robtarget pHome2:=[[491.93,-26.07,230.36],[0.000135218,-0.556332,-0.83096,-5.93678E-05],[-1,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
	CONST robtarget p10:=[[-32,-442,7],[1.84964E-05,-0.650831,-0.759223,-2.51296E-05],[-2,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
	CONST robtarget p20:=[[476.85,-432.45,413.36],[4.38213E-05,-0.556315,-0.830971,-8.55472E-05],[-1,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
	CONST robtarget p30:=[[616.13,-459.90,332.39],[2.28305E-06,-0.326002,-0.945369,-9.10512E-07],[-1,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
	CONST robtarget con_end:=[[619,-14.78,127],[7.02875E-06,0.103828,-0.994595,2.62461E-08],[-1,-1,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
	CONST robtarget metal_box:=[[394.80,326.41,102.30],[2.7142E-05,0.103895,-0.994588,-2.8837E-05],[0,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
	CONST robtarget b_p_box:=[[394.84,426.36,102.29],[7.57723E-06,0.103902,-0.994588,-4.6509E-05],[0,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
	CONST robtarget w_p_box:=[[394.86,542.55,102.27],[5.74707E-06,-0.10393,0.994585,6.29787E-05],[0,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];

	VAR num x_pos :=0;
	VAR num y_pos :=0;
	
	PROC main()
		AccSet 1, 1;
		MoveL pHome, v200, fine, tool2_ej;

		WHILE TRUE DO

			IF di02_ma_none = 1 AND di07_running=0 THEN
				pick_plate;
				PulseDO\PLength:=0.2,do02_plcstart;
			ENDIF
			
			IF di06_arrive = 1 THEN
				con_end_proc;
                MoveJ pHome2, v200, fine, tool2_ej;
				IF di03_metal = 1 THEN
					PulseDO\PLength:=0.2,do03_reset_jedg;
					metal_proc;
				ELSEIF di04_plastic_black = 1 THEN
					PulseDO\PLength:=0.2,do03_reset_jedg;
					b_p_proc;
				ELSEIF di05_plastic_white = 1 THEN
					PulseDO\PLength:=0.2,do03_reset_jedg;
					w_p_proc;
				ENDIF
				MoveJ pHome2, v200, fine, tool2_ej;
			ENDIF
			
		ENDWHILE
	ENDPROC
	
	PROC metal_proc()
		MoveJ Offs(metal_box,0,0,60), v200, z30, tool2_ej;
		MoveL metal_box, v30, fine, tool2_ej;
		grip_off;
		MoveL metal_box, v100, z30, tool2_ej;
	ENDPROC
	
	PROC b_p_proc()
		MoveJ Offs(b_p_box,0,0,60), v200, z30, tool2_ej;
		MoveL b_p_box, v30, fine, tool2_ej;
		grip_off;
		MoveL b_p_box, v100, z30, tool2_ej;
	ENDPROC
	
	PROC w_p_proc()
		MoveJ Offs(w_p_box,0,0,60), v200, z30, tool2_ej;
		MoveL w_p_box, v30, fine, tool2_ej;
		grip_off;
		MoveL w_p_box, v100, z30, tool2_ej;
	ENDPROC	
	
	PROC con_end_proc()
		MoveJ Offs(con_end,0,0,60), v200, z30, tool2_ej;
		MoveL con_end, v30, fine, tool2_ej;
		grip_on;
		MoveL Offs(con_end,0,0,60), v100, z30, tool2_ej;
	ENDPROC	
	
	PROC grip_on()
		PulseDO\PLength:=0.2,do00_gripon;			
		WaitDI di00_grip_on_sen,1;
	ENDPROC

	PROC grip_off()
		PulseDO\PLength:=0.2,do01_gripoff;
		WaitDI di01_grip_off_sen,1;
	ENDPROC
	
	PROC rout1()
		MoveJ P20, v200, z50, tool2_ej;
		MoveJ Offs(p30,0,0,50),v200,z20,tool2_ej;
		MoveL p30, v30, fine, tool2_ej;
		grip_off;
		MoveL Offs(p30,0,0,50), v100, z20, tool2_ej;
		MoveJ P20, v200, z50, tool2_ej;
	ENDPROC
	
	PROC pick_plate()
		x_pos := 0;
		y_pos := 0;
		FOR ct2 FROM 1 TO 2 DO
			FOR ct1 FROM 1 TO 3 DO
				MoveJ Offs(p10,x_pos,y_pos,100),v200,z30,tool2_ej;
				MoveL Offs(p10,x_pos,y_pos,0), v30, fine, tool2_ej;
				grip_on;
				MoveL Offs(p10,x_pos,y_pos,100), v100, z30, tool2_ej;
				rout1;

                IF di02_ma_none = 1 THEN
					PulseDO\PLength:=0.2,do04_buzzer;
					WaitDI di08_restart,1;
					MoveL pHome, v200, fine, tool2_ej;
					RETURN;
				ENDIF

				x_pos := x_pos+110;
			ENDFOR
			x_pos := 0;
			y_pos := y_pos-110;
		ENDFOR

	ENDPROC
	
ENDMODULE




창고 적재

우측 메뉴바 상단
툴 좌표계로 티칭 (지금까지는 베이스좌표계로 티칭했었음)
이떄는 Offs 함수 대신 RelTool를 사용

20250110_04

과제

흰색 플라스틱 제품을 창고 상단 (7 ~ 9)에 적재하고
3개 적재 이후 흰색 제품을 더이상 적재할 수 없을 경우
1) 시스템 일시 중단
2) 사용자에게 부저 알림
3) 사용자가 창고 상단 제거
4) 다시 시작 버튼 누르면 반복해서 동작 가능하도록

20250110_02
20250110_03

MODULE MainModule
	CONST robtarget pHome:=[[329.55,-26.08,334.47],[0.000108947,-0.556346,-0.830951,-8.14346E-05],[-1,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
	CONST robtarget pHome2:=[[491.93,-26.07,230.36],[0.000135218,-0.556332,-0.83096,-5.93678E-05],[-1,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
	CONST robtarget p10:=[[-32,-442,7],[1.84964E-05,-0.650831,-0.759223,-2.51296E-05],[-2,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
	CONST robtarget p20:=[[476.85,-432.45,413.36],[4.38213E-05,-0.556315,-0.830971,-8.55472E-05],[-1,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
	CONST robtarget p30:=[[615,-459.90,332.39],[2.28305E-06,-0.326002,-0.945369,-9.10512E-07],[-1,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
	CONST robtarget con_end:=[[615,-16,130],[7.02875E-06,0.103828,-0.994595,2.62461E-08],[-1,-1,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
	CONST robtarget metal_box:=[[394.80,326.41,102.30],[2.7142E-05,0.103895,-0.994588,-2.8837E-05],[0,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
	CONST robtarget b_p_box:=[[394.84,426.36,102.29],[7.57723E-06,0.103902,-0.994588,-4.6509E-05],[0,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
	CONST robtarget w_p_box:=[[394.86,542.55,102.27],[5.74707E-06,-0.10393,0.994585,6.29787E-05],[0,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
	CONST robtarget store1:=[[-39.62,604.81,257.58],[0.42092,-0.561505,0.571821,0.424923],[1,0,-1,1],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];

	VAR num x_pos :=0;
	VAR num y_pos :=0;
	VAR num tw_pos :=0;

	
	PROC main()
		AccSet 1, 1;
		MoveJ pHome, v200, fine, tool2_ej;

		WHILE TRUE DO

			IF di02_ma_none = 1 AND di07_running=0 THEN
				pick_plate;
				PulseDO\PLength:=0.2,do02_plcstart;
			ENDIF
			
			IF di06_arrive = 1 THEN
				con_end_proc;
				IF di03_metal = 1 THEN
					PulseDO\PLength:=0.2,do03_reset_jedg;
					metal_proc;
				ELSEIF di04_plastic_black = 1 THEN
					PulseDO\PLength:=0.2,do03_reset_jedg;
					b_p_proc;
				ELSEIF di05_plastic_white = 1 THEN
					PulseDO\PLength:=0.2,do03_reset_jedg;
					w_p_proc;
				ENDIF
				MoveJ pHome2, v200, fine, tool2_ej;
			ENDIF
			
		ENDWHILE
	ENDPROC
	
	PROC metal_proc()
		MoveJ Offs(metal_box,0,0,60), v200, z30, tool2_ej;
		MoveL metal_box, v30, fine, tool2_ej;
		grip_off;
		MoveL metal_box, v100, z30, tool2_ej;
	ENDPROC
	
	PROC b_p_proc()
		MoveJ Offs(b_p_box,0,0,60), v200, z30, tool2_ej;
		MoveL b_p_box, v30, fine, tool2_ej;
		grip_off;
		MoveL b_p_box, v100, z30, tool2_ej;
	ENDPROC
	
	PROC w_p_proc()

		MoveJ RelTool(store1,-20,0,-200), v200, z30, tool2_ej;
		
		pos7:

		IF di16_st07 = 0 THEN

			MoveL RelTool(store1,-20,0,-50), v100, fine, tool2_ej;
			MoveL RelTool(store1,-20,0,0), v20, fine, tool2_ej;
			MoveL RelTool(store1,0,0,0), v20, fine, tool2_ej;
			grip_off;
			MoveL RelTool(store1,0,0,-200), v200, fine, tool2_ej;

		ELSEIF di17_st08 = 0 THEN

			MoveL RelTool(store1,-20,-50,-50), v100, fine, tool2_ej;
			MoveL RelTool(store1,-20,-50,0), v20, fine, tool2_ej;
			MoveL RelTool(store1,0,-50,0), v20, fine, tool2_ej;
			grip_off;
			MoveL RelTool(store1,0,-50,-200), v200, fine, tool2_ej;

		ELSEIF di18_st09 = 0 THEN

			MoveL RelTool(store1,-20,-100,-50), v100, fine, tool2_ej;
			MoveL RelTool(store1,-20,-100,0), v20, fine, tool2_ej;
			MoveL RelTool(store1,0,-100,0), v20, fine, tool2_ej;
			grip_off;
			MoveL RelTool(store1,0,-100,-200), v200, fine, tool2_ej;
		
		ENDIF

		IF di19_storeA = 1 THEN
			PulseDO\PLength:=0.2,do04_buzzer;
			WaitDI di08_restart,1;
			GOTO pos7;
		ENDIF
		

		!MoveJ Offs(w_p_box,0,0,60), v200, z30, tool2_ej;
		!MoveL w_p_box, v30, fine, tool2_ej;
		!grip_off;
		!MoveL w_p_box, v100, z30, tool2_ej;
	ENDPROC	
	
	PROC con_end_proc()
		MoveJ Offs(con_end,0,0,60), v200, z30, tool2_ej;
		MoveL con_end, v30, fine, tool2_ej;
		grip_on;
		MoveL Offs(con_end,0,0,60), v100, z30, tool2_ej;
	ENDPROC	
	
	PROC grip_on()
		PulseDO\PLength:=0.2,do00_gripon;			
		WaitDI di00_grip_on_sen,1;
	ENDPROC

	PROC grip_off()
		PulseDO\PLength:=0.2,do01_gripoff;
		WaitDI di01_grip_off_sen,1;
	ENDPROC
	
	PROC rout1()
		MoveJ P20, v200, z50, tool2_ej;
		MoveJ Offs(p30,0,0,50),v200,z20,tool2_ej;
		MoveL p30, v30, fine, tool2_ej;
		grip_off;
		MoveL Offs(p30,0,0,50), v100, z20, tool2_ej;
		MoveJ P20, v200, z50, tool2_ej;
	ENDPROC
	
	PROC pick_plate()
		x_pos := 0;
		y_pos := 0;
		tw_pos := 0;
		FOR ct2 FROM 1 TO 2 DO
			FOR ct1 FROM 1 TO 3 DO
				MoveJ Offs(p10,x_pos,y_pos+tw_pos,100),v200,z30,tool2_ej;
				MoveL Offs(p10,x_pos,y_pos+tw_pos,0), v30, fine, tool2_ej;
				grip_on;
				MoveL Offs(p10,x_pos,y_pos+tw_pos,100), v100, z30, tool2_ej;
				rout1;
				
				IF di02_ma_none = 1 THEN
					PulseDO\PLength:=0.2,do04_buzzer;
					WaitDI di08_restart,1;
					MoveL pHome, v200, fine, tool2_ej;
					RETURN;
				ENDIF
				
				x_pos := x_pos+110;
				tw_pos := tw_pos+2;
			ENDFOR
			x_pos := 0;
			tw_pos := 0;
			y_pos := y_pos-110;
		ENDFOR

	ENDPROC
	
ENDMODULE

tw_pos 는 개인적인 보정값이므로 생략해도 됨

태그:

카테고리:

업데이트:

Comments