您好!欢迎光临工博士商城

ABB机器人配件服务运营商

产品:208    

咨询热线:18616599333

QQ QQ
您当前的位置:首页 » 新闻中心 » ABB机器人通过总线发送浮点数
产品分类
新闻中心
ABB机器人通过总线发送浮点数
发布时间:2019-10-14        浏览次数:2039        返回列表
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,如下图
PLC正常接受得到实数-199.875,如下图

4. 以上方法主要考虑西门子PLC高低字节和机器人高低字节不同,分成4个组输出,亦可在机器人创建一个组输出gout_real,地址为0-31,如下图

个组输出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 测试结果同前文,
6 测试结果同前文,

7 机器人接受PLC发送浮点数,方法类似,此处举例创建一个32为组输入gin_real

此处举例创建一个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机器人接受测试结果如下:

9在PLC中创建out_real1,地址为QD0(即QB0~QB3),对out_real1赋值,机器人接受测试结果如下
10 以上方法也可参考前文,创建4个8位的组输入,并使用PackRawbyte和UnPackRawbyte指令获得实数。 







 

联系热线:18616599333   联系人:赵经理 联系地址:上海市宝山区富联一路98弄6号

技术和报价服务:星期一至星期六8:00-22:00 ABB机器人配件服务运营商