MODBUS 功能码简介
代码 | 中文名称 | 位操作 / 字操作 | 操作数量 |
01h | 读线圈状态 | 位操作 | 单个或多个 |
02h | 读离散输入状态 (只能读到 0 或 1) | 位操作 | 单个或多个 |
03h | 读保持寄存器 (保持寄存器可以通过 06h 功能写入) | 字操作 | 单个或多个 |
04h | 读输入寄存器 (输入寄存器只能读取, 不能通过 06h 功能写入) | 字操作 | 单个或多个 |
05h | 写单个线圈 (线圈表示用来控制输出 IO 控制) | 位操作 | 单个 |
06h | 写单个保持寄存器 | 字操作 | 单个 |
0Fh | 写多个线圈 | 位操作 | 多个 |
10h | 写多个保持寄存器 | 字操作 | 多个 |
Modbus TCP 介绍
示例 - 通过 03 功能码读寄存器 (从寄存器 00 开始, 读取两个值, 读到 01 寄存器结束)
客户端发送 01 02 00 00 00 06 01 03 00 00 00 02
01 02 00 00 00 06 (固定报文头)
01 02: 客户端发出的检验信息, server 端会将这两个字节内容复制到回应的报文第一二位. 一般我们会将第一二位进行不停递加, 然后根据服务器返回的相应内容, 来验证服务器回应信息的时效性
00 00: 表示 tcp/ip 的协议的 modbus 的协议
00 06: 表示客户端发送的后面带了多少字节.
01 03 00 00 00 02(用户数据)
01: 表示设备地址
03: 表示读保持寄存器功能码
00 00: 表示客户端读取的寄存器起始地址
00 02: 表示读取的寄存器值个数 (由于为 02, 所以会读出寄存器 00h 和 01h 的值)
返回值如下图所示:
服务器返回值 01 02 00 00 00 07 01 03 04 04 7B 00 FF
01 02: 服务器回应的检验信息
00 00: 表示 tcp/ip 的协议的 modbus 的协议
00 07: 表示服务器发送的后面带了多少字节.
01: 表示设备地址
03: 表示功能码
04: 表示后面发送的寄存器 00 的字节长度
04 7B: 表示寄存器 00 的值
00 FF: 表示寄存器 01 的值
示例 - 06 功能码写单个寄存器 (向寄存器 03 地址里写值)
客户端发送 01 02 00 00 00 06 01 06 00 03 00 FF
01 02 00 00 00 06 (固定报文头)
01 02: 客户端发出的检验信息
00 00: 表示 tcp/ip 的协议的 modbus 的协议
00 06: 表示客户端发送的后面带了多少字节.
01 06 00 03 00 FF (用户数据)
01: 表示设备地址
06: 表示写单个保持寄存器功能码
00 FF: 表示写入寄存器 03h 的值为 0xFF
返回值如下图所示:
服务器返回 01 02 00 00 00 06 01 06 00 03 00 FF
后面的 06 00 03 00 FF: 表示客户端使用 06 功能码成功向寄存器 03h 分别写入了 0xFF 值
示例 - 10 功能码写多个寄存器 (向寄存器 03~06 地址里写不同值)
客户端发送 01 02 00 00 00 10 01 10 00 03 00 04 08 FF FF 00 0A 00 0F 00 06
01 02 00 00 00 10 (固定报文头)
01 02: 客户端发出的检验信息
00 00: 表示 tcp/ip 的协议的 modbus 的协议
00 10: 表示客户端发送的后面带了多少字节.
01 10 00 03 00 04 08 FF FF 00 0A 00 0F 00 06 (用户数据)
01: 表示设备地址
10: 表示写多个保持寄存器功能码
00 03: 表示客户端写入的寄存器起始地址
00 04: 表示写入的寄存器值个数 (由于为 04, 所以会写入寄存器 03h~06h 的值)
08: 表示后面写入的字节个数
FF FF: 表示写入寄存器 03h 的值
00 0A: 表示写入寄存器 04h 的值
00 0F: 表示写入寄存器 05h 的值
00 06: 表示写入寄存器 06h 的值
返回值如下图所示:
服务器返回 01 02 00 00 00 06 01 10 00 03 00 04
后面的 10 00 03 00 04: 表示客户端使用 10 功能码成功向寄存器 03h~06h 分别写入了值
部分参考内容: https://blog.csdn.net/mikasoi/article/details/81782159
来源: https://www.cnblogs.com/lifexy/p/11311112.html