ABB机器人发送实时位置数据

对于不同的主控系统,机器人发送当前位置数据的方式也多种多样。如果使用PC机作为上位机来读取机器人实时位置信息,那么我们就可以通过使用IRC5 OPC Server来读取机器人位置数据,然后再发送给PC上位机;当然,也可以通过PC SDK对机器人控制器进行二次开发,然后通过PC Interface选项,直接读取控制器中机器人的位置信息。如果是使用PLC作为上位机来读取机器人实时位置信息,那么我们就可以通过工业现场通信,如ProfiBus、ProfiNet、DeviceNet等,然后使用ABB机器人内置的数据处理指令编写实时位置数据发送程序,来实现机器人位置数据的发送。

变量声明

机器人的当前位置就是工具末端的当前位置,也就是TCP的当前坐标,它是由x、y、z的坐标值以及分别绕x、y、z轴旋转的角度值组成,这些数据的类型均是实数类型。在ABB机器人中,使用num与dnum来表示实数,其中num类型与西门子PLC中的real类型一致,都是32位的单精度实数;而dnum类型数据是64位的双精度实数。因此,在机器人中,我们可以声明num类型变量来存放机器人的当前位置数据。同时,声明其他类型的数据变量,作为数据处理的中间转换变量。变量声明代码如下所示。

组输出信号配置

ABB机器人传输实数数据的方式大致可以分为两种:一、使用模拟量输出信号传输实数数据,由于模拟量信号自身抗干扰性能差,并且需要加装价格昂贵的模量信号扩展模块,因此,在传输大量的实数数据的场合中,一般很少使用模拟量信号;二、使用组输出信号传输实数数据,组输出信号不仅可以通过加装价格相对低廉的数字量I/O信号扩展模块实现,也可以通过加装现场通信模块的方式实现。本例,使用第二种方式,通过ProfiBus现场总线通信的形式来传输机器人当前位置数据。

由于机器人当前位置数据都是32位的单精度实数类型,所以,我们定义的每一个组输出信号长度也应该是32位。

中断子程序编写

创建中断子例行程序,并在其中编写读取机器人当前位置x、y、z坐标数据程序。由于ABB机器人系统中使用四元数形式表示TCP绕相应坐标轴的旋转角度,因此,这里需要使用EulerZYX指令将以四元数形式表示的角度数据转换为欧拉角形式表示的旋转角度数据。完整的中断子程序代码如下所示。

 TRAP iTrap!中断程序iTrap
        !读取机器人当前位置,并将读取数据赋值给pCurrentPos
        pCurrentPos:=CRobT();
        !将读取到的机器人当前位置x、y、z坐标值分别赋值给变量x、y、z
        x:=pCurrentPos.trans.x;
        y:=pCurrentPos.trans.y;
        z:=pCurrentPos.trans.z;
        !将将读取到的机器人当前位置四元数角度值转换为欧拉角之后,分别赋值给变量rx、ry、rz
        rx:=EulerZYX(\x,pCurrentPos.rot);
        ry:=EulerZYX(\y,pCurrentPos.rot);
        rz:=EulerZYX(\z,pCurrentPos.rot);
        !调用发送机器人当前位置例行程序
        send_pCurrentPos;
    ENDTRAP

机器人当前位置数据发送子程序编写

创建发送机器人当前位置数据子例行程序,并将其在中断子程序中调用。首先,将读取的机器人当前位置数据使用PackRawBytes指令按照Float形式进行打包,然后将其存放到已经声明的rawbyte类型容器变量的连续四个字节中。

然后使用FOR指令进行循环解包操作,即将打包好的数据使用UnpackRawBytes指令解包到声明的byte类型四维数组变量中,每一个字节对应数组变量中的一维byte元素。

