3. EtherCAT协议原理
核心原理:从站硬件化处理与“飞读飞写”
EtherCAT(Ethernet for Control Automation Technology)最本质的设计思想,是将传统以太网协议栈中由软件完成的帧解析、数据提取与插入工作,下沉到每个从站的 ESC(EtherCAT Slave Controller)芯片中,由硬件在报文经过的瞬间完成处理。主站发送的以太网帧依次穿过每个从站,每个从站仅产生纳秒级的延迟(典型值 < 1 µs),报文在最后一个从站处被折返,沿原路径返回主站。这种“飞读飞写”机制使得整个网络的通信周期不再依赖从站CPU的处理速度,而是由物理链路长度与从站数量决定。
关键认知:EtherCAT不是“主站轮询从站”的传统请求-响应模式,而是“一帧经过,全员读写”的流水线模式。从站无需IP地址,也无需MAC地址参与路由,它只识别帧中的位置与命令。
帧结构与子报文格式
EtherCAT直接使用标准以太网帧,但以太网类型字段固定为 0x88A4。帧结构分为三层:以太网帧头、EtherCAT报文头和数据区。数据区由多个子报文(Datagram)串联组成,每个子报文独立寻址一组从站。
| 字段 | 长度 | 说明 |
|---|---|---|
| 目的MAC / 源MAC | 各6字节 | 标准以太网地址,通常为广播或多播 |
| EtherType | 2字节 | 固定为 0x88A4,标识EtherCAT协议 |
| EtherCAT头 | 2字节 | 包含数据区长度(11位)与类型(1位,1=与从站通信) |
| 子报文1..n | 可变 | 每个子报文包含命令、地址、数据与工作计数器 |
| FCS | 4字节 | 帧校验序列,由以太网控制器自动生成 |
子报文内部结构是理解EtherCAT的关键,其核心字段如下:
- 命令(CMD):如
NOP、APRD(寻址读)、APWR(寻址写)、BRD(广播读)、FPWR(配置写)等,决定从站执行何种操作。 - 索引(Idx):用于匹配请求与响应,主站可同时发出多个未完成的子报文。
- 地址(Ado/Adp):从站地址或自动增量计数器值,具体含义取决于寻址方式。
- 长度(Len):数据区字节数,最大为 1486 字节(受以太网MTU限制)。
- 数据区:实际读写的对象字典数据或过程数据。
- WKC(Working Counter):工作计数器,从站每成功处理一次该子报文,WKC 加 1。主站通过检查 WKC 的增量判断哪些从站正确响应。
实操提示:在抓包工具(如 Wireshark)中,如果看到 WKC 为 0,说明没有任何从站响应;如果 WKC 增量小于预期从站数,说明部分从站通信异常。这是排查 EtherCAT 通信故障的第一手依据。
寻址方式:位置寻址与配置寻址
EtherCAT 支持两种从站寻址模式,分别用于不同阶段:
- 位置寻址(Auto Increment,AI):子报文中的地址字段存放一个自动增量计数器。报文每经过一个从站,该计数器减 1。当计数器值为 0 时,当前从站即被选中。这种方式不依赖从站自身配置,适合在启动阶段扫描总线上的从站拓扑。
- 配置寻址(Configured Address,CA):每个从站在初始化时被分配一个唯一的 16 位站地址(0x0001~0xFFFF)。子报文中的地址字段直接存放该站地址,从站通过比较自身地址决定是否响应。这种方式用于正常运行阶段的过程数据通信。
此外还有广播寻址(所有从站同时处理)和逻辑寻址(基于 FMMU 将过程数据映射到连续逻辑地址空间,用于周期通信)。逻辑寻址是 EtherCAT 实现高实时性的核心:主站将各从站的输入输出数据映射到一个连续的逻辑地址段,每个从站通过 FMMU(现场总线内存管理单元)将自身数据映射到该段中的固定偏移位置,从而在一个子报文中完成所有从站的数据交换。
案例:某6轴运动控制系统,主站将6个伺服驱动器的目标位置(各4字节)映射到逻辑地址 0x1000~0x1017,将状态字(各2字节)映射到 0x2000~0x200B。每个周期,主站只需发送一个写子报文(逻辑地址 0x1000,长度24字节)和一个读子报文(逻辑地址 0x2000,长度12字节),即可完成全部6轴的控制与状态采集。
通信周期与分布式时钟同步
EtherCAT 的通信周期由主站决定,典型值为 250 µs ~ 4 ms。在一个周期内,主站发送下行帧,从站处理并返回上行帧,主站接收后立即开始下一周期。由于从站处理完全由硬件完成,周期抖动可控制在 ±100 ns 以内。
对于多轴运动控制,各从站必须同时采样输入、同时更新输出,否则会造成轴间不同步。EtherCAT 通过 分布式时钟(DC,Distributed Clock) 实现从站间的精确同步:
- 主站选择一个参考从站(通常为第一个从站),其本地时钟作为系统参考时钟。
- 主站周期性发送 ARMW(读-修改-写) 命令,读取所有从站的本地时钟与参考时钟的偏差,并写入补偿值。
- 每个从站的 ESC 内置时钟漂移补偿逻辑,通过 SYNC 信号 触发本地应用控制器(如 DSP/FPGA)的同步中断。
DC 同步的最终效果是:所有从站在同一时刻产生 SYNC 脉冲,误差通常小于 100 ns。对于伺服驱动器,这意味着电流环采样、位置锁存等事件在物理上同时发生,从而保证多轴插补的轨迹精度。
// 主站配置DC同步的典型寄存器操作(伪代码)
// 1. 选择参考从站(从站0)
slave0.dc_config.enable = true;
slave0.dc_config.cycle_time = 1000; // 单位:µs
// 2. 对所有从站执行ARMW命令,校准时钟偏移
for (each_slave in slaves) {
ec_datagram_armw(each_slave, REG_DC_SYSTIME, 8);
}
// 3. 设置SYNC脉冲周期与激活
for (each_slave in slaves) {
ec_datagram_fpwr(each_slave, REG_DC_SYNC_ACTIVATE, 0x0001);
}
误区与复盘:常见设计陷阱
误区1:认为从站越多,周期越长。实际上,从站处理延迟是纳秒级的,真正影响周期的是帧传输时间(与总电缆长度相关)和主站软件开销。100个从站与10个从站的帧传输时间差异仅约 10 µs(按100Mbps计算)。
误区2:忽略FMMU配置导致数据错位。逻辑寻址依赖FMMU将物理地址映射到逻辑地址。如果FMMU配置错误,从站可能写入错误的数据偏移,导致主站读到的数据张冠李戴。务必在初始化阶段逐站验证映射关系。
误区3:DC同步只影响运动控制。即使是非运动应用(如高速I/O采样),DC同步也能保证所有输入信号在同一时刻被锁存,避免因扫描不同步造成的采样误差。
复盘建议:在项目调试初期,先用位置寻址扫描总线,确认从站数量与拓扑;再切换到配置寻址并验证每个从站的站地址;最后配置 FMMU 与 DC,并用示波器测量各从站 SYNC 信号的相位差,确保同步精度达标。每一步都通过 WKC 返回值确认操作成功,避免将错误累积到后期。