目录
- 一、前言
- [二、功能码 01 查询报文详细解析](#二、功能码 01 查询报文详细解析)
- [三、功能码 01 响应报文详细解析](#三、功能码 01 响应报文详细解析)
- [四、Modbus 常见异常码说明与解读](#四、Modbus 常见异常码说明与解读)
- 五、数据字节数计算与软件报文验证
- 六、总结
- 七、结尾
一、前言
在上一篇笔记中,我们借助三套仿真软件完成了 Modbus 主从机的基础数据交互,验证了协议的读写功能有效性。而想要真正吃透 Modbus 协议,仅停留在功能验证层面远远不够,还需要深入解析其底层报文结构 ------ 报文是 Modbus 通信的核心载体,包含了通信所需的所有关键信息,理解报文的字段含义、格式规范与校验方式,是排查通信故障、实现 Modbus 协议底层开发的基础。本次笔记将以功能码 01(读线圈状态)为例,详细拆解 Modbus 报文的结构、字段含义,同时解读常见异常码与数据字节数计算规则,结合仿真软件的真实通信记录,让抽象的报文变得具象易懂。
二、功能码 01 查询报文详细解析
Modbus 协议主要有两种传输模式:ASCII 模式 与RTU 模式,两者的报文结构、校验方式与字节数均存在差异,以下是功能码 01(读线圈状态)查询报文的详细示例,清晰展示两种模式的报文格式:
| 字段 | 例(Hex) | ASCII 模式字符型 | RTU 模式 8 位(Hex) |
|---|---|---|---|
| 帧头 | ":" | ||
| 从设备地址 | 0x03 | "0","3" | 0x03 |
| 功能码 | 0x01 | "0","1" | 0x01 |
| 起始地址(高位) | 0x00 | "0","0" | 0x00 |
| 起始地址(低位) | 0x13 | "1","3" | 0x13 |
| 寄存器数(高位) | 0x00 | "0","0" | 0x00 |
| 寄存器数(低位) | 0x25 | "2","5" | 0x25 |
| 差错检验 | LRC(2 字符) | CRC(2 字节) | |
| 帧尾 | CR/LF | ||
| 合计字节数 | 17 | 8 |
补充:ASCII 模式以明文字符传输,帧头为 ":"、帧尾为 CR/LF,采用 LRC 校验;RTU 模式以二进制字节传输,无额外帧头帧尾,采用 CRC 循环冗余校验,传输效率更高,在工业现场中应用更广泛。
该查询报文的核心字段作用明确:
- 从设备地址:指定目标从机,确保报文被正确接收;
- 功能码:0x01 标识 "读线圈状态" 操作,告知从机执行的任务类型;
- 起始地址:指定要读取的线圈寄存器起始位置(高低位组合表示完整地址);
- 寄存器数:指定要读取的线圈寄存器数量,本次示例为 0x25(即 37 个);
- 差错检验:验证报文在传输过程中是否损坏,保证通信可靠性。
三、功能码 01 响应报文详细解析
当从机接收到合法的查询报文后,会返回对应的响应报文,携带主机所需的线圈状态数据,功能码 01 响应报文的详细示例如下:
| 字段 | 例(Hex) | ASCII 模式字符型 | RTU 模式 8 位(Hex) |
|---|---|---|---|
| 帧头 | ":" | ||
| 从设备地址 | 0x03 | "0","3" | 0x03 |
| 功能码 | 0x01 | "0","1" | 0x01 |
| 数据域字节数 | 0x05 | "0","5" | 0x05 |
| 数据 1 | 0x53 | "5","3" | 0x53 |
| 数据 2 | 0x6B | "6","B" | 0x6B |
| 数据 3 | 0x01 | "0","1" | 0x01 |
| 数据 4 | 0xF4 | "F","B" | 0xF4 |
| 数据 5 | 0x1B | "1","B" | 0x1B |
| 差错校验 | LRC(2 字符) | CRC(2 字符) | |
| 帧尾 | CR/LF | ||
| 合计字节数 | 21 | 10 |
与查询报文相比,响应报文新增了数据域字节数字段,用于告知主机后续携带的有效数据长度(本次示例为 5 字节),后续的 5 个数据字节即为从机返回的线圈状态数据,主机可通过解析这些字节获取具体的线圈状态。
补充:响应报文中的从设备地址与功能码,与查询报文保持一致,方便主机确认响应报文对应的查询任务,避免报文混淆。
四、Modbus 常见异常码说明与解读
当从机无法正常执行主机的查询任务时,会返回携带异常码的响应报文,告知主机故障原因。以下是 Modbus 协议中最常见的四类异常码,涵盖了大部分通信与执行故障场景:
| 异常码 | 名称 | 说明 |
|---|---|---|
| 01 | 非法功能码 | 从站设备不支持此功能码 |
| 02 | 非法数据地址 | 指定的数据地址在从站设备中不存在 |
| 03 | 非法数据值 | 指定的数据超过范围或者不允许使用 |
| 04 | 从站设备故障 | 从站设备处理响应的过程中出现未知错误等 |
对异常码的通俗解读:
- 异常码 01:主机发送的功能码(如 0x08)超出了从机的支持范围,从机无法识别该操作;
- 异常码 02:主机指定的寄存器地址(如读取地址 0x1000)超出了从机的寄存器地址范围,无对应数据;
- 异常码 03:主机写入的数据(如向线圈写入 0x02,而线圈仅支持 0x00/0x01)不符合从机的参数要求;
- 异常码 04:从机自身硬件故障或内部程序异常,无法正常处理主机请求,属于从机端的未知故障。
五、数据字节数计算与软件报文验证
1. 数据字节数计算规则
Modbus 协议中,读取位寄存器(线圈、离散输入)时,返回的数据字节数有明确的计算规则:由于 1 字节 = 8 位,当读取的位寄存器数量 N 为 8 的整数倍时,数据字节数为 N/8;当 N 不为 8 的整数倍时,数据字节数满足公式 (N/8+1),即向上取整。
例如,想要读取 9 位数据时,代入公式可得(9/8+1)=2 字节,从机会返回 2 字节数据,多余的位会填充为 0,不影响有效数据的解析。
2. 仿真软件报文实战验证
我们可以通过 Modbus 仿真软件查看真实的通信记录,验证上述报文结构与计算规则,主机的通信记录如下图所示:

从机的通信记录如下图所示:

对该通信记录的核心报文解析如下:
- 主机发送报文:01 01 00 00 00 0A BC 0D
- 01:从设备地址;
- 01:功能码(读线圈状态);
- 00 00:线圈起始地址(0x0000);
- 00 0A:要读取的位寄存器个数(10 个);
- BC 0D:CRC 校验码。
- 从机接收并返回报文:01 01 02 05 00 ...
- 01:从设备地址;
- 01:功能码(读线圈状态响应);
- 02:数据域字节数(读取 10 个位寄存器,代入公式得 2 字节);
- 05 00:返回的有效数据,转为八位二进制为 0101 0000,对应 10 个线圈的状态。
更多复杂报文的解析技巧,可查询 Modbus 协议官方文档与专业开发资料,进一步夯实报文解析能力。
六、总结
- Modbus 报文分 ASCII 与 RTU 模式,RTU 模式传输效率更高,工业现场应用更广泛;
- 功能码 01 报文包含地址、功能码、地址 / 数量、校验码,响应包新增数据域字节数字段;
- 位寄存器数据字节数有明确计算公式,异常码对应具体通信或执行故障;
- 可通过仿真软件查看真实报文,直观验证报文结构与解析规则,降低学习门槛。
七、结尾
Modbus 报文解析是掌握协议底层逻辑的核心,吃透报文的字段含义、计算规则与异常码解读,就能为后续的 Modbus 硬件实战与故障排查打下坚实基础。报文解析看似繁琐,实则有明确的规律可循,反复结合仿真软件验证,就能快速掌握其中的技巧。感谢各位的阅读,持续关注本系列笔记,一起从报文解析到硬件落地,全面掌握 Modbus 协议的开发与应用技能!