码文不易,如有转载请表明本文链接:https://blog.****.net/weixin_46304253/article/details/107960184
文章有错误也可以联系本人
Modbus协议
Modbus 是OSI 模型第七层应用层上的报文传输协议,它在连接至不同类型总线或网络的设备之间提供客户机/服务器通信。
- Modbus 按照国家标准《基于 Modbus 协议的工业自动化网络规范》分为三个部分: 第1部分: Modbus 应用协议(GB/T 19582.1-2008)Modbus是一个请求/应答协议,这部分描述了 Modbus 事物处理框架内使用的功能码。
- 第2部分: Modbus 协议在串行链路上的实现指南(GB/T 19582.2-2008) 这部分描述了串行链路上的 Modbus 协议。
- 第3部分: Modbus 协议在 TCP/IP 上的实现指南(GB/T 19582.3-2008) 这部分描述了 TCP/IP上
的Modbus 协议。

事务处理
- 请求:向服务机发出事务请求(功能码+数据请求)。
- 正常响应:操作码+数据响应(操作码=请求功能码)。
- 异常响应:差错码+异常码(差错码=请求功能码+0x80;异常码用于指示差错原因)。
功能码
- 1-64:公共功能码。
- 65-72:用户定义功能码。
- 73-99:公共功能码。
- 100-110:用户定义功能码。
- 111-127:公共功能码。
- 127-255:异常响应保留码。
功能码 |
对应功能 |
寄存器地址 |
位/字操作 |
操作数量 |
01(0x01) |
读线圈状态 |
00001-09999 |
位操作 |
单个或多个 |
02(0x02) |
读离散量输入 |
10001-19999 |
位操作 |
单个或多个 |
03(0x03) |
读保持寄存器 |
40001-49999 |
字操作 |
单个或多个 |
04(0x04) |
读输入寄存器 |
30001-39999 |
字操作 |
单个或多个 |
05(0x05) |
写单个线圈 |
00001-09999 |
位操作 |
单个 |
06(0x06) |
写单个保持寄存器 |
40001-49999 |
字操作 |
单个 |
15(0x0F) |
写多个线圈 |
00001-09999 |
位操作 |
多个 |
16(0x10) |
写多个保持寄存器 |
40001-49999 |
字操作 |
多个 |
功能码具体操作:
(1)01(0x01) 读线圈:
功能码 |
1个字节 |
0x01 |
起始地址 |
2个字节 |
0x0000-0xFFFF |
线圈数量 |
2个字节 |
0x0001-0x07D0 |
功能码 |
1个字节 |
0x01 |
字节数 |
1个字节 |
N=线圈数量/8,余数不为0则加1 |
线圈状态 |
N个字节 |
|
功能码 |
1个字节 |
0x81 |
异常码 |
1个字节 |
01,02,03,04 |
(2)02(0x02) 读离散量输入:
功能码 |
1个字节 |
0x02 |
起始地址 |
2个字节 |
0x0000-0xFFFF |
输入数量 |
2个字节 |
0x0001-0x07D0 |
功能码 |
1个字节 |
0x02 |
字节数 |
1个字节 |
N=线圈数量/8,余数不为0则加1 |
输入状态 |
N个字节 |
|
功能码 |
1个字节 |
0x82 |
异常码 |
1个字节 |
01,02,03,04 |
(3)03(0x03) 读保持寄存器:
功能码 |
1个字节 |
0x03 |
起始地址 |
2个字节 |
0x0000-0xFFFF |
寄存器数量 |
2个字节 |
0x0001-0x07D0 |
- 响应PDU(03 06 02 2B 00 00 00 64):
功能码 |
1个字节 |
0x03 |
字节数 |
1个字节 |
N=寄存器数量*2 |
寄存器值 |
N个字节 |
|
功能码 |
1个字节 |
0x83 |
异常码 |
1个字节 |
01,02,03,04 |
(4)04(0x04) 读输入寄存器:
功能码 |
1个字节 |
0x04 |
起始地址 |
2个字节 |
0x0000-0xFFFF |
寄存器数量 |
2个字节 |
0x0001-0x07D0 |
功能码 |
1个字节 |
0x04 |
字节数 |
1个字节 |
N=寄存器数量*2 |
寄存器值 |
N个字节 |
|
功能码 |
1个字节 |
0x84 |
异常码 |
1个字节 |
01,02,03,04 |
(5)05(0x05) 写单个线圈:
功能码 |
1个字节 |
0x05 |
输出地址 |
2个字节 |
0x0000-0xFFFF |
输出值 |
2个字节 |
0x0000或者0xFF00 |
功能码 |
1个字节 |
0x05 |
输出地址 |
2个字节 |
0x0000-0xFFFF |
输出值 |
2个字节 |
0x0000或者0xFF00 |
功能码 |
1个字节 |
0x85 |
异常码 |
1个字节 |
01,02,03,04 |
(6)06(0x06) 写单个线圈:
功能码 |
1个字节 |
0x06 |
寄存器地址 |
2个字节 |
0x0000-0xFFFF |
寄存器值 |
2个字节 |
0x0000-0xFFFF |
功能码 |
1个字节 |
0x06 |
输出地址 |
2个字节 |
0x0000-0xFFFF |
输出值 |
2个字节 |
0x0000-0xFFFF |
功能码 |
1个字节 |
0x86 |
异常码 |
1个字节 |
01,02,03,04 |
(7)15(0x0F) 写多个线圈:
- 请求PDU(0F 00 13 00 0A 02 CD 01):
功能码 |
1个字节 |
0x0F |
起始地址 |
2个字节 |
0x0000-0xFFFF |
输出数量 |
2个字节 |
0x0001-0x07B0 |
字节数 |
1个字节 |
N=线圈数量/8,余数不为0则加1 |
输出值 |
N个字节 |
|
功能码 |
1个字节 |
0x0F |
输出地址 |
2个字节 |
0x0000-0xFFFF |
输出值 |
2个字节 |
0x0001-0x07B0 |
功能码 |
1个字节 |
0x8F |
异常码 |
1个字节 |
01,02,03,04 |
(8)16(0x10) 写多个寄存器:
- 请求PDU(10 00 01 00 02 04 00 0A 01 02):
功能码 |
1个字节 |
0x10 |
起始地址 |
2个字节 |
0x0000-0xFFFF |
寄存器数量 |
2个字节 |
0x0001-0x007B |
字节数 |
1个字节 |
N=寄存器数量*2 |
寄存器值 |
N个字节 |
|
功能码 |
1个字节 |
0x0F |
输出地址 |
2个字节 |
0x0000-0xFFFF |
寄存器数量 |
2个字节 |
0x0001-0x007B |
功能码 |
1个字节 |
0x90 |
异常码 |
1个字节 |
01,02,03,04 |
异常码
代码 |
名称 |
含义 |
0x01 |
非法功能 |
接受到的功能码是不允许的操作 |
0x02 |
非法数据地址 |
接受到的数据地址是不允许的地址 |
0x03 |
非法数据值 |
接受到的数据值是不允许的值 |
0x04 |
从站设备故障 |
执行请求的操作时,产生不可重新获得的差错 |
0x05 |
确认 |
从站已经接受请求并且正在处理,但是需要较长的处理时间,返回这个响应防止主站发生超时错误 |
0x06 |
从站设备忙 |
从站正在处理长持续时间的请求 |
0x08 |
存储奇偶性差错 |
读取记录文件时发现奇偶校验错误 |
0x0A |
不可用网关路径 |
网关不能为处理请求分配输入端口至输出端口的内部通信路径,通常意味着网关配置错误或过载 |
0x0B |
网关目标设备响应失败 |
没有从目标设备中获取响应,通常意味着设备未在网络中 |
码文不易,如有转载请表明本文链接:https://blog.****.net/weixin_46304253/article/details/107960184
文章有错误也可以联系本人