KUKA机器人焊接程序解析CELL程序DEF CELL ()INIT;初始化(折合)CHECK HOME;检测机器人是否在HOME位置(折合)PTP HOME Vel= 100 % DEFAULT;移动到HOME位置AUTOEXT INI;外部自动初始化(折合)LOOP;此处开始LOOP循环Loop_Init ();调用初始化程序P00 (#EXT_PGNO,#PGNO_GET,DMY[],0 );请求程序号SWITCH PGNO;此处为SWITCH…CASE语句,进行程序号选择CASE 1P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 );复位程序号请求AC_WELD ();调用AC车型的焊接程序CASE 2P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 );复位程序号请求AD_WELD ();调用AD车型的焊接程序CASE 3P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 );复位程序号请求AF_WELD ();调用AF车型的焊接程序CASE 4P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 );复位程序号请求A68_WELD ();调用A68车型的焊接程序CASE 5P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 );复位程序号请求A28_WELD ();调用A28车型的焊接程序CASE 29P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 );复位程序号请求Tipdress_GunX1 ();调用修磨程序CASE 31P00 (#EXT_PGNO,#PGNO_ACKN,DMY[],0 );复位程序号请求Tipchange_GunX1 ();调用换帽程序DEFAULT;若请求到的程序号无以上数值,则执行词句,程序即在词句无限循环P00 (#EXT_PGNO,#PGNO_FAULT,DMY[],0 );复位程序号请求ENDSWITCHENDLOOPENDA2_WELD程序DEF A28_WELD()INI;初始化(折合)USER INI;用户初始化(折合);Work_Start (1)A28_Weld1_GunC1 ();调用焊接程序1(定点焊接)A28_Weld2_GunC1 ();调用焊接程序2(空中焊接);Work_End (1)ENDA2_Weld1_GunX1程序DEF A28_Weld1_GunC1()INI;初始化(折合)BASISTECH INI;初始化基坐标参数(折合)USER INI;用户初始化(折合)VALID_HOME ();调用子程序,检测当前机器人是否在HOME位置VALID_FRAME ();调用子程序,检测坐标是否可用VALID_DATA ();调用子程序,参数正确检查PTP HOME Vel=100 % PDAT4;移动到HOME位置SEGMENT=1;机器人进入程序(发给PLC)PTP P59 CONT Vel=100 % PDAT76 Tool[1]:C_GUN1 Base[5]:A28_BASEREQ_CONTINUE ();调用“请求继续运行”子程序SEGMENT=50;进入点定焊接程序(发给PLC)$timer[1]=0;计时器1清零$timer_stop[1]=FALSE;计时器1开始计时PTP P26 CONT Vel=100 % PDAT37 Tool[1]:C_GUN1 Base[5]:A28_BASE PTP P27 CONT Vel=100 % PDAT38 Tool[1]:C_GUN1 Base[5]:A28_BASE PTP P28 CONT Vel=100 % PDAT39 Tool[1]:C_GUN1 Base[5]:A28_BASE(1) (2) (3) (4) (5) (6) (7)PTP SG0000010 Vel=100 % PDAT42 ProgNr=81 ServoGun=1 Cont=CLS OPN (1) (2) (3) (4) (5) (6) (7)Part=3mm Force=3.2 kN Tool[1]:C_GUN1 Base[5]:A28_BASE(8) (9) (10) (11)PTP P31 CONT Vel=100 % PDAT43 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP P32 CONT Vel=100 % PDAT44 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP SG0000011 Vel=100 % PDAT45 ProgNr=32 ServoGun=1 Cont=CLS OPN Part=1.9 mm Force=2.5 kN Tool[1]:C_GUN1 Base[5]:A28_BASEPTP P33 CONT Vel=100 % PDAT46 Tool[1]:C_GUN1 Base[5]:A28_BASE;ENTER ZONE 5 WITH R2;对下句调用的注释ENTER_ZONE (5);进入干涉区5PTP P34 CONT Vel=100 % PDAT47 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP SG0000012 Vel=100 % PDAT50 ProgNr=32 ServoGun=1 Cont=CLS OPN Part=1.9 mm Force=2.5 kN Tool[1]:C_GUN1 Base[5]:A28_BASEPTP P37 CONT Vel=100 % PDAT51 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP P40 CONT Vel=100 % PDAT54 Tool[1]:C_GUN1 Base[5]:A28_BASE;LEAVE ZONE 5 WITH R2;对下句调用的注释CLOSE_ZONE (5);离开干涉区5PTP P41 CONT Vel=100 % PDAT55 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP SG0000014 Vel=100 % PDAT58 ProgNr=32 ServoGun=1 Cont=CLS OPN Part=1.9 mm Force=2.5 kN Tool[1]:C_GUN1 Base[5]:A28_BASEPTP P43 CONT Vel=100 % PDAT59 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP P2 CONT Vel=100 % PDAT2 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP P44 CONT Vel=100 % PDAT60 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP P45 CONT Vel=100 % PDAT61 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP SG0000015 Vel=100 % PDAT66 ProgNr=32 ServoGun=1 Cont=CLS OPN Part=1.9 mm Force=2.5 kN Tool[1]:C_GUN1 Base[5]:A28_BASEPTP P50 CONT Vel=100 % PDAT67 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP P51 CONT Vel=100 % PDAT68 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP P52 CONT Vel=100 % PDAT69 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP lpd28 CONT Vel=100 % P_OLP3 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP SG0000001 Vel=100 % PDAT9 ProgNr=32 ServoGun=1 Cont=CLS OPN Part=1.9 mm Force=2.5 kN Tool[1]:C_GUN1 Base[5]:A28_BASEPTP lpd30 CONT Vel=100 % P_OLP6 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP P4 CONT Vel=100 % PDAT6 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP HOME1 Vel=100 % PDAT17;到达HOME1位置,此为定义的第二个HOME位(库卡机器人最多可以定义6个HOME位置)$timer_stop[1]=TRUE;计时器1停止计时REQ_CONTINUE ();调用“请求继续运行”子程序SEGMENT=55;机器人进入空中焊接程序(发给PLC)ENDA2_Weld2_GunC1程序DEF A28_Weld2_GunC1()INI;初始化(折合)PTP HOME1 Vel=100 % PDAT19;home1位置SEGMENT=55;机器人进入空中焊接程序(发给PLC)$timer[2]=0;计时器2清零$timer_stop[2]=FALSE;计时器2开始计时PTP P2 CONT Vel=100 % PDAT2 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP p16 CONT Vel=100 % PDAT23 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP P1 CONT Vel=100 % PDAT1 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP P3 CONT Vel=100 % PDAT3 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP SG0000001 Vel=100 % PDAT5 ProgNr=32 ServoGun=1 Cont=CLS OPN Part=1.9 mm Force=2.5 kN Tool[1]:C_GUN1 Base[5]:A28_BASEPTP P5 CONT Vel=100 % PDAT6 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP SG0000007 Vel=100 % PDAT24 ProgNr=29 ServoGun=1 Cont=CLS OPN Part=2.1 mm Force=2.5 kN Tool[1]:C_GUN1 Base[5]:A28_BASEPTP P6 CONT Vel=100 % PDAT7 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP SG0000008 Vel=100 % PDAT25 ProgNr=90 ServoGun=1 Cont=CLS OPN Part=4.1 mm Force=3.3 kN Tool[1]:C_GUN1 Base[5]:A28_BASEPTP SG0000009 Vel=100 % PDAT26 ProgNr=90 ServoGun=1 Cont=CLS OPN Part=4.1 mm Force=3.3 kN Tool[1]:C_GUN1 Base[5]:A28_BASEPTP P8 CONT Vel=100 % PDAT9 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP p15 CONT Vel=100 % PDAT22 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP p17 CONT Vel=100 % PDAT27 Tool[1]:C_GUN1 Base[5]:A28_BASEPTP p18 CONT Vel=100 % PDAT28 Tool[1]:C_GUN1 Base[5]:A28_BASE$timer_stop[2]=TRUE;计时器2停止计时REQ_CONTINUE ();调用“请求继续运行”子程序SEGMENT=62;机器人准备进入下循环的焊接SEGMENT=63;机器人准备进入下循环的焊接PTP HOME Vel= 100 % DEFAULTENDTipDress_GunC1程序DEF TipDress_GunC1()INI;初始化(折合)Work_Start(7);调用子程序,工作启动PTP HOME Vel= 100 % DEFAULT;原点位置SEGMENT=4;机器人进入修磨程序(发给PLC)PTP P1 CONT Vel=100 % PDAT1 Tool[1]:C_GUN1 Base[0]PTP P3 CONT Vel=100 % PDAT3 Tool[1]:C_GUN1 Base[0]PTP P2 CONT Vel=100 % PDAT2 Tool[1]:C_GUN1 Base[0]Full_Speed();调用子程序,设置机器人速度为全速LIN P11 CONT Vel=2 m/s CPDAT5 Tool[1]:C_GUN1 Base[0]TD_Start();调用子程序,启动修磨器转动TD_TIME=1.5;设置修磨时间为1.5秒LIN TIPDRESS Vel=2 m/s CPDAT4 TipDress ProgNr=1 ServoGun=1 Part=5 mm Force=1.5 kN Tool[1]:C_GUN1 Base[0];修磨位置TD_Stop();调用子程序,停止修磨器转动LIN P12 CONT Vel=2 m/s CPDAT6 Tool[1]:C_GUN1 Base[0]LIN P6 Vel=2 m/s CPDAT3 Tool[1]:C_GUN1 Base[0]PTP P7 CONT Vel=100 % PDAT5 Tool[1]:C_GUN1 Base[0]INIT ServoGun=1 Same;修磨后初始化电极,进行补偿Previous_Speed ();调用子程序,使机器人从100%的速度返回到原来设置的速度PTP P8 CONT Vel=100 % PDAT6 Tool[1]:C_GUN1 Base[0]PTP P9 CONT Vel=100 % PDAT7 Tool[1]:C_GUN1 Base[0]PTP HOME Vel= 100 % DEFAULT;回到原点位置OUT 47 ' TipDress_Comp1' State=TRUE ;置位修磨完成信号Work_END(7);调用子程序,工作终止OUT 47 ' TipDress_Comp1' State=FALSE ;复位修磨完成信号ENDTipChange_GunC1程序DEF TipChange_GunC1()INI;初始化(折合)Work_Start(8);调用子程序,工作启动PTP HOME Vel= 100 % DEFAULT;原点位置SEGMENT=2;机器人进入维修程序(发给PLC)PTP P7 CONT Vel=100 % PDAT6 Tool[1]:C_GUN1 Base[0]PTP P8 CONT Vel=100 % PDAT7 Tool[1]:C_GUN1 Base[0]PTP P9 CONT Vel=100 % PDAT8 Tool[1]:C_GUN1 Base[0]OUT 38 'Service_Position' State=TRUE ;置位服务位置信号REQ_CONTINUE ();调用“请求继续运行”子程序OUT 38 'Service_Position' State=FALSE ;复位服务位置信号IF $IN[40] THEN;如果“更换电极帽完成”信号存在,则继续执行PTP P13 CONT Vel=100 % PDAT12 Tool[1]:C_GUN1 Base[0]Full_Speed();调用子程序,设置机器人速度为全速INIT ServoGun=1 New;新电极帽的初始化TC_Reset();调用子程序,电极复位Zero_Point_Copy ();调用子程序,判断电极是否达到最大修磨量PTP P5 CONT Vel=100 % PDAT5 Tool[1]:C_GUN1 Base[0]LIN P17 CONT Vel=2 m/s CPDAT2 Tool[1]:C_GUN1 Base[0]TD_Start();调用子程序,启动修磨器转动TD_TIME=1.5;设置修磨时间为1.5秒LIN TIPDRESS Vel=2 m/s CPDAT4 TipDress ProgNr=1 ServoGun=1 Part=5 mm Force=1.5 kN Tool[1]:C_GUN1 Base[0]LIN P16 CONT Vel=2 m/s CPDAT1 Tool[1]:C_GUN1 Base[0]TD_Stop();调用子程序,停止修磨器转动LIN P6 Vel=2 m/s CPDAT0 Tool[1]:C_GUN1 Base[0]INIT ServoGun=1 Same;修磨后初始化电极,进行补偿Previous_Speed();调用子程序,使机器人从100%的速度返回到原来设置的速度ENDIFSEGMENT=3;机器人退出修磨程序(发给PLC)PTP P11 CONT Vel=100 % PDAT10 Tool[1]:C_GUN1 Base[0]PTP P12 CONT Vel=100 % PDAT11 Tool[1]:C_GUN1 Base[0]PTP HOME Vel= 100 % DEFAULTWork_END(8);调用子程序,工作停止ENDDEF LSB010_WE_L2_data( )ENDVALID_HOME;检测HOME位的数据global DEF VALID_HOME()E6AXIS VALID_HOMEVALID_HOME={A1 -46.5159492,A2 -122.549797,A3 148.406601,A4 0.00109880499,A5 64.1413269,A6 -53.1286888,E1 -97.7747269,E2 0.0,E3 0.0,E4 0.0,E5 0.0,E6 0.0} ;可用的HOME位的坐标值WAIT FOR XHOME.A1==VALID_HOME.A1WAIT FOR XHOME.A2==VALID_HOME.A2WAIT FOR XHOME.A3==VALID_HOME.A3WAIT FOR XHOME.A4==VALID_HOME.A4WAIT FOR XHOME.A5==VALID_HOME.A5WAIT FOR XHOME.A6==VALID_HOME.A6;把现在的HOME位置与可用的HOME位置进行比较(现在的HOME位置保存在Config.dat中)ENDVALID_FRAME;检测坐标系数据(Root, Base, Tool)global DEF VALID_FRAME()FRAME VALID_ROOTFRAME VALID_BASE[32]FRAME VALID_TOOL[16]VALID_ROOT={X 0.0,Y 0.0,Z 0.0,A 0.0,B 0.0,C 0.0}WAIT FOR $ROBROOT.X==VALID_ROOT.XWAIT FOR $ROBROOT.Y==VALID_ROOT.YWAIT FOR $ROBROOT.Z==VALID_ROOT.ZWAIT FOR $ROBROOT.A==VALID_ROOT.AWAIT FOR $ROBROOT.B==VALID_ROOT.BWAIT FOR $ROBROOT.C==VALID_ROOT.C;把现在的世界坐标位置与可用的坐标位置进行比较(现在的世界坐标位置保存在Config.dat中)VALID_TOOL[1]={X -200.0,Y 0.00999999978,Z 919.0,A 180.0,B 0.0,C 180.0} WAIT FOR TOOL_DATA[1].X==VALID_TOOL[1].XWAIT FOR TOOL_DATA[1].Y==VALID_TOOL[1].YWAIT FOR TOOL_DATA[1].Z==VALID_TOOL[1].ZWAIT FOR TOOL_DATA[1].A==VALID_TOOL[1].AWAIT FOR TOOL_DATA[1].B==VALID_TOOL[1].BWAIT FOR TOOL_DATA[1].C==VALID_TOOL[1].C;把现在的工具坐标位置与可用的坐标位置进行比较(现在的工具坐标位置保存在Config.dat中)WAIT FOR TOOL_TYPE[1]==#BASEVALID_BASE[1]={X 1277.27405,Y -439.797485,Z 632.609924,A 90.0454025,B 0.0703999996,C 89.867897}WAIT FOR BASE_DATA[1].X==VALID_BASE[1].XWAIT FOR BASE_DATA[1].Y==VALID_BASE[1].YWAIT FOR BASE_DATA[1].Z==VALID_BASE[1].ZWAIT FOR BASE_DATA[1].A==VALID_BASE[1].AWAIT FOR BASE_DATA[1].B==VALID_BASE[1].BWAIT FOR BASE_DATA[1].C==VALID_BASE[1].C;把现在的基坐标位置与可用的坐标位置进行比较(现在的基坐标位置保存在Config.dat中)WAIT FOR BASE_TYPE[1]==#BASEENDVALID_DATA;检测可用的数据(此数据为系统配置,不作详细解析)global DEF VALID_DATA()WAIT FOR EG_NON_KUKA_DRESS==TRUEWAIT FOR $COLL_ENABLECAV==TRUEWAIT FOR $CHCK_MOVENA==TRUEWAIT FOR CHECK_HOME==TRUEWAIT FOR $OUT[37]==TRUEWAIT FOR PGNO_TYPE==1WAIT FOR REFLECT_PROG_NR==1WAIT FOR PGNO_FBIT==4WAIT FOR PGNO_FBIT_REFL==4WAIT FOR PGNO_LENGTH==6WAIT FOR PGNO_REQ==10WAIT FOR PGNO_VALID==10WAIT FOR APPL_RUN==12WAIT FOR EG_GUN_TYP[1]==2WAIT FOR EG_DIRECTION_OF_TIPWEAR[1]==#PZWAIT FOR EG_TIP_CORRECTION==TRUEWAIT FOR EG_PART_CONTROL==TRUEWAIT FOR EG_EQ_ACTIVE==TRUEIF $EXT AND (NOT $IN[15])THENWAIT FOR EG_NO_PART_IN==1026ENDIFIF $EXT AND (NOT $IN[42])THENWAIT FOR EG_TIMER_TYP==2ENDIFENDCHECK_HOME1;检测可用的HOME1位置global DEF CHECK_HOME1()E6AXIS VALID_HOME1VALID_HOME1={A1 -43.6800194,A2 -123.675797,A3 147.271103,A4 0.00200690911,A5 66.4055862,A6 -56.4421997,E1 -97.7750015,E2 0.0,E3 0.0,E4 0.0,E5 0.0,E6 0.0} ;可用的HOME1位置WAIT FOR XHOME1.A1==VALID_HOME1.A1WAIT FOR XHOME1.A2==VALID_HOME1.A2WAIT FOR XHOME1.A3==VALID_HOME1.A3WAIT FOR XHOME1.A4==VALID_HOME1.A4WAIT FOR XHOME1.A5==VALID_HOME1.A5WAIT FOR XHOME1.A6==VALID_HOME1.A6;把现在的HOME1位置与可用的HOME1位置进行比较(现在的HOME1位置保存在Config.dat中)WAIT FOR $OUT[39]==TRUE;等待HOME1位置的输出信号ENDVALID_WEAR;检测电极磨损数据global DEF VALID_WEAR()IF(EG_WEAR[1]<=-2) OR (EG_WEAR[1]>=16) OR (EG_WEAR_FLEX[1]<=-1) OR(EG_WEAR_FLEX[1]>=8) OR (EG_WEAR_FIX[1]<=-1) OR (EG_WEAR_FIX[1]>=8)THEN $cycflag[4]=true;置位循环标识位4ELSE$cycflag[4]=falseENDIFIF EG_WORN[1] OR $CYCFLAG[4] THEN$OUT[51]=TRUE;如果达到最大修磨量或循环标识位4为1,则置位“请求换电极帽1”信号ELSE$OUT[51]=FALSEENDIFIF(EG_WEAR[2]<=-4) OR (EG_WEAR[2]>=16) OR (EG_WEAR_FLEX[2]<=-2) OR(EG_WEAR_FLEX[2]>=8) OR (EG_WEAR_FIX[2]<=-2) OR (EG_WEAR_FIX[2]>=8)THEN $cycflag[9]=true;置位循环标识位9ELSE$cycflag[9]=falseENDIFIF EG_WORN[2] OR $CYCFLAG[9] THEN$OUT[52]=TRUE;如果达到最大修磨量或循环标识位9为1,则置位“请求换电极帽2”信号ELSE$OUT[52]=FALSEENDIFENDVALID_TIP;检测可用的电极global DEF VALID_TIP()IF(Wear_copy1>=4)THENMsgNotify("WRONG TIP,PLS CHECK !");如果电极修磨量>=4,则在示教器上显示出报警信息WAIT FOR(Wear_copy1<=4)ENDIFENDZero_Point_Copy;检测电极帽的余量GLOBAL DEF Zero_Point_Copy()SWITCH EG_EXTAX_ACTIVECASE 1Wear_Copy1=EG_WEAR[EG_EXTAX_ACTIVE]CASE 2Wear_Copy2=EG_WEAR[EG_EXTAX_ACTIVE]ENDSWITCHIF Wear_Copy1>4 THEN$OUT[201]=TRUE;枪1电极达到最大修磨量ELSE$OUT[201]=FALSEENDIFIF Wear_Copy2>4 THEN$OUT[202]=TRUE;枪2电极达到最大修磨量ELSE$OUT[202]=FALSEENDIFENDCheck_Tip;检测修磨或换帽请求global DEF Check_Tip(index :IN )INT indexSWITCH indexCASE 1IF $IN[47] THEN; Tipdress1( )ENDIFCASE 2IF $IN[48] THEN; Tipdress2( )ENDIFCASE 3IF $IN[40] THEN; Tipchange1( )ENDIFCASE 4IF $IN[41] THEN; Tipchange2( )ENDIFENDSWITCHENDTool_Number;激活工具号global DEFFCT INT Tool_Number()DECL INT tool_numberif($in[97] and not $in[98] and $in[99])then if(not $in[115] and $in[116])thenwait for eg_extax_active==1wait for $ASYNC_EX_AX_DECOUPLE=='B0010'tool_number=1;激活工具号1elseif($in[115] and not $in[116])thenwait for eg_extax_active==2wait for $ASYNC_EX_AX_DECOUPLE=='B0001'tool_number=2;激活工具号2endifendifelsewait for(not $in[97] and $in[98] and not $in[99] and $in[115] and $in[116]) wait for $ASYNC_EX_AX_DECOUPLE=='B0011'tool_number=10;激活工具号10endifwait for(tool_number==1) or (tool_number==2) or (tool_number==10)return tool_numberENDFCTChange_Gun;切换焊枪;----------------------------------------;Get Desired Gun;----------------------------------------global DEF Change_Gun (index :IN )INT indexSWITCH indexCASE 1IF Tool_Number ()<>1 THENIF Tool_Number ()==2 THENWAIT FOR $OUT[37]wait for $in[27];drop_gun2 ( );调用子程序,放下枪2;pick_gun1 ( );调用子程序,抓起枪1ENDIFENDIFWAIT FOR Tool_Number ()==1CASE 2IF Tool_Number ()<>2 THENIF Tool_Number ()==1 THENWAIT FOR $OUT[37]wait for $in[27];drop_gun1 ( );调用子程序,放下枪1;pick_gun2 ( );调用子程序,抓起枪2 ENDIFENDIFWAIT FOR Tool_Number ()==2 ENDSWITCHENDCheck_with_Gun;检测是否是需要的焊枪global DEF Check_with_Gun (index :IN ) INT indexSWITCH indexCASE 1WAIT FOR Tool_Number ()==1CASE 2WAIT FOR Tool_Number ()==2CASE 10WAIT FOR Tool_Number ()==10 ENDSWITCHENDOpen_Cover;打开防尘罩global DEF Open_Cover (index :IN )INT indexSWITCH indexCASE 1$OUT[113]=FALSE$OUT[114]=TRUECASE 2$OUT[114]=FALSE$OUT[113]=TRUEENDSWITCHENDOpen_Cover_Check;打开防尘罩检测global DEF Open_Cover_Check (index :IN ) INT indexSWITCH indexCASE 1WAIT FOR( NOT $IN[113] AND $IN[114] ) $OUT[113]=FALSE$OUT[114]=FALSECASE 2WAIT FOR( $IN[113] AND NOT $IN[114] ) $OUT[113]=FALSE$OUT[114]=FALSEENDSWITCHENDTool_in_Stand;工具在架台上global DEF Tool_in_Stand (index :IN ) INT indexSWITCH indexCASE 1WAIT FOR $IN[115]CASE 2WAIT FOR $IN[116]ENDSWITCHENDStand_Empty;架台上无工具global DEF Stand_Empty (index :IN )INT indexSWITCH indexCASE 1WAIT FOR NOT $IN[115]CASE 2WAIT FOR NOT $IN[116]ENDSWITCHENDTool_Present;检测机器人上携带着工具global DEF Tool_Present()WAIT FOR $IN[99]ENDTool_Unpresent;检测机器人上没携带着工具global DEF Tool_Unpresent()WAIT FOR NOT $IN[99]ENDTool_Lock;工具锁紧global DEF Tool_Lock()wait for $in[99]$OUT[97]=FALSE$OUT[98]=TRUEWAIT FOR($IN[97] AND NOT $IN[98] AND $IN[99]) $OUT[97]=FALSE$OUT[98]=FALSEENDTool_Unlock;工具解锁global DEF Tool_Unlock()$OUT[98]=FALSE$OUT[97]=TRUEWAIT FOR(NOT $IN[97] AND $IN[98])$OUT[97]=FALSE$OUT[98]=FALSEENDTool_Lock_Check;工具锁紧检测global DEF Tool_Lock_Check()WAIT FOR($IN[97] AND NOT $IN[98] AND $IN[99]) ENDTool_Unlock_Check;工具解锁检测global DEF Tool_Unlock_Check()WAIT FOR(NOT $IN[97] AND $IN[98])ENDClose_Water;关闭循环水global DEF Close_Water()$OUT[45]=trueENDOpen_Water;打开循环水global DEF Open_Water() $OUT[116]=trueENDWait_Water_OK;等待水流正常global DEF Wait_Water_OK()wait for $in[50]$OUT[116]=false$OUT[45]=falseENDWait_Gate_OK;等待安全门正常global DEF Wait_Gate_OK()wait for $in[27]$OUT[27]=falseENDDEF Library ( )ENDInit;机器人初始化global DEF Init()SEGMENT=0VALID_HOME()VALID_FRAME()VALID_DATA()VALID_WEAR()$OUT[17]=TRUE$OUT[18]=TRUE$OUT[19]=TRUE$OUT[20]=TRUE$OUT[21]=TRUE$OUT[22]=TRUE$OUT[23]=TRUE$OUT[24]=TRUE$OUT[25]=TRUE$OUT[26]=TRUE$OUT[27]=TRUE$OUT[28]=TRUE$OUT[EG_NOCURRENT_OUT[EG_EXTAX_ACTIVE]]=TRUE$OUT[EG_Timer_Ready_Out]=TRUEPULSE($OUT[EG_QUIT_OUT[EG_EXTAX_ACTIVE]], TRUE,0.5)$OUT[29]=FALSE$OUT[38]=FALSE$OUT[47]=FALSE$OUT[79]=FALSE$OUT[EG_WELD_ERROR_DIALOG_OUT[EG_EXTAX_ACTIVE]]=FALSE$OUT[Deposition_Out]=FALSEAPPL_RUN_FLAG=FALSETD_HALT_FLAG=FALSEFull_Speed_REQ=FALSEENDLoop_Init;LOOP循环初始化global DEF Loop_Init()VALID_HOME()VALID_FRAME()VALID_DATA()VALID_WEAR()SEGMENT=0$OUT[38]=FALSE$OUT[47]=FALSE$OUT[79]=FALSE$OUT[Deposition_Out]=FALSEAPPL_RUN_FLAG=FALSETD_HALT_FLAG=FALSEFull_Speed_REQ=FALSEIF $IN[EG_ERROR_IN[EG_EXTAX_ACTIVE]] OR $IN[EG_ALARM_IN] OR NOT $IN[EG_TIMER_READY_IN[EG_EXTAX_ACTIVE]] THENPULSE($OUT[EG_QUIT_OUT[EG_EXTAX_ACTIVE]], TRUE,0.5)ENDIFIF $OUT[EG_WELD_ERROR_DIALOG_OUT[EG_EXTAX_ACTIVE]] AND$IN[EG_TIMER_READY_IN[EG_EXTAX_ACTIVE]] THEN$OUT[EG_WELD_ERROR_DIALOG_OUT[EG_EXTAX_ACTIVE]]=FALSEENDIFENDWork_Start;工作启动global DEF Work_Start(Job :IN )INT Job;定义Job为整型变量SWITCH Job;进入SWITCH…CASE循环CASE 1,2,5VALID_HOME()VALID_FRAME()VALID_DATA()VALID_WEAR()VALID_TIP()I[1]=0;复位枪1的循环焊接计数$CYCFLAG[1]=FALSE;复位循环标识器1I[6]=0;复位枪2的循环焊接计数$CYCFLAG[6]=FALSE;复位循环标识器6$OUT[25]=FALSE$OUT[26]=FALSE$Timer_Stop[1]=TRUE;计时器1停止计时$Timer[1]=0;计时器1清零$Timer_Stop[1]=FALSE;计时器1开始计数CASE 7SWITCH $ASYNC_EX_AX_DECOUPLECASE 'B0000','B0010'WAIT FOR NOT $OUT[51]CASE 'B0001'WAIT FOR NOT $OUT[52] ENDSWITCH……………………………………………………………………;此处为嵌套的SWITCH…CASE循环VALID_HOME()VALID_FRAME()VALID_DATA()VALID_WEAR()VALID_TIP()Before_TW()$OUT[47]=FALSE$OUT[48]=FALSECASE 8VALID_HOME()VALID_FRAME()VALID_DATA()VALID_WEAR()VALID_TIP()Before_TW()$OUT[40]=FALSE$OUT[41]=FALSEENDSWITCHENDWork_End;工作结束global DEF Work_End(Job :IN )DECL STATE_T STATEINT OFFSETINT JobCHAR ActNr[10]SWITCH JobCASE 1,2,5WAIT FOR $OUT[37]==TRUE;等待HOME位置信号$Timer_Stop[1]=TRUE;计时器1停止计时IF($EXT AND NOT $IN[Dry_Run_In] AND NOT $IN[Weld_Off_In])THEN SWITCH $ASYNC_EX_AX_DECOUPLECASE 'B0000'if I[1]>=Gun1_Spot[Job] then$cycflag[1]=trueelse$cycflag[1]=falseendifif I[2]>=TD1_Spot then$cycflag[2]=trueelse$cycflag[2]=falseendifif I[3]>=TC1_Spot then$cycflag[3]=trueelse$cycflag[3]=falseendifIF NOT $CYCFLAG[1] THEN$OUT[EG_WELD_ERROR_DIALOG_OUT[EG_EXTAX_ACTIVE]]=TRUEOFFSET=0SWRITE (ActNr[], STATE, OFFSET,"%d",Gun1_Spot[Job]-I[1])MsgDialog(Answer,"Warnning %1 Spot Without Weld-End Signal, SetCycle-Complete Signal to PLC?","GAMC", ActNr[],,,,,,"NO","YES") WAIT FOR(ANSWER==1) OR $IN[EG_QUIT_REPEAT_IN]ANSWER=0$OUT[EG_WELD_ERROR_DIALOG_OUT[EG_EXTAX_ACTIVE]]=FALSEENDIFIF $CYCFLAG[2] THEN$OUT[EG_WELD_ERROR_DIALOG_OUT[EG_EXTAX_ACTIVE]]=TRUEOFFSET=0SWRITE (ActNr[], STATE, OFFSET,"%d",TD1_Spot-I[2])MsgDialog(Answer,"Warnning %1 Spot Outof TD1_Spot Setting ! Please Check the Gun1 TipDress!","GAMC",ActNr[],,,,,,"NO","YES")WAIT FOR(ANSWER==1) OR $IN[EG_QUIT_REPEAT_IN]ANSWER=0$OUT[EG_WELD_ERROR_DIALOG_OUT[EG_EXTAX_ACTIVE]]=FALSEENDIFCASE 'B0010','B0001'if I[1]>=Gun1_Spot[Job] then$cycflag[1]=trueelse$cycflag[1]=falseendifif I[2]>=TD1_Spot then$cycflag[2]=trueelse$cycflag[2]=falseendifif I[3]>=TC1_Spot then$cycflag[3]=trueelse$cycflag[3]=falseendifif I[6]>=Gun2_Spot[Job] then$cycflag[6]=trueelse$cycflag[6]=falseendifif I[7]>=TD2_Spot then$cycflag[7]=trueelse$cycflag[7]=falseendifif I[8]>=TC2_Spot then$cycflag[8]=trueelse$cycflag[8]=falseendifIF(NOT $CYCFLAG[1]) OR (NOT $CYCFLAG[6])THEN$OUT[EG_WELD_ERROR_DIALOG_OUT[EG_EXTAX_ACTIVE]]=TRUEOFFSET=0SWRITE (ActNr[], STATE, OFFSET,"%d",(Gun1_Spot[Job]-I[1])+(Gun2_Spot[Job]-I[6]))MsgDialog(Answer,"Warnning %1 Spot Outof TD1_Spot Setting ! Please Check the Gun1 TipDress!","GAMC",ActNr[],,,,,,"NO","YES")WAIT FOR(ANSWER==1) OR $IN[EG_QUIT_REPEAT_IN]ANSWER=0$OUT[EG_WELD_ERROR_DIALOG_OUT[EG_EXTAX_ACTIVE]]=FALSEENDIFIF $CYCFLAG[2] THEN$OUT[EG_WELD_ERROR_DIALOG_OUT[EG_EXTAX_ACTIVE]]=TRUEOFFSET=0SWRITE (ActNr[], STATE, OFFSET,"%d",TD1_Spot-I[2])MsgDialog(Answer,"Warnning %1 Spot Outof TD1_Spot Setting ! Please Check the Gun1 TipDress!","GAMC",ActNr[],,,,,,"NO","YES")WAIT FOR(ANSWER==1) OR $IN[EG_QUIT_REPEAT_IN]ANSWER=0$OUT[EG_WELD_ERROR_DIALOG_OUT[EG_EXTAX_ACTIVE]]=FALSEENDIFIF $CYCFLAG[7] THEN$OUT[EG_WELD_ERROR_DIALOG_OUT[EG_EXTAX_ACTIVE]]=TRUEOFFSET=0SWRITE (ActNr[], STATE, OFFSET,"%d",TD2_Spot-I[7])MsgDialog(Answer,"Warnning %1 Spot Outof TD2_Spot Setting ! Please Check the Gun2 TipDress!","GAMC",ActNr[],,,,,,"NO","YES")WAIT FOR(ANSWER==1) OR $IN[EG_QUIT_REPEAT_IN]ANSWER=0$OUT[EG_WELD_ERROR_DIALOG_OUT[EG_EXTAX_ACTIVE]]=FALSEENDIFENDSWITCHENDIF$OUT[25]=TRUE$OUT[26]=TRUE$OUT[29]=TRUEWAIT FOR $IN[31]$OUT[29]=FALSECASE 7After_TW()VALID_WEAR()WAIT FOR $OUT[37]==TRUE$OUT[130]=FALSESWITCH $ASYNC_EX_AX_DECOUPLECASE 'B0000','B0010'IF((LAST_WEAR_FLEX1[TW1_Index]+LAST_WEAR_FIX1[TW1_Index])<=TW1_Min) OR ((LAST_WEAR_FLEX1[TW1_Index]+LAST_WEAR_FIX1[TW1_Index])>=TW1_Max)THEN$OUT[EG_WELD_ERROR_DIALOG_OUT[EG_EXTAX_ACTIVE]]=TRUEOFFSET=0SWRITE (ActNr[], STATE, OFFSET,"%f",(LAST_WEAR_FLEX1[TW1_Index]+LAST_WEAR_FIX1[TW1_Index]))MsgDialog(Answer,"Last_Wear[1] = %1 (mm), Please CheckTipDress!","GAMC",ActNr[],,,,,,"NO","YES")WAIT FOR(ANSWER==1) OR $IN[EG_QUIT_REPEAT_IN]ANSWER=0$OUT[EG_WELD_ERROR_DIALOG_OUT[EG_EXTAX_ACTIVE]]=FALSEENDIFPULSE($OUT[47], TRUE,1.0)CASE 'B0001'IF((LAST_WEAR_FLEX2[TW2_Index]+LAST_WEAR_FIX2[TW2_Index])<=TW2_Min) OR ((LAST_WEAR_FLEX2[TW2_Index]+LAST_WEAR_FIX2[TW2_Index])>=TW2_Max)THEN$OUT[EG_WELD_ERROR_DIALOG_OUT[EG_EXTAX_ACTIVE]]=TRUEOFFSET=0SWRITE (ActNr[], STATE, OFFSET,"%f",(LAST_WEAR_FLEX2[TW2_Index]+LAST_WEAR_FIX2[TW2_Index]))MsgDialog(Answer,"Last_Wear[2] = %1 (mm), Please CheckTipDress!","GAMC",ActNr[],,,,,,"NO","YES")WAIT FOR(ANSWER==1) OR $IN[EG_QUIT_REPEAT_IN]ANSWER=0$OUT[EG_WELD_ERROR_DIALOG_OUT[EG_EXTAX_ACTIVE]]=FALSEENDIFPULSE($OUT[48], TRUE,1.0)ENDSWITCHCASE 8EG_WORN[1]=FALSEAfter_TW()VALID_WEAR()WAIT FOR $OUT[37]==TRUE$OUT[130]=FALSE$OUT[38]=FALSESWITCH $ASYNC_EX_AX_DECOUPLECASE 'B0000','B0010'PULSE($OUT[40], TRUE,1.0)CASE 'B0001'PULSE($OUT[41], TRUE,1.0)ENDSWITCHENDSWITCHENDEnter_Zone;进入干涉区global DEF Enter_Zone (Zone :IN )INT ZoneSWITCH Zone$OUT[17]=FALSE;复位“干涉区1”信号WAIT FOR $IN[17]CASE 2$OUT[18]=FALSE;复位“干涉区2”信号WAIT FOR $IN[18]CASE 3$OUT[19]=FALSE;复位“干涉区3”信号WAIT FOR $IN[19]CASE 4$OUT[20]=FALSE;复位“干涉区4”信号WAIT FOR $IN[20]CASE 5$OUT[21]=FALSE;复位“干涉区5”信号WAIT FOR $IN[21]CASE 6$OUT[22]=FALSE;复位“干涉区6”信号WAIT FOR $IN[22]CASE 7$OUT[23]=FALSE;复位“干涉区7”信号WAIT FOR $IN[23]CASE 8$OUT[24]=FALSE;复位“干涉区8”信号WAIT FOR $IN[24]CASE 9$OUT[25]=FALSE;复位“干涉区9”信号WAIT FOR $IN[25]CASE 10$OUT[26]=FALSE;复位“干涉区10”信号WAIT FOR $IN[26]CASE 11$OUT[27]=FALSE;复位“干涉区11”信号WAIT FOR $IN[27]$OUT[28]=FALSE;复位“干涉区12”信号WAIT FOR $IN[28]ENDSWITCHENDClose_Zone;离开干涉区global DEF Close_Zone(Zone :IN ) INT ZoneSWITCH ZoneCASE 1WAIT SEC 0$OUT[17]=TRUE;置位“干涉区1”信号CASE 2WAIT SEC 0$OUT[18]=TRUE;置位“干涉区2”信号CASE 3WAIT SEC 0$OUT[19]=TRUE;置位“干涉区3”信号CASE 4WAIT SEC 0$OUT[20]=TRUE;置位“干涉区4”信号CASE 5WAIT SEC 0$OUT[21]=TRUE;置位“干涉区5”信号CASE 6WAIT SEC 0$OUT[22]=TRUE;置位“干涉区6”信号CASE 7WAIT SEC 0$OUT[23]=TRUE;置位“干涉区7”信号CASE 8WAIT SEC 0$OUT[24]=TRUE;置位“干涉区8”信号CASE 9WAIT SEC 0$OUT[25]=TRUE;置位“干涉区9”信号CASE 10WAIT SEC 0$OUT[26]=TRUE;置位“干涉区10”信号CASE 11WAIT SEC 0$OUT[27]=TRUE;置位“干涉区11”信号CASE 12WAIT SEC 0$OUT[28]=TRUE;置位“干涉区12”信号ENDSWITCHENDSafe_Condition;检测安全条件global DEF Safe_Condition()IF $EXT THENIF(NOT $ALARM_STOP)OR (NOT $USER_SAF)OR (NOT $PERI_RDY)OR (NOT $ON_PATH) THENSafe_Speed_REQ=TRUEELSESafe_Speed_REQ=FALSEENDIFENDIFENDSafe_Speed;安全速度global DEF Safe_Speed()if $EXT and $PERI_RDY and $PRO_ACT and Safe_Speed_REQ thenSafe_Speed_REQ=FALSEif($OV_PRO>=50) and ($OV_PRO<=100)thenif(PRE_OV_PRO==0)or ($OV_PRO==50)or($OV_PRO==75)or ($OV_PRO==100)then PRE_OV_PRO=$OV_PROendif$OV_PRO=20$timer_stop[11]=true$timer[11]=0$timer_stop[11]=falseelseif($OV_PRO==20) or ($OV_PRO==40)then$timer_stop[11]=true$timer[11]=0$timer_stop[11]=falseelsePRE_OV_PRO=0$timer_stop[11]=true$timer[11]=100endifendifendifif$EXT and (PRE_OV_PRO>=0)and (PRE_OV_PRO<=100)and ($timer[11]>=5000)then if($OV_PRO==20) or ($OV_PRO==40) or ($OV_PRO==60) or ($OV_PRO==80)then if($OV_PRO<=PRE_OV_PRO) and $PRO_MOVE thenif $OV_PRO+20<PRE_OV_PRO then$OV_PRO=$OV_PRO+20$timer_stop[11]=true$timer[11]=0$timer_stop[11]=falseelse$OV_PRO=PRE_OV_PROPRE_OV_PRO=0$timer_stop[11]=true$timer[11]=101endifendifelsePRE_OV_PRO=0$timer_stop[11]=true$timer[11]=102endifendifENDFull_Speed;设置全速运行global DEF Full_Speed()Full_Speed_REQ=TRUE;置位“全速请求”信号if $EXT and ($OV_PRO<>100)then;如果在外部自动状态且程序运行的速度不是100%,则继续if PRE_OV_PRO==0 thenPRE_OV_PRO=$OV_PRO;如果PRE_OV_PRO的值为0,则把程序运行的速度值赋值给PRE_OV_PRO endif$OV_PRO=100;程序运行的速度设置为100%endifENDPrevious_Speed;从全速返回到之前的速度global DEF Previous_Speed()if $EXT and ($OV_PRO==100) and (PRE_OV_PRO>0) and (PRE_OV_PRO<=100)then $OV_PRO=PRE_OV_PRO;变量PRE_OV_PRO中的速度值赋值给程序运行的速度PRE_OV_PRO=0endifFull_Speed_REQ=FALSE;复位“全速请求”信号ENDSpeed_Control;从PLC对速度进行控制global DEF Speed_Control()IF $EXT AND ($OV_PRO>0) AND ($OV_PRO<=100) AND (NOT Full_Speed_REQ) AND (Speed_In<>Speed_Out)THENSWITCH Speed_InCASE 0$OV_PRO=0Speed_Out=0;“Speed_In”为0时,程序执行的速度为0CASE 1$OV_PRO=30Speed_Out=1;“Speed_In”为1时,程序执行的速度为30%CASE 2$OV_PRO=70Speed_Out=2;“Speed_In”为2时,程序执行的速度为70%CASE 3$OV_PRO=100Speed_Out=3;“Speed_In”为3时,程序执行的速度为100%DEFAULT$OV_PRO=0Speed_Out=0ENDSWITCHENDIFENDPRO_Monitor;程序监控,避免不可用的程序执行global DEF PRO_Monitor()IF $OUT[APPL_RUN] THENAPPL_RUN_FLAG=TRUEENDIFIF $EXT AND $PRO_ACT AND $PRO_MOVE AND NOT $STOPMESS THENIF(NOT $OUT[APPL_RUN]) AND (NOT APPL_RUN_FLAG)THEN$OV_PRO=0MsgQuit("The Running Program Does not Start from CELL, PleaseCheck!!!","GAMC")ENDIFENDIFENDWeld_Mode;焊接模式global DEF Weld_Mode()$OUT[Weld_Off_Out]=NOT $FLAG[2];发给PLC的焊接模式信号$OUT[Timer_Ready_to_PLC]=$IN[EG_TIMER_READY_IN[EG_EXTAX_ACTIVE]];发给PLC的“焊接控制器准备好”信号IF $EXT THEN$FLAG[1]=NOT $IN[Dry_Run_In]$FLAG[2]=NOT $IN[Weld_Off_In]ENDIFIF $FLAG[1] THENEG_NO_PART_IN=1026。