最后更新:2022-01-25 10:50:12 手机定位技术交流文章
最近对接一份协议使用Modbus TCP,下位机跟硬件的同事给过来的对接协议上对值类型的描述是word跟Dword。一开始并没有想那么多,按照C#惯用的UShort通过BitConverter.GetBytes()转成byte[]根据协议套到指定位置就好,做好给到下位机去测试才发现的问题:在涉及到协议中的Dword类型的值时,给出去或者读取到的值都会有问题。
按照同事的说法,他们要的是32位的有符号浮点类型数值。
所以,在C#代码中我们使用float即可:
转出来的byteDatas的count是4位,至此我才想明白协议内容上偶尔会空出一个地址的原因,同样,模拟器上值设定成float后也会空出一位,作为上一位数值字长的补充:
,这种情况下就得使用写多个寄存器的方式0x10来写值了。
同时,我们还需要留心下位机这里的方式:
也可能是float inverse类型等,需要根据实际情况调整转换的值。
一开始我并没有意识到0x01功能号中数据长度的意义,事实上,数据长度如果超过当前地址的值,会往后延伸到后面的地址。寄存器也同理,如上述的一个值占用两个地址等。
在Modbus中,一个地址占2个字节,超过,当然就算下个地址了。
而在报文里面,一般1个地址也是由2个字节进行描述。

我们可以设定好地址和数据长度, 对返回的数据做处理:
如下,可以对应上线圈的状态:
关于Modbus TCP更加基础的学习,可以参照: ModbusTCP协议学习笔记_iknow_nothing的博客-CSDN博客_modbustcp
同时,可以借助网络调试工具,对照学习: NetAssist网络调试助手 V5.0.2-软件工具-野人家园 (cmsoft.cn)
本文由 在线网速测试 整理编辑,转载请注明出处。