从零开发 EtherCAT 主站(二):EtherCAT 通信原理详解,数据为什么能“边经过边处理”?
从零开发 EtherCAT 主站(二):EtherCAT 通信原理详解,数据为什么能“边经过边处理”?
文章目录
- 从零开发 EtherCAT 主站(二):EtherCAT 通信原理详解,数据为什么能“边经过边处理”?
-
- 一、前言
- 二、先从普通 Ethernet Frame 说起
- 三、EtherCAT Frame 到底是什么?
- 四、EtherCAT 为什么可以让一个 Frame 访问多个从站?
- 五、On-The-Fly 到底是怎么实现的?
- 六、EtherCAT 的地址到底是什么?
- 七、FMMU:主站如何把数据“拼”到一起?
- 八、一个 EtherCAT Frame 可以包含多个 Datagram
- 九、Working Counter(WKC)为什么如此重要?
- 十、EtherCAT 数据交换的完整过程
- 十一、EtherCAT 为什么适合运动控制?
- 十二、EtherCAT 与传统 CAN 通信的核心区别
- 十三、从主站开发角度理解 EtherCAT
- 十四、总结
- 系列文章导航
- 写在最后
一、前言
上一篇文章我们介绍了 EtherCAT 的发展背景,以及它为什么能够在工业自动化、机器人、运动控制等领域得到广泛应用。
其中最核心的一个原因就是:
EtherCAT 从站可以在数据帧经过自己的同时完成数据读取和写入,而不需要等待整个数据帧接收完成。
这个机制被称为 On-The-Fly Processing(边经过边处理)。
但如果只停留在这个概念层面,我们还是很难真正理解 EtherCAT。
例如:
- EtherCAT Frame 到底是什么?
- 一个 Ethernet Frame 里面装了什么?
- 什么是 EtherCAT Datagram?
- 主站如何告诉从站“这个数据是给你的”?
- 从站如何在数据帧经过时修改数据?
- 一个 Frame 为什么可以同时访问多个从站?
- WKC(Working Counter)又是在哪里发挥作用的?
这些问题搞明白之后,EtherCAT 的通信机制基本就算入门了。
本文将从 Ethernet Frame 开始,一层一层拆开 EtherCAT 的通信过程。
二、先从普通 Ethernet Frame 说起
EtherCAT 建立在标准 Ethernet 物理层之上,因此理解 EtherCAT 之前,首先需要知道一个普通 Ethernet Frame 是什么。
一个典型的 Ethernet II Frame 可以抽象为:
┌──────────────┐
│ Destination │ 6 Bytes
├──────────────┤
│ Source │ 6 Bytes
├──────────────┤
│ EtherType │ 2 Bytes
├──────────────┤
│ Payload │
├──────────────┤
│ FCS │ 4 Bytes
└──────────────┘
其中比较重要的是 EtherType。
它用于告诉接收设备:
当前 Ethernet Frame 中携带的是什么上层协议。
EtherCAT 使用专门的 EtherType:
0x88A4
因此,当网卡收到一个 EtherType 为 0x88A4 的 Ethernet Frame 时,就可以知道:
这是一个 EtherCAT Frame。
2.1 EtherCAT 并不是重新发明 Ethernet
这一点非常重要。
EtherCAT 并不是:
Ethernet
↓
完全换掉
↓
EtherCAT
而是在 Ethernet 的基础上定义了自己的实时通信协议。
可以简单理解为:
┌──────────────────────┐
│ EtherCAT Protocol │
├──────────────────────┤
│ Ethernet │
├──────────────────────┤
│ PHY │
└──────────────────────┘
因此 EtherCAT 可以使用标准的 Ethernet PHY 和常见的双绞线、光纤等物理介质。
三、EtherCAT Frame 到底是什么?
一个 EtherCAT Frame 本质上仍然是一个 Ethernet Frame。
只不过它的 Payload 部分被 EtherCAT 协议重新定义了。
可以简化成:
Ethernet Frame
┌────────────────────────────────────┐
│ Ethernet Header │
├────────────────────────────────────┤
│ EtherCAT Datagram 1 │
├────────────────────────────────────┤
│ EtherCAT Datagram 2 │
├────────────────────────────────────┤
│ ... │
├────────────────────────────────────┤
│ EtherCAT Datagram N │
└────────────────────────────────────┘
这里最重要的概念就是:
EtherCAT Datagram。
如果把整个 EtherCAT Frame 理解成“一封快递”,那么 Datagram 就可以理解成快递里面的一条具体操作指令。
3.1 什么是 Datagram?
一个 EtherCAT Datagram 通常包含:
┌──────────────┐
│ Cmd │
├──────────────┤
│ Index │
├──────────────┤
│ Address │
├──────────────┤
│ Length │
├──────────────┤
│ IRQ │
├──────────────┤
│ Data │
├──────────────┤
│ WKC │
└──────────────┘
其中几个字段非常重要。
| 字段 | 作用 |
|---|---|
| Cmd | 告诉从站执行什么操作 |
| Index | Datagram 的索引编号 |
| Address | 指定访问位置 |
| Length | 数据长度 |
| Data | 实际数据 |
| WKC | Working Counter |
后面学习 SOEM 时,你会发现 SOEM 大量代码其实就是在构造和解析这些 Datagram。
四、EtherCAT 为什么可以让一个 Frame 访问多个从站?
这是理解 EtherCAT 最关键的一步。
假设我们有三个从站:
Master
│
▼
Slave 1
│
▼
Slave 2
│
▼
Slave 3
主站可以发送一个 EtherCAT Frame:
┌─────────────────────────────┐
│ Ethernet Header │
├─────────────────────────────┤
│ Datagram │
│ │
│ Data for Slave 1 │
│ Data for Slave 2 │
│ Data for Slave 3 │
└─────────────────────────────┘
这个 Frame 会依次经过所有从站。
但是,每个从站只会处理属于自己的那部分数据。
于是就出现了非常有意思的过程:
Master
│
│ Frame
▼
┌─────────┐
│ Slave 1 │ ← 读取/写入自己的数据
└─────────┘
│
│ Frame
▼
┌─────────┐
│ Slave 2 │ ← 读取/写入自己的数据
└─────────┘
│
│ Frame
▼
┌─────────┐
│ Slave 3 │ ← 读取/写入自己的数据
└─────────┘
│
▼
Master
这就是 EtherCAT 所谓的:
Processing on the fly。
五、On-The-Fly 到底是怎么实现的?
仅仅说“边经过边处理”还不够。
真正实现这个机制的关键是:
EtherCAT Slave Controller(ESC)。
5.1 ESC 是什么?
ESC 可以理解为 EtherCAT 从站专用的硬件控制器。
很多 EtherCAT 从站芯片或者 MCU 内置的 EtherCAT 外设,本质上都需要具备类似 ESC 的功能。
常见的 EtherCAT Slave Controller 包括:
- Beckhoff ET1100
- Microchip LAN9252
- TI AM243x EtherCAT Subsystem
- STM32 部分带 EtherCAT 从站功能的产品
ESC 的核心任务不是运行复杂的应用算法,而是负责高速处理 EtherCAT 数据。
5.2 数据帧经过 ESC 时发生了什么?
假设主站发送:
Data = 0x12345678
当 Frame 经过某个从站时,ESC 会根据 Datagram 中的地址判断:
这个地址是不是我的?
如果是,那么 ESC 可以直接访问内部寄存器或者 Process Data 区域。
整个过程可以抽象为:
EtherCAT Frame
│
▼
PHY
│
▼
ESC
│
├── 地址匹配?
│
├── YES → 读/写数据
│
└── NO → 直接转发
│
▼
下一个 Slave
注意:
这里并不需要 CPU 把整个 Ethernet Frame 收下来,再交给软件协议栈处理。
这正是 EtherCAT 与普通网络通信非常重要的区别。
六、EtherCAT 的地址到底是什么?
既然从站需要判断:
“这个数据是不是我的?”
那么就必须存在寻址机制。
EtherCAT 提供了多种寻址方式。
比较常见的包括:
- Auto Increment Address
- Configured Station Address
- Broadcast
- Logical Address
其中最重要的是:
Logical Address(逻辑地址)。
6.1 逻辑地址
在 EtherCAT PDO 通信中,主站通常不会简单地说:
“给 3 号从站发送数据。”
而是建立一个统一的逻辑地址空间。
例如:
Logical Address
0x00000000
│
├── Slave 1 Input
│
├── Slave 1 Output
│
├── Slave 2 Input
│
├── Slave 2 Output
│
├── Slave 3 Input
│
└── Slave 3 Output
这就需要引出 EtherCAT 中非常重要的一个概念:
FMMU(Fieldbus Memory Management Unit)。
FMMU 会把从站内部的数据区域映射到 EtherCAT 的逻辑地址空间。
后面讲 PDO 映射时,我们会专门深入 FMMU。
七、FMMU:主站如何把数据“拼”到一起?
假设系统中有三个伺服:
Servo 1
Position
Velocity
Torque
Servo 2
Position
Velocity
Torque
Servo 3
Position
Velocity
Torque
主站希望把这些数据组织成一个连续的逻辑地址空间:
Logical Address
0x0000
│
├── Servo1 Position
├── Servo1 Velocity
├── Servo1 Torque
│
├── Servo2 Position
├── Servo2 Velocity
├── Servo2 Torque
│
├── Servo3 Position
├── Servo3 Velocity
└── Servo3 Torque
这时候每个从站只需要通过 FMMU 将自己的本地数据映射到对应逻辑地址。
因此:
主站看到的是一个连续的逻辑内存,而不是几十个完全独立的从站。
这也是 EtherCAT PDO 高效通信的重要基础。
八、一个 EtherCAT Frame 可以包含多个 Datagram
前面说一个 EtherCAT Frame 可以访问多个从站,但还需要补充一个细节:
一个 EtherCAT Frame 内部可以包含多个 Datagram。
例如:
Ethernet Frame
│
├── Datagram 1
│ └── PDO Output
│
├── Datagram 2
│ └── PDO Input
│
├── Datagram 3
│ └── SDO / Mailbox
│
└── Datagram 4
└── 状态读取
因此主站可以根据实际需要,将多个操作组合到一个 Ethernet Frame 中。
这样可以进一步降低:
- Ethernet Frame 数量;
- 协议处理开销;
- CPU 负担;
- 网络延迟。

