[西门子] ABB机器人读写ModbusTCP从站浮点数

[复制链接]
查看59186 | 回复0 | 2024-2-21 08:47:06 | 显示全部楼层 |阅读模式
容请点击上方 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



如向西门子modbus从站寄存器0和1发送浮点数 -0.98时,寄存器0的显示需要修改为如下图的Float BA DC,使用使用以下代码:writeFloat2Reg 0,-0.98\bSiemens;

注:西门子modbus的每个寄存器内的字节需要颠倒



MODULEmodbusTCP_Master    !!!!!!! support holding register    !!!!!!! support holding coil    !!!!!!! support 0x03 0x06 0x10 0x01 0x05 0x0F function
VARsocketdev sock_mod;VARrawbytes recv_raw;    VAR rawbytes send_raw;
    !!!!!! data need to be modifiedPERSbool bBigEndian:=TRUE;PERSstring slave_ip:="127.0.0.1";    PERS num slave_ID:=1;   PERSnum regAdd:=1;VARnum outValue{50};
PROCmain()writeFloat2Reg0,-0.98;        ! 向寄存器地址0开始两个寄存器写入浮点数-0.98reg1:=readFloatFromReg(0);        ! 从寄存器地址0开始两个寄存器读取数据,并转化为浮点数stop;
writeFloat2Reg0,-0.98\bSiemens;        ! 向西门子寄存器地址0开始两个寄存器写入浮点数-0.98        ! 西门子modbus,高word在前,每个word内高低字节颠倒reg1:=readFloatFromReg(0\bSiemens);stop;ENDPROC
PROCcheckSocket()ifSocketGetStatus(sock_mod)<>SOCKET_CONNECTED THENSocketClosesock_mod;SocketCreatesock_mod;SocketConnectsock_mod,slave_ip,502\Time:=10;endifENDPROC
funcnum 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    dataVARnum b{100};VARnum dataByteLen;VARnum w_high;VARnum w_low;VARnum 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;
ClearRawBytessend_raw;FORi FROM 1 TO 8 DOPackRawBytesb{i},send_raw,i\IntX:=1;ENDFORPackRawBytesregAdd,send_raw\Network,9\IntX:=2;PackRawBytes2,send_raw\Network,11\IntX:=2;sendAndReceive;
UnPackRawBytesrecv_raw\Network,9,dataByteLen\IntX:=UsINT;
IFpresent(bSiemens) THENUnPackRawBytesrecv_raw\Network,10,w_high\IntX:=UINT;UnPackRawBytesrecv_raw\Network,12,w_low\IntX:=UINT;PackRawBytesw_high,recv_raw,10\IntX:=2;PackRawBytesw_low,recv_raw,12\IntX:=2;ENDIFUnPackRawBytesrecv_raw\Network,10,outValue\Float4;RETURNoutValue;ENDFUNC
PROCwriteFloat2Reg(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
VARnum b{100};VARnum v1;VARnum v2;VARrawbytes out_raw;VARnum 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;
ClearRawBytessend_raw;FORi FROM 1 TO 8 DOPackRawBytesb{i},send_raw,i\IntX:=1;ENDFORPackRawBytesregAdd,send_raw\Network,9\IntX:=2;PackRawBytes2,send_raw\Network,11\IntX:=2;PackRawBytes2*2,send_raw\Network,13\IntX:=1;
        PackRawBytes data,out_raw\Network,1\Float4;IFPresent(bSiemens) THENUnpackRawBytesout_raw\Network,1,v1\IntX:=2;UnpackRawBytesout_raw\Network,3,v2\IntX:=2;
PackRawBytesv1,out_raw,1\IntX:=2;PackRawBytesv2,out_raw,3\IntX:=2;ENDIFCopyRawBytesout_raw,1,send_raw,14;PackRawBytes7+2*2,send_raw\Network,5\IntX:=2;sendAndReceive;    ENDPROCENDMODULE
********************************

如何获取更多经典文章?

关注公众号 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
您需要登录后才可以回帖 登录 | 注册哦

本版积分规则