07 组网、调试与排障

07 组网、调试与排障

本文重点:EtherCAT 网络的硬件布线规范、上电检查流程、WKC / AL Status / 错误计数器 / Wireshark 四大诊断手段、典型故障案例、看门狗机制与性能验证方法。
前置阅读:05-主站实现-IgH与SOEM.md06-ROS2与EtherCAT集成.md
寄存器地址与 AL Status Code 以 ETG.1000 规范及所用 ESC(如 Beckhoff ET1100/LAN9252)数据手册为准。


1. 硬件与布线

项目 规范/建议 说明
线缆 Cat5e 及以上,屏蔽(SF/UTP 或更好) 100BASE-TX,两对线即可,但工业环境务必用屏蔽线并良好接地
单段长度 ≤100m(100BASE-TX) 超长距离用光纤从站端口
拓扑 物理上线形/星形/树形均可,逻辑恒为环 帧按端口顺序遍历,末端从站开放端口自动闭环(loopback)
IN/OUT 方向 不能接反 从站端口有方向:上一站接本站 IN(Port 0),本站 OUT(Port 1)接下一站 IN。接反轻则拓扑错乱、寻址异常,重则部分从站不可见。布线后对照 ethercat slaves 顺序核对
EBUS 背板 模块化 IO(如 Beckhoff EL 系列)内部用 E-bus(LVDS 背板总线)级联 耦合器(如 EK1100)做 100BASE-TX ↔ E-bus 转换;注意 E-bus 供电电流预算,模块多时需供电扩展模块
接地/EMI 屏蔽层 360° 端接、远离动力线、变频器输出线用屏蔽电缆 EMI 是 RX Error 计数器增长的头号来源
连接器 RJ45 或 M8/M12(D-code) 振动场合优先 M8/M12

2. 上电检查流程

按顺序逐级确认,任何一级失败先解决再往下:

1
2
3
4
5
6
7
8
9
10
11
① 物理层:每段链路两端 Link/Activity LED 亮

② 主站扫描:ethercat slaves 数量 == 实际从站数

③ 状态机:全部从站 INIT → PREOP(主站自动)

④ 配置:SDO 可读写(ethercat upload),PDO 映射下发成功

⑤ SAFEOP:输入数据有效(只读不写输出)

⑥ OP:过程数据双向交换,WKC == 期望值稳定
1
2
3
4
ethercat master            # 主站状态、link up、发送/接收帧统计
ethercat slaves # 期望输出形如:0 0:0 OP + EK1100 ...
ethercat slaves -v # 每站 DC 能力、端口连接关系(拓扑核对)
ethercat states -p 3 OP # 手动请求某从站迁移状态

从站数不对时的二分定位:从主站侧开始逐段插拔,ethercat slaves 观察数量变化,坏点在”最后一个可见从站”的下游第一段(线缆或下一站 IN 口)。


3. 诊断手段

3.1 WKC(Working Counter)异常分析

每个 datagram 尾部的 WKC 由成功处理该 datagram 的从站硬件递增(LRW 访问:读成功 +1、写成功 +2;只读/只写各 +1,见 ETG.1000.4)。主站把实收 WKC 与期望值比较:

现象 含义 定位方法
WKC == 期望 全部从站正常处理
WKC 恒定偏少 某从站未处理(掉出 OP、地址不匹配、配置错) ethercat slaves 看谁不在 OP;差值 = 缺席从站贡献值
WKC = 0 帧根本没经过任何配置从站 查链路、主站网卡、从站顺序变化
WKC 偶发抖动(偶尔少 1~2) 传输误码使某站 CRC 判帧无效而不处理 查错误计数器(§3.3)定位坏线段/EMI

IgH 中 ecrt_domain_state() 返回 working_counterwc_state(ZERO/INCOMPLETE/COMPLETE);SOEM 中 ec_receive_processdata() 直接返回 WKC,与 expectedWKC = ec_group[0].outputsWKC * 2 + ec_group[0].inputsWKC 比较(SOEM 示例中的惯用算法)。

