Robotstudio软件:机床上下料工作站机器人主逻辑编写与仿真运行

本文已经首发在个人微信公众号:工业机器人仿真与编程(微信号:IndRobSim),欢迎关注!

前一期介绍了机器人数控机床上下料例行程序的编写,但是,也只是编写了机器人的运动程序,并没有进行信号逻辑控制程序的编写。本期,就来为大家介绍一下工作站信号控制逻辑的编写。

概述

机器人例行程序的控制逻辑主要是在Main主程序中完成的,同时在每一个子例行程序中也要对各自的控制信号进行逻辑控制,比如机器人自动给料装置抓取工件例行程序中需要控制抓手工具抓取工件、输送带放料例行程序中需要控制抓手放下工件等。当然,在主程序中还包括前台与后台运行程序的信号逻辑交互。

数控机床后台运行程序

数控机床后台运行程序没有改动,这里不再过多介绍。

完整程序代码如下:

MODULE MainModule
	PROC main()
		WHILE TRUE DO
            IF RM_C=1 THEN!循环扫描数控机床加工控制信号是否为1,若为1,则向下执行;若不为1,则继续扫描
                Set VM_D_C;!置位数控机床防护门控制信号为1
                WaitUntil VM_D_R=1;!等待数控机床防护门反馈信号为1
                Set VM_F_C;!置位数控机床法兰旋转控制信号为1
                Set VM_FD_C;!置位数控机床进给机构控制信号为1
                WaitTime 5;!等待5s,用以模拟数控机床加工时间
                Reset VM_FD_C;!复位数控机床进给机构控制信号为0
                WaitUntil VM_FD_R=1;!等待数控机床进给机构反馈信号为1
                Reset VM_F_C;!复位数控机床法兰旋转控制信号为0
                Reset VM_D_C;!复位数控机床防护门控制信号为0
                WaitUntil VM_D_R=0;!等待数控机床防护门反馈信号为0
                Reset RM_C;!复位数控机床加工控制信号为0
            ENDIF
        ENDWHILE
	ENDPROC
ENDMODULE

自动给料装置后台运行程序

自动给料装置后台运行程序做了一些修改,增加了自动给料装置A、B交替运行参考标志可变量reg10的声明,并对自动给料装置A、B交替运行标志flag4、flag5的赋值运算重新定义,同时修改了信号控制逻辑。

完整程序代码如下:

MODULE MainModule
    PERS num reg10:=0;!声明整型可变量reg10,初始化值为0,作为自动给料装置A、B交替运行参考标志,并与前台程序进行数据交互
    VAR bool flag4:=FALSE;!声明布尔变量flag4,初始状态为FALSE
    VAR bool flag5:=FALSE;!声明布尔变量flag5,初始状态为FALSE
	PROC main()
		WHILE TRUE DO
            flag4:=RWA_C=1 AND RWB_C=0 AND reg10>=0 AND reg10<=2;!对自动给料装置A工件生成控制信号、自动给料装置B工件生成控制信号、自动给料装置A、B交替运行参考标志做逻辑“与”运算,若RWA_C为1且RWB_C为0且0≤reg10≤2,则flag4为1;否则为0
            flag5:=RWA_C=0 AND RWB_C=1 AND reg10>=3 AND reg10<=5;!对自动给料装置A工件生成控制信号、自动给料装置B工件生成控制信号、自动给料装置A、B交替运行参考标志做逻辑“与”运算,若RWA_C为0且RWB_C为1且3≤reg10≤5,则flag4为1;否则为0
            IF flag4=TRUE THEN!循环扫描flag4,若为TRUE则向下执行;若不为TRUE则继续扫描
                Reset VM_FYB_C;!循环扫描flag4,若为TRUE则向下执行;若不为TRUE则继续扫描
                WaitUntil VM_FYB_R=0;!等待给料机构B进给反馈信号为0
                WaitUntil RWA_R=0;!等待自动给料装置A工件生成反馈信号为0
                Set VM_FYA_C;!置位给料机构A进给控制信号为1
                WaitUntil VM_FYA_R=1;!等待给料机构A进给反馈信号为1
                Set VM_FAW_C;!置位自动给料装置A工件生成控制信号为1
                WaitUntil VM_FWA_R=1;!等待自动给料装置A工件生成反馈信号为1
                Reset VM_FAW_C;!复位自动给料装置A工件生成控制信号为0
                Reset RWA_C;!复位自动给料装置A工件生成控制信号为0
            ELSEIF flag5=TRUE THEN!循环扫描flag5,若为TRUE则向下执行;若不为TRUE则继续扫描
                Reset VM_FYA_C;!复位给料机构A进给控制信号为1
                WaitUntil VM_FYA_R=0;!等待给料机构A进给反馈信号为0
                WaitUntil RWB_R=0;!等待自动给料装置B工件生成反馈信号为0
                Set VM_FYB_C;!置位给料机构B进给控制信号为1
                WaitUntil VM_FYB_R=1;!等待给料机构B进给反馈信号为1
                Set VM_FBW_C;!置位自动给料装置B工件生成控制信号为1
                WaitUntil VM_FWB_R=1;!等待自动给料装置B工件生成反馈信号为1
                Reset VM_FBW_C;!复位自动给料装置B工件生成控制信号为0
                Reset RWB_C;!复位自动给料装置B工件生成控制信号为0
            ENDIF
        ENDWHILE
	ENDPROC
