2. EtherCAT从站通信基础

要理解 ESI(EtherCAT Slave Information)文件为什么长成那样,必须先回到 EtherCAT 从站本身的通信机制。ESI 不是一份孤立的 XML 配置,而是对从站内部四类通信能力的“外部声明”:状态机决定它如何被启动和切换,过程数据对象决定它每个周期交换什么,邮箱通信决定它如何被参数化与诊断,分布式时钟决定它的时间基准如何与主站对齐。本节把这条对应关系讲清楚,后续读写 ESI 时才能知道每个节点在描述什么。

一、从站状态机:ESI 描述的是“能力”,状态机决定“时机”

EtherCAT 从站的状态机由 ESM(EtherCAT State Machine)定义,核心状态包括 Init、Pre-Operational(Pre-Op)、Safe-Operational(Safe-Op)、Operational(Op),此外还有 Bootstrap 用于固件更新。状态迁移由主站通过写 AL Control 寄存器触发,从站用 AL Status 与 AL Status Code 回应。关键约束是:只有进入 Pre-Op 之后邮箱通信才可用,只有进入 Safe-Op 之后过程数据输入才有效,只有进入 Op 之后过程数据输出才被真正施加到执行器。

这条时序直接映射到 ESI:<Mailbox> 节点描述的是 Pre-Op 阶段可用的邮箱协议与缓冲区大小;<Sm> 同步管理器节点描述的是各状态允许使用的通道;<Dc> 节点描述的是进入 Op 后分布式时钟的配置能力。也就是说,ESI 声明的是“从站在某个状态下具备什么能力”,而状态机决定“这些能力何时被激活”。

二、过程数据对象:SM2/SM3 与 PDO 映射

过程数据(Process Data)通过同步管理器 SM2(主站→从站,输出)和 SM3(从站→主站,输入)周期性交换。每个 SM 通道内由若干 PDO(Process Data Object)组成,PDO 再映射到对象字典中的具体条目。例如一个伺服从站常见的输入 PDO 会包含状态字 0x6041、实际位置 0x6064、实际速度 0x606C;输出 PDO 会包含控制字 0x6040、目标位置 0x607A、目标速度 0x60FF。

ESI 中的 <TxPdo> 与 <RxPdo> 正是对这些映射的声明,每个 <Entry> 给出索引、子索引、位长和数据类型。主站在配置阶段读取这些条目,才能计算出过程数据映像的总长度,并据此分配 SM2/SM3 的缓冲区。若 ESI 中 PDO 条目与实际固件不一致,典型现象是进入 Safe-Op 时 AL Status Code 报 0x001D(SM 长度不匹配)或 0x001E(SM 配置无效)。

三、邮箱通信:CoE、FoE、EoE 与参数通道

邮箱通信走 SM0(主站→从站)和 SM1(从站→主站),在 Pre-Op 阶段即可使用。常见协议包括 CoE(CANopen over EtherCAT,用于对象字典读写与 SDO 传输)、FoE(File over EtherCAT,用于固件下载)、EoE(Ethernet over EtherCAT,用于 IP 通道)。ESI 通过 <Mailbox> 下的 <CoE>、<FoE>、<EoE> 子节点声明支持哪些协议,并给出 Bootstrap 与标准邮箱的缓冲区大小。

这里有一个容易忽略的对应关系:ESI 中声明的对象字典条目,既是 PDO 映射的来源,也是 CoE SDO 访问的目标。如果某个参数只出现在 <Dictionary> 中而未映射进 PDO,它就只能通过 CoE 在 Pre-Op 阶段读写;如果它同时出现在 PDO 中,则可以在 Op 阶段周期刷新。理解这一点,才能判断一个参数应该走邮箱还是走过程数据。

四、分布式时钟:DC 模式与同步窗口

分布式时钟(Distributed Clocks, DC)让所有从站共享同一时间基准。主站发送 ARMW/FRMW 广播帧,从站据此测量传播延迟并补偿本地时钟偏移。DC 模式下,从站可工作在两种同步方式:SYNC0 同步(周期性同步信号触发过程数据采样与输出)和 SYNC1 同步(用于更高精度或特殊应用)。ESI 中的 <Dc> 节点声明从站是否支持 DC、支持哪些同步模式、以及 <OpMode> 中可选的周期时间范围。

