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 字节)。我在项目中遇到过有人把数据塞得太满,结果帧被分片了,导致通信异常。嗯,这个错误很低级,但确实容易犯。
3.2 寻址方式:从站怎么找到自己的数据?
EtherCAT 的寻址方式有好几种,但最常用的就两个:设备寻址和逻辑寻址。我刚开始学的时候,总觉得逻辑寻址很绕,后来做项目用多了,才发现它才是精髓。
3.2.1 设备寻址
设备寻址又分两种:
- 顺序寻址:从站在总线上的物理位置决定地址。第一个从站是 0,第二个是 1,依此类推。这种方式简单,但一旦拓扑变了,地址就全乱了。
- 节点寻址:每个从站有一个固定的站地址(通过硬件拨码或 EEPROM 设置)。这种方式更灵活,我建议在复杂拓扑中用这个。
设备寻址的报文格式里,地址区的前 16 位是地址,后 16 位是偏移量。举个例子:
地址区 = 0x0001_0020
// 表示访问站地址为 1 的从站,偏移量为 0x0020 的寄存器
我曾经在一个产线上遇到过地址冲突的问题。两个从站拨码都设成了 5,结果数据全乱了。从那以后,我每次上电前都会用工具扫一遍总线,确认地址唯一。
3.2.2 逻辑寻址
逻辑寻址才是 EtherCAT 的杀手锏。它把整个总线的从站映射到一个连续的虚拟地址空间里。主站发一个帧,所有从站同时处理自己的那一段数据。
逻辑寻址的地址区是 32 位的,范围从 0x00000000 到 0xFFFFFFFF。每个从站会配置一个 FMMU(现场总线内存管理单元),告诉它:你的数据在哪个逻辑地址段。
举个例子:
从站 A:逻辑地址 0x00000000 - 0x000000FF
从站 B:逻辑地址 0x00000100 - 0x000001FF
从站 C:逻辑地址 0x00000200 - 0x000002FF
主站发一个帧,地址区填 0x00000000,长度填 0x0300。这个帧经过每个从站时,从站会检查自己的 FMMU 配置,如果命中,就处理对应的数据段。
3.3 数据交换机制:从站怎么「偷」数据?
EtherCAT 的数据交换机制,说白了就是 「帧在总线上跑一圈,每个从站顺路处理自己的数据」。这个过程叫 「集总帧」 技术。
具体流程是这样的:
- 主站发一个帧,帧里包含了所有从站要读或写的数据。
- 帧到达第一个从站,从站读取属于自己的数据,同时把自己的数据写回帧里。
- 帧继续往下传,每个从站都做同样的操作。
- 最后一个从站把帧返回给主站。
你想想看,这个过程有多高效?传统以太网是「一问一答」,一个从站一个从站地轮询。EtherCAT 是一次性把所有事都办了。
这里有个关键点:从站处理数据的时间极短。我记得在测试一个伺服驱动器时,从站处理一个子报文的时间只有几十纳秒。嗯,这个时间主要花在硬件上,跟软件关系不大。
3.3.1 数据交换模式
EtherCAT 支持三种数据交换模式:
| 模式 | 说明 | 适用场景 |
|---|---|---|
| 周期性过程数据 | 主站周期性地发送和接收数据,用于实时控制 | 伺服驱动、IO 控制 |
| 非周期性邮箱数据 | 用于参数配置、诊断等非实时数据 | 上电初始化、故障诊断 |
| 分布式时钟同步 | 通过专用报文同步所有从站的时钟 | 多轴同步、高速采集 |
我建议你在做项目时,把过程数据和邮箱数据分开处理。别混在一起,否则实时性会受影响。我曾经见过一个案例,工程师把参数配置报文塞进了过程数据通道,结果周期抖动直接翻了一倍。
3.3.2 数据交换的时序
一个典型的 EtherCAT 周期是这样的:
主站发送帧 → 从站处理 → 帧返回主站
| | |
T0 T1 T2
其中:
- T0 → T1:帧从主站到最后一个从站的传输时间。这个时间取决于总线长度和从站数量。
- T1 → T2:帧从最后一个从站返回主站的时间。
- 总周期时间 = T2 - T0。
你可能会问:抖动主要出在哪?我告诉你,大部分抖动来自 T0 → T1 段。因为每个从站的处理时间虽然短,但累积起来就不可忽视了。尤其是当从站数量多,或者某个从站的处理时间不稳定时,抖动就会明显增加。
3.4 小结
这一节的内容,说白了就是 EtherCAT 的「内功心法」。帧结构告诉你数据怎么装,寻址方式告诉你数据找谁,数据交换机制告诉你数据怎么跑。搞懂了这些,你才能理解为什么 EtherCAT 能实现微秒级的同步精度。
下一节,我会讲 EtherCAT 的分布式时钟机制。嗯,那个才是抖动的核心来源,咱们到时候细聊。