ABB机器人通过总线发送浮点数
声明:本媒体部分图片、文章来源于网络,
版权归原作者所有,如有侵权,请与我联系删除。
ABB机器人使用num和dnum来表示实数。num类似C中的float(单精度实数,使用32位表示,包括1位符号位,8位指数位,23位尾数)。
组输入输出只能发送整数,故可以按照float表示方法,用4个byte来表示num,并通过总线发送。
西门子端没有float,只有real(和float一样用32位表示单精度实数),注意西门子对于数据的处理时,字节高低字节位置和普通相反,故机器人发送接受时,需先反向。
1. 在机器人端创建四个组输出,根据需要设置地址,此处举例通过devicenet,若使用PROFINET,对应设备选择PN_INTERNAL_DEVICE即可。
2. 创建代码如下
VAR rawbytes rawbyte1;
VAR byte byte1{4};
PROC send_real_si()
reg1:=-199.875; !要发送的实数
ClearRawBytes rawbyte1;!将rawbyte清空
PackRawBytes reg1,rawbyte1,1Float4;!把reg1按照float形式打包如rawbyte**个字节开始的连续四个字节
FOR i FROM 1 TO 4 DO
UnpackRawBytes rawbyte1,i,byte1{i}Hex1;
!把rawbyte里的前4个字节数据分别保存到byte数组中
ENDFOR
SetGO gout1,byte1{4};
!由于设置的gout1组输出是低字节,而西门子PLC的高低字节相反,所以此处把byte1{4},即原始数据的高字节放入gout1
SetGO gout2,byte1{3};
SetGO gout3,byte1{2};
SetGO gout4,byte1{1};
waittime 0.5;
3. 由于配置四个组输出分别为0-7,8-15,16-23,24-31,所以在西门子PLC中创建in_real1变量,对应地址为ID0(即IB0,IB1,IB2,IB3),此时ABB机器人发送实数-199.875,PLC正常接受得到实数-199.875,如下图
4. 以上方法主要考虑西门子PLC高低字节和机器人高低字节不同,分成4个组输出,亦可在机器人创建一个组输出gout_real,地址为0-31,如下图
5. 方法和步骤2一样,只是在得到4个byte后,通过左移和取或来完成4个byte的拼接。插入如下代码
VAR dnum dn_senddata;
VAR dnum dn_recvdata;
VAR rawbytes rawbyte1;
VAR byte byte1{4};
PROC send_real_si()
reg1:=-199.875;
ClearRawBytes rawbyte1;
PackRawBytes reg1,rawbyte1,1Float4;
FOR i FROM 1 TO 4 DO
UnpackRawBytes rawbyte1,i,byte1{i}Hex1;
ENDFOR
dn_senddata:=BitLShDnum(NumToDnum(byte1{1}),24);
!由于西门子PLC高低字节与机器人高低字节定义相反,故此处把byte1{左移24位}
dn_senddata:=BitOrDnum(dn_senddata,BitLShDnum(NumToDnum(byte1{2}),16));
!把byte1{2}左移16位,并和上一步获得的左移24位数据合并(使用or或)
dn_senddata:=BitOrDnum(dn_senddata,BitLShDnum(NumToDnum(byte1{3}),8));
!把byte1{3}左移8位,并和上一步获得的数据合并(使用or或)
dn_senddata:=BitOrDnum(dn_senddata,NumToDnum(byte1{4}));
!把byte1{4}和上一步获得的数据合并(使用or或)
setgo gout_real,dn_senddata;
waittime 0.5;
6 测试结果同前文,
7 机器人接受PLC发送浮点数,方法类似,此处举例创建一个32为组输入gin_real
8 创建代码如下:
PROC recv_real_si()
dn_recvdata:=GInputDnum(gin_real);
!将组输入转为dnum类型
byte1{4}:=dnumtonum(BitAndDnum(dn_recvdata,255));
!获取组输入的低字节并放入byte1数值中的第{4}元素
dn_recvdata:=BitRShDnum(dn_recvdata,8);
!将dn_recvdata右移8位,即去除*低字节内容
byte1{3}:=dnumtonum(BitAndDnum(dn_recvdata,255));
!获取组输入的第二字节并放入byte1数值中的第{3}元素
dn_recvdata:=BitRShDnum(dn_recvdata,8);
byte1{2}:=dnumtonum(BitAndDnum(dn_recvdata,255));
dn_recvdata:=BitRShDnum(dn_recvdata,8);
byte1{1}:=dnumtonum(BitAndDnum(dn_recvdata,255));
ClearRawBytes rawbyte1;
FOR i FROM 1 TO 4 DO
PackRawBytes byte1{i},rawbyte1,iHex1;
!将byte1数组打包如rawbyte1
ENDFOR
UnpackRawBytes rawbyte1,1,reg2Float4;
!按照float,将rawbyte1中的第1字节开始的4个字节数据转化成float,放入reg2中
9在PLC中创建out_real1,地址为QD0(即QB0~QB3),对out_real1赋值,ABB机器人接受测试结果如下:
10 以上方法也可参考前文,创建4个8位的组输入,并使用PackRawbyte和UnPackRawbyte指令获得实数。