2. EtherCAT通信原理:帧结构、寻址方式与数据链路层工作机制
各位同学,咱们今天聊点硬核的——EtherCAT到底是怎么在物理线上跑数据的。说实话,我刚接触EtherCAT时,看了好几遍协议栈源码才真正搞明白它的帧结构。你想想看,一个以太网帧里塞了几十个从站的数据,这活儿怎么干的?
2.1 EtherCAT帧结构——数据怎么塞进去的
EtherCAT没有 reinvent the wheel。它直接用了标准以太网帧,但把数据区重新定义了。标准以太网帧长这样:
| 字段 | 长度(字节) | 说明 |
|---|---|---|
| 目的MAC | 6 | 广播或多播地址 |
| 源MAC | 6 | 主站MAC地址 |
| EtherType | 2 | 0x88A4(EtherCAT专属) |
| EtherCAT头 | 2 | 长度 + 保留位 + 类型 |
| EtherCAT数据 | 44-1498 | 一个或多个数据报 |
| FCS | 4 | 帧校验 |
关键就在这个 EtherCAT数据 区域。它里面可以塞多个 数据报(Datagram),每个数据报独立寻址、独立操作。我做过一个项目,一个帧里塞了12个数据报,分别读写不同从站的参数,效率极高。
每个数据报的结构如下:
| 字段 | 长度(字节) | 作用 |
|---|---|---|
| 数据报头 | 10 | 包含寻址信息、命令、长度等 |
| 数据 | 0-1486 | 实际读写的数据 |
| 工作计数器(WKC) | 2 | 从站处理完数据后递增 |
核心要点:WKC(Working Counter)是EtherCAT的"回执"。每个从站处理完数据报后,会把WKC加1。主站通过检查WKC就能知道——到底有几个从站成功处理了这个数据报。我在调试时经常靠WKC定位问题,如果WKC没变,说明从站根本没收到数据。
2.2 寻址方式——主站怎么找到你
EtherCAT有三种寻址方式,我按使用频率排个序:
2.2.1 设备寻址(Device Addressing)
设备寻址又分两种:
- 顺序寻址(Auto Increment):从站按物理位置编号。主站发一个帧,经过一个从站,地址就加1。第一个从站地址是0,第二个是1,以此类推。
- 站点寻址(Configured Station Address):每个从站有一个固定的站点地址(0-65535),由主站在初始化时配置。这个地址在掉电后需要重新配置。
我个人习惯在调试阶段用顺序寻址,因为能直观看到数据流经了哪些从站。但正式运行时,必须用站点寻址——万一你换了个从站位置,顺序寻址就全乱了。
2.2.2 逻辑寻址(Logical Addressing)
这才是EtherCAT的杀手锏。逻辑寻址把整个网络映射成一个 4GB的虚拟地址空间(0x00000000 - 0xFFFFFFFF)。每个从站把自己的部分寄存器或内存映射到这个空间里。
主站发一个逻辑读/写命令,所有从站同时检查这个地址是否落在自己的映射范围内。如果是,就处理;不是,就转发。
实战技巧:逻辑寻址最大的好处是——一次数据报可以同时操作多个从站。比如你有一个8轴运动控制系统,每个轴需要4字节的位置指令。你可以把8个轴的数据连续映射到逻辑地址0x1000-0x101F,然后一个逻辑写命令就能同时更新所有轴。我在做多轴同步时,这招屡试不爽。
2.2.3 广播寻址(Broadcast)
所有从站都会处理这个数据报。常用于初始化阶段,比如同时复位所有从站。
| 寻址方式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 顺序寻址 | 调试、初始化 | 无需配置地址 | 位置变化后失效 |
| 站点寻址 | 正常运行 | 地址固定 | 需要配置 |
| 逻辑寻址 | 过程数据交换 | 高效、支持多从站 | 需要映射配置 |
| 广播寻址 | 全局操作 | 一帧控制所有从站 | 无法单独控制 |
2.3 数据链路层工作机制——帧怎么在线上跑
EtherCAT的数据链路层,说白了就是 "边传边处理"。标准以太网是"存储转发"——交换机收到完整帧,检查完再发出去。EtherCAT不一样,帧经过每个从站时,从站直接读取或写入数据,然后立刻转发给下一个从站。
这个过程叫 "飞读飞写"(On-the-fly Processing)。延迟只有几十纳秒。
注意:EtherCAT从站必须支持 直通转发(Cut-Through)。如果从站用的是"存储转发"模式,整个网络的实时性就毁了。我曾经遇到一个第三方从站,它的PHY芯片配置不对,导致每次转发都延迟了1微秒,整个环网抖动直接超标。查了两天才找到原因。
数据链路层的核心流程:
- 主站发送帧:主站构造一个或多个数据报,封装成标准以太网帧,从第一个从站的RX口发出去。
- 从站处理:从站检查帧头,判断数据报是否命中自己的地址。如果命中,就在帧经过时修改数据,并递增WKC。
- 从站转发:处理完后,从站把帧从TX口转发给下一个从站。
- 最后一个从站返回:帧走完所有从站后,最后一个从站把帧从RX口返回给主站。
- 主站校验:主站收到返回的帧,检查WKC是否等于预期值。如果不等,说明有从站没处理成功。
下面这张图展示了整个数据流:
2.4 数据链路层的几个关键机制
2.4.1 环网冗余
EtherCAT物理上可以是线型或环型。如果是环型,最后一个从站的TX口连回主站的RX口。这样即使某段线缆断了,主站还能从另一方向收到帧。我在产线上遇到过网线被叉车压断的情况,环网冗余让系统继续运行,没停机。
2.4.2 分布式时钟(DC)
虽然DC是应用层的事,但数据链路层提供了时间戳捕获机制。每个从站在帧经过时,可以捕获本地时间,然后通过DC算法同步所有从站的时钟。精度能做到亚微秒级。
2.4.3 帧的转发延迟
每个从站转发帧时,会有固定的延迟(通常几十纳秒)。主站可以通过测量往返时间,计算出每个从站的延迟,然后补偿到DC中。我建议你在调试时,先测一下每个从站的转发延迟,确保它们在合理范围内。
总结一下:EtherCAT的数据链路层,核心就是"飞读飞写" + "逻辑寻址"。这两个机制让EtherCAT在实时性和效率上碾压了其他工业以太网协议。你只要理解了帧怎么走、地址怎么找,后面学NMT状态机和从站开发就会轻松很多。