2. EtherCAT协议原理:数据帧结构、寻址方式、通信模式
好,咱们进入正题。EtherCAT这个协议,说白了就是让以太网能用在运动控制上。为什么它能做到?核心就在它的数据帧结构、寻址方式和通信模式上。我刚开始接触的时候也觉得挺绕,但搞明白这几个点,后面分析负载、做优化就顺了。
2.1 数据帧结构:一个帧,多个设备
传统以太网是一个帧只发给一个设备。EtherCAT不一样,它一个帧经过所有从站,每个从站只处理属于自己的那部分数据。这就像一列火车,每节车厢装不同货物,到站卸货或装货。
EtherCAT数据帧基于标准以太网帧,但 EtherType 字段用的是 0x88A4。帧结构如下:
+----------------+----------------+----------------+----------------+
| 以太网帧头(14B) | EtherCAT头(2B) | 数据报1(n B) | 数据报2(n B) | ... | 数据报N(n B) | FCS(4B) |
+----------------+----------------+----------------+----------------+
以太网帧头:目标MAC、源MAC、EtherType(0x88A4)。
EtherCAT头:就2个字节,包含数据报长度和保留位。嗯,这里要注意,长度字段是数据报的总长度,不包括以太网帧头。
数据报:这才是核心。一个帧里可以塞多个数据报,每个数据报结构如下:
+--------+--------+--------+--------+--------+--------+--------+--------+
| 数据报头(10B) | 数据区(0-1486B) | 工作计数器(WKC, 2B) |
+--------+--------+--------+--------+--------+--------+--------+--------+
数据报头包含:
- 命令(1B):比如读、写、读写等。我常用的有
APRD(自动递增物理读)、FPRD(配置地址读)、LRW(逻辑读写)。 - 索引(1B):用于匹配请求和响应。
- 寻址信息(4B):后面细说。
- 长度(2B):数据区长度。
- M位(1b):表示后面还有数据报。
- IRQ(2B):中断请求。
工作计数器(WKC):每个从站处理完数据报后,会递增这个值。主站通过检查WKC就知道有多少从站处理了数据。我在调试时经常用这个来排查哪个从站没响应。
关键点:一个以太网帧可以包含多个数据报,每个数据报可以寻址不同的从站或同一从站的不同地址。这就是EtherCAT高效的原因——减少帧头开销。
2.2 寻址方式:三种方式,各有用处
EtherCAT有三种寻址方式,我分别说说。
2.2.1 设备寻址(物理寻址)
又分两种:
- 自动递增寻址:从站位置由它在总线上的物理位置决定。第一个从站地址为0,第二个为1,以此类推。主站发送时,每个从站收到帧后地址减1,地址为0的从站处理该数据报。这种方式在启动时自动分配地址,很方便。
- 配置寻址:每个从站有一个固定的站地址(由主站配置)。主站直接指定目标从站的地址。这种方式在运行中更稳定,不会因为从站插拔而改变。
我个人习惯在调试阶段用自动递增,正式运行时用配置寻址。为什么?有一次我在产线上换了一个从站,自动递增地址变了,导致整个轴控逻辑乱掉。从那以后,我都是先配好站地址再上线。
2.2.2 逻辑寻址(段寻址)
这是EtherCAT最牛的地方。主站把整个网络映射成一个连续的虚拟地址空间(4GB)。每个从站把自己的寄存器、输入输出数据映射到这个空间里。主站通过 LRW 命令一次性读写多个从站的数据。
举个例子:
// 假设从站1的输入映射到地址0x1000-0x1003
// 从站2的输入映射到地址0x1004-0x1007
// 主站发送一个LRW命令,地址0x1000,长度8字节
// 就能同时读取两个从站的输入数据
这种方式的效率极高。我在做六轴机器人控制时,就用一个LRW数据报读取所有轴的位置和状态,一个数据报写入所有轴的目标位置。一个周期内搞定所有数据交换。
我的经验:逻辑寻址是EtherCAT性能的关键。合理规划地址映射,把频繁交换的数据放在连续地址段,能减少数据报数量,降低总线负载。
2.3 通信模式:周期性 vs 非周期性
EtherCAT支持两种通信模式,说白了就是:
- 周期性通信:固定时间间隔,用于实时控制数据。
- 非周期性通信:按需发送,用于参数配置、诊断等。
2.3.1 周期性通信(过程数据)
这是运动控制的主战场。主站以固定周期(比如1ms、0.5ms)发送过程数据对象(PDO)。每个周期内,主站发送一个或多个帧,包含所有从站的输入输出数据。
特点:
- 时间确定性:周期抖动通常在微秒级。
- 数据量固定:每个周期交换的数据量基本不变。
- 使用逻辑寻址:效率最高。
我记得有一次调试一个高速贴片机,周期要求250μs。刚开始用默认配置,总线负载飙到80%以上,偶尔丢帧。后来优化了数据报数量,把多个小数据报合并成一个大数据报,负载降到40%以下,稳得很。
2.3.2 非周期性通信(邮箱数据)
用于配置参数、上传下载固件、读取诊断信息等。使用邮箱(Mailbox)协议,数据通过SDO(服务数据对象)传输。
特点:
- 非实时:响应时间不确定。
- 数据量大:可以传输大块数据。
- 使用设备寻址:通常用配置寻址。
邮箱通信有几种协议:
- CoE(CANopen over EtherCAT):最常用,用SDO读写对象字典。
- SoE(Servo drive profile over EtherCAT):伺服驱动专用。
- FoE(File over EtherCAT):文件传输,比如固件升级。
避坑指南:我曾经在调试时,一边跑周期性运动,一边用SDO读参数,结果导致周期抖动变大,电机出现异响。后来才明白,非周期性通信会占用总线带宽,影响周期性通信的实时性。建议在系统停止或低速运行时进行参数配置。
2.4 知识体系总览
下面这张图把本章的核心逻辑串起来了:
这张图把数据帧、数据报、寻址方式和通信模式串起来了。你想想看,一个帧里塞多个数据报,每个数据报用不同寻址方式,既能做周期性实时控制,又能做非周期性参数配置。这就是EtherCAT的灵活之处。
好了,这一章就到这里。记住:数据帧结构是基础,寻址方式决定怎么找到设备,通信模式决定什么时候传数据。搞明白这三块,EtherCAT的原理你就掌握了七成。