由于西门子PLC中数据采用大端存储模式,而ABB机器人中的数据采用的是小端存储模式,为了发送的数据能够被PLC正确解析,因此,我们需要对机器人的位置数据进行移位操作。所谓的大端模式(Big-endian),是指数据的高字节,保存在内存的低地址中,而数据的低字节,保存在内存的高地址中,地址由小向大增加,而数据从高位往低位放;小端模式(Little-endian)是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权值有效结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。

对于ABB机器人当前位置数据的移位操作:首先使用NumToDnum指令将解包后的byte类型数据转换为dnum类型,然后按照西门子PLC中实数类型数据高低字节顺序进行移位操作,数据移位指令使用BitLShDnum。同时,将四个移位后的byte类型数据使用BitOrDnum指令进行“逻辑或”运算,重新组成32位的单精度数据,并将其存放到声明好的dnum类型变量中。当然,这个移位操作,我们也可以在PLC中实现。

最后,使用setgo指令将转换好的机器人当前位置数据赋值到相应的组输出信号,然后发送给PLC。

PROC send_pCurrentPos()!发送机器人当前位置例行程序
        !清空机器人位姿通用数据容器中间转换变量
        ClearRawBytes rawbyte_x;
        ClearRawBytes rawbyte_y;
        ClearRawBytes rawbyte_z;
        ClearRawBytes rawbyte_rx;
        ClearRawBytes rawbyte_ry;
        ClearRawBytes rawbyte_rz;
        !将机器人当前位置数据按照float形式打包
        PackRawBytes x,rawbyte_x,RawBytesLen(rawbyte_x)+1\Float4;
        PackRawBytes y,rawbyte_y,RawBytesLen(rawbyte_y)+1\Float4;
        PackRawBytes z,rawbyte_z,RawBytesLen(rawbyte_z)+1\Float4;
        PackRawBytes rx,rawbyte_rx,RawBytesLen(rawbyte_rx)+1\Float4;
        PackRawBytes ry,rawbyte_ry,RawBytesLen(rawbyte_ry)+1\Float4;
        PackRawBytes rz,rawbyte_rz,RawBytesLen(rawbyte_rz)+1\Float4;
        !将机器人位姿通用数据容器里的前4个字节数据分别保存到字节数组变量中
        FOR i FROM 1 TO 4 DO
            UnpackRawBytes rawbyte_x,i,byte_x{i}\Hex1;
            UnpackRawBytes rawbyte_y,i,byte_y{i}\Hex1;
            UnpackRawBytes rawbyte_z,i,byte_z{i}\Hex1;
            UnpackRawBytes rawbyte_rx,i,byte_rx{i}\Hex1;
            UnpackRawBytes rawbyte_ry,i,byte_ry{i}\Hex1;
            UnpackRawBytes rawbyte_rz,i,byte_rz{i}\Hex1;
        ENDFOR
        !机器人数据格式转换(西门子PLC高低字节与机器人高低字节定义相反)
        dn_x:=BitLShDnum(NumToDnum(byte_x{1}),24);!将单精度数据byte_x{1}转换为双精度类型后,左移24位,然后赋值给dn_x
        dn_x:=BitOrDnum(dn_x,BitLShDnum(NumToDnum(byte_x{2}),16));!将单精度数据byte_x{2}转换为双精度类型后,左移16位,并与dn_x做或运算,然后赋值给自己
        dn_x:=BitOrDnum(dn_x,BitLShDnum(NumToDnum(byte_x{3}),8));!将单精度数据byte_x{2}转换为双精度类型后,左移8位,并与dn_x做或运算,然后赋值给自己
        dn_x:=BitOrDnum(dn_x,NumToDnum(byte_x{4}));!将单精度数据byte_x{2}转换为双精度类型后,与dn_x做或运算,然后赋值给自己
        !机器人数据格式转换
        dn_y:=BitLShDnum(NumToDnum(byte_y{1}),24);
        dn_y:=BitOrDnum(dn_y,BitLShDnum(NumToDnum(byte_y{2}),16));
        dn_y:=BitOrDnum(dn_y,BitLShDnum(NumToDnum(byte_y{3}),8));
        dn_y:=BitOrDnum(dn_y,NumToDnum(byte_y{4}));
        !机器人数据格式转换
        dn_z:=BitLShDnum(NumToDnum(byte_z{1}),24);
        dn_z:=BitOrDnum(dn_z,BitLShDnum(NumToDnum(byte_z{2}),16));
        dn_z:=BitOrDnum(dn_z,BitLShDnum(NumToDnum(byte_z{3}),8));
        dn_z:=BitOrDnum(dn_z,NumToDnum(byte_z{4}));
        !机器人数据格式转换
        dn_rx:=BitLShDnum(NumToDnum(byte_rx{1}),24);
        dn_rx:=BitOrDnum(dn_rx,BitLShDnum(NumToDnum(byte_rx{2}),16));
        dn_rx:=BitOrDnum(dn_rx,BitLShDnum(NumToDnum(byte_rx{3}),8));
        dn_rx:=BitOrDnum(dn_rx,NumToDnum(byte_rx{4}));
        !机器人数据格式转换
        dn_ry:=BitLShDnum(NumToDnum(byte_ry{1}),24);
        dn_ry:=BitOrDnum(dn_ry,BitLShDnum(NumToDnum(byte_ry{2}),16));
        dn_ry:=BitOrDnum(dn_ry,BitLShDnum(NumToDnum(byte_ry{3}),8));
        dn_ry:=BitOrDnum(dn_ry,NumToDnum(byte_ry{4}));
        !机器人数据格式转换
        dn_rz:=BitLShDnum(NumToDnum(byte_rz{1}),24);
        dn_rz:=BitOrDnum(dn_rz,BitLShDnum(NumToDnum(byte_rz{2}),16));
        dn_rz:=BitOrDnum(dn_rz,BitLShDnum(NumToDnum(byte_rz{3}),8));
        dn_rz:=BitOrDnum(dn_rz,NumToDnum(byte_rz{4}));
        !使用相应的组输出信号,将机器人当前位置数据进行输出
        setgo go_cx,dn_x;
        setgo go_cy,dn_y;
        setgo go_cz,dn_z;
        setgo go_crx,dn_rx;
        setgo go_cry,dn_ry;
        setgo go_crz,dn_rz;
    ENDPROC

