3. EtherCAT数据帧结构:数据帧格式、寻址方式、工作计数器(WKC)

好,咱们进入第三个核心话题。EtherCAT的数据帧结构,说白了就是数据在总线上怎么打包、怎么找到目标、怎么确认干完了活。这三点搞不清楚,后面分布式时钟同步根本玩不转。我当年第一次调EtherCAT从站时,就是被WKC给坑了一把,后面会细说。

3.1 数据帧格式:以太网帧里藏了什么?

EtherCAT数据帧,本质上还是标准以太网帧。但它把以太网数据载荷(Payload)重新定义了。你想想看,标准以太网帧头是14字节(目标MAC+源MAC+类型),EtherCAT的类型字段固定是 0x88A4。这个值,IEEE专门给EtherCAT分配的。

帧结构长这样:

+----------------+----------------+----------------+----------------+
|  目标MAC地址(6B) |  源MAC地址(6B)  |  0x88A4 (2B)   |  EtherCAT头(2B) |
+----------------+----------------+----------------+----------------+
|   EtherCAT数据段(44-1498B)       |   FCS(4B)       |
+----------------------------------+-----------------+

EtherCAT头只有2个字节:

  • 长度(11位):表示后面数据段的总字节数。注意,这个长度不包括EtherCAT头本身。
  • 保留位(1位):一般置0。
  • 类型(4位):我见过最多的是 0x01(EtherCAT命令)和 0x04(网络变量)。咱们做同步控制,基本只用 0x01

重要提醒:EtherCAT数据段最大1498字节,但实际项目中很少塞满。因为每个从站处理数据需要时间,帧太长会导致循环周期变大。我个人习惯,数据段控制在512字节以内,性能最稳。

3.2 寻址方式:数据怎么找到对应的从站?

EtherCAT的寻址,说白了就两种:设备寻址逻辑寻址。嗯,这里要注意,设备寻址又分两种子模式。

3.2.1 设备寻址

每个从站都有一个唯一的站地址。主站发命令时,直接指定这个地址。设备寻址有两种:

  • 顺序寻址:从站按物理连接顺序编号,从0开始。主站发一个广播帧,每个从站收到后把地址字段减1,直到减到0的就是目标。这种方式简单,但一旦拓扑变了,地址全乱。我早期做样机时用过,后来再也不敢了。
  • 配置寻址:主站通过EEPROM或配置工具,给每个从站分配一个固定地址。这个地址写在从站的寄存器里,掉电不丢。项目上线后,我强烈建议用这种方式,排查问题方便很多。

3.2.2 逻辑寻址

这才是EtherCAT的精髓。主站把整个网络映射成一个4GB的逻辑地址空间(0x00000000 ~ 0xFFFFFFFF)。每个从站把自己的输入输出数据,映射到这个空间的某个区域。主站发一个逻辑读/写命令,所有从站同时处理自己对应的那一段数据。

为什么会这样?因为逻辑寻址支持FMMU(现场总线内存管理单元)。每个从站内部有一个FMMU表,告诉芯片:逻辑地址A到B的数据,对应我本地的物理地址C到D。这样主站一次广播,所有从站并行处理,效率极高。

我的经验:配置FMMU时,一定要检查地址对齐。我曾经遇到一个从站,逻辑地址起始是0x1000,但本地地址起始是0x200,结果数据死活不对。后来发现是FMMU的偏移量没算对。记住,FMMU的起始地址必须是4字节对齐的。

3.3 工作计数器(WKC):怎么知道从站干完活了?

WKC,全称Working Counter。它是EtherCAT数据帧里一个16位的计数器,位于每个子报文(Datagram)的头部。主站发命令时,WKC初始化为0。每个从站处理完这个命令后,会根据操作类型把WKC加一个固定值。

具体规则如下:

操作类型 WKC增加值 说明
读操作 +1 从站成功读取数据
写操作 +1 从站成功写入数据
读写操作 +3 从站同时完成读写

主站发完帧后,检查返回帧的WKC值。如果WKC等于期望值,说明所有目标从站都正确响应了。如果小于期望值,说明有从站没响应或出错。

避坑指南:我曾经遇到一个情况,WKC总是少1。查了半天,发现是一个从站的EEPROM配置错了,导致它不识别某个命令。所以,调试时如果WKC不对,先检查从站的配置和状态机。另外,有些从站支持多个FMMU通道,每个通道都会增加WKC,别算漏了。

3.4 实战:一个典型的EtherCAT数据帧

咱们看一个实际例子。假设主站要写数据到从站1和从站2,每个从站写4字节。数据帧大概长这样:

Ethernet Header:
  MAC目标: FF:FF:FF:FF:FF:FF (广播)
  MAC源:   00:11:22:33:44:55
  类型:    0x88A4

EtherCAT Header:
  长度: 0x002C (44字节)
  类型: 0x01 (命令)

Datagram 1:
  命令: 0x04 (写)
  索引: 0x01
  寻址方式: 配置寻址
  从站地址: 0x0001
  起始地址: 0x1000
  数据长度: 4字节
  数据: 0x12345678
  WKC: 0 (初始)

Datagram 2:
  命令: 0x04 (写)
  索引: 0x02
  寻址方式: 配置寻址
  从站地址: 0x0002
  起始地址: 0x1000
  数据长度: 4字节
  数据: 0x9ABCDEF0
  WKC: 0 (初始)

主站发出去后,从站1处理第一个Datagram,把WKC加1;从站2处理第二个Datagram,把WKC加1。返回帧的WKC应该是2。如果主站收到的是1,那肯定有一个从站没干活。

核心要点:WKC是EtherCAT数据完整性的最后一道防线。我建议在应用层也做一次校验,比如每个从站返回一个状态字。双重保险,总没错。

3.5 小结

数据帧格式、寻址方式、WKC,这三者是EtherCAT通信的基石。你想想看,没有正确的帧结构,数据传不过去;没有灵活的寻址,多从站协同就是空谈;没有WKC,你根本不知道数据有没有被正确执行。下一章,咱们会把这些知识用到分布式时钟同步里,到时候你就知道为什么WKC在同步场景下特别重要了。