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 循环冗余校验,传输效率更高,在工业现场中应用更广泛。

该查询报文的核心字段作用明确:

  1. 从设备地址:指定目标从机,确保报文被正确接收;
  2. 功能码:0x01 标识 "读线圈状态" 操作,告知从机执行的任务类型;
  3. 起始地址:指定要读取的线圈寄存器起始位置(高低位组合表示完整地址);
  4. 寄存器数:指定要读取的线圈寄存器数量,本次示例为 0x25(即 37 个);
  5. 差错检验:验证报文在传输过程中是否损坏,保证通信可靠性。

三、功能码 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 从站设备故障 从站设备处理响应的过程中出现未知错误等

对异常码的通俗解读:

  1. 异常码 01:主机发送的功能码(如 0x08)超出了从机的支持范围,从机无法识别该操作;
  2. 异常码 02:主机指定的寄存器地址(如读取地址 0x1000)超出了从机的寄存器地址范围,无对应数据;
  3. 异常码 03:主机写入的数据(如向线圈写入 0x02,而线圈仅支持 0x00/0x01)不符合从机的参数要求;
  4. 异常码 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
  1. 01:从设备地址;
  2. 01:功能码(读线圈状态);
  3. 00 00:线圈起始地址(0x0000);
  4. 00 0A:要读取的位寄存器个数(10 个);
  5. BC 0D:CRC 校验码。
  • 从机接收并返回报文:01 01 02 05 00 ...
  1. 01:从设备地址;
  2. 01:功能码(读线圈状态响应);
  3. 02:数据域字节数(读取 10 个位寄存器,代入公式得 2 字节);
  4. 05 00:返回的有效数据,转为八位二进制为 0101 0000,对应 10 个线圈的状态。

更多复杂报文的解析技巧,可查询 Modbus 协议官方文档与专业开发资料,进一步夯实报文解析能力。

六、总结

  1. Modbus 报文分 ASCII 与 RTU 模式,RTU 模式传输效率更高,工业现场应用更广泛;
  2. 功能码 01 报文包含地址、功能码、地址 / 数量、校验码,响应包新增数据域字节数字段;
  3. 位寄存器数据字节数有明确计算公式,异常码对应具体通信或执行故障;
  4. 可通过仿真软件查看真实报文,直观验证报文结构与解析规则,降低学习门槛。

七、结尾

Modbus 报文解析是掌握协议底层逻辑的核心,吃透报文的字段含义、计算规则与异常码解读,就能为后续的 Modbus 硬件实战与故障排查打下坚实基础。报文解析看似繁琐,实则有明确的规律可循,反复结合仿真软件验证,就能快速掌握其中的技巧。感谢各位的阅读,持续关注本系列笔记,一起从报文解析到硬件落地,全面掌握 Modbus 协议的开发与应用技能!

相关推荐
A9better3 小时前
嵌入式开发学习日志50——任务调度与状态
stm32·嵌入式硬件·学习
四维碎片3 小时前
QSettings + INI 笔记
笔记·qt·算法
非凡ghost3 小时前
ESET NupDown Tools 数据库下载工具
学习·软件需求
zzcufo4 小时前
多邻国第5阶段17-18学习笔记
笔记·学习
BlackWolfSky4 小时前
鸿蒙中级课程笔记4—应用程序框架进阶1—Stage模型应用组成结构、UIAbility启动模式、启动应用内UIAbility
笔记·华为·harmonyos
中屹指纹浏览器4 小时前
指纹浏览器性能优化实操——多实例并发与资源占用管控
经验分享·笔记
brave and determined4 小时前
工程设计类学习(DAY9):印刷电路板(PCB)材料选择、工艺特性与制造技术综合详解
学习·制造·pcb·smt·工程设计·fr-4·pcb钻孔
草丛中的蝈蝈5 小时前
STM32向FLASH写入数据后,重新读出的数据和原写入数据不一致
stm32
了一梨5 小时前
SQLite3学习笔记5:INSERT(写)+ SELECT(读)数据(C API)
笔记·学习·sqlite
DLGXY5 小时前
STM32——EXTI外部中断(六)
stm32·单片机·嵌入式硬件