跳到主要内容

冗余 (Redundancy)

EtherCAT 冗余通过双网卡 + 环形拓扑实现链路级容错: 主网口走 primary 帧, 副网口走 secondary 帧, 任一段断线时 SDK 自动从两侧 WKC 合并完成的从站状态, 整个网络仍正常运行.

通过 master 直接调用启用 / 强制故障转移, 通过 master.diagnostics_info() 查看诊断.

相关页面

启用与状态

方法返回类型说明
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