跳到主要内容

错误处理

一句话答案(错误码 5023 / 1168 / 21 是什么意思):5023 = 授权闸关闭(未授权/过期,查授权状态,与网卡无关);1168 = NDIS 协议未绑定网卡(走官方安装包重装,不要手动 netcfg);21 = 驱动通道未就绪(瞬态,可重试)。CiA 402 读失败哨兵:-32768 / 0xFFFF / -1,不是真实数值。

EtherCAT 通信中的错误处理策略和常见故障排查。

错误类型​

类型来源处理方式
AL Status Code从站状态转换失败通过 slave.ErrorCode 读取,使用 ALErrorClassifier.Classify() 分类
SDO ErrorCoE 读写失败SDO 方法返回 false 或抛出异常,错误码见 SDOError
PDO 丢帧通信异常通过 PDOFrameLoss 事件 监控
Emergency从站硬件/固件错误通过 Emergency 事件 接收
状态降级从站异常回退通过 StateChanged 事件 监控

状态转换错误​

检测方式​

if (!master.SetState(EcState.OP, out string message))
{
Console.WriteLine($"状态切换失败: {message}");

foreach (var slave in master.Slaves)
{
if (slave.ErrorCode != EcALState.NoError)
Console.WriteLine($" 从站 {slave.SlaveNum}: 0x{(int)slave.ErrorCode:X4} - {slave.ErrorCode.GetDescription()}");
}
}

错误分类​

使用 ALErrorClassifier.Classify() 快速判断处理策略:

var category = ALErrorClassifier.Classify(slave.ErrorCode);
switch (category)
{
case ALErrorCategory.Transient:
// 重试状态转换
slave.SetState(EcState.OP);
break;
case ALErrorCategory.Configuration:
// 检查 PDO 映射、SM 配置
break;
case ALErrorCategory.Hardware:
// 检查从站设备、线缆、电源
break;
}
详细分类

完整的 AL 错误分类和常见错误码请参考 主站诊断 - AL 错误分类。

常见 AL Status Code​

  • 0x001E — 无效输入配置(InvalidInputConfig): 检查输入 PDO 配置是否与从站支持的一致
  • 0x001D — 无效输出配置(InvalidOutputConfig): 检查输出 PDO 配置
  • 0x0017 — 无效 SM 配置(InvalidSyncManagerConfig): 检查 SyncManager 配置(大小、方向)
  • 0x001B — SM 看门狗超时(SyncManagerWatchdog): PDO 周期过慢或通信中断
  • 0x001A — 同步错误(SyncError): 同步配置问题,检查 SYNC0 周期
  • 0x0034 — DC 同步超时(DcSyncTimeout): DC 启动时间配置问题
  • 0x0003 — 无效设备设置(InvalidDeviceSetup): 耦合器无物理模块,或模块配置不匹配
  • 0x0043 — 邮箱 CoE 错误(MailboxCoe): CoE 邮箱通信失败
  • 0x0051 — EEPROM 错误(EepromError): 从站 EEPROM 读写异常
  • 0x0060 — 从站重启(SlaveRestarted): 从站发生过复位/重启

错误码 5023:数据闸关闭(授权未通过)​

原生层把 Windows ERROR_INVALID_STATE(5023)复用为数据闸关闭判据:授权未通过(未授权 / 授权过期 / 在线裁决 DENY / 完整性校验失败)时数据闸保持关闭,数据面调用直接被拒。

调用失败表现
网卡绑定SetNetwork(...) 是链式配置方法(返回 this),原生绑定在 Build() 内执行;绑定失败时 Build() 返回 null,错误文本带原生错误码
SetState() 进 SafeOp / OP返回 false;需要原因时用 SetState(state, out string error)

5023 与网卡无关。 见到 5023 不要去换网线、重装驱动或重新绑定网卡 —— 先查授权状态。

判读顺序:

  1. Build() 返回 null / SetState() 返回 false 时,先看错误文本里的错误码,不要凭"失败"就归因网卡。
  2. 5023 = 数据闸 / 授权问题;1168 = ERROR_NOT_FOUND(NDIS 协议未绑定网卡);21 = ERROR_NOT_READY(驱动通道未就绪,瞬态可重试)。
  3. 其它值按 Windows 系统错误码解释。
备注

当前 C# 的网卡失败描述表尚未收录 5023,遇到 5023 会落到泛化文案"网卡通道初始化失败(错误 5023)"。以错误码本身为准:5023 是授权闸,不是网卡。

事件驱动的异常处理​

推荐通过事件监控异常,而非轮询:

// 状态降级检测
master.Events.StateChanged += (sender, e) =>
{
if (e.NewState < e.OldState)
Console.WriteLine($"状态降级: {e.OldState} → {e.NewState}");
};

// 从站离线
master.Events.SlaveOffline += (slaveIndex) =>
Console.WriteLine($"从站 {slaveIndex} 离线");

// PDO 丢帧
master.Events.PDOFrameLoss += (masterIndex, group, consecutive, total) =>
{
if (consecutive > 10)
Console.WriteLine($"组 {group} 严重丢帧: 连续 {consecutive} 帧");
};

// 紧急消息
master.Events.EmergencyEvent += (masterIndex, slaveIndex, errorCode, errorReg, b1, w1, w2) =>
Console.WriteLine($"从站 {slaveIndex} 紧急消息: 0x{errorCode:X4}");
自动日志

所有事件(PDO 周期回调除外)触发时系统均自动记录日志,无论是否订阅。详见 事件。

常见故障排查​

Build() 构建失败(链式调用得到 null)​

Build() 返回 BuildResult,用 Success / Message 看成败与原因;隐式转换为 DarraEtherCAT 或链式调用时失败得 null。常见原因:

  • 管理员权限不足 — 以管理员身份运行
  • 网卡名称/MAC 不匹配 — 检查 GetNetworkInfo() 返回的网口列表
  • ENI/DENI 文件路径错误 — 确认文件路径存在且可读
  • 无从站响应 — 帧从 A 口发出、没从 A 口回来 = 链路通,问题在接收(B 口 / 对端 NIC / 内核 RX / 绑定)。先查网卡绑定和接收路径,不要一看到无从站就重插网线。只有帧从 A 发出又从 A 弹回,才是中间断链

从站无法进入 OP​

  • PDO 映射/配置不匹配 — 检查 slave.ErrorCode,常见 0x0024/0x0025(映射无效)、0x001E/0x001D(输入/输出配置无效)
  • ESI 版本不匹配 — 使用与固件版本对应的 ESI 文件
  • DC 同步失败 — 检查 DC 配置,确认 SYNC0 周期合理
  • SM 配置错误 — 检查 SyncManager 大小和方向
  • 缺少启动参数 — 使用 DENI 文件或 EnableAutoStartup()

通信不稳定​

  • 丢帧率高 — 检查网线质量、交换机端口、EMI 干扰
  • 抖动大 — 安装 DarraRT 驱动,隔离 CPU 核心
  • 偶尔超时 — 检查系统负载,关闭不必要的后台进程
  • DC 同步偏差大 — 使用 DarraRT 驱动降低抖动

日志系统​

// 启用日志监控
DarraEtherCAT.Logs.Updated += () =>
{
foreach (var log in DarraEtherCAT.Logs)
Console.WriteLine($"[{log.Timestamp:HH:mm:ss}] {log.Message}");
};

// 启用详细日志(调试用)
DarraEtherCAT.EnableDebugLogging();
DarraEtherCAT.EnableMailboxLogging();
DarraEtherCAT.EnablePDOLogging();
日志详情

日志系统详见 日志。