1. 掉线不等于程序崩:先把"断"和"错"拆开看
干过现场的都知道,Modbus RTU 从站掉线这事最磨人的地方不在于难修,而在于它会让你把时间花在错误的方向上。设备通讯时好时坏,PLC 报通讯故障,触摸屏上数据卡住不动,第一反应往往是"程序是不是写错了""轮询逻辑是不是有 bug",然后打开工程文件从头翻一遍,改改超时、加加重试,烧进去,跑半天又掉了。一整天就这么没了,问题还在原地。
我带过不少新人,他们共同的思维惯性是:软件看得见、改得动,所以优先怀疑软件。而线缆、端子、干扰这些东西看不见摸不着,还得拆柜子,心理上天然抗拒。可现实恰恰相反——Modbus RTU 的间歇性掉线,八成以上发生在物理层和时序层,程序本身背锅的比例远没有想象中高。这不是说代码永远没问题,而是说排查顺序错了,你会把大量时间浪费在低概率区域。
先做个基础定义,方便后面统一语言。Modbus RTU 是主从式串行通讯协议,一条总线上通常只有一个主站(PLC、上位机、网关),下面挂若干个从站(仪表、变频器、温控器、IO 模块)。主站按站号依次发请求帧,从站收到自己的站号后回响应帧,其它从站听到不是自己的站号就闭嘴。整个过程靠时间间隔来切分帧边界,而不是靠起始字节——这一点非常关键,后面讲时序会重点展开。
1.1 三种"掉线"的形态,处理思路完全不同
现场说的"掉线",其实至少混着三种不同的故障,混在一起谈就会越谈越乱。
第一种是彻底失联型。主站发什么从站都不回,超时百分百。这种反而好查,因为故障是稳定的,你能用替换法、短接线、单独测试快速锁定。常见原因:站号被改过、波特率或校验位不一致、A/B 接反、从站没上电、通讯口烧了。
第二种是间歇性超时型,也是真正折磨人的那类。白天跑得好好的,下午三点开始偶尔超时;或者只要旁边那台变频器一启动就掉。这类问题用"换个程序试试"的方式基本解决不了,因为触发条件在环境里,不在代码里。
第三种是通讯没断但数据不对。从站有响应,CRC 也过,但读回来的数值离谱——温度显示 6553.5、电度表读数跳变、频率值忽大忽小。这往往不是"掉线",而是字节序、寄存器映射、数据长度的问题,被误报成了通讯故障。
提示:处理任何 Modbus 问题之前,先花五分钟确认它属于上面哪一类。分类做对了,排查路径直接砍掉三分之二。
1.2 为什么"先怀疑程序"是个昂贵的习惯
我算过一笔账:改一次 PLC 程序、下载、复位、观察,平均二十分钟;拆一次柜子检查接线、量电压、看屏蔽,平均十分钟。也就是说,软件排查的单位成本比硬件排查高一倍。从效率角度看,也应该先做便宜的动作。
更麻烦的是,改程序会引入新的变量。你今天调了超时时间、加了重试次数,明天问题没复现,你会误以为是"改好了",其实只是干扰源那天没开机。这种"假修复"最坑人,它让你带着一个没解决的隐患进入下一阶段,等到客户验收或者半夜产线停机的时候集中爆发。
还有一种情况值得单独提:多主站或者说网关转发场景。有些项目里 PLC 直接连从站,有些是 PLC 通过网关、DTU、串口服务器去连从站。后面这种结构里,掉线的根因可能在中间设备上——比如网关自己的轮询周期和 PLC 的周期打架,同一时刻两个主站在总线上说话,帧就撞了。这类问题看 PLC 程序永远看不出来。
1.3 一张现场能直接用的分层定位表
我把这些年用得最顺手的判断逻辑整理成表,你到现场照着走一遍,基本能在一小时内把范围缩到一两层。
| 观察到的现象 | 最可能的层级 | 优先动作 |
|---|---|---|
| 全部从站同时失联 | 主站侧、总线主干、供电 | 查主站串口、终端电阻、总线供电 |
| 只有某一个从站失联 | 该从站接线、站号、参数 | 单独接该从站短距离测试 |
| 白天正常,特定时段掉 | 干扰源、电网波动 | 记录掉线时间点,对照大功率设备启停 |
| 距离短正常,拉长就掉 | 线材、终端电阻、共地 | 换屏蔽双绞,检查终端匹配 |
| 新增一台从站后开始掉 | 地址冲突、总线负载 | 核对站号唯一性、查是否有重复 |
| 通讯正常但数值错 | 字节序、映射、长度 | 用串口助手抓原始帧核对 |
这张表的作用不是直接给你答案,而是防止你在错误层级反复折腾。我见过有人在软件里折腾两天,最后发现是新加的一台仪表跟老设备站号撞了。
2. 物理层的几个老问题,恰恰是最常翻车的地方
物理层的东西讲了几十年,教科书上一大堆,但现场真正做对的比例依然不高。原因不复杂:这些东西"看起来接上了",用万用表量也通,于是就被判定为没问题。可 RS-485 是差分信号,通不通和能不能稳定通讯是两回事。
2.1 A/B 极性和双绞,决定的是抗干扰能力
先说极性。RS-485 用一对差分线传信号,习惯叫 A 和 B(有些资料叫 D+ / D-)。不同厂家对 A/B 的定义不统一,这是行业里长期存在的历史包袱。所以现场最靠谱的验证方式是:先按说明书接,不通就对调一次,通了就记住。别花时间在网上争论谁对谁错,接到能通就是对的。
再说双绞。很多人用普通多芯电缆做 485 通讯线,短距离(几米)确实能跑,但一拉到几十米,误码率就上来了。原因是差分信号靠两根线的电磁环境高度一致来抵消共模干扰,不绞在一起,两根线感受到的干扰不一样,抵消效果大打折扣。工程上应该用屏蔽双绞线,一对绞线走 A/B,屏蔽层单独处理。
这里有个容易被忽略的细节:多芯电缆里如果有空闲的线对,别把 A/B 分到不同的绞对上。有些人图省事,A 用第一对的芯、B 用第二对的芯,这在电气上完全没问题,但抗干扰性能直接退化成非双绞。
2.2 终端电阻:该加的时候不加会掉,不该加的时候加了也会掉
终端电阻的争议比极性还大。原理很清楚:RS-485 总线在两端各加一个 120Ω 电阻,用来做阻抗匹配,吸收信号到达末端时的反射。线越长、速率越高,反射的影响越明显。
但现场经常出现两个极端。一种是完全不接,几十上百米的线两端空着,信号在末端反射回来和原信号叠加,形成过冲和振铃,接收端在阈值附近来回穿越,就产生了随机的误码和丢帧。另一种是每个从站都焊一个 120Ω,八个从站挂上去,并联电阻只有 15Ω,驱动器根本推不动,结果所有站都不通。
正确的做法是:只在总线物理上的两个最远端各接一个,中间的从站一律不接。判断"最远端"要看物理布线布局,不是看站号顺序。如果你的布线是星型或者有长分支,那终端电阻怎么加都不太对,应该改成手拉手的总线拓扑。
注意:很多设备的 485 接口里已经内置了可跳线的终端电阻,出厂默认是断开的。你拆柜子检查的时候一定要看清楚跳线帽的位置,别在外面又并一个。
2.3 共地问题:看起来接好了,其实浮在半空
这是我认为最被低估的一类根因。RS-485 收发器的共模电压范围一般是 -7V 到 +12V,超出这个范围就可能误判甚至损坏芯片。如果两个设备各自接各自的电源,地电位之间有几十伏的差异(工业现场很常见),那么这个差值就直接压在收发器的共模输入上。
典型症状非常有辨识度:单独测试都正常,一起连上就掉;或者用手摸一下柜体、设备接地一碰就好。这种时候十有八九是共地问题。
解决方案通常有三个层次。最基础的是把总线两端设备的地用一根线连起来,注意用足够粗的线,且不要形成地环路。往上一步是在总线上加隔离型 485 收发器或者隔离型转换器,把两端电气完全隔开,这在跨配电柜、跨楼层的场景里几乎是标配。再往上是让整条总线的从站供电规范化,避免一路从 A 柜取电、一路从 B 柜取电。
2.4 线径、长度和拓扑,几条经验数值
下面这些数值不是标准条文,是我自己项目里总结的经验区间,你可以当参考起点:
| 参数 | 建议值 | 说明 |
|---|---|---|
| 通讯线截面积 | 0.5~1.0 mm² | 太细线阻大,压降和反射都变差 |
| 单段长度 | ≤ 1000 m | 超过要加中继或分段 |
| 分支长度 | 越短越好,最好为 0 | 分支会形成阻抗不连续点 |
| 波特率与距离 | 9600 可跑较长,115200 建议 ≤ 100 m | 速率越高对线材要求越高 |
| 节点数 | 通常 ≤ 32(受驱动能力限制) | 超了要用中继器 |
拓扑必须是手拉手,一根总线串过去。星型、树型、环形在 RS-485 上都是雷区。如果设备物理布局确实是分散的,那就用 485 集线器或者中继器把它切成几段独立总线,每段各自手拉手。
我做过的项目中有一个很典型的教训:厂房里六个仪表分散在三面墙上,施工队图省事从主柜拉了六根线分别到每个仪表,形成星型。结果每次开三台以上设备就掉线。改成从主柜一路手拉手串过去之后,两年没出过问题。
3. 时间参数配不对,再好的线也白搭
物理层搞定了,接下来最容易出问题的是时序。Modbus RTU 不像 Modbus TCP 有明确的长度字段,它靠帧之间的静默间隔判断帧结束。这个特性决定了几个关键时间参数必须配得合理,否则会出现一种很诡异的现象:单独测都通,跑起来就偶发超时。
3.1 3.5 字符间隔到底是多少毫秒
协议规定,一帧数据前后要有至少 3.5 个字符时间的静默。一个字符在串口里通常是 11 位(1 起始位 + 8 数据位 + 1 校验位 + 1 停止位)。所以 3.5 个字符 = 38.5 位。
按波特率算:
- 9600 bps:38.5 / 9600 ≈4.0 ms
- 19200 bps:38.5 / 19200 ≈2.0 ms
- 38400 bps:38.5 / 38400 ≈1.0 ms
- 115200 bps:38.5 / 115200 ≈0.33 ms
看出来了吗?波特率越高,这个间隔越短,对主站和从站的响应速度要求越苛刻。很多老一点的仪表处理器性能一般,主站发完 1ms 就接着发下一帧,从站还在处理上一帧的数据,新帧就开始位了,直接被它当成帧内字节吞掉,然后 CRC 出错、丢帧。
提示:如果项目里从站设备比较杂、有老仪表,宁可把波特率降到 19200 甚至 9600,把时间余量留足。通讯速率不是越高越好,稳定第一。
3.2 响应超时:不能太短,也不能太长
响应超时是指主站发出请求后,等多久没收到回复就判超时。取值太短,从站处理慢一点就误判;取值太长,真掉线时主站会卡很久,看起来像"死机"。
我的经验公式是:超时 ≥ 从站最长处理时间 + 帧传输时间 + 2~3 倍余量。
举个具体的例子:波特率 9600,一次读 10 个保持寄存器,请求帧 8 字节,响应帧 25 字节。
- 请求帧传输时间 = 8 × 11 / 9600 ≈ 9.2 ms
- 响应帧传输时间 = 25 × 11 / 9600 ≈ 28.6 ms
- 从站处理时间设 20 ms(保守)
那么理论往返约 58 ms,超时设200 ms比较稳妥。如果从站是变频器这类处理较慢的设备,可以直接上 500 ms。
很多 PLC 的 Modbus 指令默认超时是 300ms 或 1s,多数情况下够用,但如果项目里从站数量多、轮询周期紧,就要单独算一下。
3.3 轮询周期和从站处理能力要匹配
轮询周期是指主站把一轮所有从站问完需要的时间。它等于所有单次交互时间之和,加上间隔。
假设 10 个从站,每个交互(请求 + 响应 + 间隔)平均耗时 80 ms,那一轮就是 800 ms。也就是说任何从站的数据刷新周期最快也是 800 ms。如果你在 HMI 上要求 200 ms 刷新,那是不可能实现的,看到的抖动其实不是掉线,是数据本身刷新慢。
反过来,如果从站处理能力弱但主站轮询很急,会出现总线长时间被占用,某些低速从站永远赶不上节奏,表现为"总是那几个站掉线"。这时候解决办法是分组轮询:把快速设备放一组、慢速设备放一组,两组用不同的周期跑,而不是全部硬塞进同一个循环。
3.4 重试机制:用错地方就是掩盖问题
通讯指令一般都有重试次数设置,从站不响应就重发。适度重试能提高成功率,但重试次数设太多,会把偶发故障伪装成正常运行。
更糟的是,重试会打乱轮询节奏。某个从站连续重试三次,每次都超时,那这一轮就有 600 ms 被它占用了,其它从站的数据刷新时间全被拖后。如果从站数量多,还可能出现"重试风暴",总线利用率接近饱和,所有站都开始掉。
我的做法是:重试次数设 1~2 次,同时在上位机侧单独记录"每个从站的超时次数"。超时次数缓慢增长说明有隐患要处理,而不是靠重试把它盖掉。这个计数比单纯的"通讯正常/故障"标志有用得多,它能告诉你趋势。
4. 干扰和供电:变频器旁边那一米线
前面说的都是静态问题,接对了就接对了。真正让老手也头疼的是动态干扰——线接得没毛病,参数也没毛病,但旁边那台 22kW 的变频器一启动,总线就抖。
4.1 干扰是怎么钻进通讯线的
工业现场的干扰主要走三条路。
第一条是传导。变频器、伺服驱动器、大功率接触器在工作时会产生大量的高频谐波,这些谐波会通过供电线路传播,如果通讯设备的电源和动力设备共用一路,噪声就直接进到设备里。
第二条是辐射。变频器到电机的输出线(PWM 波形,dv/dt 很高)本质上是一根很长的高频发射天线。如果通讯线和这根动力线平行走线,尤其是放在同一个线槽里,耦合量会非常可观。
第三条是共模耦合。设备的外壳、屏蔽层、接地线上都会有高频电流,这些电流流过通讯线的时候,在 A/B 上形成共模电压,超过收发器的容限就出错。
识别是哪一条,最简单的方法是做对照试验:把可疑的那台设备关了,看掉线是否消失;或者临时把通讯线挪开动力线一米,看是否改善。改善明显就是辐射,没改善就往传导和共模方向查。
4.2 几个真正见效的整改手段
按性价比排序,我一般这么做:
第一,走线分开。通讯线和动力线绝对不能同槽,平行距离至少要 200mm 以上,实在避不开就交叉成 90 度走。这一条改完,很多时候问题就消失了一半。
第二,屏蔽层单端接地。屏蔽双绞线的屏蔽层只在一端接地(通常接主柜侧),另一端悬空。两端都接的话,屏蔽层本身形成地环路,反而会引入电流。屏蔽层要接到柜体的接地铜排,不是随便拧在某个螺丝上。
第三,加隔离。主站的 485 转换器换成隔离型,成本几十到几百块,能解决大量共模问题。从站如果支持隔离输入,优先选隔离型号。
第四,磁环。在通讯线靠近设备的一端套一两个铁氧体磁环,对高频共模骚扰有一定抑制作用。成本几块钱,值得试。注意线要在磁环里绕 2~3 圈才有效果,直接穿过去作用有限。
第五,动力侧整改。变频器输出侧加输出电抗器、动力线用屏蔽电缆并把屏蔽层两端接地、电机侧加磁环。这些是治本的手段,但需要停机改造,适合在前期设计阶段做进去。
4.3 从站供电:地环流是个隐形杀手
有个案例我印象特别深。一条总线上挂了八个称重仪表,其中三个偶尔失联,位置不固定。检查接线一切正常,换线也没用。后来发现这八个仪表是分两路供电的——五个从 A 配电箱取 24V,三个从 B 配电箱取。两个配电箱的 0V 之间有大约 3V 的电位差,加上两个箱子的接地方式不同,通讯线里的共模电流就有几十毫安。
改造方案很朴素:统一从一个配电箱给所有从站供电,或者用隔离型 485 收发器把通讯和电源的地都隔开。改完之后掉线彻底消失。
这个案例的启示是:总线上所有设备的参考地必须是同一个。做不到的时候,就必须用隔离来人为切段。
5. 转换器、驱动和串口占用:上位机侧的几个坑
从站排查完,别忘了另一头——上位机(PC、工控机、触摸屏)。因为上位机侧的问题和现场接线问题表现几乎一样:都是通讯超时、数据不更新。
5.1 USB 转串口芯片的稳定性差异
USB 转 RS-485 的转换器,价格从十几块到几百块不等,差异主要在芯片和隔离设计上。常见的转串口芯片里,工业现场用得比较多的是一些老牌型号,抗干扰和驱动稳定性相对好一些;也有一些低成本芯片在长时间运行后会出现 USB 掉线、需要重新插拔的情况。
判断转换器是否有问题,有个简单办法:换一台电脑、换一根 USB 线、换一个 USB 口,如果现象跟着变,那就是转换器或主机侧的问题。另外,USB 口优先用主机后面板直出的口,不要用前面板延长线或者 USB Hub,Hub 的供电和信号完整性都可能出问题。
还有一点常被忽略:Windows 的 USB 选择性暂停。系统在空闲时会把 USB 设备挂起省电,某些转换器被挂起后无法正常唤醒,表现就是运行几小时后突然掉线,重插一下又好了。手动关掉电源管理里的这一项,能解决一批"莫名其妙掉线"的投诉。
5.2 串口被抢占和缓冲区溢出
上位机程序里读串口,如果用了阻塞式读取又没设超时,或者多个线程同时操作同一个 COM 口,会出现数据被吃掉的情况。现象就是从站明明回复了,主站却认为超时。
另外,如果程序里读取不及时,串口驱动的接收缓冲区满了,后续数据会被丢弃。这在一次读大量寄存器(比如一次读 125 个)的时候特别容易发生。
注意:一条串口链路上,任何时候只能有一个程序打开该 COM 口。调试的时候别忘了关掉串口助手,否则你会以为是设备掉线,实际上是口被占着。
5.3 一段用来验证链路的最小代码
排查的时候,我习惯先抛开 PLC 和上位机软件,用一段最简代码验证物理链路本身是否可靠。这段代码只做一件事:循环读一个从站,统计成功率和响应时间。
import time import serial from pymodbus.client import ModbusSerialClient client = ModbusSerialClient( port="COM3", baudrate=19200, parity="N", stopbits=1, bytesize=8, timeout=0.3, ) ok = 0 fail = 0 costs = [] for i in range(1000): t0 = time.perf_counter() try: rr = client.read_holding_registers(address=0, count=4, slave=1) if rr.isError(): fail += 1 else: ok += 1 costs.append((time.perf_counter() - t0) * 1000) except Exception: fail += 1 time.sleep(0.05) client.close() print(f"成功 {ok} 次, 失败 {fail} 次, 成功率 {ok/10:.1f}%") if costs: print(f"平均耗时 {sum(costs)/len(costs):.1f} ms, 最大 {max(costs):.1f} ms")这段代码的价值在于量化。跑一千次,如果成功率 99.5% 以上、最大耗时稳定,那链路是健康的,问题在软件逻辑或轮询调度上。如果成功率只有 95% 而且最大的那几次耗时明显跳高,那就是物理层有间歇性干扰,可以拿这个数据去说服施工方整改,比空口说"我觉得线有问题"有力得多。
6. 通讯没断但数据不对:字节序和映射的坑
这一类严格说不是"掉线",但现场经常被归到掉线里报上来,而且排查起来同样耗时间。既然标题是"查一整天",就把这几个坑一起说了。
6.1 32 位数据的高低字交换
Modbus 的寄存器是 16 位的,一个 32 位浮点数或者 32 位整数要占两个寄存器。问题是协议没有规定这两个寄存器的顺序,于是出现了四种排列:
| 顺序名称 | 寄存器排列 | 说明 |
|---|---|---|
| ABCD | 高字在前,高字节在前 | 最常见的大端方式 |
| CDAB | 低字在前,高字节在前 | 字交换,很常见 |
| BADC | 高字在前,低字节在前 | 字节交换 |
| DCBA | 低字在前,低字节在前 | 完全小端 |
如果顺序搞错了,你读到的数值会是"看起来像随机数但又不是完全随机"的结果。比如设定 50.0Hz,读回来是 1.1e-38 或者 4.6e+30 这种离谱值,那基本可以断定是字节序问题。
实操建议:先用一个已知的整数去试。比如把从站某个参数设成 1000,读回来如果是 0x03E8 就对了;如果是 0xE803,那就是字节交换;如果读的是两个寄存器 0x0000 和 0x03E8 顺序反了,那就是字交换。用整数试比用浮点数试好判断得多。
6.2 寄存器地址的 0 基和 1 基
这也是老坑。设备说明书上写的地址和协议里实际要发的地址,经常差 1。手册上写"保持寄存器 40001",实际发的时候地址字段要填 0;手册写"40010",实际填 9。有些厂家手册里会明确标注"协议地址"和"手册地址",有些就不写,只能试。
判断方法:如果读回来的数据明显是隔壁参数的(比如你想读频率却读到了电流),那大概率是地址偏移了 1。往前挪一个再看。
6.3 读取长度和从站缓冲区
有些从站设备的寄存器缓冲区比较小,一次读太多会返回异常码。比如你想一次读 100 个寄存器,从站只支持一次最多读 32 个,那就得拆成多次读。这种情况下从站会返回异常响应(功能码 | 0x80,后面跟异常码 03,表示非法数据值),不是不解码。
所以如果你的排查工具只统计"有没有回复",会漏掉这种异常响应。一定要把异常响应单独统计和打印出来,它会直接告诉你从站是哪一类拒绝。
7. 一次真实排查的完整链路
前面讲的都是分层的知识,这一节我把一个具体案例从头到尾走一遍,你可以照着这个节奏去复现。
7.1 现象记录和第一轮二分
项目背景:一条产线,一台 PLC 做 Modbus RTU 主站,下面挂 12 个从站(4 台变频器、6 个温控器、2 个电表)。现象是每天上午十点到十一点之间,随机会有 1~3 个从站超时报警,下午恢复正常。
第一步,我做的不是改程序,而是记录。花了一天时间,把每次掉线的从站编号、时间点、持续时长记下来。结果发现一个规律:掉线的从站编号每次都不同,时间点集中在十点到十一点,而且持续时长都不到 5 秒。
第二步,二分范围。把所有从站分成两组,A 组 6 个接在原总线上,B 组 6 个临时接到另一条独立的串口上,两个口分别观察一天。结果两边都掉。这就排除了"某个从站有问题"的可能,说明是共性问题——总线、主站、或者环境。
第三步,换环境条件。我让现场把那个时间段启动的大功率设备(一台 30kW 空压机)关掉,只观察一天,掉线完全消失。范围一下就锁到了干扰。
7.2 抓波形:到底看什么
到这一步,光靠猜不行了,得上仪器。我在主柜的 485 口上并了一个示波器(差分探头接 A/B),设成上升沿触发、单次捕捉模式,等着掉线发生。
掉线果然复现了,波形上看到两件事:
- 正常帧的差分幅度大约 2.2V,边沿干净;
- 掉线那一刻,A/B 上叠加了一串大概 200kHz 的高频振铃,幅度接近 1V,正好压在收发器的判决阈值附近。
这就确认了:干扰通过辐射或传导耦合到了总线上,让接收端把高电平判成了低电平,帧解析出错。
7.3 整改和验证
按前面第 4 节的思路,我们做了三件事,按成本从低到高:
- 通讯线改走独立的金属线槽,与动力线分开,平行段从原来的同槽变成相距 400mm 以上;
- 主站侧加隔离型 485 转换器,屏蔽层改接到柜体接地排,单端接地;
- 空压机侧的动力线加装输出电抗器和磁环。
整改完之后,用第 5.3 节那段统计代码连续跑了一周,成功率从之前的 96.8% 提升到 99.98%,掉线报警归零。
这里想说的一点是:三条措施里,第一条最便宜也最有效。很多项目根本不需要动动力侧,把走线改对就能解决。所以整改建议的排序很重要,先做便宜且有效的,别一上来就让客户停机改硬件。
8. 把偶发掉线挡在发生之前
前面都是"出问题了怎么查",最后说说"怎么让它少出问题"。这部分是我这些年最愿意花时间的地方,因为一次前期投入能省掉后面无数次现场出差。
8.1 设计阶段就该定下来的几件事
第一,总线上所有从站统一供电,做不到就用隔离。这条能消灭一大类共模问题。
第二,通讯线选型和走线路径提前定。图纸上就把通讯线和动力线画在不同的桥架里,施工队照图施工,后期不会扯皮。
第三,拓扑必须是手拉手。设备布局分散的时候,提前规划好中继器位置,别指望施工队现场自由发挥。
第四,波特率留余量。从站品牌杂、有老设备的时候,直接选 9600 或 19200,别为了"看起来先进"上 115200。
第五,给每台从站单独设超时计数,并把这个计数接到上位机的报警或趋势记录里。这是最便宜的预测性维护手段。
8.2 运行阶段的监测习惯
我自己的习惯是,在项目交付时留一个"通讯质量面板",上面至少显示这几项:
| 监测项 | 作用 | 报警建议 |
|---|---|---|
| 每站超时次数(小时/天) | 发现缓慢恶化的隐患 | 环比翻倍就查 |
| 平均响应时间 | 反映总线负载 | 超过阈值 2 倍就查 |
| 总线利用率 | 反映轮询是否过密 | 长期 > 60% 要优化 |
| 异常响应计数 | 区分是拒答还是无答 | 非零就核对参数 |
| 重试触发次数 | 反映链路健康度 | 持续增长就查物理层 |
有了这几个数,你能在问题变成"产线停机"之前就发现它。很多现场的掉线其实是缓慢恶化的过程——今天超时 5 次,下周 20 次,一个月后变成报警。有趋势数据就不会被动。
8.3 一个能省很多事的备件习惯
最后分享一个小习惯:项目交付的时候,我一般会在柜子里留一个同型号的隔离型 485 转换器、一段屏蔽双绞线、两个 120Ω 电阻、一两个磁环。这些东西加起来不到两百块,但现场出问题时能让你在半小时内完成替换验证,而不是等采购、等快递、等三天。
还有个细节,从站设备的通讯参数(站号、波特率、校验、字节序)全部拍照存档,贴在柜门内侧。设备换新、参数丢失的时候,这几张照片能救命。
搞 Modbus RTU 掉线这件事,说到底就是个"顺序"问题。先分类型,再看物理层,再看时序,再看干扰,最后才轮到程序。顺序对了,一天变一小时;顺序错了,一天变一周,而且问题还在那儿。我自己踩过的坑里,真正因为程序逻辑写错导致的间歇性掉线,一只手数得过来;剩下那些,全都在柜子里、线槽里,或者在那台离通讯线只有十厘米的变频器身上。