ENDMODULE

自动给料装置A取料例行程序

自动给料装置A取料例行程序中,增加了自动给料装置A、B工件生成控制信号逻辑程序,以及机器人工具抓取工件信号控制逻辑。

完整程序代码如下:

	PROC Pick_FA()
	    MoveJ Target_10,v500,z100,TCP1\WObj:=wobj0;
        Reset RWB_C;!复位自动给料装置B工件生成控制信号为0
        Set RWA_C;!置位自动给料装置A工件生成控制信号为1
	    MoveJ Target_20,v500,z100,TCP1\WObj:=wobj0;
        WaitUntil RWA_R=1;!等待自动给料装置A工件生成反馈信号为1
	    MoveL Target_30,v500,fine,TCP1\WObj:=wobj0;
        Set VC_Hand_C1;!置位机器人工具控制信号1为1
        WaitUntil VC_Hand_R1=1;!等待机器人工具反馈信号1为1
        MoveL Target_20,v500,z100,TCP1\WObj:=wobj0;
	    MoveJ Target_10,v500,z100,TCP1\WObj:=wobj0;
	ENDPROC

自动给料装置B取料例行程序

自动给料装置B取料例行程序与自动给料装置A取料例行程序类似,不再过多介绍,程序如下所示。

完整程序代码如下:

	PROC Pick_FB()
	    MoveJ Target_10,v500,z100,TCP1\WObj:=wobj0;
        Reset RWA_C;!复位自动给料装置A工件生成控制信号为0
        Set RWB_C;!置位自动给料装置B工件生成控制信号为1
	    MoveJ Target_40,v500,fine,TCP1\WObj:=wobj0;
        WaitUntil RWB_R=1;!等待自动给料装置B工件生成反馈信号为1
	    MoveL Target_50,v500,fine,TCP1\WObj:=wobj0;
        Set VC_Hand_C1;!置位机器人工具控制信号1为1
        WaitUntil VC_Hand_R1=1;!等待机器人工具反馈信号1为1
        MoveL Target_40,v500,fine,TCP1\WObj:=wobj0;
	    MoveJ Target_10,v500,z100,TCP1\WObj:=wobj0;
	ENDPROC

输送带放料例行程序

输送带放料例行程序中,添加了输送带运行控制信号逻辑程序,以及机器人工具放料程序逻辑。

完整程序代码如下:

	PROC Conveyor_Drop()
	    MoveJ Target_140,v500,fine,TCP2\WObj:=wobj0;
        WaitUntil VC_CNY_R=1;!等待输送带运行反馈信号为1
	    MoveJ Target_150,v500,fine,TCP2\WObj:=wobj0;
	    MoveL Target_160,v500,fine,TCP2\WObj:=wobj0;
        Reset VC_Hand_C2;!复位机器人工具控制信号2为0
        WaitUntil VC_Hand_R2=0;!等待机器人工具反馈信号2为0
        MoveL Target_150,v500,fine,TCP2\WObj:=wobj0;
        Set VC_CNY_C;!置位输送带运行控制信号为1
	    MoveJ Target_140,v500,fine,TCP2\WObj:=wobj0;
	ENDPROC

初始化例行程序

