错误处理
EtherCAT 通信中的错误处理策略和常见故障排查。
错误类型
| 类型 | 来源 | 处理方式 |
|---|---|---|
| AL Status Code | 从站状态转换失败 | 通过 slave.ErrorCode 读取,使用 ALErrorClassifier.Classify() 分类 |
| SDO Error | CoE 读写失败 | 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— 无效输入映射: 检查 PDO 映射配置是否与从站支持的映射一致0x001D— 无效输出映射: 检查 PDO 输出映射配置0x0017— 无效 SM 配置: 检查 SyncManager 配置(大小、方向)0x001B— SM 看门狗超时: PDO 周期过慢或通信中断0x002D— 同步错误: DC 同步配置问题,检查 SYNC0 周期0x0032— DC 同步超时: DC 启动时间配置问题0x0003— 无效设备设置: 耦合器无物理模块,或模块配置不匹配
事件驱动的异常处理
推荐通过事件监控异常,而非轮询:
// 状态降级检测
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
- 管理员权限不足 — 以管理员身份运行
- 网卡名称/MAC 不匹配 — 检查
GetNetworkInfo()返回的网口列表 - ENI/DENI 文件路径错误 — 确认文件路径存在且可读
- 无从站响应 — 检查网线连接和从站供电
从站无法进入 OP
- PDO 映射不匹配 — 检查
slave.ErrorCode,常见 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();
日志详情
日志系统详见 日志。