03-异常响应排障


3.3 异常响应排障

本节摘要:从站答不上来不是沉默——它会把功能码最高位置 1 并附异常码。本节讲清异常响应格式、八类异常码的现场含义,以及"从站沉默"这种更隐蔽的故障怎么排查。位置:3.2 会发报文了,本节处理"发出去没下文"的所有情况。

异常响应的格式

从站发现请求有问题,响应不是沉默而是报错:

异常响应:地址(1) + (功能码|0x80) + 异常码 + 校验 例:请求 01 03 00 64 00 02 → 地址越界 应答 01 83 02 [CRC] ← 83 = 03|0x80,02 = 非法数据地址 ​

最高位置 1(功能码 + 0x80)是"这条是异常响应"的标记,解析时先看这一位,再看异常码。

八类异常码的现场含义

异常码 名称 现场典型原因 处置方向
01 非法功能码 设备不支持该功能码(如老表不支持 16) 查点表支持矩阵,改用 06
02 非法数据地址 地址/偏移超出设备映射范围 核对偏移,别忘减 1
03 非法数据值 数量超上限或数值非法 拆小批量、校验范围
04 从站设备故障 设备内部错误,无法处理 查设备日志、看状态灯
05 已接受延迟处理 设备忙,稍后处理 稍后重试
06 从站忙 正在处理上一条 加大轮询间隔重试
08 存储奇偶错 设备存储区校验失败 联系厂商

现场排障口诀:02 先怀疑地址,03 先怀疑数量,04 之后查设备。02/03 是配置类错误,九成是主站侧程序的问题;04+ 才需要摸设备。

从站沉默:比异常更隐蔽的故障

比异常响应更常见的是完全沉默——主站发出去,等不到任何回应。按链路一层层查:

层次 怀疑点 验证手段
物理层 接线、终端电阻、波特率 示波器看波形、串口助手试波特率
链路层 地址是否匹配、CRC 是否对 用抓包工具算 CRC 比对
应用层 功能码/数据是否合法 用调试器发同一条报文观察
配置 从站是否被禁用、网关路由 读设备配置、查网关映射表

特别提醒:地址不匹配与 CRC 错误的沉默是最像的两种——前者设备根本没听,后者设备听了但扔了。用串口抓包把原始字节抓下来算一次 CRC,立刻能区分。

异常排障的完整案例流程

把异常排障串成一个标准流程,现场照着走:

主站报"从站无响应" → 抓包看有没有响应帧? 无响应 → 看有没有请求帧发出? 无请求 → 主站软件/轮询配置问题 有请求 → 算 CRC → 对地址 → 查波特率 → 查物理层 有响应 → 看是正常响应还是异常响应? 正常 → 解析数据是否符合点表(可能是点表口径问题) 异常 → 查异常码:01 查功能码支持,02 查地址,03 查数值 ​

异常码与重试策略的搭配

不同异常码的重试策略完全不同:01/02/03(非法请求)重试也没用——是配置/程序错误,应停止重试并记录日志告警;05/06(设备忙)适合重试——加大间隔重试几次可能成功;04(设备故障)重试意义有限——先查设备状态再决定。把异常码分"不可重试/可重试/需人工"三类处理,程序才不会在错误方向上反复浪费带宽。

从站沉默的物理层验证实操

怀疑物理层时,最直接的验证是回环测试:把 RS-485 的 A/B 线在从站端短接或拆下,主站自发自收(把主站 TX 接到自己的 RX 看是否能收到自己发的帧)。能收到说明主站侧物理链路正常;收不到说明主站串口配置或线缆问题。再配合示波器看 A/B 差分波形(静默时应是稳定的偏置电平,通信时应有清晰的方波翻转),物理层问题基本能定位到"哪一段线"。

易错点补充

  • 把从站忙(06)当故障告警:从站忙是正常状态(正在处理高优先级任务),主站应平滑重试而非告警刷屏;
  • 异常码 02 与地址减 1 的连锁错误:点表写 40001 你填偏移 1,设备回 02,很多人去查"寄存器是不是坏了",其实错在减 1 没做;
  • 沉默与慢响应的区分:从站处理慢(数百 ms)与真沉默要区分——把超时设到实测值的 2-3 倍,再用抓包确认是否真的无响应。

易错点清单

  • 把沉默当"设备坏了":先抓包,沉默的原因按物理→地址→CRC→配置顺序查,多数是主站侧;
  • 异常码只记数字不记含义:01/02/03 的处置完全不同,把异常码到处置的映射表贴在调试台前;
  • 重试逻辑无退避:从站忙(06)时立即重试会加剧拥塞,重试间隔按 100ms 起步递增。

要点回顾:异常响应 = 功能码最高位置位 + 异常码;02 查地址、03 查数量、04+ 查设备;沉默按物理→地址→CRC→配置分层排。报文与异常都摸透了,下一章看三种传输模式怎么把这套报文搬上不同的线。

实战复盘:三次重试背后的真正原因

某自动化仓库项目,堆垛机的读操作偶尔报"超时重试 3 次后失败"。抓包发现:请求正常发出,从站偶发不响应,且集中在堆垛机急停动作的瞬间。深入排查:急停时从站(变频器)忙于安全逻辑,Modbus 处理被挤到几十毫秒之后,而主站超时设的是 30ms——从站不是没响应,是响应慢了。

修正:把该从站的超时从 30ms 提到 200ms,重试次数从 3 次降到 1 次(减少拥塞),问题消失。复盘结论:超时与重试要按"最慢从站的最坏响应时间"设置,而不是按理想值;从站忙(急停、自检、写 Flash)导致的慢响应是正常现象,应该用更长的超时包容,而不是用更多重试去轰炸。

异常日志的设计

生产系统的异常处理要有日志:记录时间、从站地址、功能码、异常码、连续失败次数。连续失败次数超过阈值(如 5 次)自动告警;异常码分布按周统计,能暴露"某台设备长期报 02"这类被忽略的系统性问题。没有日志的异常处理等于没处理——现场排障第一件事永远是翻日志。

小结:异常响应=功能码最高位置位+异常码;02 查地址、03 查数值、04 以上查设备;沉默按物理-地址-CRC-配置分层排;超时按最慢从站的最坏响应设定。
延伸练习:搭一套串口回环(主站经 USB 转 485 连一台从站模拟器),故意制造三类故障——地址错、功能码不支持、从站忙——观察异常码与沉默行为,并把处置流程写成你自己的排障速查表。完成练习后对照本节要点自查:遇到从站沉默,能否按物理层、地址、CRC、配置的顺序独立排查?能,则三种传输模式的学习可以开始了。

作者与出处
原作者:灏天文库
来源:平台策划编纂
整理人: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U