处理原则:周期循环里 WKC 异常先计数、超过阈值(如连续 N 周期)再降级/停机,单次抖动不触发急停。

3.2 AL Status Code 速查

从站拒绝状态迁移或自行退级时,会在 AL Status Code 寄存器(0x0134)给出原因:

1
ethercat slaves -v         # 输出中含 AL state 与 status code
Code 含义 常见原因
0x0000 无错误
0x0011 Invalid requested state change 跳级请求(如 INIT→OP)
0x0016 Invalid mailbox configuration (PREOP) SM0/SM1 配置与 EEPROM 不符
0x001A Synchronization error DC 同步丢失:主站发帧抖动过大 / 周期不一致
0x001B Sync manager watchdog SM 看门狗超时:主站停发/漏发过程数据
0x001D Invalid output configuration SM2(输出)配置错,PDO 映射与实际长度不符
0x001E Invalid input configuration SM3(输入)配置错
0x0029 Freerun needs 3-buffer mode 同步模式配置矛盾
0x002B Invalid input & output 双向 PDO 配置均错
0x002C Fatal sync error SYNC0 事件长期缺失
0x002D No sync error(SAFEOP 时未收到 SYNC) DC 未启用/AssignActivate 错
0x0030 Invalid DC SYNC configuration SYNC0/1 周期、偏移非法
0x0032 PLL error 从站 DC PLL 未锁定
0x0034 Invalid DC cycle time 周期与从站支持范围不符
0x0050 EEPROM no access EEPROM 被占用/损坏
0x0051 EEPROM error SII 内容校验失败

(完整表见 ETG.1000.6 / ESC 数据手册;厂商可扩展 0x8000 以上私有码,查从站手册。)

3.3 错误计数器寄存器(定位坏线缆/EMI)

ESC 每端口维护硬件错误计数器,只增不减,写任意值清零。核心地址(ET1100 类 ESC,以数据手册为准):

寄存器 名称 含义
0x0300+2n RX Error Counter (Port n) 物理层符号错误 + 帧错误,上游线段质量的直接指标
0x0301+2n Invalid Frame Counter (Port n) CRC 错帧
0x0308+n Forwarded RX Error Counter (Port n) 上游已标记错误的帧被转发的次数(错误发生在更上游)
0x030C ECAT Processing Unit Error Counter 到达处理单元的错帧
0x0310+n Link Lost Counter (Port n) 链路丢失次数:接触不良、连接器松动的指标
1
2
3
4
5
6
# 读从站 3 的端口错误计数器(8 字节:Port0~3 的 RX Err/Invalid Frame)
ethercat reg_read -p 3 0x0300 8
# 读 Lost Link 计数器
ethercat reg_read -p 3 0x0310 4
# 清零后跑一段时间再读,观察增长
ethercat reg_write -p 3 0x0300 -t uint32 0

定位逻辑:错误在链路上被第一个检测到它的端口计数并标记。沿帧行进方向找第一个 RX Error 增长的端口,坏点就在该端口的上游线段(线缆、连接器、或上游从站 PHY)。全网清零 → 运行 30 分钟 → 逐站读取,是例行体检做法。

3.4 Wireshark 抓包(EtherType 0x88A4)

Wireshark 自带 EtherCAT dissector,能解析 datagram 头、命令类型、地址、WKC:

1
2
3
4
5
6
7
8
9
10
11
# 方式一:SOEM/generic 驱动时直接抓主站网卡
sudo tshark -i eth0 -f "ether proto 0x88a4" -w ecat.pcapng

# 方式二:IgH native 驱动独占网卡、无法本机抓包时,
# 在主站与首从站之间插 TAP 或镜像口交换机

# 常用显示过滤器
ecat # 所有 EtherCAT datagram
ecat.cmd == 12 # LRW(逻辑读写,过程数据)
ecat.cnt < 6 # WKC 小于期望值的帧(数值按你的期望改)
ecat_mailbox.coe # CoE 邮箱(SDO 交互)

