2023-03-03
通讯
00
请注意,本文编写于 419 天前,最后修改于 406 天前,其中某些信息可能已经过时。

目录

读操作
功能码 0x01 读一组线圈
功能码0x02 读一组输入线圈/离散量线圈
功能码0x03 读一组保持寄存器
功能码0x04 读一组输入寄存器
写操作
功能码:0x05 写单个线圈
功能码0x0F 写一组线圈
功能码 0x06 写单个保持寄存器
功能码0x10 写一组保持寄存器

接上一篇,C#ModBus Tcp的学习及Master的实现,我们可以根据功能进行读写。本篇文章,主要对不同的功能码所发出的报文进行解析(包括请求报文及响应报文)。

读操作

功能码 0x01 读一组线圈

例:读取站号为1,从地址12开始的10个线圈:

1630815-20190510181441380-1035543879.png

接下来,按照报文格式划分:

1630815-20190507125605486-1036070568.png

解析一下上文中读一组线圈的报文:

000002-Rx:00 01 00 00 00 06 01 01 00 0C 00 0A 000003-Tx:00 01 00 00 00 05 01 01 02 AE 00

1630815-20190510183553735-2007331914.png

Tip

报文中线圈起始地址 00000 对应设备中 10001 地址,其他顺延。

功能码0x02 读一组输入线圈/离散量线圈

报文格式与功能码0x01一致,只是第八字节的功能码变为02,其他完全一致,解析参考上文。

功能码0x03 读一组保持寄存器

例:读取站号为1 从地址12开始的10个值

1630815-20190510190045552-230039486.png 解析报文:

1630815-20190510191353804-697453985.png

功能码0x04 读一组输入寄存器

报文格式与功能码0x03一致,只是第八字节的功能码变为04,其他完全一致,解析参考上文。

写操作

功能码:0x05 写单个线圈

例:将站号为1,地址为21的线圈置为On:

Tip

在报文中,指定线圈通断标志: FF00 置线圈为ON0000置线圈为OFF

1630815-20190510201738294-757735980.png 报文解析:

1630815-20190510202713559-525769030.png

功能码0x0F 写一组线圈

例:将站号1,起始地址21,的连续五个线圈置为:通,断,断,通,通

测试结果:

1630815-20190510205207418-869645667.png

报文解析:

1630815-20190510205259390-1138719863.png

功能码 0x06 写单个保持寄存器

例:将6666写入从站1,地址为21的保持寄存器中:

测试结果

1630815-20190510210234553-451130699.png

报文解析:

1630815-20190510210250406-1451441253.png

功能码0x10 写一组保持寄存器

例:将12,23,34,45,56,67,78分别写入从站1,起始地址为21的7个连续的保持寄存器中:

1630815-20190510211859008-180180752.png 测试结果

报文解析:

1630815-20190510211938701-1859410713.png

至此,我们常用的几个ModBus功能码报文都解析完毕了,有错误之处,欢迎指正!

本文作者:Peter.Pan

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!