九、Working Counter(WKC)为什么如此重要?
前面多次提到 WKC。
现在可以理解它存在的意义了。
假设主站发送一个 Datagram:
Master
│
▼
Slave1
│
▼
Slave2
│
▼
Slave3
│
▼
Master
如果三个从站都正确处理了这个 Datagram,那么 WKC 就会按照协议规则增加。
最终主站收到 Frame 后检查:
Expected WKC
==
Actual WKC
如果相等:
通信正常
如果不相等:
可能存在从站掉线、
数据未处理或通信异常
因此,在 SOEM 中你会经常看到类似:
wkc = ec_receive_processdata(EC_TIMEOUTRET);
然后判断:
if (wkc < expectedWKC)
{
// 通信异常
}
这也是后续我们阅读 SOEM 源码时必须理解的核心概念。
十、EtherCAT 数据交换的完整过程
现在把前面的知识全部串起来。
假设系统中有三个从站:
Master
│
▼
Slave 1
│
▼
Slave 2
│
▼
Slave 3
主站首先根据设备配置建立:
Object Dictionary
↓
PDO Mapping
↓
FMMU
↓
Logical Address
然后进入周期通信。
10.1 主站发送 Process Data
Master
│
│ EtherCAT Frame
▼
Slave 1
│
│ 处理自己的数据
▼
Slave 2
│
│ 处理自己的数据
▼
Slave 3
│
│ 处理自己的数据
▼
Master
10.2 从站实时处理数据
每个从站的 ESC 在数据经过时完成:
检测地址
↓
读取/写入 DPRAM
↓
更新 WKC
↓
继续转发
CPU 主要负责:
应用算法
状态机
控制逻辑
参数管理
而不是负责逐字节搬运 EtherCAT Frame。
10.3 主站检查通信结果
最终:
Actual WKC
↓
与 Expected WKC 比较
↓
通信正常?
如果通信正常:
继续下一个周期
如果异常:
进入错误处理
Slave Recovery
重新检查状态
后面我们会专门分析 EtherCAT 主站如何进行从站恢复。
十一、EtherCAT 为什么适合运动控制?
到这里我们就可以理解为什么 EtherCAT 特别适合伺服和机器人。
一个典型的运动控制系统可能是:
EtherCAT Master
│
┌─────────┼─────────┐
│ │ │
▼ ▼ ▼
Servo1 Servo2 Servo3
│ │ │
▼ ▼ ▼
Motor1 Motor2 Motor3
主站可以在一个周期内同时发送:
Position Command
Velocity Command
Torque Command
Control Word
同时接收:
Actual Position
Actual Velocity
Actual Torque
Status Word
这样就可以实现高性能的多轴运动控制。
进一步结合 Distributed Clocks(DC),还可以让多个从站在统一时间基准下进行同步。
这也是 EtherCAT 能够应用于:
- 机器人
- CNC
- 伺服系统
- 半导体设备
- 高速包装设备
的重要原因。

