Modbus 报文工具
粘贴报文即可看懂,选好参数即可生成。支持 RTU / TCP / ASCII。
粘贴报文
选择参数生成报文
调用代码
32 位数据的四种字节序
Modbus 寄存器是 16 位的,一个 float / int32 要占两个寄存器。不同厂家拼字节的顺序不一样,读出来是乱数时先换这里试。默认按「ABCD」书写。
16 位寄存器的高低字节
只调一个寄存器也可能高低字节反了,这里做 AB ↔ BA 互换。
CRC16(Modbus)/ LRC 计算
粘贴不含校验的报文,或者整帧(会自动去掉最后 2 字节再算),得到正确的校验值。
Modbus 功能码
| 功能码 | 名称 | 作用 | 数据区 |
|---|---|---|---|
| 01 | 读线圈 | 读开关量输出状态(ON/OFF) | 0xxxx |
| 02 | 读离散输入 | 读开关量输入状态 | 1xxxx |
| 03 | 读保持寄存器 | 读可读写的 16 位寄存器(最常用) | 4xxxx |
| 04 | 读输入寄存器 | 读只读的 16 位寄存器(如测量值) | 3xxxx |
| 05 | 写单个线圈 | 控制一个开关量输出 | 0xxxx |
| 06 | 写单个寄存器 | 写一个 16 位寄存器(如设定值) | 4xxxx |
| 0F | 写多个线圈 | 连续控制多个开关量 | 0xxxx |
| 10 | 写多个寄存器 | 连续写多个 16 位寄存器 | 4xxxx |
| 17 | 读/写多个寄存器 | 一次完成读和写 | 4xxxx |
| 2B | 读设备标识 | 读厂家、型号、版本 | — |
异常码(响应功能码 + 0x80 时)
| 异常码 | 含义 | 常见原因 |
|---|---|---|
| 01 | 非法功能码 | 从站不支持这个功能码 |
| 02 | 非法数据地址 | 地址超出范围、地址映射没配对 |
| 03 | 非法数据值 | 写入的值或数量超范围 |
| 04 | 从站设备故障 | 从站内部错误,查设备手册 |
| 05 | 确认 | 已接受,但需要较长时间处理 |
| 06 | 从站设备忙 | 稍后重试 |
| 08 | 存储奇偶性差错 | 从站存储区异常 |
| 0A | 网关路径不可用 | 网关后面的设备没响应 |
| 0B | 网关目标设备无响应 | 目标设备掉线或站号错 |
地址对照:报文地址 vs 文档地址
报文里的地址是 从 0 开始,而设备手册/组态软件里常见的是 从 1 开始 的 5 位号。
换算:文档地址 40100 → 报文地址 99(40100 − 40001)。
常用参数
串口默认 9600 bps / 8 数据位 / 无校验 / 1 停止位(8N1);从站地址 1–247,0 是广播(只能写,不回复)。
TCP默认端口 502。MBAP 头 7 字节:事务标识(2) + 协议标识(2,固定 0) + 长度(2) + 单元标识(1)。
帧间隔RTU 两帧之间至少静默 3.5 个字符时间,否则从站会当成同一帧。
寄存器1 个寄存器 = 16 位 = 2 字节,范围 0–65535(无符号)。
其他工控协议(帧结构速查)
西门子 S7 通信(S7comm / 端口 102)
报文分三层,从外到内:
区域码:0x81 输入 I、0x82 输出 Q、0x83 标志 M、0x84 数据块 DB、0x1C 计数器 C、0x1D 定时器 T。
注意:S7 地址按「字节.位」表示,例如 DB1.DBX0.0;读 10 个字节就是长度 10、地址偏移 0。
三菱 MC 协议(以太网 / 串口)
注意:二进制和 ASCII 模式的软元件代码不一样,D/M/X/Y 等代码以对应系列手册为准;TCP 端口由 PLC 参数设定(常见 5000)。
欧姆龙 FINS(TCP/UDP 9600)
其他设备
汇川、信捷、台达、步科等大部分国产 PLC/触摸屏的以太网通信都兼容 Modbus TCP(端口 502),地址映射看各自手册。用上面的「报文解析」直接粘贴抓到的报文就能对照。