Modbus协议

本文最后更新于 2025-12-11 20:32:33

原文发表在公众号

4种数据模式

基本表格 对象类型 访问类型 内容
离散量输入(Discretes Input) 单个比特 只读 I/O系统提供这种类型数据
线圈(Coils) 单个比特 读写 通过应用程序改变这种类型数据
输入寄存器(Input Registers) 16-比特字 只读 I/O系统提供这种类型数据
保持寄存器(Holding Registers) 16-比特字 读写 通过应用程序改变这种类型数据

3种传输模式

基于串口的Modbus-RTU 数据按照标准串口协议进行编码,采用CRC-16_Modbus检验算法。
基于串口的Modbus-ASCII 所有数据都是ASCII格式,一个字节的原始数据需要两个字符来表示,效率底,采用LRC校验算法。
基于网口的Modbus-TCP 基于TCP/IP协议,占用502端口,数据帧主要包括两部分:MBAP(报文头)+ PDU(帧结构)。

3类功能码

公共功能码、用户定义功能码、保留功能码

公共功能码定义

图片

Modbus-RTU报文帧

子节点地址 功能代码 数据 CRC校验
1个字节 1个字节 0~252字节 2字节(CRC低位,CRC高位)

Modbus RTU帧最大位256字节

串口信息(9600Baud、偶校验、1个停止位)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
0x01 - Read Coils
Address :0
Quantity :2000

Tx:01 01 00 00 07 D0 3F A6
01 表示从机地址
01 功能码,表示读线圈
0000表示线圈起始地址
07D0表示读取线圈数量(2000)
3FA6为CRC校验值

Rx:01 01 FA /*41 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80/*数据*/ 0A DF
注释
01表示从机地址
01功能码,表示读线圈
FA表示数据数量

0ADF 为CRC校验值

Modbus-ASCII报文帧

起始 子节点地址 功能代码 数据 LRC校验 结束
1字符(冒号字符) 2字符 2字符 0~2*252字符 2字符 2字符(CR,LF)

Modbus ASCII帧最大位2 * 252 + 1 + 2 + 2 + 2 + 2 = 513字符

串口信息(9600Baud、偶校验、1个停止位)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
0x01 - Read Coils
Address :0
Quantity :2000

Tx:3A 30 31 30 31 30 30 30 30 30 37 44 30 32 37 0D 0A
3A表示冒号字符
30 31表示字符0、字符1,即从机地址01
30 31表示字符0、字符1,即功能码01,表示读线圈
30 30 30 30 表示字符0、字符0、字符0、字符0,即线圈起始地址(0x0000
30 37 44 30 表示字符0、字符7、大写字母D、字符0,即读取线圈数量(0x07D0
32 37表示LRC校验结果
0D 0A 表示回车键CR、换行键LF

Rx:3A 30 31 30 31 46 41 /*34 31 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 38 30/*数据*/ 34 33 0D 0A
3A表示冒号字符
30 31表示字符0、字符1,即从机地址01
30 31表示字符0、字符1,即功能码01,表示读线圈
46 41 表示大写字母F、大写字母A,即数据数量(0xFA

34 33表示LRC校验结果
0D 0A 表示回车键CR、换行键LF

Modbus-TCP报文格式

MBAP报文头 功能码 数据
事务元标识符 协议标识符 长度 单元标识符
2字节 2字节(0) 2字节(表示单元标识符 + 功能码 + 数据的字节总数) 1字节 1字节
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Tx:06 DF 00 00 00 06 01 01 00 00 07 D0
06事务处理标识符Hi
DF事务处理标识符Lo
0000协议标识符
0006后续数据长度
01单元标识符,即从机地址
01功能码
0000表示线圈起始地址
07D0表示读取线圈数量(2000)

Rx:06 DF 00 00 00 FD 01 01 FA /*41 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80/*数据*/
06事务处理标识符Hi
DF事务处理标识符Lo
0000协议标识符
00FD后续数据长度
01单元标识符,即从机地址
01功能码
FA后续数据长度

Modbus协议
https://njit-77.github.io/2024/04/16/Modbus协议/
作者
njit-77
发布于
2024年4月16日
许可协议