获取更多行业资源
学习更机器人知识
点击蓝字关注我们
本公众号对接ABB、KUKA(库卡)、YASKAWA(安川)、FANUC(发那科)、埃斯顿等机器人业务,欢迎咨询合作
(135-8416-9133)
机器人单机(新/二手)、各类备件(含维修)、调试、保养等
非标集成:工件上下料、搬运(拆码垛)、2D视觉(定位、识别、抓取)、3D视觉(引导、路径规划、免示教)等
诚挚希望与各机器人培训机构,机器人使用单元合作,提供技术支持
对各类主流机器人应用,仿真,毕业设计提供技术支持
友情提示
全国已正式入伏,各位调试工程师请做好降温防暑措施
(本公众号和厂家合作,提供多款降温服,有兴趣可以后台留言)
夏季也是机器人故障高发期,如有需求可及时联系我们
以下正文:
Modbus的前世今生
简单说下这个协议的历史,Modicon公司于1979年制定了Modbus协议标准,并用在其PLC产品上。后来Modicon公司被施耐德收购。已成为一种事实标准协议,同时也被IEC-61158工业通信总线规范收录于type 15子集。所谓一流的企业做标准,二流的企业做品牌,三流的企业做产品。这些标准国人都基本是使用者,而非缔造者,所以使用一下,产品上印个标志,做做相关的测试认证都要给老外交钱。
Modbus协议目前存在用于串口、以太网以及其他支持互联网协议的网络的版本。其中Modbus-RTU通信通过串口EIA-485物理层进行。即Modbus-RTU基于485传输方式进行。若设备只有一个232串口接口,也可购买485转232接口后使用。
此次介绍ABB机器人使用Modbus-RTU与设备进行通讯。ABB机器人使用串口通讯不需要选项。
Step1-ABB机器人控制柜提供com1口作为机器人与外部设备通讯的串口,如下图。若使用Modbus-RTU通讯,需要购买485转223接口。机器人侧用232,在使用串口线时注意交叉接线。
Step2-在示教器的控制面板-配置-主题communication-Serial Port中,根据Modbus-RTU主站设备的要求,设置机器人串口参数。
Step3-Modbus rtu通过不同功能码对相应单个线圈/多个寄存器进行读写,例如使用0x03功能码读取多个保持型寄存器数据,发送数据及返回数据格式如下:
Step4-使用0x10功能码写入多个保持型寄存器数据,发送数据及返回数据格式如下:
Step5-其他功能码如下:
Step6-使用Modbus-RTU进行数据读写时,从站需要发送CRC校验码,CRC校验内容为CRC校验码之前的所有数据,Modbus-RTU CRC校验码计算方法如下:在CRC计算时只用8个数据位,起始位及停止位,如有奇偶校验位也包括奇偶校验位,都不参与CRC计算。
加载一值为0XFFFF的16位寄存器,此寄存器为CRC寄存器。2、 把第一个8位二进制数据(即通讯信息帧的第一个字节)与16位的CRC寄存器的相异或,异或的结果仍存放于该CRC寄存器中。3、 把CRC寄存器的内容右移一位,用0填补最高位,并检测移出位是0还是1。4、 如果移出位为零,则重复第三步(再次右移一位);如果移出位为1,CRC寄存器与0XA001进行异或。5、 重复步骤3和4,直到右移8次,这样整个8位数据全部进行了处理。6、 重复步骤2和5,进行通讯信息帧下一个字节的处理。7、 将该通讯信息帧所有字节按上述步骤计算完成后,得到的16位CRC寄存器的高、低字节进行交换8、 最后得到的CRC寄存器内容即为:CRC校验码
具体代码如下:在任意模块最上方加入自定义数据类型ushort
MODULEserial1RECORDushortnumhigh;numlow;ENDRECORD
FUNCuShort fGetCRC16(byte arr{*},num length)VARdnum crc;VARnum len;VARuShort CRC16;crc:=65535;len:=1;WHILElen<=length DOcrc:=BitXOrDnum(crc,NumToDnum(arr{len}));incrlen;FORi FROM 1 TO 8 DOIFBitAndDnum(crc,0x01)=1 THENcrc:=BitXOrDnum(BitRShDnum(crc,1),0xa001);ELSEcrc:=BitRShDnum(crc,1);ENDIFENDFORENDWHILECRC16.low:=DnumToNum(BitAndDnum(crc,0xff));CRC16.High:=DnumToNum(BitRShDnum(BitAndDnum(crc,0xff00),8));RETURNCRC16;ENDFUNC
以下举例通过ABB机器人对汇川sp600 伺服基于modbusrtu 写入地址H31-00,bit0为1的数据,对伺服Enable。
PROC InnoEnable() rModbusWrite InnoID,[0x31,0x00],[0,1]; !设备地址InnoID为1, 写入数据地址为H31-00,写入数据为1ENDPROC
PROC rModbusWrite(byte slaveID,ushort opAdd,ushort Data) VAR uShort crc; VAR uShort res; VAR byte sendArr{8}; sendArr{1}:=slaveID; sendArr{2}:=0x06; !功能码0x06,写入一个寄存器 sendArr{3}:=opAdd.High; sendArr{4}:=opAdd.low; sendArr{5}:=Data.High; sendArr{6}:=Data.low; crc:=fGetCRC16(sendArr,6); sendArr{7}:=crc.low; sendArr{8}:=crc.High; rSerialWrite sendArr,8; WaitTime 0.5; ENDPROC
PROC rSerialWrite(byte array{*},num len) ClearRawBytes raw_data_out; FOR i FROM 1 TO len DO PackRawBytes array{i},raw_data_out,RawBytesLen(raw_data_out)+1\Hex1; ENDFOR Open "COM1",io_device\Bin; ClearIOBuff io_device; WriteRawBytes io_device,raw_data_out; Close io_device; UNDO Close io_device; ENDPROC
以下举例通过ABB机器人对汇川sp600 伺服基于modbusrtu 读取地址H0B-00的数据,获取伺服电机转速(返回数据为16bit的 INT数据)。
FUNCnum InnoReadSpeed() VAR num result; VAR uShort crc; VAR byte sendArr{8}; VAR byte resultArr{8}; VAR rawbytes rawbyte1;
sendArr{1}:=InnoID; sendArr{2}:=0x04; !read input register use 0x04 sendArr{3}:=0x0B; sendArr{4}:=0x00; !参数地址H0B-00 sendArr{5}:=0X00; sendArr{6}:=0X01; !读取个数1crc:=fGetCRC16(sendArr,6); sendArr{7}:=crc.low; sendArr{8}:=crc.High; rSerialWrite sendArr,8; rSerialRead resultArr,7; crc:=fGetCRC16(resultArr,5); IF crc.High<>resultArr{7} OR crc.low<>resultArr{6} THEN ErrWrite "CRC16-ERROR",""; Stop; EXIT; ENDIF PackRawBytes resultArr{5},rawbyte1,1\Hex1; PackRawBytes resultArr{4},rawbyte1,2\Hex1; UnpackRawBytes rawbyte1,1,result\IntX:=INT; !返回数据为16bit的有符号INT数据,按照INT数据进行 RETURN result;ENDFUNC
PROCrSerialRead(inout byte array{*},num rLength)VARnum num1;ClearRawBytesraw_data_in;Open"COM1",io_device\Bin;Rewindio_device; FOR i FROM 1 TO rLength DO num1:=ReadBin(io_device\Time:=0.5);array{i}:=num1;ENDFORClearIOBuffio_device;Closeio_device;UNDOCloseio_device;ENDPROC
原文来自战略合作伙伴“ABB机器人实战技巧”,欢迎关注点赞。
往期经典
安川机器人选项功能列表(全)
安川机器人常用指令合集
ABB机器人如何实现WAN网口同时使用Socket和Profinet
ABB机器人使用Excel批量修改EIO文件教程
机器人调试工程师的利器——WiFi信号增强器 |