跳到主要内容

冗余 (Redundancy)

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

通过 master.Diagnostics 访问冗余状态; 启用冗余通过初始化时指定双网口完成。

启用方式

冗余在 初始化阶段 通过 SetNetwork(primary, redundant) 指定双网口启用, 不需要单独的开关 API。运行时无需手动控制。

相关页面

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);
}