DC 与状态机的耦合点在于:只有进入 Op 且 DC 已激活,SYNC0 才会真正驱动过程数据。若 ESI 声明支持 DC 但实际固件未启用,主站可能在 Op 阶段观察到周期抖动或 AL Status Code 0x0032(DC 同步错误)。

五、四类机制与 ESI 描述范围的对应关系

把上述内容收拢成一张对应图,可以清楚看到 ESI 的每个主要节点分别服务于哪类通信机制。下图以“从站通信能力”为中心,左侧是四类机制,右侧是 ESI 中对应的描述节点,中间标注了它们生效的状态阶段。

从站通信机制与 ESI 描述范围的对应关系 从站状态机 ESM Init→Pre-Op→Safe-Op→Op 过程数据 PDO SM2 输出 / SM3 输入 邮箱通信 CoE / FoE / EoE 分布式时钟 DC SYNC0 / SYNC1 同步 生效状态阶段 Pre-Op Safe-Op Op Bootstrap 邮箱:Pre-Op 起可用 过程数据:Safe-Op 起有效 DC 同步:Op 阶段驱动 <Sm> 同步管理器 SM0/SM1 邮箱,SM2/SM3 过程数据,SM 长度与方向 <TxPdo> / <RxPdo> 索引、子索引、位长、数据类型,决定过程数据映像 <Mailbox> + <Dictionary> CoE/FoE/EoE 协议声明,对象字典条目与 SDO 访问 <Dc> + <OpMode> DC 支持标志、SYNC0/SYNC1、周期时间范围 对应原则:ESI 声明“从站在某状态下具备什么能力”,状态机决定“这些能力何时被激活”。 PDO 条目同时是过程数据映射来源与 CoE SDO 访问目标;DC 只有在 Op 阶段才真正驱动 SYNC0。

六、从 ESI 反推从站行为的检查方法

拿到一份 ESI 后,可以按下面的顺序快速核对它是否与从站实际行为一致。这不是固定流程,而是一套“从描述到现象”的对照方法:

  • 看 <Sm>:确认 SM2/SM3 的长度与方向,与主站扫描到的过程数据长度比对。若不一致,进入 Safe-Op 会失败。
  • 看 <TxPdo>/<RxPdo>:确认每个 Entry 的索引、子索引、位长。位长之和应等于对应 SM 的缓冲区长度。
  • 看 <Mailbox>:确认 CoE 是否声明、对象字典是否完整。若某个参数在 PDO 中找不到,应能在 Dictionary 中找到并通过 SDO 读写。
  • 看 <Dc>:确认是否支持 DC、支持哪种 SYNC 模式、周期时间范围是否覆盖实际使用的周期。
  • 看 <OpMode>:确认可选操作模式与固件支持的模式一致,避免主站请求了从站不支持的模式。
一个实用的判断经验:如果从站能进入 Pre-Op 但进不了 Safe-Op,优先怀疑 PDO 映射或 SM 长度;如果能进 Safe-Op 但进不了 Op,优先怀疑 DC 配置或输出 PDO 的看门狗设置。

七、一个最小对照示例

假设某数字量输入从站,8 路输入映射到 0x6000:01,位长 8 位;8 路输出映射到 0x7000:01,位长 8 位。则 ESI 中应有:<RxPdo> 指向 0x7000:01(主站→从站,输出),<TxPdo> 指向 0x6000:01(从站→主站,输入),SM2 长度 1 字节,SM3 长度 1 字节。主站扫描后过程数据映像应为 1 字节输入 + 1 字节输出。若实际固件把输入映射到 0x6000:01 的 16 位,而 ESI 写的是 8 位,则 Safe-Op 阶段会因长度不匹配而报错。这个例子说明:ESI 的 PDO 条目不是文档装饰,而是主站计算过程数据映像的直接依据。

把状态机、PDO、邮箱、DC 四者与 ESI 节点的对应关系建立起来之后,后续阅读任何一份 ESI 文件,都可以先定位它描述的是哪类通信能力,再判断该能力在哪个状态阶段生效,从而快速判断配置是否与从站实际行为匹配。