3、硬件冗余设计:双电源冗余设计(热备与均流)、双CPU模块设计、双背板总线设计
好,咱们进入正题。硬件冗余设计,说白了就是给系统上「双保险」。你想想看,一个远程IO站要是突然断电了,或者CPU死机了,现场的设备是不是全得停?那损失可就大了去了。
我个人习惯把硬件冗余分成三个层次来看:电源、大脑(CPU)、以及连接它们的骨架(背板总线)。咱们一个一个拆开讲。
3.1 双电源冗余设计:热备与均流
电源是整个系统的命脉。我见过太多项目,因为一个保险丝烧了,整个机柜断电,最后查出来是电源模块老化。所以,双电源冗余是第一步。
双电源冗余有两种主流模式:热备模式和均流模式。
3.1.1 热备模式(1+1备份)
热备模式,也叫主备模式。一个电源主输出,另一个电源待机。主电源正常工作时,备电源几乎不输出电流。一旦主电源挂了,备电源瞬间顶上。
这里有个关键点:切换时间。我曾经在一个化工项目里遇到过,切换时间长了5毫秒,结果PLC直接掉电重启了。嗯,这里要注意,切换时间必须小于系统掉电保持时间。一般要求小于10ms,好的设计能做到1ms以内。
- 切换时间:< 10ms(建议< 1ms)
- 输出电压跌落:< 5%
- 故障检测:硬件级快速检测,不依赖软件
3.1.2 均流模式(N+1冗余)
均流模式就更有意思了。两个电源同时工作,各承担一半负载。如果其中一个坏了,另一个自动承担全部负载。
均流的关键在于「电流均衡」。我建议使用下垂法或者主动均流法。下垂法简单,但精度差;主动均流法精度高,但需要额外的均流总线。
3.1.3 双电源的ORing电路
不管哪种模式,最后都需要一个ORing电路来合并两路电源。说白了就是两个二极管,或者更高级的MOSFET。
// 典型的双电源ORing电路示意
// 电源1 -> 二极管D1 -> 输出
// 电源2 -> 二极管D2 -> 输出
// 注意:二极管的压降和散热问题
用二极管简单,但压降大、发热大。我建议用理想二极管控制器,比如LTC4357。它能模拟二极管行为,但压降只有几十毫伏,效率高很多。
3.2 双CPU模块设计
CPU是系统的大脑。双CPU设计,说白了就是让两个CPU同时工作,互相监督。
双CPU有两种架构:热备架构和同步架构。
3.2.1 热备架构(主从模式)
主CPU干活,从CPU待机。主CPU定期把自己的状态和数据同步给从CPU。一旦主CPU挂了,从CPU接管。
同步数据是关键。我建议同步以下内容:
- IO状态表:所有输入输出的当前值
- 运行计数器:程序执行的步数
- 故障日志:最近的报警和错误
- 配置参数:IP地址、通信参数等
同步方式有两种:共享内存和高速串行链路。共享内存快,但需要双口RAM;高速串行链路灵活,但延迟稍大。
3.2.2 同步架构(双机热备)
同步架构更高级。两个CPU同时执行相同的程序,同时处理相同的输入。输出时,通过表决电路选择其中一个输出。
这种架构的难点在于:时钟同步和输出表决。
时钟同步可以用IEEE 1588(PTP)协议,精度能达到纳秒级。输出表决可以用硬件比较器,或者软件投票。
3.2.3 双CPU的切换逻辑
切换逻辑不能太敏感,也不能太迟钝。我见过一个项目,因为电源波动导致CPU频繁切换,系统反而更不稳定。
我建议的切换策略:
- 故障检测:连续3次心跳丢失,或者看门狗超时
- 切换确认:等待10ms,确认故障不是瞬时的
- 切换执行:从CPU接管所有IO控制权
- 故障上报:通过通信接口上报主CPU故障
3.3 双背板总线设计
背板总线是系统的骨架。所有模块都插在背板上,通过总线通信。如果背板总线坏了,整个系统就瘫痪了。
双背板总线,说白了就是两条独立的通信通道。
3.3.1 双总线架构
有两种常见架构:并行双总线和冗余环网。
| 架构 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 并行双总线 | 结构简单,切换快 | 需要双倍背板空间 | 小型远程IO站 |
| 冗余环网 | 节省背板空间,自愈能力强 | 协议复杂,延迟稍大 | 大型分布式系统 |
我个人习惯用并行双总线。为什么?因为简单可靠。你想想看,远程IO模块本来就不大,多一条总线也不占多少地方。
3.3.2 双总线的切换机制
双总线切换,不能靠软件,必须靠硬件。我建议用总线仲裁器或者硬件选择器。
切换条件:
- 总线A故障:比如CRC错误连续超过阈值
- 总线A物理断开:比如背板插槽接触不良
- 总线A噪声过大:比如电磁干扰导致信号畸变
切换时间:我建议控制在1个总线周期内。比如总线速率是10Mbps,一个周期是100ns,切换必须在100ns内完成。
3.3.3 双总线的物理设计
物理设计上,有几点要注意:
- 电气隔离:两条总线之间必须隔离,防止一条总线故障影响另一条
- 阻抗匹配:每条总线的终端电阻必须精确匹配,防止信号反射
- 热插拔:模块在带电状态下插拔,不能影响总线通信
3.4 总结与建议
好了,咱们把三个硬件冗余设计都过了一遍。总结一下:
- 双电源:热备或均流,关键是切换时间和均流精度
- 双CPU:热备或同步,关键是数据同步和切换逻辑
- 双背板总线:并行或环网,关键是切换速度和物理隔离
最后,我想说一句:冗余设计不是堆硬件,而是设计一套可靠的「故障应对机制」。你想想看,如果冗余系统比单系统还容易出问题,那还不如不用。所以,设计时一定要考虑「故障模式」和「故障恢复」,而不是只想着「多一个备份」。
下一章,咱们聊聊软件层面的冗余设计,比如双链路通信和冗余协议栈。到时候再细聊。