冗余 (Redundancy)
EtherCAT 冗余通过双网卡 + 环形拓扑实现链路级容错: 主网口走 primary 帧, 副网口走 secondary 帧, 任一段断线时 SDK 自动从两侧 WKC 合并完成的从站状态, 整个网络仍正常运行.
通过 master 直接调用启用 / 强制故障转移, 通过 master.Diagnostics() 查看冗余诊断.
相关页面
- 冗余诊断 /
RingMode/BreakPoint详见 主站诊断 - 冗余状态 - 冗余链路状态变化事件:
addRedundancyModeChangedListener
启用与状态
| 方法 | 返回类型 | 说明 |
|---|---|---|
| enableRedundancy(boolean) | boolean | 启用 / 禁用冗余 (需在 Start() 之前调用) |
| forceRedundancyFailover() | boolean | 强制冗余故障切换 (调试 / 维护用) |
| checkRedundancyHealth() | boolean | 检查冗余健康状态 |
| RingMode() | int | 环拓扑冗余运行模式 (0=Inactive, 1=Dual, 2=Degraded) |
| SecondaryLinkStatus() | boolean | 副网口链路是否正常 |
| setRedProcessdata(int mode) | void | 设置冗余处理模式 |
| RedProcessdata() | int | 获取当前冗余处理模式 |
enableRedundancy(boolean)
public boolean enableRedundancy(boolean enable)
启用 / 禁用冗余. 必须在 Start() 之前调用, 且构造主站时已经通过
SetNetwork(primary, secondary) 指定副网卡.
forceRedundancyFailover()
public boolean forceRedundancyFailover()
强制把当前发送路径切到副网口, 调试或预防性维护时使用.
checkRedundancyHealth()
public boolean checkRedundancyHealth()
检查冗余健康状态.
RingMode()
public int RingMode()
获取环拓扑冗余运行模式.
SecondaryLinkStatus()
public boolean SecondaryLinkStatus()
副网口链路是否正常.
setRedProcessdata(int mode) / RedProcessdata()
public void setRedProcessdata(int mode)
public int RedProcessdata()
设置 / 获取冗余处理模式.
完整示例
启用冗余 + 健康监控
try (EtherCATMaster master = EtherCATMaster.create()) {
master.SetNetwork("\\Device\\NPF_{primary-guid}", "\\Device\\NPF_{secondary-guid}");
// 启用冗余 (Start 前调用)
master.enableRedundancy(true);
// 订阅冗余模式变化
master.Events().addRedundancyModeChangedListener((mi, oldMode, newMode) -> {
System.out.printf("冗余模式: %s -> %s%n", oldMode, newMode);
});
master.setState(EcState.OP);
master.Start();
// 周期性健康检查
while (true) {
boolean healthy = master.checkRedundancyHealth();
int mode = master.RingMode();
boolean secOk = master.SecondaryLinkStatus();
System.out.printf("冗余: healthy=%b ring_mode=%d secondary_link=%b%n",
healthy, mode, secOk);
Thread.sleep(1000);
}
}
故障转移演练
// 模拟主网口故障, 强制切到副网口
master.forceRedundancyFailover();
Thread.sleep(500);
// 检查副链路是否承载主路
assert master.SecondaryLinkStatus();
assert master.State() == EcState.OP;
参考
- ETG.1500 §5.7 Cable Redundancy
- 其他语言 SDK 对齐: C#
EnableRedundancy/ Pythonenable_redundancy/ C++EnableRedundancy/ Rustenable_redundancy