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微秒,整个环网抖动直接超标。查了两天才找到原因。

数据链路层的核心流程:

  1. 主站发送帧:主站构造一个或多个数据报,封装成标准以太网帧,从第一个从站的RX口发出去。
  2. 从站处理:从站检查帧头,判断数据报是否命中自己的地址。如果命中,就在帧经过时修改数据,并递增WKC。
  3. 从站转发:处理完后,从站把帧从TX口转发给下一个从站。
  4. 最后一个从站返回:帧走完所有从站后,最后一个从站把帧从RX口返回给主站。
  5. 主站校验:主站收到返回的帧,检查WKC是否等于预期值。如果不等,说明有从站没处理成功。

下面这张图展示了整个数据流:

EtherCAT数据链路层:帧流转过程 主站 从站1 从站2 从站3 …N TX TX TX TX RX返回 RX返回 RX返回 RX返回 关键说明 1. 主站从TX口发出帧,依次经过从站1→2→3→…→N 2. 每个从站在帧经过时处理数据(飞读飞写),延迟仅几十纳秒 3. 最后一个从站把帧从RX口返回,原路返回主站 4. 主站检查WKC,确认所有从站是否成功处理 5. 整个过程在一个以太网帧内完成,效率极高

2.4 数据链路层的几个关键机制

2.4.1 环网冗余

EtherCAT物理上可以是线型或环型。如果是环型,最后一个从站的TX口连回主站的RX口。这样即使某段线缆断了,主站还能从另一方向收到帧。我在产线上遇到过网线被叉车压断的情况,环网冗余让系统继续运行,没停机。

2.4.2 分布式时钟(DC)

虽然DC是应用层的事,但数据链路层提供了时间戳捕获机制。每个从站在帧经过时,可以捕获本地时间,然后通过DC算法同步所有从站的时钟。精度能做到亚微秒级。

2.4.3 帧的转发延迟

每个从站转发帧时,会有固定的延迟(通常几十纳秒)。主站可以通过测量往返时间,计算出每个从站的延迟,然后补偿到DC中。我建议你在调试时,先测一下每个从站的转发延迟,确保它们在合理范围内。

总结一下:EtherCAT的数据链路层,核心就是"飞读飞写" + "逻辑寻址"。这两个机制让EtherCAT在实时性和效率上碾压了其他工业以太网协议。你只要理解了帧怎么走、地址怎么找,后面学NMT状态机和从站开发就会轻松很多。