[三菱] ABB机器人MODBUS RTU通讯

[复制链接]
查看85698 | 回复0 | 2024-4-14 23:55:35 | 显示全部楼层 |阅读模式
更多内容请点击上方 ABB机器人实战技巧 关注

也可点击公众号下方 往期经典 浏览更多内容

转载请先后台留言,大家一起支持原创,推动机器人使用和发展

本公众号对各类ABB机器人应用,仿真,毕业设计提供技术支持,详细后台留言

本公众号诚挚希望与各机器人培训机构,机器人使用单元合作,提供技术支持,详细后台留言
      Modbus是一种串行通信协议,是Modicon公司(现在的施耐德电气Schneider Electric)于1979年为使用可编程逻辑控制器(PLC)通信而发表。Modbus已经成为工业领域通信协议的业界标准(De facto),并且现在是工业电子设备之间常用的连接方式。     Modbus协议目前存在用于串口、以太网以及其他支持互联网协议的网络的版本。    其中Modbus RTU通信通过串口EIA-485物理层进行。即Modbus RTU基于485传输方式进行。若设备只有一个232串口接口,也可购买485转232接口后使用。   本文介绍ABB机器人使用Modbus RTU与设备进行通讯。   ABB机器人使用串口通讯不需要选项。   1. ABB机器人控制柜提供com1口作为机器人与外部设备通讯的串口,如下图。若使用Modbus RTU通讯,需要购买485转223接口。机器人侧用232,在使用串口线时注意交叉接线。

在示教器的控制面板-配置-主题communication-Serial Port中,根据Modbus RTU主站设备的要求,设置机器人串口参数

2. Modbus rtu通过不同功能码对相应单个线圈/多个寄存器进行读写,例如使用0x03功能码读取多个保持型寄存器数据,发送数据及返回数据格式如下:

使用0x10功能码写入多个保持型寄存器数据,发送数据及返回数据格式如下:

3. 其他功能码如下:

4. 使用Modbus RTU进行数据读写时,从站需要发送CRC校验码,CRC校验内容为CRC校验码之前的所有数据,Modbus RTU CRC校验码计算方法如下:在CRC计算时只用8个数据位,起始位及停止位,如有奇偶校验位也包括奇偶校验位,都不参与CRC计算。1、  加载一值为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校验码具体代码如下:FUNC uShort fGetCRC16(byte arr{*},num length)        VAR dnum crc;        VAR num len;        VAR uShort CRC16;        crc:=65535;        len:=1;        WHILE len<=length DO            crc:=BitXOrDnum(crc,NumToDnum(arr{len}));            incr len;            FOR i FROM 1 TO 8 DO                IF BitAndDnum(crc,0x01)=1 THEN                    crc:=BitXOrDnum(BitRShDnum(crc,1),0xa001);                ELSE                    crc:=BitRShDnum(crc,1);                ENDIF            ENDFOR        ENDWHILE        CRC16.low:=DnumToNum(BitAndDnum(crc,0xff));        CRC16.High:=DnumToNum(BitRShDnum(BitAndDnum(crc,0xff00),8));        RETURN CRC16;    ENDFUNC
5. 以下举例通过ABB机器人对汇川sp600 伺服基于modbusrtu 写入地址H31-00,bit0为1的数据,对伺服EnablePROC 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
6. 以下举例通过ABB机器人对汇川sp600 伺服基于modbusrtu 读取地址H0B-00的数据,获取伺服电机转速(返回数据为16bit的 INT数据)FUNC num 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;       !读取个数1        crc:=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
     PROC rSerialRead(inout byte array{*},num rLength)        VAR num num1;        ClearRawBytes raw_data_in;        Open "COM1",io_device\Bin;        Rewind io_device;        FOR i FROM 1 TO rLength DO            num1:=ReadBin(io_device\Time:=0.5);            array{i}:=num1;        ENDFOR        ClearIOBuff io_device;        Close io_device;    UNDO        Close io_device;    ENDPROC

********************************

如何获取更多经典文章?

关注公众号 ABB机器人实战技巧,点击页面底部的往期经典和配置,查看更多经典内容

点击阅读原文,学习robotstudio仿真,获取完整教学视频

更多内容

★ 如何搜索历史文章

★基于pcsdk传输文件到HOME及加载

通过总线发送实数及负整数

★使用定时中断向PLC发送机器人位置

★信号的准确提早触发

★变位机校准

★ABB机器人零位校准的那些秘密

★创建UDP通讯

★旋转姿态的左乘与右乘

★通过socket控制机器人启停

上位机仪表盘实时显示机器人速度

★机器人画哆啦A梦

上位机实时控制机器人运动之EGM

Python控制ABB机器人运动

通过Excel批量修改EIO文件

带连杆的机器人正运动学计算

制作四连杆机构

机器人PROFINET同时做CONTROLLER和DEVICE

★语音控制ABB机器人

★手机访问web控制机器人

★自定义伺服焊枪

★制作输送链抓取搬运码垛工作站

★随机物料产生与抓取

★四轴机器人定义TCP

★自定义外部轴-变位机

★示教四点完成码垛

★multimove之双机器人与变位机

Robotware6.08碰撞预测启用与关闭

SMB板针脚解释

四六关节耦合限制

求两点间距离

新I/O DSQC1030配置

ABB机器人配置伺服焊枪

转角路径故障不提示设置

外部PLC选择机器人程序

一键回HOME程序

机器人各轴上下限位修改

Wobjdata数据解释

输送链跟踪与视觉的联系

急停与自动停止接线

更多大牛讲解视频,可以微信搜索ABB机器人实战技巧,或者扫描以下二维码关注

本帖子中包含更多资源

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

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

本版积分规则