看什么:

  • 每帧内的 datagram 列表(主站一个周期通常发 1 帧含多个 datagram:LRW 过程数据 + BRD 状态巡检 + DC 同步 ARMW/FRMW);
  • 每个 datagram 的 WKC 返回值
  • 周期帧的时间间隔抖动(Statistics → I/O Graph);
  • SDO 交互失败时看 CoE Abort Code。

3.5 IgH ethercat 命令排障示例

1
2
3
4
5
6
7
8
9
10
ethercat master                       # 帧统计:tx/rx count、loss
ethercat slaves -v # 状态 + AL status code + 端口拓扑 + DC
ethercat reg_read -p 0 0x0130 2 # AL Status 寄存器
ethercat reg_read -p 0 0x0134 2 # AL Status Code
ethercat reg_read -p 0 0x092C 4 # DC 系统时间差(同步质量,带符号)
ethercat pdos -p 2 # 核对 PDO 映射是否与预期一致
ethercat sii_read -p 1 > sii.bin # 备份 EEPROM(SII)
ethercat sii_write -p 1 sii.bin # 恢复/烧写 EEPROM(谨慎!)
ethercat eoe # EoE 状态(若使用)
ethercat domains -v # domain 的 WKC 期望值与实际

子命令名称与参数随 IgH 版本略有差异(如 eeprom 相关操作在不同版本叫 sii_read/sii_write),以 ethercat --help 和官方文档为准。


4. 典型故障案例表

症状 高概率原因 排查动作
从站周期性掉到 SAFEOP,AL code 0x001A(Sync error) 主站发帧抖动过大 / DC 参考时钟漂移 / cycle time 三处不一致 cyclictest 量调度抖动;核对 update_rate、主站周期、SYNC0 周期一致;加大 sync0_shift;检查是否忘了周期调用 DC 同步 API
WKC 抖动(偶发少 1) 线缆/连接器误码、EMI §3.3 错误计数器沿线定位;换屏蔽线、检查接地、远离动力线
进 OP 后驱动器无输出/不动 PDO 映射与驱动器实际配置不符;控制字状态机没走到 Operation Enabled;看门狗参数不当 ethercat pdos 核对映射;ethercat upload -p N 0x6041 0 看状态字;读 0x0400(SM 看门狗分频/时间寄存器区)核对看门狗配置与触发状态(0x0440)
扫描到的从站数少于实际 IN/OUT 接反、某段链路断、从站没上电 顺链路查 LED;二分插拔;ethercat slaves -v 看末站端口状态
从站全部消失又恢复(间歇) 供电跌落、连接器振动松动 读 0x0310 Lost Link 计数器逐站排查
EEPROM 损坏(从站身份异常、0x0050/0x0051) 烧写中断、干扰 用备份 sii_write 恢复;无备份则从厂商 ESI 重新生成 SII 烧写
SDO 读写超时 从站还在 INIT / mailbox 配置错 确认至少 PREOP;ethercat slaves -v 查 mailbox 支持
换了一个从站后总线起不来 位置寻址下配置与实际型号不匹配 核对 vendor/product;用 alias 站号替代纯位置寻址提高可维护性

5. 从站看门狗机制

从站 ESC 内置 SM 看门狗(Sync Manager Watchdog):每次输出 SM(通常 SM2)被主站过程数据写一次就”喂狗”;主站停发或漏发超过看门狗时间,从站硬件把输出置为安全态(数字量输出清零、伺服按配置停机),并报 AL 0x001B 退到 SAFEOP。

  • 相关寄存器(ESC 通用布局,以数据手册为准):0x0400(看门狗分频器)、0x0420(SM 看门狗时间)、0x0440(看门狗状态)、0x0442(看门狗计数器)。默认典型值 100ms。
  • 工程意义:这是”主站崩溃/断线后设备不会带着旧指令继续跑”的最后防线。看门狗时间应设为周期的合理倍数(如 10~100 倍):太短则正常抖动误触发,太长则失去保护意义。
  • 看门狗只保证输出进安全态,不等于功能安全——人身安全仍依赖 STO 等硬接线安全回路(呼应 armRobot 的安全边界原则)。

