冗余 (Redundancy)
EtherCAT 冗余通过双网卡 + 环形拓扑实现链路级容错: 主网口走 primary 帧, 副网口走 secondary 帧, 任一段断线时 SDK 自动从两侧 WKC 合并完成的从站状态, 整个网络仍正常运行.
通过 master 直接调用启用 / 强制故障转移, 通过 master.diagnostics_info() 查看诊断.
相关页面
- 冗余诊断 /
RingMode/BreakPoint详见 主站诊断 - 冗余状态 - 冗余链路状态变化事件:
on_redundancy_mode_changed
启用与状态
| 方法 | 返回类型 | 说明 |
|---|---|---|
| enable_redundancy(bool) | Result<()> | 启用 / 禁用冗余 (需在 start() 之前调用) |
| force_redundancy_failover() | Result<()> | 强制冗余故障切换 (调试 / 维护用) |
| check_redundancy_health() | bool | 检查冗余健康状态 |
| ring_mode() | i32 | 环拓扑冗余运行模式 (0=Inactive, 1=Dual, 2=Degraded) |
| secondary_link_status() | bool | 副网口链路是否正常 |
enable_redundancy()
pub fn enable_redundancy(&self, enable: bool) -> Result<()>
启用 / 禁用冗余. 必须在 start() 之前调用, 且构造主站时已经通过
set_network(primary, redundant) 指定副网卡.
force_redundancy_failover()
pub fn force_redundancy_failover(&self) -> Result<()>
强制把当前发送路径切到副网口, 调试或预防性维护时使用.
check_redundancy_health()
pub fn check_redundancy_health(&self) -> bool
检查冗余链路当前是否健康.
冗余过程数据模式
EtherCATMaster::set_redundancy_mode() / EtherCATMaster::redundancy_mode()
pub fn set_redundancy_mode(mode: i32)
pub fn redundancy_mode() -> i32
静态方法, 设置 / 读取全局冗余过程数据处理模式 (0 = 禁用, 1 = 启用).
完整示例
启用冗余 + 健康监控
use ethercat::EtherCATMaster;
let mut master = EtherCATMaster::new()?;
master.set_network(r"\Device\NPF_{primary-guid}", r"\Device\NPF_{secondary-guid}")?;
// 启用冗余 (start 前调用)
master.enable_redundancy(true)?;
master.set_state(EcState::Operational)?;
master.start();
// 订阅冗余模式变化
master.events().on_redundancy_mode_changed(|old, new_mode| {
println!("冗余模式: {:?} -> {:?}", old, new_mode);
});
// 周期性健康检查
loop {
let healthy = master.check_redundancy_health();
let mode = master.ring_mode();
let sec_ok = master.secondary_link_status();
println!("冗余: healthy={} ring_mode={} secondary_link={}", healthy, mode, sec_ok);
std::thread::sleep(std::time::Duration::from_secs(1));
}
故障转移演练
// 模拟主网口故障, 强制切到副网口
master.force_redundancy_failover()?;
std::thread::sleep(std::time::Duration::from_millis(500));
// 检查副链路是否承载主路
assert!(master.secondary_link_status());
assert_eq!(master.state(), EcState::Operational);
参考
- ETG.1500 §5.7 Cable Redundancy