ABB WaitDI & 6개 공작물 매거진 & PLC 프로그램 창고 적재
보완 기능 추가
매거진(공작물투입부)에 공작물 넣었지만
공작물 없는 경우
시스템 일시정지 시키고
사용자에게 부저 울리고
PB4 버튼 누르면 로봇이 다시 처음부터 6개 투입하는 코드
위의 PLC 코드 맨하단에 아래의 코드 추가
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를 사용
과제
흰색 플라스틱 제품을 창고 상단 (7 ~ 9)에 적재하고
3개 적재 이후 흰색 제품을 더이상 적재할 수 없을 경우
1) 시스템 일시 중단
2) 사용자에게 부저 알림
3) 사용자가 창고 상단 제거
4) 다시 시작 버튼 누르면 반복해서 동작 가능하도록
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