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

ABB机器人集成经销服务商

产品:87    
联系我们
联系方式
  • 联系人:魏经理
  • 电话:18964551752
  • 邮件:2064199103@qq.com
  • 手机:18964551752
站内搜索
 
新闻分类
  • 暂无分类
首页 > 新闻中心 > ABB机器人MODBUS RTU通讯
新闻中心
ABB机器人MODBUS RTU通讯
发布时间:2022-05-30        浏览次数:709        返回列表
    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,在使用串口线时注意交叉接线。
微信图片_20220530160050
在示教器的控制面板-配置-主题communication-Serial Port中,根据Modbus RTU主站设备的要求,设置机器人串口参数
微信图片_20220530160106
2. Modbus rtu通过不同功能码对相应单个线圈/多个寄存器进行读写,例如使用0x03功能码读取多个保持型寄存器数据,发送数据及返回数据格式如下:
微信图片_20220530160127
使用0x10功能码写入多个保持型寄存器数据,发送数据及返回数据格式如下:
微信图片_20220530160145
3. 其他功能码如下:
微信图片_20220530160209
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的数据,对伺服Enable
PROC InnoEnable()
        rModbusWrite InnoID,[0x31,0x00],[0,1];
      !设备地址InnoID为1, 写入数据地址为H31-00,写入数据为1
ENDPROC

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机器人服务商



 

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

技术和报价服务:星期一至星期六8:00-22:00 ABB机器人集成经销服务商

返回
顶部