抖音粉丝群1
『7x24小时有问必答』

容请点击上方 ABB机器人实战技巧 关注
也可点击公众号下方 往期经典 浏览更多内容
转载请先后台留言,大家一起支持原创,推动机器人使用和发展
本公众号对各类ABB机器人应用,仿真,毕业设计提供技术支持,详细后台留言
本公众号诚挚希望与各机器人培训机构,机器人使用单元合作,提供技术支持,详细后台留言

1. ABB机器人原生没有提供Modbus Master功能,需要客户根据modbusTCP定义,自行编写数据收发,见ABB机器人Modbus/TCP 通讯
2. modbusTCP通常读写的寄存器为word(2个字节)。机器人作为master,如果希望读写从站的寄存器,并传入浮点数,可以参考以下代码,即讲float打包成4个字节,并且按照定义发动modbus从站的连续2个寄存器上。从站根据定义解析即可。

注意:modbusTCP默认采用大端编码,即高字节在前,低字节在后。例如使用以下代码:writeFloat2Reg 0,-0.98;  向modbus从站寄存器0和1发送浮点数 -0.98时,寄存器0的显示需要修改为如下图的Float AB CD
1.png
向西门子modbus从站寄存器0和1发送浮点数 -0.98时,寄存器0的显示需要修改为如下图的Float BA DC,使用使用以下代码:writeFloat2Reg 0,-0.98\bSiemens;  
注:西门子modbus的每个寄存器内的字节需要颠倒
2.png
MODULE modbusTCP_Master
    !!!!!!! support holding register
    !!!!!!! support holding coil
    !!!!!!! support 0x03 0x06 0x10 0x01 0x05 0x0F function

    VAR socketdev sock_mod;
    VAR rawbytes recv_raw;
    VAR rawbytes send_raw;

    !!!!!! data need to be modified
    PERS bool bBigEndian:=TRUE;
    PERS string slave_ip:="127.0.0.1";
    PERS num slave_ID:=1;   
    PERS num regAdd:=1;
    VAR num outValue{50};

    PROC main()
        writeFloat2Reg 0,-0.98;
        ! 向寄存器地址0开始两个寄存器写入浮点数-0.98
        reg1:=readFloatFromReg(0);
        ! 从寄存器地址0开始两个寄存器读取数据,并转化为浮点数
        stop;

        writeFloat2Reg 0,-0.98\bSiemens;
        ! 向西门子寄存器地址0开始两个寄存器写入浮点数-0.98
        ! 西门子modbus,高word在前,每个word内高低字节颠倒
        reg1:=readFloatFromReg(0\bSiemens);
        stop;
    ENDPROC

    PROC checkSocket()
        if SocketGetStatus(sock_mod)<>SOCKET_CONNECTED THEN
            SocketClose sock_mod;
            SocketCreate sock_mod;
            SocketConnect sock_mod,slave_ip,502\Time:=10;
        endif
    ENDPROC

    func num readFloatFromReg(num regAdd\switch bSiemens)
        ! read float(4bytes) from 2 register, add1 with high word,  add2 with low word
        ! funNo: 0x03: read multi holding register
        !        device send:    0000 0000 0006           01         03       0001      0001
        !                                  ttl data len   slaveID    funNo    add       data_num
        !        robot feedback: 0000 0000 0005           01         03       02               0001
        !                                  ttl data len   slaveID    funNo    rest_data_len    data
        VAR num b{100};
        VAR num dataByteLen;
        VAR num w_high;
        VAR num w_low;
        VAR num outValue;
        checkSocket;
        b{1}:=0x00;
        b{2}:=0x00;
        b{3}:=0x00;
        b{4}:=0x00;
        b{5}:=0x00;
        b{6}:=0x06;
        b{7}:=slave_ID;
        b{8}:=0x03;

        ClearRawBytes send_raw;
        FOR i FROM 1 TO 8 DO
            PackRawBytes b{i},send_raw,i\IntX:=1;
        ENDFOR
        PackRawBytes regAdd,send_raw\Network,9\IntX:=2;
        PackRawBytes 2,send_raw\Network,11\IntX:=2;
        sendAndReceive;

        UnPackRawBytes recv_raw\Network,9,dataByteLen\IntX:=UsINT;

        IF present(bSiemens) THEN
            UnPackRawBytes recv_raw\Network,10,w_high\IntX:=UINT;
            UnPackRawBytes recv_raw\Network,12,w_low\IntX:=UINT;
            PackRawBytes w_high,recv_raw,10\IntX:=2;
            PackRawBytes w_low,recv_raw,12\IntX:=2;
        ENDIF
        UnPackRawBytes recv_raw\Network,10,outValue\Float4;
        RETURN outValue;
    ENDFUNC

    PROC writeFloat2Reg(num regAdd,num data\Switch bSiemens)
        ! write float(4bytes) to 2 register,
        ! funNo: 0x10: write multi holding register
        !        device send:    0000 0000 000B           FF   10       0002  0002      04              0021   002A
        !                                  ttl_data_len   id  funNo     add   data_num  rest_data_len   data1  data2
        !        robot feedback: 0000 0000 0006           FF   10       0002  00 02
        !                                  ttl_data_len   id   funNo    add   data_num

        VAR num b{100};
        VAR num v1;
        VAR num v2;
        VAR rawbytes out_raw;
        VAR num dataByteLen;
        checkSocket;
        b{1}:=0x00;
        b{2}:=0x00;
        b{3}:=0x00;
        b{4}:=0x00;
        !        b{5}:=0x00;
        !        b{6}:=0x06;
        b{7}:=slave_ID;
        b{8}:=0x10;

        ClearRawBytes send_raw;
        FOR i FROM 1 TO 8 DO
            PackRawBytes b{i},send_raw,i\IntX:=1;
        ENDFOR
        PackRawBytes regAdd,send_raw\Network,9\IntX:=2;
        PackRawBytes 2,send_raw\Network,11\IntX:=2;
        PackRawBytes 2*2,send_raw\Network,13\IntX:=1;

        PackRawBytes data,out_raw\Network,1\Float4;
        IF Present(bSiemens) THEN
            UnpackRawBytes out_raw\Network,1,v1\IntX:=2;
            UnpackRawBytes out_raw\Network,3,v2\IntX:=2;

            PackRawBytes v1,out_raw,1\IntX:=2;
            PackRawBytes v2,out_raw,3\IntX:=2;
        ENDIF
        CopyRawBytes out_raw,1,send_raw,14;
        PackRawBytes 7+2*2,send_raw\Network,5\IntX:=2;
        sendAndReceive;
    ENDPROC
ENDMODULE
********************************
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

上一主题上一主题         下一主题下一主题
QQ手机版小黑屋粤ICP备17165530号

关于我们·投诉举报· 用户帮助· 联系我们 · 本站服务 · 版权声明· 隐私政策 · 投搞指南

法律保护:PLC技术网,plcjs.com,plcjs.net等字样
Copyright 2010-2030. All rights reserved. 


微信公众号二维码 抖音二维码 百家号二维码 今日头条二维码哔哩哔哩二维码