十二、EtherCAT 与传统 CAN 通信的核心区别
如果你熟悉 CAN,那么可以用下面这个思路快速理解两者。
CAN:
多个节点共享总线
↓
竞争发送
↓
仲裁
↓
一个节点发送一帧
EtherCAT:
Master 统一调度
↓
一个 Frame
↓
依次经过所有 Slave
↓
各 Slave On-The-Fly 处理
因此,两者的设计哲学完全不同。
CAN 的核心思想是:
让多个节点公平、可靠地共享一条总线。
EtherCAT 的核心思想则是:
让主站高效地控制整个网络,并让从站在数据帧经过时直接完成数据处理。
这也是为什么 EtherCAT 特别适合集中式运动控制系统。
十三、从主站开发角度理解 EtherCAT
到了这里,我们已经可以开始思考:
如果我要自己开发一个 EtherCAT Master,需要做什么?
从软件角度来看,大致可以分成:
┌──────────────────────────────┐
│ Qt 上位机 │
├──────────────────────────────┤
│ EtherCAT Master │
├──────────────────────────────┤
│ SOEM │
├──────────────────────────────┤
│ Raw Ethernet │
├──────────────────────────────┤
│ Ethernet NIC │
└──────────────────────────────┘
SOEM 位于中间这一层。
它负责帮助我们完成:
- EtherCAT Frame 构造;
- 从站扫描;
- 状态管理;
- PDO 配置;
- SDO 通信;
- Process Data 通信;
- WKC 处理;
- 从站状态恢复。
因此,接下来真正进入本系列的核心:
SOEM。
十四、总结
本文从 Ethernet Frame 开始,一步一步分析了 EtherCAT 的基本通信机制。
需要重点记住以下几个概念:
14.1 EtherCAT Frame
EtherCAT Frame 本质上是一个 Ethernet Frame,其 Payload 中携带 EtherCAT Datagram。
14.2 Datagram
Datagram 是 EtherCAT 实际执行读写操作的基本数据单元,其中包含 Command、Address、Data、WKC 等信息。
14.3 ESC
EtherCAT Slave Controller 是实现从站实时数据处理的核心硬件。
14.4 On-The-Fly
数据帧经过从站时,从站即可直接读取或修改自己的数据,然后继续转发。
这正是 EtherCAT 高实时性的核心原因之一。
14.5 FMMU
FMMU 将从站本地数据映射到 EtherCAT 的逻辑地址空间,使主站可以使用统一的逻辑地址访问分布式数据。
14.6 WKC
Working Counter 用于判断 Datagram 是否被预期数量的从站正确处理,是主站判断周期通信是否正常的重要依据。
把这些概念串起来,就得到了 EtherCAT 最核心的通信模型:
EtherCAT Master
│
│ Ethernet Frame
▼
Slave 1
│
│ On-The-Fly
▼
Slave 2
│
│ On-The-Fly
▼
Slave 3
│
│ On-The-Fly
▼
EtherCAT Master
│
▼
Check WKC
│
▼
Next Cycle
这就是 EtherCAT 能够实现高带宽、低延迟、高效率实时通信的核心机制。
下一篇,我们将继续往上走,研究一个非常重要的问题:
EtherCAT 从站为什么有 Init、Pre-OP、Safe-OP、OP 这些状态?主站到底是如何一步一步把一个刚上电的从站带到 OP 状态的?
这就是 EtherCAT State Machine(ESM)。
系列文章导航
| 章节 | 标题 | 状态 |
|---|---|---|
| 第一篇 | EtherCAT 为什么能成为工业实时通信的主流? | ✔ |
| 第二篇 | EtherCAT 通信原理详解,数据为什么能“边经过边处理”? | ✔ |
| 第三篇 | EtherCAT 状态机(ESM)完整解析,Init、Pre-OP、Safe-OP、OP 到底有什么区别? | 待更新 |
| 第四篇 | PDO、Mailbox、CoE、FoE 到底是什么?一文搞懂 EtherCAT 通信体系 | 待更新 |
| 第五篇 | SOEM 框架源码解析,一个例程带你读懂整个主站 | 待更新 |
| …… | …… | …… |
写在最后
到这里,我们已经完成了 EtherCAT 主站开发前最重要的第一层知识储备。
下一阶段将正式进入 SOEM 源码。
从下一篇开始,我们不再只讲协议概念,而是会逐渐结合实际代码,看看一个 EtherCAT Master 到底是如何:
打开网卡
↓
扫描从站
↓
配置从站
↓
建立 PDO
↓
进入 OP
↓
周期通信
最终,我们会把这些内容全部串起来,完成一个真正可以运行的 EtherCAT 主站。
参考链接:
ECAT
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)