错误处理
EtherCAT 通信中的错误处理策略和常见故障排查。
错误类型
| 类型 | 来源 | 处理方式 |
|---|---|---|
| AL Status Code | 从站状态转换失败 | 通过 slave.error_code 读取,使用 classify_al_error() 分类 |
| SDO Error | CoE 读写失败 | SDO 方法返回 None 或 False,错误码见 SDOError |
| PDO 丢帧 | 通信异常 | 通过 pdo_frame_loss 事件 监控 |
| Emergency | 从站硬件/固件错误 | 通过 emergency_event 事件 接收 |
| 状态降级 | 从站异常回退 | 通过 state_changed 事件 监控 |
状态转换错误
检测方式
if not master.set_state(EcState.OP):
print(f"状态切换失败, 错误码: {master.error_code}")
for slave in master.slaves:
ec = slave.error_code
if ec != 0:
print(f" 从站 {slave.index}: 0x{ec:04X}")
错误分类
使用 classify_al_error() 快速判断处理策略:
from darra_ethercat import classify_al_error, ALErrorCategory
category = classify_al_error(slave.error_code)
if category == ALErrorCategory.TRANSIENT:
# 重试状态转换
slave.set_state(EcState.OP)
elif category == ALErrorCategory.CONFIGURATION:
# 检查 PDO 映射、SM 配置
print("配置错误,请检查 PDO/SM 配置")
elif category == ALErrorCategory.HARDWARE:
# 检查从站设备、线缆、电源
print("硬件错误,请检查从站设备")
常见 AL Status Code
0x001E无效输入映射 — 检查 PDO 映射配置是否与从站支持的映射一致0x001D无效输出映射 — 检查 PDO 输出映射配置0x0017无效 SM 配置 — 检查 SyncManager 配置(大小、方向)0x001BSM 看门狗超时 — PDO 周期过慢或通信中断0x002D同步错误 — DC 同步配置问题,检查 SYNC0 周期0x0032DC 同步超时 — DC 启动时间配置问题0x0003无效设备设置 — 耦合器无物理模块,或模块配置不匹配
事件驱动的异常处理
推荐通过事件监控异常,而非轮询:
# 状态降级检测
# 状态变化
master.on_state_change(lambda mi, si, old, new:
print(f"从站 {si}: 0x{old:02X} -> 0x{new:02X}"))
# 从站发现/丢失
master.on_slave_discovery(lambda mi, si, found:
print(f"从站 {si} {'上线' if found else '离线'}"))
# PDO 丢帧
master.on_pdo_frame_loss(lambda mi, group, consecutive, total:
print(f"组 {group} 严重丢帧: 连续 {consecutive} 帧") if consecutive > 10 else None)
# 紧急消息
master.on_emergency(lambda mi, si, err_code, err_reg, b1, w1, w2:
print(f"从站 {si} 紧急消息: 0x{err_code:04X}"))
自动日志
所有事件(PDO 周期回调除外)触发时系统均自动记录日志,无论是否订阅。详见 事件。
常见故障排查
初始化失败
- 管理员权限不足 — 以管理员身份运行
- 网卡名称不匹配 — 检查
get_network_info()返回的网口列表 set_network()返回 0 — 检查网线连接和从站供电RuntimeError— 主站实例数已达上限
从站无法进入 OP
- PDO 映射不匹配 — 检查
slave.error_code,常见0x001E/0x001D - ESI 版本不匹配 — 使用与固件版本对应的 ESI 文件
- DC 同步失败 — 检查 DC 配置,确认 SYNC0 周期合理
- SM 配置错误 — 检查 SyncManager 大小和方向
- 缺少启动参数 — 使用 DENI 文件或
enable_auto_startup()
通信不稳定
- 丢帧率高 — 检查网线质量、交换机端口、EMI 干扰
- 抖动大 — 安装 DarraRT 驱动,隔离 CPU 核心
- 偶尔超时 — 检查系统负载,关闭不必要的后台进程
- DC 同步偏差大 — 使用 DarraRT 驱动降低抖动
日志系统
from darra_ethercat import EtherCATMaster
# 启用日志监控
# 设置日志回调
master.set_log_callback(lambda cat, msg: print(f"[{cat}] {msg}"))
# 启用详细日志(调试用)
EtherCATMaster.set_debug_logging(True)
EtherCATMaster.set_mailbox_logging(True)
EtherCATMaster.set_pdo_logging(True)
日志详情
日志系统详见 日志。