Modbus CRC16 校验与报文解析生成工具
1 CRC16 校验计算(数据区 → 补 CRC)
输入不含 CRC 的数据(从站地址+功能码+数据),支持空格/逗号/0x/换行混排。
2 报文解析 / CRC 校验(完整帧 → 逐字段)
粘贴含 CRC 的完整 RTU 帧,自动识别主站请求 / 从站响应 / 异常响应并核对 CRC。
3 主站请求帧生成(填表 → 出报文)
功能码速查
| 功能码 | 名称 | 数据区 | 典型用途 |
|---|---|---|---|
| 01 | 读线圈 | 起始地址+数量 | 批量读 DO/位输出状态 |
| 02 | 读离散输入 | 起始地址+数量 | 批量读 DI 开关量输入 |
| 03 | 读保持寄存器 | 起始地址+数量 | 读 4x 可读写寄存器,最常用 |
| 04 | 读输入寄存器 | 起始地址+数量 | 读 3x 只读模拟量 |
| 05 | 写单个线圈 | 地址+FF00/0000 | 单点 DO 置位/复位 |
| 06 | 写单个寄存器 | 地址+写入值 | 改单个设定值/参数 |
| 0F / 10 | 写多个线圈/寄存器 | 地址+数量+字节数+数据 | 批量下发 |
常见问题
Modbus RTU 的 CRC16 怎么算?初始值和多项式是多少?
Modbus RTU 使用 CRC-16/MODBUS:初始值 0xFFFF,多项式 0xA001(即 0x8005 的位反转),对报文除 CRC 外的每个字节逐位异或移位,结果不做最终异或。本工具按标准算法实现,已用官方校验向量(ASCII「123456789」结果为 0x4B37)验证。
为什么 Modbus 的 CRC 是低字节在前、高字节在后?
RTU 线上 CRC 按「低字节在前、高字节在后」追加(CRC Lo 先发,CRC Hi 后发)。例如读保持寄存器帧 01 03 00 00 00 0A 算出 CRC 寄存器值为 0xCDC5,其中低字节是 0xC5、高字节是 0xCD,所以帧尾实际发送 C5 CD,而不是 CD C5。本工具的「完整帧」已按线上顺序排好,可直接复制下发。
一帧 Modbus RTU 报文由哪几部分组成?
主站请求帧 = 从站地址(1) + 功能码(1) + 数据区(N) + CRC(2)。读操作(01-04)数据区为「起始地址(2)+数量(2)」;写单个(05/06)为「地址(2)+值(2)」。从站正常响应首字节为字节数,异常响应则功能码最高位置 1(如 03 变 83)并跟一个异常码。
功能码 03 和 04 有什么区别?
03 读保持寄存器(Holding Register),对应可读写的 4x 区;04 读输入寄存器(Input Register),对应只读的 3x 区,通常接模拟量采集。报文结构完全一样,只是访问的寄存器分区不同。01/02 则分别读线圈(0x)和离散输入(1x)这两类位量。
收到功能码最高位置 1 的异常响应怎么排查?
例如请求 03 收到 83,表示从站拒绝了该请求,紧跟的异常码给出原因:02 非法地址(寄存器不存在或越界最常见)、03 非法数据值(数量超限等)、04 从站故障。先用本工具解析确认异常码,再核对地址表、寄存器数量范围和从站型号手册。