报文结构先看清楚
Modbus 有串行与以太网两种承载方式,解析前先确认手头是哪一种。以太网承载(常称 Modbus TCP)的报文由七字节报文头加上协议数据单元组成:报文头包含事务标识、协议标识、长度与单元标识,协议数据单元的首字节是功能码,其后是数据。串行承载(RTU)的报文由从站地址、协议数据单元与两字节校验组成。两种承载的协议数据单元是同一套,因此功能码与数据字段的读法一致,差别在于寻址与校验方式。解析的第一步是把事务标识或从站地址与请求响应配对,否则无从判断交互是否正常。
基本信息
| 以太网承载 | 默认使用端口 502,报文头七字节加协议数据单元 |
|---|---|
| 串行承载 | 从站地址加协议数据单元加校验,需按串口参数解析 |
| 协议数据单元 | 首字节为功能码,其后为地址、数量或数据 |
| 请求响应配对 | 以太网按事务标识配对,串行按从站地址与顺序配对 |
| 异常响应 | 响应功能码为请求功能码的最高位置位,并附带一个异常码 |
| 判读依据 | 功能码判断读写类型,地址范围判断访问对象,异常码判断失败原因 |
判读要点
- 区分读写性质:读类功能码属正常监视流量,写类功能码涉及参数与控制,需要关注来源与时序
- 核对地址范围:同一条读写是否总落在设定范围内,超出范围可能是配置错误或异常访问
- 统计异常码分布:集中出现的异常码指向配置、地址或设备状态问题
- 观察轮询周期:正常监视是规律周期轮询,周期被破坏或请求量突增需要解释
- 确认发起方:同一服务端设备被哪些客户端访问,有无清单外的客户端出现
- 注意单元标识:一个网关后可挂多个从站,单元标识混淆会导致结论错误
- 结合变更记录:工程调试期间出现写操作属正常,需与变更时间对照
常见功能码与含义
| 功能码 | 操作类型 | 典型用途 |
|---|---|---|
| 01 / 02 | 读线圈与离散量类数据 | 读取开关量状态 |
| 03 / 04 | 读保持寄存器与输入寄存器 | 读取测量值与参数 |
| 05 / 06 | 写单个线圈与单个寄存器 | 修改单个设定值或输出 |
| 15 / 16 | 写多个线圈与多个寄存器 | 批量下发参数或配方 |
| 异常响应 | 功能码最高位置位并附异常码 | 用于判断失败原因,如非法地址或设备故障 |
异常码是很有价值的线索:非法数据地址类的异常集中出现,通常意味着上位机地址映射配置有误或设备地址范围发生过变更;设备故障类的异常则指向服务端设备本身。把异常码按设备与时间统计,往往能直接定位到问题源头。