冗余 (Redundancy)
EtherCAT 冗余通过双网卡 + 环形拓扑实现链路级容错: 主网口走 primary 帧, 副网口走 secondary 帧, 任一段断线时 SDK 自动从两侧 WKC 合并完成的从站状态, 整个网络仍正常运行.
通过 master.Diagnostics 访问冗余状态; 启用冗余通过初始化时指定双网口完成。
启用方式
冗余在 初始化阶段 通过 SetNetwork(primary, redundant) 指定双网口启用, 不需要单独的开关 API。运行时无需手动控制。
相关页面
- 冗余诊断 /
RingMode/BreakPoint详见 主站诊断 - 冗余状态 - 冗余链路状态变化事件:
RedundancyModeChanged - 网口扫描自动识别冗余对:
GetNetworkInfo
RedundancyState
public enum RedundancyState
{
None = 0, // 无冗余
Primary = 1, // 仅使用主网络
Secondary = 2, // 仅使用备用网络
Both = 3 // 使用双网络(活动冗余)
}
RedundancyStatus
冗余运行时状态详细信息。
public class RedundancyStatus
{
public RedundancyState State { get; } // 冗余总体状态
public bool PrimaryLinkUp { get; } // 主链路是否在线
public bool SecondaryLinkUp { get; } // 副链路是否在线
public uint PrimaryTxFrames { get; } // 主网口发送帧数
public uint PrimaryRxFrames { get; } // 主网口接收帧数
public uint SecondaryTxFrames { get; } // 副网口发送帧数
public uint SecondaryRxFrames { get; } // 副网口接收帧数
public uint FailoverCount { get; } // 故障切换次数
public DateTime LastFailoverTime { get; } // 上次切换时间
}
完整示例
启用冗余 + 健康监控
// 通过双网口启用冗余 (推荐通过 GetNetworkInfo 自动识别冗余对)
var adapters = DarraEtherCAT.GetNetworkInfo();
var pair = adapters.Where(a => a.RedundantSlaveNum > 0).Take(2).ToList();
if (pair.Count < 2) return;
var master = new DarraEtherCAT()
.SetNetwork(pair[0], pair[1])
.SetENI(@"C:\config.xml")
.Build();
if (master == null) return;
// 订阅冗余模式变化
master.Events.RedundancyModeChanged += (sender, e) =>
{
Console.WriteLine($"冗余模式: {e.OldMode} -> {e.NewMode}");
};
master.SetState(EcState.OP);
// 周期性健康检查 — 通过诊断模块查看冗余状态
var diag = master.Diagnostics;
while (true)
{
Console.WriteLine($"冗余: ring_mode={diag.RingMode}, " +
$"active={diag.RedundancyActive}, " +
$"primary_ok={diag.PrimaryPortOk}, secondary_ok={diag.SecondaryPortOk}");
if (diag.BreakPoint != null)
Console.WriteLine($"故障点: {diag.BreakPoint}");
Thread.Sleep(1000);
}