IgH 主站启动后与 EtherCAT 从站的完整交互流程分析最近在做人形机器人 EtherCAT 总线调试时我抓取了一段 IgH EtherCAT Master 从启动、扫描从站、读取从站信息、配置邮箱和 PDO到最终进入 OP 并开始周期通信的报文。本文结合igh_master0.pcap抓包结果对 IgH 主站启动后与从站之间的关键交互流程做一次系统梳理。报文下载链接https://pan.quark.cn/s/336a7fee9bf2本文重点不是逐字节解释所有 EtherCAT 报文而是把主站初始化过程拆成若干个阶段说明每个阶段主站为什么要发这些报文、从站返回了什么、这些返回值对后续配置有什么意义。说明本文帧号以igh_master0.pcap中从#33092开始的一段完整重新初始化流程为准。该段抓包中主站通过BRD 0x0130扫描到16个从站返回WKC16。如果只连接单个模组或使用另一份精简抓包帧号和 WKC 会不同但流程是一致的。1. 抓包背景为了搞清楚 IgH 协议栈启动后到底和从站做了哪些交互我在 RK3588 控制器上使用tcpdump抓取 EtherCAT 报文。抓包方式如下sudo./tcpdump-ienP2p33s0-s0-wigh_master0.pcap ether proto 0x88a4然后重启 EtherCAT 主站或重启运控程序等待所有从站重新进入 OP 后停止抓包。EtherCAT 报文使用以太网类型0x88A4。在 Wireshark 中打开抓包后可以重点观察以下字段EtherCAT Command例如BRD、BWR、APWR、FPRD、FPWR、LRWADP/ADO即从站地址和寄存器地址Data即主站写入或从站返回的数据WKC即 Working Counter用来判断报文经过了多少从站、是否被目标从站正确处理2. 整体流程概览IgH 主站启动后的初始化大致可以分成 10 个阶段广播读取 AL_STATUS扫描总线上的从站数量和状态广播清空从站站地址广播触发 DC 接收时间戳锁存使用 APWR 给每个从站分配固定站地址读取 ESC 基本信息、DC 时间和链路状态接管 EEPROM/SII读取从站描述信息通过 Mailbox/CoE SDO 读取 PDO 映射等对象字典信息配置 FMMU、SyncManager 和 DC写 AL Control推动从站状态机进入 INIT、PREOP、SAFEOP、OP开始 LRW 周期 PDO 通信下面按抓包顺序展开。3. 广播读取 AL_STATUS扫描从站IgH 主站启动后首先发送广播读命令Frame: #33092 / #33093 Command: BRD Register: 0x0130 AL_STATUS Return: WKC16, Data02 00BRD是 Broadcast Read主站用它读取所有从站的同一个寄存器。这里读取的是0x0130也就是 EtherCAT 从站的 AL_STATUS 寄存器。返回帧中WKC16说明这条总线上有 16 个从站参与了该广播读。返回数据为02 00低字节0x02表示从站处于 PREOP 状态。这一步的核心作用是确认总线上从站数量确认从站当前 AL 状态为后续逐个寻址和配置建立基础如果你在精简环境中只连接一个模组但扫描到两个从站常见原因是模组板上除了关节控制从站外还可能有一颗用于拓扑连接或桥接的 ESC。4. 广播清空旧站地址扫描完成后主站会广播写 Station AddressFrame: #33094 / #33095 Command: BWR Register: 0x0010 Station Address Write Data: 00 00 Return: WKC160x0010是从站的 Station Address 寄存器。IgH 主站在重新分配地址之前会先将所有从站的站地址清零。这样做的原因是从站上一次运行时可能已经被写入过地址如果不清除后续固定地址访问可能会受到残留地址影响。清零后主站可以重新通过 Auto-Increment Physical Addressing 按物理链路顺序给从站分配地址。5. 广播触发 DC 时间戳锁存接下来主站广播写 DC 接收时间相关寄存器Frame: #33096 / #33097 Command: BWR Register: 0x0900 DC Receive Time Write Data: 00 Return: WKC16这一帧会触发从站 ESC 硬件锁存报文到达端口的本地时间戳。后续主站会读取这些时间戳用于计算链路线缆延迟并为 Distributed Clocks也就是 DC 同步做准备。在机器人场景中DC 同步非常关键。多个关节驱动器如果要在同一个控制周期内采样、更新输出就需要尽可能一致的分布式时钟基准。6. 使用 APWR 分配站地址随后主站使用APWR给每个从站分配固定站地址Command: APWR Register: 0x0010 Station Address Return: 每次成功写入 WKC1APWR是 Auto-Increment Physical Write。它不是通过固定站地址访问从站而是通过物理链路顺序访问从站。主站用这种方式给每个从站写入 Station Address。在igh_master0.pcap中站地址分配过程如下帧号相对时间物理 ADP分配站地址#330990.003640s0x00100x0001#347050.086358s0x000F0x0002#369250.211561s0x000E0x0003#389250.344567s0x000D0x0004#410850.462760s0x000C0x0005#434250.578322s0x000B0x0006#455150.713543s0x000A0x0007#476450.836905s0x00090x0008#497570.967135s0x00080x0009#521331.089918s0x00070x000A#544571.210461s0x00060x000B#567691.333106s0x00050x000C#587471.466809s0x00040x000D#607371.590137s0x00030x000E#630551.707714s0x00020x000F#651611.828593s0x00010x0010从这一步开始主站就可以用FPRD、FPWR按固定站地址访问指定从站了。7. 读取 ESC 基本信息、DC 时间和链路状态给从站分配站地址后主站会读取一组 ESC 基础寄存器Command: FPRD Registers: 0x0000 ESC Information 0x0910 DC System Time 0x0900 DC Receive Time Port 0x0110 DL Status Return: 每个从站 WKC1其中0x0000附近包含 ESC 类型、Revision、Build、FMMU 数量、SM 数量、DPRAM 大小、端口能力、DC 能力等信息0x0910用于读取从站 DC 系统时间0x0900用于读取各端口接收时间戳0x0110是 DL Status用于判断端口链路状态和拓扑情况这一步相当于主站给每个从站做一次“摸底”这个从站是什么 ESC、支持几个 FMMU、几个 SyncManager、是否支持 DC、端口连接状态如何。后续的 SM/FMMU/DC 配置都依赖这些信息。8. 读取 EEPROM/SII 信息接下来主站会访问从站 EEPROM也就是 EtherCAT 中常说的 SII 信息区。典型报文如下Register: 0x0500 EEPROM Configuration Register Register: 0x0502 EEPROM Command / Data主站首先写0x0500接管 EEPROM 访问控制权避免 PDI 同时访问 EEPROM。随后向0x0502写入读命令例如读取 EEPROM 地址0x0040再不断轮询0x0502等待 Read Busy/Read Access 状态结束最后从 EEPROM Data 字段中取出读到的字。这一步在抓包中数量非常多。igh_master0.pcap中0x0502相关读写超过一万次。原因是主站需要从 SII 中读取大量从站描述信息例如Vendor IDProduct CodeRevisionSerial NumberMailbox 配置SyncManager 描述PDO 映射描述DC 能力描述简单说SII 是主站理解从站“硬件描述”的入口。9. 通过 Mailbox/CoE SDO 读取对象字典当主站知道从站支持 mailbox 后会通过 SyncManager 0/1 建立邮箱通信进一步读取对象字典。抓包中主要看到SM0: 0x1000 Master - Slave mailbox SM1: 0x1080 Slave - Master mailbox Protocol: CoE SDO Upload在原始分析中一个典型从站通过 MBX 读取到的 PDO 映射对象如下SDO IndexSDO Subindex读到的值0x1C120x000x010x1C120x010x16010x16010x000x0A0x16010x010x701001100x16010x02Abort Transfer0x1C130x000x010x1C130x010x1A000x1A000x000x0C0x1A000x010x600001100x1A000x02Abort Transfer这里的含义可以这样理解0x1C12表示 RxPDO assignment也就是主站输出到从站的 PDO 分配0x1C13表示 TxPDO assignment也就是从站输入到主站的 PDO 分配0x1601是一个 RxPDO mapping 对象0x1A00是一个 TxPDO mapping 对象0x70100110、0x60000110这类值描述了对象索引、子索引和位宽如果某个 subindex 返回 Abort Transfer并不一定表示异常。很多对象映射表的有效项数由 subindex0x00给出主站继续读超出范围的 subindex 时从站返回 abort 是正常现象。10. 配置 FMMU、SyncManager 和 DC读取完 SII 和对象字典后主站已经知道每个从站的邮箱区、PDO 区、过程数据长度和映射关系。接下来开始写配置FMMU: 0x0600 ... SM: 0x0800 ... DC: 0x0980 ...配置过程通常包括清零 FMMU清零 SM清零 DC Cyclic Unit Control、DC Activation 等寄存器重新写入 SM0/SM1 邮箱配置写入 SM2/SM3 或其他 PDO SyncManager 配置写入 FMMU 逻辑地址映射写入 DC 同步相关配置FMMU 的作用是把 EtherCAT 逻辑地址映射到从站 DPRAM 中的指定区域。SyncManager 用于管理邮箱区和过程数据区。DC 配置用于让各从站按照主站规划的周期同步工作。对于机器人关节模组来说这一步决定了后续 LRW 过程数据中每个字节最终对应哪个从站、哪个 PDO、哪个控制量或反馈量。11. 写 AL Control推动从站状态机EtherCAT 从站有标准 AL 状态机常见状态包括INITPREOPSAFEOPOP主站通过写0x0120 AL Control请求状态切换Register: 0x0120 AL Control Write: 0x01 - INIT 0x02 - PREOP 0x04 - SAFEOP 0x08 - OP在抓包中可以看到IgH 主站会对所有从站写入这些状态请求。状态切换不是单纯写一个寄存器就结束主站还会反复读取 AL_STATUS确认从站是否真正到达目标状态。如果从站配置不完整、PDO 映射不匹配、SM/FMMU 配置错误就可能卡在 PREOP 或 SAFEOP。调试 EtherCAT 启动失败时这一段非常重要。建议重点关注AL Control 请求写了什么状态AL_STATUS 是否进入目标状态AL Status Code 是否有错误码WKC 是否符合预期12. 进入 LRW 周期 PDO 通信当从站进入 OP 后主站开始发送周期过程数据帧。抓包中主要表现为大量LRWFrame: #87044 开始出现 LRW Frame: #87247 起 LRW 返回 WKC 0 Command: LRW Meaning: Logical Read WriteLRW是逻辑读写命令。主站在一帧中同时完成写输出 PDO例如控制字、目标位置、目标速度、目标力矩等读输入 PDO例如状态字、当前位置、当前速度、当前力矩、错误码等这也是 EtherCAT 高实时性的关键主站不需要对每个从站单独发一帧而是按逻辑地址空间组织过程数据报文沿总线经过各从站时从站在自己的映射区域读写数据最后一帧返回主站。当 LRW 的 WKC 开始稳定大于 0说明从站已经开始参与过程数据交换主站和从站之间的实时 PDO 通信链路建立成功。13. 各阶段常见问题定位建议如果从站无法进入 OP可以按下面顺序排查BRD 0x0130的 WKC 是否等于预期从站数量BWR 0x0010是否成功清除旧站地址APWR 0x0010是否逐个返回WKC1FPRD 0x0000是否能读取 ESC 基本信息0x0500/0x0502EEPROM/SII 读取是否完成Mailbox SDO 是否有异常 abortSM/FMMU 配置写入是否返回WKC1AL Control 写入 SAFEOP/OP 后AL_STATUS 是否同步变化AL Status Code 是否出现错误码LRW 周期帧 WKC 是否稳定如果卡在 PREOP通常优先看 mailbox、SDO 和 SM 配置如果卡在 SAFEOP通常优先看 PDO 映射、FMMU、SM2/SM3 和 DC 配置如果已经进入 OP 但 LRW WKC 不对则重点看逻辑地址映射和周期任务是否真正启动。14. 总结IgH 主站启动后与从站的交互不是简单地“扫描一下然后进入 OP”而是一整套严格的初始化流程扫描从站 - 清地址 - DC 时间戳锁存 - 分配站地址 - 读取 ESC / DC / DL 信息 - 读取 EEPROM/SII - Mailbox/CoE SDO 读取对象字典 - 配置 FMMU / SM / DC - INIT / PREOP / SAFEOP / OP 状态切换 - LRW 周期 PDO 通信理解这套流程后再看 Wireshark 中密密麻麻的 EtherCAT 报文就会清晰很多哪些报文是在扫描拓扑哪些是在读取硬件描述哪些是在配置邮箱和 PDO哪些是在切换状态机哪些才是真正的实时控制周期数据。对于人形机器人项目来说这类抓包分析非常有价值。它不仅能帮助我们理解 IgH 协议栈的启动行为也能在从站无法进入 OP、PDO 数据异常、DC 同步失败、WKC 不稳定等问题出现时快速定位问题发生在哪一个阶段。