1.1 通过总线发送实数
前文介绍了ABB工业机器人支持的I/O信号类型,包括单个数字量输入与输出信号,组输入与输出信号,以及模拟量输入与输出信号。对于组输入和组输出信号,只能赋值非负整数。
现场在遇到需要传输实数(包括负整数、带小数部分的数据等)时,多数采取先将数据统一加一个数转化为正实数(如统一加300),再将新数据统一乘以一个数转化为正整数(如乘以1000),如式(1-3)所示。PLC在收到数据后,做对应的反运算,就可得到实际需要的实数。
此类方法较为烦琐,且需要机器人和PLC双方事先做好约定。若有一方修改规则,则收发数据就会出现问题。
PLC端均支持常见的计算机数据类型,包括USINT、UINT、UDINT、ULINT、SINT、INT、DINT、LINT 及REAL(相当于标准Float 32位单精度浮点数)。以上数据类型均符合IEC 61131-3标准。对于以上不同的数据类型,最终均转化为二进制。机器人要发送相应类型的数据,只需要按照IEC 61131-3标准对数据进行打包转化即可。PLC端在接收数据时,将对应地址位数据的类型设置成与机器人侧数据相同的类型,则PLC端可自动获取对应类型的数据(如REAL和DINT等)。
可以利用机器人指令PackRawBytes将不同的数据类型打包成二进制,并利用指令UnPackRawBytes将打包好的二进制数据转化为非负整数的形式,通过机器人的组输出信号发送。PLC端收到对应的二进制数据后,根据数据类型自动解析,得到所需数据,其包括REAL和DINT等类型。
PackRawBytes integer, raw_data, (RawBytesLen(raw_data)+1) \IntX := DINT; 表示将数据integer以整数形式DINT(有符号的双字整数)打包至rawbyte类型的数据raw_data中,存储于当前raw_data已有数据的下一字节开始的位置,占据4字节。IntX参数可以选择的整数打包类型见表1-3。
PackRawBytes float, raw_data, RawBytesLen(raw_data)+1) \Float4;表示将数据float以单精度实数形式Float4打包至rawbyte类型的数据raw_data中,存储于当前raw_data已有数据的下一字节开始的位置,占据4字节。
UnpackRawBytes raw_data, 1, g_out1 \IntX := UDINT; 表示在raw_data数据中,将以第一字节开始连续的4字节的数据转化为UDINT类型(无符号双字整数)并存储于数据g_out1(实际上g_out1可以是一个num类型的数据,或者是一个组输出信号数据)。
利用以上指令,即可把REAL或者DINT等数据转化为UDINT类型的非负整数,并通过组输出信号发送给网络上的其他设备。PLC端在接收到相应的二进制数据后,根据收到的数据类型进行自动转化,即可得到REAL或者DINT等数据结果。
在ABB工业机器人的RAPID编程中,直接使用num和dnum类型进行编程。num和dnum均可表示整数和实数。在表示相应的整型数据时,参考表1-3的限制。
表1-3 RAPID支持的整型数据
续表
注:* 关于储存数据类型num中整型数据的RAPID限制。
** 关于储存数据类型dnum中整型数据的RAPID限制。
*** 使用dnum时的范围。
**** 使用dnum时的范围。
为考虑通用性,可编写代码1-2实现ABB工业机器人通过工业总线发送/接收实数和负数。发送数据时使用自定义指令setdata(可选参数根据实际需要转化的数据类型进行选择)实现,接收数据时使用自定义函数getdata(可选参数根据实际需要转化的数据类型进行选择)实现。
代码1-2
代码1-3所示举例说明如何使用上述自定义指令与函数通过总线发送/接收数据。
代码1-3
在使用以上代码前,需要先在机器人的控制器中创建对应的组输出信号和组输入信号:
(1)针对DINT类型的数据,在I/O信号配置处创建组输入/组输出信号,长度为32位。例如,Device Mapping地址为“0-31”(若遇到西门子等PLC端存在高低字节颠倒问题,则Device Mapping的写法为“24-31,16-23,8-15,0-7”,如图1-7所示)。
(2)针对INT类型的数据,在I/O信号配置处创建组输入/组输出信号,长度为16位。例如,Device Mapping 地址为“0-15”(若遇到西门子等PLC端存在高低字节颠倒问题,则Device Mapping写的法为“8-15,0-7”)。
(3)针对FLOAT/REAL类型的数据,在I/O信号配置处创建组输入/组输出信号,长度为32位。例如,Device Mapping地址为“0-31”(若遇到西门子等PLC端存在高低字节颠倒问题,则Device Mapping的写法为“24-31,16-23,8-15,0-7”,如图1-7所示)。
(4)针对SINT类型的数据,在I/O信号配置处创建组输入/组输出信号,长度为8位。例如,Device Mapping地址为“0-7”。
图1-7 组输入/组输出信号高低字节颠倒问题的处理方法