4、通信总线可靠性:CAN总线冗余设计、RS485终端匹配、通信协议容错机制

通信总线这东西,说它是分拣机的「神经网络」一点不为过。传感器数据要传上来,执行器指令要发下去,中间但凡丢一个字节,轻则一个包裹分错道,重则整条线急停。我这些年调试过的分拣机项目,少说也有十几个,通信出问题占的故障比例,说实话,比电机烧了还高。

所以这一章,咱们就专门聊聊通信总线的可靠性。重点放在CAN和RS485上——这两兄弟在工业现场用得最多,坑也最多。

4.1 CAN总线冗余设计

CAN总线在分拣机里很常见,尤其是多节点、实时性要求高的场景。但CAN总线有个天生的弱点:它是单线串行通信。一旦总线被拉死,或者某个节点把总线搞挂了,整个系统就瘫痪了。

我个人习惯的做法是:物理层冗余 + 节点冗余。

4.1.1 双CAN总线冗余

说白了,就是铺两条CAN总线。一条主用,一条备用。每个节点都挂两条总线上。

  • 主总线:正常工作时,所有数据走主总线。
  • 备用总线:主总线故障时,自动切换。

切换策略我一般用两种:

  1. 心跳检测法:主节点定期发心跳帧。备用节点如果连续3个周期没收到心跳,就认为主总线挂了,自动切到备用总线。
  2. 错误计数法:CAN控制器内部有错误计数器。当某个节点的发送错误计数超过阈值(比如127),就主动切到备用总线。

关键点:切换时间要控制在50ms以内。分拣机的动作周期通常是200ms左右,50ms的切换时间不会影响正常分拣。

4.1.2 节点冗余设计

嗯,这里要注意:总线冗余只能解决「线断了」的问题,解决不了「节点挂了」的问题。

我在一个项目里遇到过:一个传感器节点突然死机,把CAN总线拉成了显性电平,整条线都动不了。后来排查发现,是那个节点的CAN收发器电源出了问题。

所以我的建议是:关键节点做双备份。比如主控节点、关键传感器节点,用两个独立的CAN控制器和收发器,分别接到两条总线上。一个挂了,另一个顶上。

避坑指南:我曾经在选型时图省事,用了同一个电源给两个CAN收发器供电。结果电源一短路,两个收发器一起挂。记住:冗余必须做到电源隔离、地线隔离,否则就是假冗余。

4.2 RS485终端匹配

RS485在分拣机里用得也很多,尤其是长距离、多节点的场景。但RS485有个老生常谈的问题:终端匹配。

你想想看,RS485是差分信号,信号在电缆里传输,到了末端如果不匹配,就会产生反射。反射信号叠加到原信号上,轻则误码,重则通信中断。

4.2.1 终端电阻怎么选?

标准做法是:在总线两端各接一个120Ω的电阻。为什么是120Ω?因为RS485常用的双绞线特性阻抗就是120Ω左右。

电缆类型 特性阻抗 终端电阻
普通双绞线 100~120Ω 120Ω
屏蔽双绞线 120~150Ω 120Ω或150Ω
CAT5网线 100Ω 100Ω

我个人习惯的做法是:不管用什么线,先测一下实际特性阻抗。用示波器看信号波形,如果过冲严重,就调大电阻;如果上升沿变缓,就调小电阻。

4.2.2 偏置电阻要不要加?

这个问题很多人会忽略。RS485在空闲时,总线电平是浮空的。如果总线上没有数据,接收器可能因为噪声而误触发。

我的经验是:在主机端加偏置电阻。把A线拉到高电平,B线拉到低电平,让总线在空闲时保持一个确定的电平。

注意:偏置电阻不能加太多。加多了会拉低差分信号幅度,影响通信距离。一般用470Ω~1kΩ就够用了。我曾经在一个项目里加了100Ω的偏置电阻,结果通信距离从1200米直接掉到300米——教训深刻。

4.3 通信协议容错机制

硬件做完了,还得看软件。通信协议如果不做容错,硬件再可靠也白搭。

4.3.1 帧结构设计

我设计通信协议时,帧结构一般长这样:

| 帧头(2字节) | 长度(1字节) | 地址(1字节) | 命令(1字节) | 数据(N字节) | CRC(2字节) | 帧尾(1字节) |
  • 帧头:固定值,比如0xAA 0x55。用于同步。
  • 长度:整个帧的长度,用于接收端判断帧是否完整。
  • 地址:节点地址,用于多节点通信。
  • 命令:读、写、应答等。
  • 数据:实际数据。
  • CRC:循环冗余校验,用于检测数据是否被篡改。
  • 帧尾:固定值,比如0x0D 0x0A。

4.3.2 超时重传机制

通信不可能100%成功。所以必须做超时重传。

我的做法是:

  1. 发送方:发送数据后,启动一个定时器。如果在规定时间内没收到应答,就重发。
  2. 接收方:收到数据后,立即回复应答帧。如果数据校验失败,回复NAK帧。

重传次数一般设3次。超过3次还没成功,就报通信故障。

避坑指南:我曾经把超时时间设得太短,结果总线稍微有点延迟就触发重传,导致总线拥堵。后来我把超时时间设为「正常通信时间的3倍」,问题就解决了。你想想看,总线上的节点多了,延迟是正常的,要给点余量。

4.3.3 数据校验与纠错

CRC是必须的。但CRC只能检错,不能纠错。

对于关键数据(比如分拣指令),我建议做三模冗余:同一份数据连续发三遍,接收方按「多数表决」原则取结果。

举个例子:

发送方:0x01 0x01 0x01
接收方:收到 0x01 0x02 0x01
表决结果:0x01(因为有两个0x01,一个0x02)

这个方法简单粗暴,但效果很好。我在一个高速分拣机项目里用过,误码率从10^-4降到了10^-7以下。

4.3.4 总线状态监控

最后,别忘了做总线状态监控。我一般会在主控节点里跑一个监控任务,定期统计:

  • 总线上每秒钟的帧数
  • 错误帧的数量
  • 重传次数
  • 节点离线次数

这些数据记录下来,一旦发现异常(比如错误帧突然增多),就主动切换总线或报警。

总结一下:通信总线可靠性,说白了就是三件事——硬件冗余、终端匹配、协议容错。这三件事做好了,分拣机的通信系统基本不会出大问题。我见过太多项目,硬件选型花了大价钱,结果通信协议一塌糊涂,最后天天出故障。嗯,别犯这种错。