初始化例行程序是在机器人运行之前对机器人关键的信号、变量、可变量恢复初始状态的程序,这里对机床上下料逻辑判断标志位flag6、自动给料装置A、B交替运行参考标志reg10分别进行了初始化赋值。对机床上下料逻辑判断标志位flag6赋值为TRUE,是告诉机器人这是第一次运行,使得后续机器人机床上下料程序执行时,可以执行第一次放料逻辑。

完整程序代码如下:

    PROC Init()
        flag6:=TRUE;!初始化机床上下料逻辑判断标志位flag6为TRUE
        reg10:=0;!初始化自动给料装置A、B交替运行参考标志reg10为0
    ENDPROC

机器人主程序

编写机器人主程序就是实现整个机器人子例行程序的调用逻辑关系,也就是把机器人工作站的控制逻辑关系转换为机器人运行程序的过程。机器人工作站的整体运行逻辑关系如下图所示。

把上述机器人工作站控制逻辑关系转换为机器人程序,如下所示。

完整程序代码如下:

	PROC Main()
        Home;!调用机器人Home点例行程序
        Init;!调用机器人初始化例行程序
        WHILE TRUE DO
            Label1:!程序跳转标签Label1
            flag1:=reg10>=0 AND reg10<=2;!对自动给料装置A、B交替运行参考标志reg10进行判断,若0≤reg10≤2,则flag1为1;否则为0
            flag2:=reg10>=3 AND reg10<=5;!对自动给料装置A、B交替运行参考标志reg10进行判断,若3≤reg10≤5,则flag1为1;否则为0
            flag3:=reg10>=6;!对自动给料装置A、B交替运行参考标志reg10进行判断,若reg10≥6,则flag1为1;否则为0
            IF flag1=TRUE THEN!循环扫描flag1,若为TRUE则向下执行;若不为TRUE则继续扫描
                Reset RWB_C;!复位自动给料装置B工件生成控制信号为0
                WaitUntil RWB_R=0;!等待自动给料装置B工件生成反馈信号为0
                Pick_FA;!调用自动给料装置A取料例行程序
                reg10:=reg10+1;!自动给料装置A、B交替运行参考标志reg10加1运算
            ELSEIF flag2=TRUE THEN!循环扫描flag2,若为TRUE则向下执行;若不为TRUE则继续扫描
                Reset RWA_C;!复位自动给料装置A工件生成控制信号为0
                WaitUntil RWA_R=0;!等待自动给料装置A工件生成反馈信号为0
                Pick_FB;!调用自动给料装置B取料例行程序
                reg10:=reg10+1;!自动给料装置A、B交替运行参考标志reg10加1运算
            ELSEIF flag3=TRUE THEN!循环扫描flag2,若为TRUE则向下执行;若不为TRUE则继续扫描
                reg10:=0;!自动给料装置A、B交替运行参考标志reg10赋值为0
                GOTO Label1;!跳转到标签Label1
            ENDIF
            Machine_Pick_Drop;!调用数控机床上下料例行程序
            IF VC_Hand_R2=1 THEN!循环扫描机器人工具反馈信号2,若为1则向下执行;若不为1则继续扫描
                Conveyor_Drop;!调用输送带放料例行程序
            ENDIF
        ENDWHILE
	ENDPROC

机器人Home点例行程序

机器人Home点例行程序保持不变。

完整程序代码如下:

	PROC Home()
	    MoveAbsJ JointTarget_1,v500,fine,tool0\WObj:=wobj0;
	ENDPROC

数控机床上下料例行程序

数控机床上下料例行程序主要是对机床上下料逻辑判断标志位flag6进行判断,如果flag6为TRUE,也就是机器人第一次运行,那么就只执行机器人数控机床上料程序;如果flag6为FALSE,机器人就不是第一次运行,那么机器人就要先把数控机床上加工完成的工件取下来,然后再把新工件安装到数控机床上。

注:程序中第117118行代码重复复位、置位数控机床工件安装与拆除控制信号VM_W_C,是经过反复测试后添加的,如果不添加这两行代码,机器人无法向下运行。按照正常运行逻辑,这里只需要复位数控机床工件安装与拆除控制信号VM_W_C即可。之所以要反复置位、复位这个信号,个人猜测可能是因为机器人在机床上安装、拆除工件时使用了不同的TCP,导致机器人内部运行逻辑的不一致,因此,这里需要再次置位、复位这个信号,使得逻辑保持一致;另一种可能性是仿真软件的BUG,这里不再过多讨论。

