4、介质冗余(Media Redundancy):MRP协议在EtherCAT中的应用

说到工业网络的可靠性,环网冗余是个绕不开的话题。我个人习惯把EtherCAT的冗余方案分成两类:一类是设备级的冗余,另一类就是今天要聊的介质冗余。说白了,介质冗余解决的是“线断了怎么办”的问题。

你想想看,在一条流水线上,如果某根网线被叉车压断了,或者某个连接器松动了,整个网络就瘫了。生产停摆一分钟,损失可能就是几万块。所以,我们需要一种机制,让网络在物理链路出问题时,还能继续工作。

4.1 MRP协议在EtherCAT中的应用

MRP,全称Media Redundancy Protocol,是IEC 62439-2标准里定义的一种环网冗余协议。它最早是为PROFINET设计的,但后来也被EtherCAT采纳了。为什么?因为它的恢复速度够快,而且实现起来相对简单。

MRP的工作原理,其实有点像“逻辑断路”。正常情况下,环网中有一个节点被指定为“冗余管理器”(Redundancy Manager,简称RM),它会阻塞其中一个端口,防止数据在环里无限循环。当链路断了,RM会检测到,然后立刻打开那个阻塞的端口,让数据从另一条路走。

核心要点:MRP的恢复时间通常在10ms到200ms之间,具体取决于环网的大小和节点数量。对于大多数工业应用来说,这个速度已经足够了。

我在项目中遇到过这样一个场景:一个汽车焊装车间,用了30多个EtherCAT从站,组成了一个环网。刚开始用的是普通的星型拓扑,结果一个月内因为线缆问题停了三次产。后来改成了MRP环网,虽然恢复时间在50ms左右,但再也没有因为单点故障导致全线停摆。

MRP在EtherCAT中的配置要点

  • 冗余管理器(RM):通常由主站或一个专用的交换机担任。我个人建议把RM放在主站上,这样管理起来方便。
  • 冗余客户端(RC):环网中的其他节点都是客户端,它们只需要转发MRP报文即可。
  • 环网端口:每个节点需要有两个端口,一个接环的“左臂”,一个接“右臂”。
  • 测试报文:RM会定期发送测试帧,检查环的完整性。如果收不到,就认为链路断了。

我的经验:配置MRP时,一定要把环网的最大节点数算清楚。有些交换机的MRP实现有节点数量限制,比如最多支持50个节点。我曾经因为没注意这个,导致环网在扩容后无法正常工作。

4.2 MRPD(介质冗余协议)详解

MRPD,全称Media Redundancy for PROFIsafe and PROFINET with MRPD,是MRP的增强版。它解决了MRP的一个痛点:在环网切换期间,数据包可能会丢失。

为什么会这样?因为MRP在切换时,需要先检测到故障,然后重新配置端口。这个过程需要时间,而在这段时间里,正在传输的数据帧就丢了。对于普通IO数据,丢几帧可能问题不大,但对于安全相关的数据(比如急停信号),丢一帧都可能引发事故。

MRPD的做法是:在发送数据时,同时往环的两个方向各发一份。这样,即使环上某处断了,数据也能从另一个方向到达目的地。说白了,就是“双路径冗余”。

MRPD的关键特性:

  • 无切换时间:因为数据本来就是双份发送的,所以链路断了也不需要切换,数据自然从另一条路走。
  • 零丢包:理论上,MRPD可以做到在链路故障时完全不丢包。
  • 带宽翻倍:代价是每个数据帧都要发两遍,所以网络带宽的利用率会降低一半。

我记得有一次给一个半导体工厂做方案,客户要求环网切换时不能有任何数据丢失,因为他们的设备对时序要求极高。MRP肯定不行,最后我们上了MRPD。虽然带宽占用高了一些,但客户验收时非常满意。

MRPD与MRP的对比

特性 MRP MRPD
恢复时间 10ms - 200ms 0ms(无切换)
丢包率 切换期间可能丢包 零丢包
带宽利用率 正常(单路径) 减半(双路径)
实现复杂度
适用场景 普通IO控制 安全通信、高实时性要求

注意:MRPD需要主站和从站都支持。目前只有部分高端EtherCAT从站控制器(ESC)支持MRPD。选型时一定要确认芯片型号。

4.3 环网恢复时间测试

理论说得再好,不如实际测一测。环网恢复时间,是衡量冗余方案好坏的核心指标。我一般用两种方法测:一种是软件打时间戳,另一种是用示波器抓信号。

测试方法一:软件打时间戳

这种方法比较简单。在主站上跑一个测试程序,每隔1ms发一个数据帧,并记录发送时间。然后在从站上接收,也记录接收时间。当环网断开时,从站会有一段时间收不到数据,这个时间差就是恢复时间。

// 伪代码示例
// 主站发送端
while(1) {
    send_frame(timestamp);
    sleep(1ms);
}

// 从站接收端
while(1) {
    frame = receive_frame();
    if (frame.timestamp - last_timestamp > 2ms) {
        // 检测到中断
        recovery_time = frame.timestamp - last_timestamp - 1ms;
        printf("Recovery time: %d ms\n", recovery_time);
    }
    last_timestamp = frame.timestamp;
}

我的习惯:测试时,我会故意在不同位置断开链路,比如在RM旁边断一次,在环的最远端断一次。因为不同位置的断链,恢复时间可能会有差异。

测试方法二:示波器抓信号

这个方法更精确。在从站的IO输出口接一个示波器,然后让主站周期性翻转这个IO。当环网断开时,IO会停止翻转,直到网络恢复。示波器上就能看到一段“平线”,这段平线的长度就是恢复时间。

我曾经用这个方法测过一个MRP环网,结果发现恢复时间比理论值大了不少。后来排查发现,是其中一个从站的固件版本太旧,处理MRP报文的速度太慢。升级固件后,恢复时间就正常了。

测试结果参考

环网节点数 MRP恢复时间(典型值) MRPD恢复时间
10个 10ms - 30ms 0ms
30个 30ms - 80ms 0ms
50个 50ms - 150ms 0ms
100个 100ms - 200ms 0ms

避坑指南:我曾经遇到过一个问题:环网恢复时间测试结果忽大忽小,不稳定。后来发现是测试时网络上有其他流量干扰。所以,测试时一定要确保网络是“干净”的,最好只跑测试数据。

嗯,关于介质冗余,今天就聊到这里。MRP和MRPD各有各的适用场景,选哪个取决于你的项目对实时性和可靠性的要求。下一章,我们会聊聊设备级冗余,也就是如何让主站或从站本身也具备冗余能力。