3、EtherCAT通信原理:帧结构、寻址方式与数据交换机制

好,咱们进入正题。EtherCAT 为什么能跑得那么快?说白了,它的通信原理跟传统以太网完全不是一个路子。我刚开始接触 EtherCAT 时,第一反应是:这不就是普通以太网帧吗?后来踩了坑才发现,里面的门道深着呢。

这一节,我会把 EtherCAT 的帧结构、寻址方式和数据交换机制掰开揉碎了讲。你想想看,搞懂了这些,你才能知道抖动到底从哪来,又该怎么优化。

3.1 帧结构:EtherCAT 数据是怎么塞进以太网帧里的?

EtherCAT 用的是标准以太网帧,但它在数据区里做了手脚。嗯,准确地说,是直接把 EtherCAT 协议数据塞进了以太网数据区。帧类型用的是 0x88A4,这个值你记一下,抓包时一眼就能认出来。

来看一个典型的 EtherCAT 帧结构:

+----------------+----------------+----------------+----------------+
|  目的MAC地址   |  源MAC地址     |  0x88A4        |  EtherCAT数据  |
|   (6字节)      |   (6字节)      |   (2字节)      |   (44-1498字节)|
+----------------+----------------+----------------+----------------+

EtherCAT 数据部分才是重点。它由两部分组成:

  • EtherCAT 头(2字节):包含数据长度和保留位。我个人习惯先看长度字段,它能告诉我后面跟了多少个子报文。
  • EtherCAT 子报文(多个):每个子报文对应一个从站的操作。一个帧里可以塞多个子报文,这就是 EtherCAT 高效的原因之一。

每个子报文的结构是这样的:

+--------+--------+--------+--------+--------+--------+--------+--------+
|  命令  |  索引  |  地址区 |  长度  |  R     |  M     |  状态位 |  数据区 |
| (1字节)| (1字节)| (4字节)| (2字节)| (1位)  | (1位)  | (4位)  | (0-1486)|
+--------+--------+--------+--------+--------+--------+--------+--------+

这里有个坑,我提醒你一下:子报文的总长度不能超过以太网帧的 MTU(1500 字节)。我在项目中遇到过有人把数据塞得太满,结果帧被分片了,导致通信异常。嗯,这个错误很低级,但确实容易犯。

注意:EtherCAT 子报文的地址区是 4 字节,但实际寻址时只用到了其中一部分。别被这个长度吓到,后面我会讲怎么用。

3.2 寻址方式:从站怎么找到自己的数据?

EtherCAT 的寻址方式有好几种,但最常用的就两个:设备寻址逻辑寻址。我刚开始学的时候,总觉得逻辑寻址很绕,后来做项目用多了,才发现它才是精髓。

3.2.1 设备寻址

设备寻址又分两种:

  • 顺序寻址:从站在总线上的物理位置决定地址。第一个从站是 0,第二个是 1,依此类推。这种方式简单,但一旦拓扑变了,地址就全乱了。
  • 节点寻址:每个从站有一个固定的站地址(通过硬件拨码或 EEPROM 设置)。这种方式更灵活,我建议在复杂拓扑中用这个。

设备寻址的报文格式里,地址区的前 16 位是地址,后 16 位是偏移量。举个例子:

地址区 = 0x0001_0020
// 表示访问站地址为 1 的从站,偏移量为 0x0020 的寄存器

我曾经在一个产线上遇到过地址冲突的问题。两个从站拨码都设成了 5,结果数据全乱了。从那以后,我每次上电前都会用工具扫一遍总线,确认地址唯一。

3.2.2 逻辑寻址

逻辑寻址才是 EtherCAT 的杀手锏。它把整个总线的从站映射到一个连续的虚拟地址空间里。主站发一个帧,所有从站同时处理自己的那一段数据。

逻辑寻址的地址区是 32 位的,范围从 0x000000000xFFFFFFFF。每个从站会配置一个 FMMU(现场总线内存管理单元),告诉它:你的数据在哪个逻辑地址段。

举个例子:

从站 A:逻辑地址 0x00000000 - 0x000000FF
从站 B:逻辑地址 0x00000100 - 0x000001FF
从站 C:逻辑地址 0x00000200 - 0x000002FF

主站发一个帧,地址区填 0x00000000,长度填 0x0300。这个帧经过每个从站时,从站会检查自己的 FMMU 配置,如果命中,就处理对应的数据段。

核心思想:逻辑寻址实现了「一次发送,多点处理」。这就是 EtherCAT 能跑出微秒级周期的根本原因。

3.3 数据交换机制:从站怎么「偷」数据?

EtherCAT 的数据交换机制,说白了就是 「帧在总线上跑一圈,每个从站顺路处理自己的数据」。这个过程叫 「集总帧」 技术。

具体流程是这样的:

  1. 主站发一个帧,帧里包含了所有从站要读或写的数据。
  2. 帧到达第一个从站,从站读取属于自己的数据,同时把自己的数据写回帧里。
  3. 帧继续往下传,每个从站都做同样的操作。
  4. 最后一个从站把帧返回给主站。

你想想看,这个过程有多高效?传统以太网是「一问一答」,一个从站一个从站地轮询。EtherCAT 是一次性把所有事都办了。

这里有个关键点:从站处理数据的时间极短。我记得在测试一个伺服驱动器时,从站处理一个子报文的时间只有几十纳秒。嗯,这个时间主要花在硬件上,跟软件关系不大。

3.3.1 数据交换模式

EtherCAT 支持三种数据交换模式:

模式 说明 适用场景
周期性过程数据 主站周期性地发送和接收数据,用于实时控制 伺服驱动、IO 控制
非周期性邮箱数据 用于参数配置、诊断等非实时数据 上电初始化、故障诊断
分布式时钟同步 通过专用报文同步所有从站的时钟 多轴同步、高速采集

我建议你在做项目时,把过程数据和邮箱数据分开处理。别混在一起,否则实时性会受影响。我曾经见过一个案例,工程师把参数配置报文塞进了过程数据通道,结果周期抖动直接翻了一倍。

3.3.2 数据交换的时序

一个典型的 EtherCAT 周期是这样的:

主站发送帧  →  从站处理  →  帧返回主站
   |               |               |
   T0             T1              T2

其中:

  • T0 → T1:帧从主站到最后一个从站的传输时间。这个时间取决于总线长度和从站数量。
  • T1 → T2:帧从最后一个从站返回主站的时间。
  • 总周期时间 = T2 - T0。

你可能会问:抖动主要出在哪?我告诉你,大部分抖动来自 T0 → T1 段。因为每个从站的处理时间虽然短,但累积起来就不可忽视了。尤其是当从站数量多,或者某个从站的处理时间不稳定时,抖动就会明显增加。

避坑指南:我曾经在一个 64 轴的运动控制项目中,发现周期抖动从 1μs 飙到了 10μs。排查了半天,发现是一个从站的 FMMU 配置错了,导致它处理了不该处理的数据。嗯,从那以后,我每次配置 FMMU 都会用工具验证一遍。

3.4 小结

这一节的内容,说白了就是 EtherCAT 的「内功心法」。帧结构告诉你数据怎么装,寻址方式告诉你数据找谁,数据交换机制告诉你数据怎么跑。搞懂了这些,你才能理解为什么 EtherCAT 能实现微秒级的同步精度。

下一节,我会讲 EtherCAT 的分布式时钟机制。嗯,那个才是抖动的核心来源,咱们到时候细聊。