下面这份是现场工程最实用、最接地气的 Modbus 调试总结,偏实战、少理论,适合 PLC、仪表、DCS、组态软件互调时直接用。
Modbus 通信调试实用技巧
一、接线与物理层(先搞定这个,再谈协议)
RS485 优先排查
A、B 别接反:一般 A+ B-,部分设备标 DATA+ / DATA-
终端电阻:远距离 / 干扰大 / 多从站时,首尾两端加 120Ω 终端电阻
屏蔽层单端接地,不要两端都接,避免地环流干扰
网线 / TCP 模式
先 ping 通,再谈 Modbus TCP
交换机不要用家用廉价款,工业现场容易丢包
同一网段、子网掩码一致,网关可先不配
二、参数必须完全一致(90% 问题都在这)
Modbus RTU 四大关键参数:
波特率(常见 9600、19200、115200)
数据位(固定 8 位)
校验位(None、Even、Odd)
停止位(1 位或 2 位)
任何一个不一致 → 直接 无响应 / 乱码。
三、从站地址(Slave ID)
从站地址必须 唯一,不能重复
地址范围:1~247
调试时先只接 1 个从站,通了再加其他设备
有些仪表默认地址是 1 或 11,一定要看手册
四、寄存器地址最容易踩坑
分清四类区(现场最常用)
0x:Coil 线圈(DO)——读/写 bit
1x:Discrete Input 离散输入(DI)——只读 bit
3x:Input Register 输入寄存器(AI)——只读 16bit
4x:Holding Register 保持寄存器——读/写 16bit
地址偏移坑(重中之重)
很多设备手册写:
保持寄存器地址:40001
但调试软件里要填:
40001 → 0
40002 → 1
也就是:
地址 = 手册地址 - 40001
不注意这一条,永远读不对。
五、功能码用对
常用就这几个:
01:读线圈
02:读离散输入
03:读保持寄存器(最常用)
04:读输入寄存器
05:写单个线圈
06:写单个寄存器
16(0x10):写多个寄存器
用错功能码直接报异常码。
六、异常码快速判断故障
01:功能码不支持 → 设备不支持你发的指令
02:寄存器地址不存在 → 地址错/越界
03:数据值非法 → 写的数据超限
04:设备故障 → 仪表/模块本身问题
05:拒绝执行 → 权限/保护
06:设备忙 → 重试即可
出现异常码,基本就是地址/功能码/数据长度错了。
七、数据格式(float、高低字节反转)
很多仪表、变频器、电表的浮点数是:
32位 float 占两个连续寄存器
常见两种排列:
ABCD(正常)
BADC / CDAB(高低字节反转)
读出来数值奇怪时,优先换字节序。
八、调试工具(强烈推荐)
Modbus Poll / ModbusScan(Windows 神器)
主站用 Poll 读仪表
从站用 Slave 模拟设备
串口调试助手
发原始报文,看是否回包
Wireshark
抓 Modbus TCP 包,定位问题
九、现场快速排查步骤(万能流程)
只接 1 台从站,断电重插
核对 波特率、校验、从站地址
用 Modbus Poll 发 03 功能码
确认寄存器地址是否 减 1 或减 40001
看是否返回异常码,按异常码定位
仍不通:换串口线、USB 转 485 模块、接地
长距离:加终端电阻、降低波特率
十、常见坑总结
485 总线 手拉手,不要星型接法
多从站时,逐个上电排查
同一总线上不能混用不同波特率/校验
不要用劣质 USB 转 485,容易丢包、无响应
有些仪表必须加 CRC 校验,软件会自动算,手动发报文别自己算错