机器人主程序编写

在主程序中编写定时器中断程序,中断时间间隔为0.5s,即每个0.5s读取一次机器人当前位置,并将当前位置数据发送给PLC。完整机器人主程序代码如下所示。

运行测试

在PLC中进行组态编程,然后运行机器人,同时对PLC中相应的数据寄存器进行监视,可以看到机器人的实时位置数据已经发送过来了,并且每隔0.5s刷新一次。西门子老版本的PLC实数数据的高低位字节顺序与ABB机器人的实数数据的高低位顺序是相反的;新版本的PLC,小编还没有测试过,若是使用新版本的PLC,测试时可以注意一下。如果高低位字节顺序是一致的,那么只需要把发送机器人当前位置数据子例行程序中的数据移位程序删除即可。对于三菱PLC、欧姆龙PLC或是其他品牌的PLC,读取机器人当前位置的程序都是类似的,感兴趣的小伙伴可以自己测试一下。

附录:完成程序

MODULE Module1
    CONST jointtarget jpos10:=[[0,0,0,0,30,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    CONST robtarget p10:=[[392.836308491,-156.6306903,309.536253784],[0.165037067,-0.000000128,0.986287365,0.000000003],[-1,0,-1,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    CONST robtarget p20:=[[392.836306583,149.260106132,309.53614795],[0.165037087,-0.000000142,0.986287362,0],[0,-1,0,0],[9E+09,9E+09,9E+09,9E+09,9E+09,9E+09]];
    !声明机器人当前位姿变量
    VAR robtarget pCurrentPos;
    !声明机器人位姿存储变量
    VAR num x;
    VAR num y;
    VAR num z;
    VAR num rx;
    VAR num ry;
    VAR num rz;
    !声明机器人位姿通用数据容器中间转换变量
    VAR rawbytes rawbyte_x;
    VAR rawbytes rawbyte_y;
    VAR rawbytes rawbyte_z;
    VAR rawbytes rawbyte_rx;
    VAR rawbytes rawbyte_ry;
    VAR rawbytes rawbyte_rz;
    !声明机器人位姿字节型中间数据转换变量
    VAR byte byte_x{4};
    VAR byte byte_y{4};
    VAR byte byte_z{4};
    VAR byte byte_rx{4};
    VAR byte byte_ry{4};
    VAR byte byte_rz{4};
    !声明双精度类型机器人位姿数据变量
    VAR dnum dn_x;
    VAR dnum dn_y;
    VAR dnum dn_z;
    VAR dnum dn_rx;
    VAR dnum dn_ry;
    VAR dnum dn_rz;
    !声明中断数据变量
    VAR intnum TrapNum;
	PROC main()
        IDelete TrapNum;!取消识别号为TrapNum的中断
        CONNECT TrapNum WITH iTrap;!将识别号为TrapNum的中断与中断程序iTrap连接
        ITimer 0.5,TrapNum;!循环调用中断程序TrapNum,循环周期为0.5s
        !循环执行机器人运动程序
        WHILE TRUE DO
            MoveAbsJ jpos10\NoEOffs,v50,z50,tool0;
            MoveJ p10,v50,z50,tool0;
            MoveJ p20,v50,z50,tool0;
            MoveAbsJ jpos10\NoEOffs,v50,z50,tool0;
        ENDWHILE
	ENDPROC
    TRAP iTrap!中断程序iTrap
        !读取机器人当前位置,并将读取数据赋值给pCurrentPos
        pCurrentPos:=CRobT();
        !将读取到的机器人当前位置x、y、z坐标值分别赋值给变量x、y、z
        x:=pCurrentPos.trans.x;
        y:=pCurrentPos.trans.y;
        z:=pCurrentPos.trans.z;
        !将将读取到的机器人当前位置四元数角度值转换为欧拉角之后,分别赋值给变量rx、ry、rz
        rx:=EulerZYX(\x,pCurrentPos.rot);
        ry:=EulerZYX(\y,pCurrentPos.rot);
        rz:=EulerZYX(\z,pCurrentPos.rot);
        !调用发送机器人当前位置例行程序
        send_pCurrentPos;
    ENDTRAP
    PROC send_pCurrentPos()!发送机器人当前位置例行程序
        !清空机器人位姿通用数据容器中间转换变量
        ClearRawBytes rawbyte_x;
        ClearRawBytes rawbyte_y;
        ClearRawBytes rawbyte_z;
        ClearRawBytes rawbyte_rx;
        ClearRawBytes rawbyte_ry;
        ClearRawBytes rawbyte_rz;
        !将机器人当前位置数据按照float形式打包
        PackRawBytes x,rawbyte_x,RawBytesLen(rawbyte_x)+1\Float4;
        PackRawBytes y,rawbyte_y,RawBytesLen(rawbyte_y)+1\Float4;
        PackRawBytes z,rawbyte_z,RawBytesLen(rawbyte_z)+1\Float4;
        PackRawBytes rx,rawbyte_rx,RawBytesLen(rawbyte_rx)+1\Float4;
        PackRawBytes ry,rawbyte_ry,RawBytesLen(rawbyte_ry)+1\Float4;
        PackRawBytes rz,rawbyte_rz,RawBytesLen(rawbyte_rz)+1\Float4;
        !将机器人位姿通用数据容器里的前4个字节数据分别保存到字节数组变量中
        FOR i FROM 1 TO 4 DO
            UnpackRawBytes rawbyte_x,i,byte_x{i}\Hex1;
            UnpackRawBytes rawbyte_y,i,byte_y{i}\Hex1;
            UnpackRawBytes rawbyte_z,i,byte_z{i}\Hex1;
            UnpackRawBytes rawbyte_rx,i,byte_rx{i}\Hex1;
            UnpackRawBytes rawbyte_ry,i,byte_ry{i}\Hex1;
            UnpackRawBytes rawbyte_rz,i,byte_rz{i}\Hex1;
        ENDFOR
        !机器人数据格式转换(西门子PLC高低字节与机器人高低字节定义相反)
        dn_x:=BitLShDnum(NumToDnum(byte_x{1}),24);!将单精度数据byte_x{1}转换为双精度类型后,左移24位,然后赋值给dn_x
        dn_x:=BitOrDnum(dn_x,BitLShDnum(NumToDnum(byte_x{2}),16));!将单精度数据byte_x{2}转换为双精度类型后,左移16位,并与dn_x做或运算,然后赋值给自己
        dn_x:=BitOrDnum(dn_x,BitLShDnum(NumToDnum(byte_x{3}),8));!将单精度数据byte_x{2}转换为双精度类型后,左移8位,并与dn_x做或运算,然后赋值给自己
        dn_x:=BitOrDnum(dn_x,NumToDnum(byte_x{4}));!将单精度数据byte_x{2}转换为双精度类型后,与dn_x做或运算,然后赋值给自己
        !机器人数据格式转换
        dn_y:=BitLShDnum(NumToDnum(byte_y{1}),24);
        dn_y:=BitOrDnum(dn_y,BitLShDnum(NumToDnum(byte_y{2}),16));
        dn_y:=BitOrDnum(dn_y,BitLShDnum(NumToDnum(byte_y{3}),8));
        dn_y:=BitOrDnum(dn_y,NumToDnum(byte_y{4}));
        !机器人数据格式转换
        dn_z:=BitLShDnum(NumToDnum(byte_z{1}),24);
        dn_z:=BitOrDnum(dn_z,BitLShDnum(NumToDnum(byte_z{2}),16));
        dn_z:=BitOrDnum(dn_z,BitLShDnum(NumToDnum(byte_z{3}),8));
        dn_z:=BitOrDnum(dn_z,NumToDnum(byte_z{4}));
        !机器人数据格式转换
        dn_rx:=BitLShDnum(NumToDnum(byte_rx{1}),24);
        dn_rx:=BitOrDnum(dn_rx,BitLShDnum(NumToDnum(byte_rx{2}),16));
        dn_rx:=BitOrDnum(dn_rx,BitLShDnum(NumToDnum(byte_rx{3}),8));
        dn_rx:=BitOrDnum(dn_rx,NumToDnum(byte_rx{4}));
        !机器人数据格式转换
        dn_ry:=BitLShDnum(NumToDnum(byte_ry{1}),24);
        dn_ry:=BitOrDnum(dn_ry,BitLShDnum(NumToDnum(byte_ry{2}),16));
        dn_ry:=BitOrDnum(dn_ry,BitLShDnum(NumToDnum(byte_ry{3}),8));
        dn_ry:=BitOrDnum(dn_ry,NumToDnum(byte_ry{4}));
        !机器人数据格式转换
        dn_rz:=BitLShDnum(NumToDnum(byte_rz{1}),24);
        dn_rz:=BitOrDnum(dn_rz,BitLShDnum(NumToDnum(byte_rz{2}),16));
        dn_rz:=BitOrDnum(dn_rz,BitLShDnum(NumToDnum(byte_rz{3}),8));
        dn_rz:=BitOrDnum(dn_rz,NumToDnum(byte_rz{4}));
        !使用相应的组输出信号,将机器人当前位置数据进行输出
        setgo go_cx,dn_x;
        setgo go_cy,dn_y;
        setgo go_cz,dn_z;
        setgo go_crx,dn_rx;
        setgo go_cry,dn_ry;
        setgo go_crz,dn_rz;
    ENDPROC
ENDMODULE
  • 28
    点赞
  • 135
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: ABB机器人可以通过与PLC(可编程逻辑控制器)的通信来实时输出XYZ(三维坐标)位置。这个过程需要以下步骤: 首先,需要确保ABB机器人和PLC之间建立了可靠的通信连接。通常情况下,可以使用以太网或其他工业通信协议来实现这种连接。 接下来,ABB机器人需要读取自身的XYZ位置信息。机器人通常配备有各种传感器和编码器,可以准确测量其运动中的位置。这些位置信息可以通过机器人控制器获取。 然后,ABB机器人将这些位置信息发送给连接的PLC。这可以通过使用通信协议和相关的通信模块来完成。机器人会将XYZ位置数据打包并传输给PLC。 PLC接收到数据后,可以使用这些位置信息进行控制操作。例如,PLC可以根据机器人当前的XYZ位置调整其动作或控制其他相关设备。这种实时反馈和控制可以帮助优化机器人的运动和与其他设备的协调。 总之,ABB机器人可以通过与PLC的通信实现实时输出XYZ位置。这种实时数据传输可以帮助机器人和PLC之间的协同工作,并实现更加精确和高效的自动化过程。 ### 回答2: ABB机器人是一种具有先进控制系统的可编程机器人,其主要用于自动化生产线上的各种任务。与此同时,PLC(可编程逻辑控制器)是一种常用于工业控制系统的计算机控制设备。为了实现实时输出机器人的XYZ位置给PLC,首先需要将机器人和PLC进行适当的连接和通信。 一种常见的方式是使用以太网或类似的通信网络将机器人和PLC连接起来。通过设置适当的网络协议和通信接口,机器人可以将其当前的XYZ位置数据发送给PLC。机器人的控制系统可以通过获取机器人关节的位置和末端执行器的信息,计算出具体的XYZ位置,并将其转发给PLC。 PLC接收到机器人实时输出的XYZ位置后,可以根据需要进行相应的控制操作。例如,PLC可以将机器人当前位置信息用于生产线上其他设备的控制,调整传送带的速度或位置,或者触发其他相关设备的操作。通过实时输出机器人位置给PLC,可以实现更高效、更灵活的工业自动化控制。 总结来说,ABB机器人可以通过适当的通信网络和协议与PLC进行连接,实时输出机器人的XYZ位置给PLC。这种实时输出可以实现更高效的工业自动化控制,提高生产线的灵活性和生产效率。 ### 回答3: ABB机器人可以实时通过通信协议将xyz位置信息传输给PLC。ABB机器人具有高度准确和可靠的控制系统,能够精确测量并实时更新机器人位置信息。xyz位置指的是机器人的三个坐标轴上的位置,分别表示横坐标、纵坐标和高度坐标。 在与PLC进行通信时,ABB机器人可以通过以太网、Modbus、Profibus等通信协议来与PLC进行数据交换。机器人实时测量到的xyz位置信息通过选定的通信协议发送给PLC,以便PLC能够即时了解并处理机器人位置信息。 PLC可以将机器人位置信息用于控制和监控产线或其他相关应用。例如,在自动化生产线上,PLC可以根据机器人位置信息进行路径规划和协调,确保机器人能够按照预定的轨迹准确运动。另外,PLC还可以利用机器人位置信息进行实时监控和故障检测,在机器人出现异常或错误的情况下及时采取相应的措施。 通过实时输出xyz位置给PLC,ABB机器人与PLC之间实现了紧密的数据交互和协作,提高了生产线的灵活性和效率。同时,这也为实现工业自动化和智能制造提供了技术支持,使得生产过程更加智能化、精确化和高效化。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值