6. 性能验证

6.1 调度抖动:cyclictest

1
2
3
# 在目标隔离核上以目标周期测 1 小时
sudo cyclictest -m -p 90 -t 1 -a 2 -i 1000 -D 3600 -h 400 -q
# -i 1000 = 1ms 周期; -a 2 = 绑 CPU2; -h 直方图

判读(经验值):1ms 控制周期下,PREEMPT_RT 调优后 max latency 通常应在几十 µs 以内;max 上百 µs 需先修 OS 配置(BIOS 节能、SMI、中断绑核)再谈总线。必须带典型负载测(跑着 ROS 栈、有网络流量),空载数据没有意义。

6.2 周期抖动统计(应用内)

在周期循环里用 clock_gettime 记录相邻唤醒间隔,维护 min/max/直方图,定期(低频、循环外)输出。IgH 用户也可参考其示例中的 latency/jitter 统计写法。同时监控 ethercat master 的帧丢失计数与 DC 系统时间差(0x092C)随时间的分布。

6.3 总线利用率估算

一帧的线上时间:

1
2
3
4
5
6
帧长(字节) ≈ 各从站 PDO 数据之和
+ 每个 datagram 头 12B(10B 头 + 2B WKC)
+ EtherCAT 帧头 2B + 以太网头 14B + FCS 4B
(不足 60B 补 pad)+ 前导码/IFG 折合 20B

100 Mbps 下 1 字节 ≈ 80 ns

算例:10 个伺服,每站 RxPDO 8B + TxPDO 8B,单个 LRW datagram 承载:

1
2
3
数据 160B + datagram 头 12B + 帧/以太网开销 40B ≈ 212B
线上时间 ≈ 212 × 80ns ≈ 17µs
1ms 周期 → 总线利用率 ≈ 1.7%(再加 BRD 巡检、DC datagram,仍 <3%)

结论:中小系统总线本身远不是瓶颈,瓶颈几乎总在主站调度抖动。当从站很多、周期很短(如 250µs + 上百从站)时才需要精算帧长,必要时拆分多个周期不同的 domain/帧。

6.4 长跑验收

  • 24h 连续运行:WKC 异常计数 = 0(或低于允许阈值)
  • 全站错误计数器增量为 0(EMI 验收)
  • DC 同步偏差(0x092C)分布稳定,无漂移趋势
  • cyclictest max 满足预算,无孤立尖峰

7. 排障 Checklist(速查)

上电起不来:

  • 链路 LED 全亮?(不亮:线/电/PHY)
  • ethercat slaves 数量正确?(少站:IN/OUT 方向、二分定位断点)
  • 全部到 PREOP?(卡 INIT:EEPROM/SII 问题,查 0x0050/51)
  • SDO 能读 0x1000 设备类型?(不能:mailbox 配置)
  • SAFEOP → OP 被拒?(读 AL Status Code 对表 §3.2)

运行中异常:

  • WKC 恒定偏少 → 哪个从站不在 OP?
  • WKC 偶发抖动 → 错误计数器沿线定位(0x0300/0x0310)
  • 掉 SAFEOP + 0x001A → 主站抖动/周期一致性(cyclictest、三周期核对)
  • 掉 SAFEOP + 0x001B → 主站是否停发/漏发(看门狗)
  • 输出没动作 → PDO 映射、CiA402 状态字、看门狗状态 0x0440

环境与工具:

  • PREEMPT_RT + 绑核 + 中断亲和 已配置(见 05 §5
  • 抓包通道可用(镜像口/TAP),Wireshark 过滤 ecat
  • EEPROM 已备份(sii_read),ESI 文件存档
  • 从站固件/硬件版本、拓扑顺序有记录(换件后核对)

返回目录README.md

文章互动

阅读 --

留言

0 条留言

正在加载留言…