ABB机器人高低字节颠倒处理方法

[复制链接]
查看19195 | 回复0 | 前天 09:22 | 显示全部楼层 |阅读模式
字节序即为多字节对象存储在内存中的字节顺序,有两种不同的存储方案:大端法和小端法。现代的处理器大多为双端法,大小端都支持,可以配置称大端法或者小端法。大端法:最高有效字节在最前面的方式称为大端法,例如假设变量x类型为int型,位于地址0x100的地方,其16进制值为0x12345678,地址范围为0x100到0x103字节。对于大端法的机器来说:

由上图可见,地址从左向右增长,x的最高有效字节12在最前面存储。这正好和我们平时书写习惯一致,先书写最高有效字节,再依次写其余字节。小端法:最低有效字节在最前面的方式成为小端法,这正好和大端法相反,仍然用大端法中举的例子说明:

由上图可见,地址依然从左向右增长,x的最低有效字节在最前面存储,与大端法相反。ABB机器人中,默认采用小端法存储。而ProfiBus/Profinet和InterBus使用大端法(即西门子PLC采用大端法)此时若ABB发送32bit的组输出255(即最低字节为0XFF),西门子PLC直接收到的32bit对应的DWORD为4278190080(即如下图所示的高低字节颠倒了)

为解决此问题,ABB机器人在发送组输出时,方法一:配置IO地址时,人为颠倒,如下图,这样setgo go2,255时,ABB机器人输出的组输出自动高低字节颠倒,西门子PLC接收到也为255

方法二:不修改IO配置,而是采用如下packrawbyte语句进行高低字节的处理,即采用unpackrawbyte指令中的Network参数,此参数会按照大端法进行数据处理。注:Network参数只有与可选参数 \IntX - UINT、UDINT、ULINT、INT、DINT、LINT和\Float4在一起时才存在关联性。  PROCtest1()setdata\bSiemens,gout1,255;  ENDPROC PROCsetdata(\switch bSiemens,VAR signalgo goutput,dnum data)VARdnum d;VARrawbytes rawbyte1;d:=data;IFPresent(bSiemens) THENPackRawBytesd,rawbyte1,1\IntX:=UDINT;UnpackRawBytesrawbyte1\Network,1,d\IntX := UDINT;ENDIF        setgo goutput,d;ENDPROC
********************************


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册哦

x
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则