2025年modbus RTU报文格式(modbus RTU报文格式响应高低位合并)

modbus RTU报文格式(modbus RTU报文格式响应高低位合并)h4 功能码 01 读取线圈状态 h4 主站发报文 从站反报文 主站发送报文格式 从站地址 功能码 起始地址 16 进制 xx xx 格式 读取线圈长度 16 进制 xxxx 格式 校验码 从站返回报文格式 从站地址 功能码 字节数 线圈长度 8 向上取整 XX 格式 即线圈最大长度是 FF 转十进制就是 255 读取数值 8 个线圈就是 XX

大家好,我是讯享网,很高兴认识大家。



 <h4>功能码01&#xff1a;读取线圈状态</h4> 

讯享网

主站发报文,从站反报文

主站发送报文格式:从站地址+功能码+起始地址(16进制xx xx格式)+读取线圈长度(16进制xxxx格式)+校验码

从站返回报文格式:从站地址+功能码+字节数(线圈长度/8,向上取整)(XX格式,即线圈最大长度是FF转十进制就是255)+读取数值(8个线圈就是XX,16个线圈就是XX XX)+校验码

举两个例子

例一:主站配置(modbus poll)


讯享网

从站地址即SlaveId=1,功能码即Function 中的01,起始地址即Address=1(格式是XX XX),读取线圈数即Quantity=9

所以主站发送报文应该是:从站地址+功能码+起始地址(16进制xxxx格式)+读取线圈长度(16进制xxxx格式)+校验码

01 01 00 01 00 09 +校验码

从站配置

从站地址=1,功能码=01,字节数=读取线圈数/8=98(向上取整)=2(XX格式),读取数值即0(转16进制数为FF,因为字节数是2所以格式是 XX XX,如果字节数是1则是XX)+校验码

所以从站返回报文应该是:从站地址+功能码+字节数(线圈长度/8,向上取整)(XX格式,即线圈最大长度是FF转十进制就是255)+读取数值(8个线圈就是XX,16个线圈就是XX XX)+校验码

01 01 02 FF 00 +校验码

自己推出:发送-》01 01 00 01 00 09 +校验码

                返回-》01 01 02 FF 00 +校验码

测试得出:一致

疑问:为什么字节数是1读取的数值位是XX呢

应为1个字节=8位最大时为 1111 1111转16进制就是FF,所以就是XX代替啦!

功能码02:读取输入状态

读取输入状态(功能码02)与01报文格式基本一样。只是02效率按字节读取,01是按位读取,如果读取线圈长度是8的倍数用02效率更合适

功能码03:读取保持寄存器

主站发送报文格式:从站地址+功能码+起始地址(16进制xx xx格式)+读取寄存器长度(16进制xx xx格式,一个寄存器等于2个字节,按道理来说最大也是存储FFFF转10进制就是65535,但是好像存不了那么大,后面再来看)+校验码

从站返回报文格式:从站地址+功能码+读取字节数(读取寄存器长度*2,XX格式)+读取的数值(XX XX)+校验码

如:主站发送报文格式:01 03 00 00 00 02 +校验码          读取两个寄存器长度

那么从站发送的报文格式应该是:01 03 04 xx xx(寄存器1的值) xx xx(寄存器2的值)+校验码

功能码04:读多路输入寄存器

报文格式和03一样,和03的区别在于读取的存储器不一样,03表示读取保持寄存器,04读取的是输入寄存器。

功能码05:写1路开关量输出(有些地方叫强制单线圈(功能码05))

当我写到这里的时候,我开始纳闷了,怎么从站可选的功能码没有05,查了资料后才知道:

相对modbus Slave设置

主站用功能码0X01,0X05,0X0F的时候,从站对应的都是01功能码

主站用功能码0X03,0X06,0X10的时候,从站对应的都是03功能码

真正的从站返回报文还是和主站发送的报文功能码部分一致的。

主站发送报文格式:从机地址+功能码+起始地址+控制命令(格式xx xx 其中FF00表示合即写入线圈值1,0000表示分即写入线圈值0)+校验码

从站返回报文格式:从机地址+功能码+起始地址+控制命令+校验码(同)

因为05功能码只用于写入单线圈

功能码XX0F:写多路开关量输出

简而言之就是一次写入线圈(布尔值)

主站发送报文格式:从机地址(xx)+功能码(xx)+起始地址(xx xx)+写入线圈数量(xx xx)+字节数(xx)+数据1(XX)+数据2+…+校验码    (空的数据为用01来补)

从站发送报文格式:从机地址+功能码+起始地址+写入线圈数量(即强制线圈数)+校验码(同

实践一下吧!

准备从地址00 0A开始写入数值  0 1 1 1 0 1 1 1 0 1  这10个数值

分析得到的发送报文是:01 0F 00 0A 00 0A 00 02 00 00 FF 00 FF 00 FF 00 00 00 FF 00 FF 00 FF 00 00 00 FF 00 +校验码 

分析得到的返回报文是:01 0F 00 0A 00 0A+校验码

结果是

我写的数据区有差异,这里数据区应该转成16进制发送,10个线圈 要用2个字节即2个XX表示

所以正确的主站发送报文的格式应该是:

01 0F 00 0A 00 0A 02 (低八位先转十六进制为 EE) (10补0到8位为00000010转十六进制为 02) +校验码 

最终主站发送报文:01 0F 00 0A 00 0A 02 EE 02+校验码

功能码06:写单路寄存器

主站报文格式:从机地址+功能码+寄存器地址+写入数据(xx xx)+校验码

从站返回格式:与主站发出格式一致。

例子:将00 02地址的寄存器值写入100

主站发送报文格式:01 06 00 02 00 64+校验码

功能码0X10:写多路寄存器

主站报文格式:从机地址+功能码+起始地址+写入寄存器数量+字节计数(写入寄存器数量*2 格式 xx)+写入数据1+写入数据2…….+校验码

从站返回报文:从机地址+功能码+起始地址+写入寄存器数量+校验码

那就实践一个试试喽!

准备发送的数据是   100 110 120 130 140 150 160 170 180 190 这10个数值

所以主站发送的报文应该是:01+10 +00 02+00 0A+14 +00 64+ 00 6E+00 78+00 82+00 8C+00 96+00 A0+00 AA+00 B4+00 BE+校验码

即01 10 00 02 00 0A 14 00 64 00 6E 00 78 00 82 00 8C 00 96 00 A0 00 AA 00 B4 00 BE+校验码

从站返回报文:01+10+00 02+00 0A+校验码

01 10 00 02 00 0A+校验码

新手,如果错误请大佬指正


小讯
上一篇 2025-04-18 12:45
下一篇 2025-04-30 19:45

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/136829.html