完整程序代码如下:

    PROC Machine_Pick_Drop()
        IF flag6=TRUE THEN!循环扫描flag6,若为TRUE则向下执行;若不为TRUE则继续扫描
            MoveJ Target_100,v500,fine,TCP2\WObj:=wobj0;
            WaitUntil RM_R=1;!等待数控机床加工反馈信号为1
            MoveJ Target_110,v500,fine,TCP2\WObj:=wobj0;
            MoveL Target_80,v500,fine,TCP1\WObj:=wobj0;
            MoveL Target_90,v500,fine,TCP1\WObj:=wobj0;
            Set VM_W_C;!置位数控机床工件安装与拆除控制信号为1
            WaitUntil VM_W_R=1;!等待数控机床工件安装与拆除反馈信号为1
            WaitTime 1;!等待1s,信号发送、接收时间
            Reset VC_Hand_C1;!复位机器人工具控制信号1为0
            WaitUntil VC_Hand_R1=0;!等待机器人工具反馈信号1为0
            MoveL Target_80,v500,fine,TCP1\WObj:=wobj0;
            MoveJ Target_110,v500,fine,TCP2\WObj:=wobj0;
            Set RM_C;!置位数控机床加工控制信号为1
            flag6:=FALSE;!机床上下料逻辑判断标志位flag6赋值为FALSE
            MoveJ Target_100,v500,fine,TCP2\WObj:=wobj0;
        ELSEIF flag6=FALSE THEN!循环扫描flag6,若为FALSE则向下执行;若不为FALSE则继续扫描
            MoveJ Target_100,v500,fine,TCP2\WObj:=wobj0;
            WaitUntil RM_R=1;!等待数控机床加工反馈信号为1
            MoveJ Target_110,v500,fine,TCP2\WObj:=wobj0;
            MoveL Target_120,v500,fine,TCP2\WObj:=wobj0;
            MoveL Target_130,v500,fine,TCP2\WObj:=wobj0;
            Reset VM_W_C;!复位数控机床工件安装与拆除控制信号为0
            Set VM_W_C;!置位数控机床工件安装与拆除控制信号为1
            Reset VM_W_C;!复位数控机床工件安装与拆除控制信号为0
            WaitUntil VM_W_R=0;!等待数控机床工件安装与拆除反馈信号为0
            WaitTime 1;!等待1s,信号发送、接收时间
            Set VC_Hand_C2;!置位机器人工具控制信号2为1
            WaitUntil VC_Hand_R2=1;!等待机器人工具反馈信号2为1
            MoveL Target_120,v500,fine,TCP2\WObj:=wobj0;
            MoveL Target_80,v500,fine,TCP1\WObj:=wobj0;
            MoveL Target_90,v500,fine,TCP1\WObj:=wobj0;
            Set VM_W_C;!置位数控机床工件安装与拆除控制信号为1
            WaitUntil VM_W_R=1;!等待数控机床工件安装与拆除反馈信号为1
            WaitTime 1;!等待1s,信号发送、接收时间
            Reset VC_Hand_C1;!复位机器人工具控制信号1为0
            WaitUntil VC_Hand_R1=0;!等待机器人工具反馈信号1为0
            MoveL Target_80,v500,fine,TCP1\WObj:=wobj0;
            MoveJ Target_110,v500,fine,TCP2\WObj:=wobj0;
            Set RM_C;!置位数控机床加工控制信号为1
            MoveJ Target_100,v500,fine,TCP2\WObj:=wobj0;
        ENDIF
    ENDPROC

完整的机器人前台运行程序

完整的机器人前台运行程序如下所示。

完整程序代码如下:

MODULE Module1
    CONST robtarget Target_10:=[[-105.49,579.988623383,906.377272022],[0,-0.707106781,0.707106781,0],[1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
	CONST robtarget Target_20:=[[-154.272430575,1040.197944831,408.821804466],[-0.000000009,0.707106789,-0.707106773,-0.000000022],[1,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
	CONST robtarget Target_30:=[[-154.272430474,1040.1979427,340.199725865],[-0.000000009,0.707106789,-0.707106773,-0.000000022],[1,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
	CONST robtarget Target_40:=[[68.727608491,1041.197987768,413.90280281],[-0.000000037,-0.707106781,0.707106781,0.000000036],[0,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
	CONST robtarget Target_50:=[[68.72761347,1041.198017452,340.201142462],[-0.000000037,-0.707106777,0.707106785,0.000000036],[0,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
	CONST robtarget Target_100:=[[573.250617984,-94.193044203,897.368388848],[-0.000000016,0.00000011,1,0],[-1,-1,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
	CONST robtarget Target_110:=[[573.250603139,130.078196979,1021.465973332],[0.000000041,-0.000000062,0.707106786,0.707106777],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
	CONST robtarget Target_120:=[[952.004763071,100.358697881,596.952671985],[0.073912769,-0.073912713,-0.703233188,-0.703233174],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
	CONST robtarget Target_130:=[[952.004775953,145.252003711,596.95269566],[0.073912767,-0.073912722,-0.70323316,-0.703233201],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
	CONST robtarget Target_80:=[[952.004663029,100.639099969,596.952707868],[0.499999999,-0.499999887,-0.500000132,-0.499999983],[-1,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
	CONST robtarget Target_90:=[[952.004756918,145.252003986,596.952682829],[0.500000014,-0.499999894,-0.500000109,-0.499999983],[-1,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
	CONST robtarget Target_60:=[[579.988643459,105.489956009,906.377338138],[-0.000000049,0.00000005,1,0],[0,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
	CONST robtarget Target_70:=[[579.988574388,121.069199606,1221.148973472],[0.000000042,-0.000000062,0.707106786,0.707106777],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
	CONST robtarget Target_140:=[[-94.193044877,-573.250644206,897.368454324],[-0.000000013,0.707106901,0.707106661,-0.000000013],[-2,-1,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
	CONST robtarget Target_150:=[[-11.250024226,-579.819937457,198.905207331],[-0.000000013,0.707106922,0.70710664,0.000000004],[-1,0,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
	CONST robtarget Target_160:=[[-11.250022761,-579.819990471,150.999928945],[0.000000008,0.707106945,0.707106618,0.000000001],[-1,-1,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
	CONST jointtarget JointTarget_1:=[[0,-29.8,0,0,90,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    PERS num reg10:=0;!声明整型可变量reg10,初始化值为0,作为自动给料装置A、B交替运行参考标志,并与后台程序进行数据交互
    VAR bool flag1:=FALSE;!声明布尔变量flag1,初始状态为FALSE,作为主程序逻辑判断标志位
	VAR bool flag2:=FALSE;!声明布尔变量flag2,初始状态为FALSE,作为主程序逻辑判断标志位
	VAR bool flag3:=FALSE;!声明布尔变量flag3,初始状态为FALSE,作为主程序逻辑判断标志位
    VAR bool flag6:=FALSE;!声明布尔变量flag6,初始状态为FALSE,作为机床上下料逻辑判断标志位
	PROC Pick_FA()
	    MoveJ Target_10,v500,z100,TCP1\WObj:=wobj0;
        Reset RWB_C;!复位自动给料装置B工件生成控制信号为0
        Set RWA_C;!置位自动给料装置A工件生成控制信号为1
	    MoveJ Target_20,v500,z100,TCP1\WObj:=wobj0;
        WaitUntil RWA_R=1;!等待自动给料装置A工件生成反馈信号为1
	    MoveL Target_30,v500,fine,TCP1\WObj:=wobj0;
        Set VC_Hand_C1;!置位机器人工具控制信号1为1
        WaitUntil VC_Hand_R1=1;!等待机器人工具反馈信号1为1
        MoveL Target_20,v500,z100,TCP1\WObj:=wobj0;
	    MoveJ Target_10,v500,z100,TCP1\WObj:=wobj0;
	ENDPROC
	PROC Pick_FB()
	    MoveJ Target_10,v500,z100,TCP1\WObj:=wobj0;
        Reset RWA_C;!复位自动给料装置A工件生成控制信号为0
        Set RWB_C;!置位自动给料装置B工件生成控制信号为1
	    MoveJ Target_40,v500,fine,TCP1\WObj:=wobj0;
        WaitUntil RWB_R=1;!等待自动给料装置B工件生成反馈信号为1
	    MoveL Target_50,v500,fine,TCP1\WObj:=wobj0;
        Set VC_Hand_C1;!置位机器人工具控制信号1为1
        WaitUntil VC_Hand_R1=1;!等待机器人工具反馈信号1为1
        MoveL Target_40,v500,fine,TCP1\WObj:=wobj0;
	    MoveJ Target_10,v500,z100,TCP1\WObj:=wobj0;
	ENDPROC
	PROC Conveyor_Drop()
	    MoveJ Target_140,v500,fine,TCP2\WObj:=wobj0;
        WaitUntil VC_CNY_R=1;!等待输送带运行反馈信号为1
	    MoveJ Target_150,v500,fine,TCP2\WObj:=wobj0;
	    MoveL Target_160,v500,fine,TCP2\WObj:=wobj0;
        Reset VC_Hand_C2;!复位机器人工具控制信号2为0
        WaitUntil VC_Hand_R2=0;!等待机器人工具反馈信号2为0
        MoveL Target_150,v500,fine,TCP2\WObj:=wobj0;
        Set VC_CNY_C;!置位输送带运行控制信号为1
	    MoveJ Target_140,v500,fine,TCP2\WObj:=wobj0;
	ENDPROC
    PROC Init()
        flag6:=TRUE;!初始化机床上下料逻辑判断标志位flag6为TRUE
        reg10:=0;!初始化自动给料装置A、B交替运行参考标志reg10为0
    ENDPROC
	PROC Main()
        Home;!调用机器人Home点例行程序
        Init;!调用机器人初始化例行程序
        WHILE TRUE DO
            Label1:!程序跳转标签Label1
            flag1:=reg10>=0 AND reg10<=2;!对自动给料装置A、B交替运行参考标志reg10进行判断,若0≤reg10≤2,则flag1为1;否则为0
            flag2:=reg10>=3 AND reg10<=5;!对自动给料装置A、B交替运行参考标志reg10进行判断,若3≤reg10≤5,则flag1为1;否则为0
            flag3:=reg10>=6;!对自动给料装置A、B交替运行参考标志reg10进行判断,若reg10≥6,则flag1为1;否则为0
            IF flag1=TRUE THEN!循环扫描flag1,若为TRUE则向下执行;若不为TRUE则继续扫描
                Reset RWB_C;!复位自动给料装置B工件生成控制信号为0
                WaitUntil RWB_R=0;!等待自动给料装置B工件生成反馈信号为0
                Pick_FA;!调用自动给料装置A取料例行程序
                reg10:=reg10+1;!自动给料装置A、B交替运行参考标志reg10加1运算
            ELSEIF flag2=TRUE THEN!循环扫描flag2,若为TRUE则向下执行;若不为TRUE则继续扫描
                Reset RWA_C;!复位自动给料装置A工件生成控制信号为0
                WaitUntil RWA_R=0;!等待自动给料装置A工件生成反馈信号为0
                Pick_FB;!调用自动给料装置B取料例行程序
                reg10:=reg10+1;!自动给料装置A、B交替运行参考标志reg10加1运算
            ELSEIF flag3=TRUE THEN!循环扫描flag2,若为TRUE则向下执行;若不为TRUE则继续扫描
                reg10:=0;!自动给料装置A、B交替运行参考标志reg10赋值为0
                GOTO Label1;!跳转到标签Label1
            ENDIF
            Machine_Pick_Drop;!调用数控机床上下料例行程序
            IF VC_Hand_R2=1 THEN!循环扫描机器人工具反馈信号2,若为1则向下执行;若不为1则继续扫描
                Conveyor_Drop;!调用输送带放料例行程序
            ENDIF
        ENDWHILE
	ENDPROC
	PROC Home()
	    MoveAbsJ JointTarget_1,v500,fine,tool0\WObj:=wobj0;
	ENDPROC
    PROC Machine_Pick_Drop()
        IF flag6=TRUE THEN!循环扫描flag6,若为TRUE则向下执行;若不为TRUE则继续扫描
            MoveJ Target_100,v500,fine,TCP2\WObj:=wobj0;
            WaitUntil RM_R=1;!等待数控机床加工反馈信号为1
            MoveJ Target_110,v500,fine,TCP2\WObj:=wobj0;
            MoveL Target_80,v500,fine,TCP1\WObj:=wobj0;
            MoveL Target_90,v500,fine,TCP1\WObj:=wobj0;
            Set VM_W_C;!置位数控机床工件安装与拆除控制信号为1
            WaitUntil VM_W_R=1;!等待数控机床工件安装与拆除反馈信号为1
            WaitTime 1;!等待1s,信号发送、接收时间
            Reset VC_Hand_C1;!复位机器人工具控制信号1为0
            WaitUntil VC_Hand_R1=0;!等待机器人工具反馈信号1为0
            MoveL Target_80,v500,fine,TCP1\WObj:=wobj0;
            MoveJ Target_110,v500,fine,TCP2\WObj:=wobj0;
            Set RM_C;!置位数控机床加工控制信号为1
            flag6:=FALSE;!机床上下料逻辑判断标志位flag6赋值为FALSE
            MoveJ Target_100,v500,fine,TCP2\WObj:=wobj0;
        ELSEIF flag6=FALSE THEN!循环扫描flag6,若为FALSE则向下执行;若不为FALSE则继续扫描
            MoveJ Target_100,v500,fine,TCP2\WObj:=wobj0;
            WaitUntil RM_R=1;!等待数控机床加工反馈信号为1
            MoveJ Target_110,v500,fine,TCP2\WObj:=wobj0;
            MoveL Target_120,v500,fine,TCP2\WObj:=wobj0;
            MoveL Target_130,v500,fine,TCP2\WObj:=wobj0;
            Reset VM_W_C;!复位数控机床工件安装与拆除控制信号为0
            Set VM_W_C;!置位数控机床工件安装与拆除控制信号为1
            Reset VM_W_C;!复位数控机床工件安装与拆除控制信号为0
            WaitUntil VM_W_R=0;!等待数控机床工件安装与拆除反馈信号为0
            WaitTime 1;!等待1s,信号发送、接收时间
            Set VC_Hand_C2;!置位机器人工具控制信号2为1
            WaitUntil VC_Hand_R2=1;!等待机器人工具反馈信号2为1
            MoveL Target_120,v500,fine,TCP2\WObj:=wobj0;
            MoveL Target_80,v500,fine,TCP1\WObj:=wobj0;
            MoveL Target_90,v500,fine,TCP1\WObj:=wobj0;
            Set VM_W_C;!置位数控机床工件安装与拆除控制信号为1
            WaitUntil VM_W_R=1;!等待数控机床工件安装与拆除反馈信号为1
            WaitTime 1;!等待1s,信号发送、接收时间
            Reset VC_Hand_C1;!复位机器人工具控制信号1为0
            WaitUntil VC_Hand_R1=0;!等待机器人工具反馈信号1为0
            MoveL Target_80,v500,fine,TCP1\WObj:=wobj0;
            MoveJ Target_110,v500,fine,TCP2\WObj:=wobj0;
            Set RM_C;!置位数控机床加工控制信号为1
            MoveJ Target_100,v500,fine,TCP2\WObj:=wobj0;
        ENDIF
    ENDPROC
ENDMODULE

逻辑设定

在软件的“仿真”菜单栏下的“工作站逻辑”中,配置机器人工作站逻辑信号,也就是把仿真工作站中的所有Smart组件控制信号与机器人的I/O信号按照下图映射关系进行连接。

仿真运行

在“控制器”菜单栏下,将数控机床后台运行程序、自动给料装置后台运行程序的“Type”修改为“Semistatic”,也就是设定后台运行程序为自动运行模式。

在“RAPID”菜单栏下,机器人前台运行程序执行“将程序指针设为所有任务中的主例行程序”,即初始化机器人程序运行指针。

在“仿真”菜单栏下,进行仿真设定,全部勾选仿真工作站中的Smart组件对象与机器人对象,并把机器人进入点设置为“主程序Main”。同时手动置位输送带运行反馈信号VC_CNY_R,以便于机器人能够在第一次运行时执行输送带放料任务。

全部设置完成后,点击“播放”按钮,机器人工作站开始仿真运行。点击“停止”按钮,机器人工作站停止仿真运行。

停止运行后要立即点击“重置”按钮,把仿真工作站恢复原始状态。下一次仿真运行之前,首先要执行机器人控制器的重启,然后再执行“将程序指针设为所有任务中的主例行程序”,最后才能再次运行机器人工作站的仿真;否则会带来一些不必要的麻烦,切记!

断断续续写了差不多有一年的时间才把这个机器人数控机床上下料仿真写完,Word文案写了100多页,一共25000字左右,快赶上一篇中短篇小说了。拖得时间太久了,也是因为实在太忙,没有太多时间来写,希望小伙伴们能够见谅。当然,这个工作站到目前为止,只是完成了仿真,工艺节拍还有待进一步优化,这些就留给感兴趣的小伙伴自己去摸索完成吧。

The End


上一篇:Robotstudio软件:机床上下料工作站机器人示教编程

  • 6
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IndRobSim

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值