2. EtherCAT数据链路层:帧结构、寻址与通道配置

大家好,我是你们的老朋友。今天咱们聊聊EtherCAT的数据链路层。说实话,这一层是EtherCAT的「灵魂」所在。很多工程师调不通从站,十有八九是没搞懂帧结构或者寻址方式。我当年刚入行时,就被FMMU配置坑过一把,折腾了两天才找到问题。

好,咱们直接进入正题。

2.1 EtherCAT帧结构详解

EtherCAT的帧,说白了就是套在标准以太网帧里的「特快专递」。它没有重新定义物理层,而是直接用了IEEE 802.3的以太网帧。这样做的好处很明显——你不需要换网卡,普通的千兆网口就能跑。

一个完整的EtherCAT帧长这样:

+----------------+----------------+------------------+------------------+
|  Ethernet头    |  EtherCAT头    |  EtherCAT数据    |  FCS (4字节)     |
|  (14字节)      |  (2字节)       |  (44-1498字节)   |                  |
+----------------+----------------+------------------+------------------+

这里有个关键点:EtherCAT的以太网类型是0x88A4。我在项目中见过有人把类型配成0x0800(IP协议),结果从站死活不响应。嗯,这个坑我替你们踩过了。

EtherCAT头结构

EtherCAT头只有2个字节,但信息量很大:

位域 长度 说明
长度 (Length) 11位 表示EtherCAT数据部分的长度,单位是字(2字节)
保留 (Reserved) 1位 必须为0
类型 (Type) 4位 1=EtherCAT命令(最常用),其他值保留

你可能会问:「为什么长度单位是字,而不是字节?」我个人理解,这是为了对齐处理器的字长,提高处理效率。EtherCAT在设计上处处透着「性能优先」的思路。

EtherCAT命令结构

当Type=1时,数据部分由若干个EtherCAT命令组成。每个命令的结构如下:

+--------+--------+--------+--------+--------+--------+--------+--------+
|  数据  |  工作  |  命令  |  索引  |  地址区  |  长度  |  IRQ  |  循环  |
|        |  计数器 |   (8)  |   (8)  |   (32)   |   (8)  |  (16) |   (8)  |
+--------+--------+--------+--------+--------+--------+--------+--------+

这里我重点说几个字段:

  • 命令 (Cmd):8位,决定了这次操作的类型。比如APRD(自动递增读)、FPRD(配置地址读)、LRD(逻辑读)等。后面讲寻址时会细说。
  • 索引 (Idx):8位,用于匹配请求和响应。多线程处理时特别有用。
  • 地址区 (Address):32位,具体含义取决于寻址方式。
  • 长度 (Len):8位,单位是字节。注意,这里和EtherCAT头的长度单位不一样,别搞混了。
  • 工作计数器 (WKC):16位,每个从站处理完数据后,会按规则增加这个值。主站通过检查WKC来判断操作是否成功。

重要:WKC是调试时的「照妖镜」。如果从站没反应,先看WKC有没有变化。没变?说明从站根本没处理你的命令。

2.2 寻址方式

EtherCAT的寻址方式,说白了就是主站怎么找到你想操作的从站。它有三种方式:设备寻址、逻辑寻址、广播寻址。咱们重点讲前两种,因为广播寻址用得少。

2.2.1 设备寻址

设备寻址又分两种:自动递增寻址配置站地址寻址

自动递增寻址 (Auto Increment Address)

这种方式在初始化阶段特别有用。主站发送一个帧,每个从站收到后,把地址字段的值加1,然后转发给下一个从站。第一个从站看到的地址是0,第二个是1,以此类推。

命令格式:APRD、APWR、APRW等。

举个例子:

主站发送:地址 = 0x0000
从站1收到:地址 = 0x0000 → 匹配,处理数据 → 地址+1 → 转发
从站2收到:地址 = 0x0001 → 匹配,处理数据 → 地址+1 → 转发
...

我在项目中遇到过一个问题:如果从站掉线了,自动递增寻址就会乱套。因为地址是累加的,少一个从站,后面的地址全对不上。所以,自动递增寻址只适合在启动阶段用,正常运行后要用配置站地址。

配置站地址寻址 (Configured Station Address)

每个从站有一个16位的配置地址,由主站在初始化时写入。这个地址是固定的,不依赖物理位置。

命令格式:FPRD、FPWR、FPRW等。

这种方式的好处是:即使从站物理位置变了,只要配置地址不变,通信就不受影响。我建议在正式项目中都用这种方式。

2.2.2 逻辑寻址

逻辑寻址是EtherCAT的「杀手锏」。它把整个网络映射成一个连续的4GB地址空间(0x00000000 ~ 0xFFFFFFFF)。主站直接读写这个地址空间,完全不用关心数据在哪个从站上。

命令格式:LRD、LWR、LRW等。

逻辑寻址依赖FMMU(现场总线内存管理单元)来实现地址映射。咱们下面细说。

2.3 FMMU与SM通道配置

2.3.1 FMMU(现场总线内存管理单元)

FMMU,说白了就是一个「地址翻译器」。它把逻辑地址翻译成从站内部的物理地址。

每个从站可以有多个FMMU通道(通常最多4个)。每个FMMU通道的配置如下:

参数 说明
逻辑起始地址 32位,逻辑地址空间的起始位置
长度 11位,单位是字节
逻辑起始位 6位,在逻辑起始地址内的位偏移
物理起始地址 8位,从站内部寄存器的起始地址
物理起始位 3位,在物理起始地址内的位偏移
类型 1位:0=输入,1=输出
使能 1位:0=禁用,1=启用

经验之谈:配置FMMU时,一定要检查「逻辑起始位」和「物理起始位」。我曾经因为这两个位没对齐,导致数据错位,查了整整一天。后来我养成了一个习惯:尽量用字节对齐的地址,避免位偏移

2.3.2 SM(同步管理器)通道

SM通道负责管理主站和从站之间的数据交换。它有点像「门卫」,控制着数据什么时候能进、什么时候能出。

每个从站通常有4个SM通道:

  • SM0:邮箱通信(Mailbox),用于非周期性数据,如参数配置、诊断信息。
  • SM1:邮箱通信(Mailbox),方向与SM0相反。
  • SM2:过程数据输出(Output),主站→从站。
  • SM3:过程数据输入(Input),从站→主站。

SM通道的配置参数包括:

参数 说明
物理起始地址 从站内部存储区的起始地址
长度 通道数据长度,单位是字节
控制寄存器 配置通道的工作模式(如缓冲模式、邮箱模式)
状态寄存器 指示通道的当前状态

注意:SM通道的物理起始地址和FMMU的物理起始地址是关联的。如果你改了SM的地址,FMMU的配置也要相应调整。否则,数据会写到错误的位置。

2.4 知识体系总览

为了让大家更直观地理解本章内容,我画了一张图:

EtherCAT数据链路层知识体系 EtherCAT帧结构 以太网头 EtherCAT头 命令数据 FCS 寻址方式 设备寻址 逻辑寻址 广播寻址 自动递增 配置站地址 FMMU & SM通道 FMMU配置 SM通道配置 核心:帧结构 → 寻址方式 → FMMU/SM配置 → 数据交换

这张图把本章的核心内容串起来了。从上到下,先有帧结构,然后通过寻址方式找到目标从站,最后通过FMMU和SM通道完成数据交换。每一步都环环相扣。

2.5 实战要点总结

最后,我给大家总结几个实战中的要点:

  1. 帧结构检查:用Wireshark抓包时,先看以太网类型是不是0x88A4,再看EtherCAT头的长度和类型对不对。
  2. 寻址方式选择:启动阶段用自动递增寻址,正常运行后用配置站地址寻址。逻辑寻址适合过程数据交换。
  3. FMMU配置:尽量用字节对齐,避免位偏移。配置完成后,用LRD/LWR命令验证一下。
  4. SM通道配置:SM0/SM1用于邮箱,SM2/SM3用于过程数据。地址和长度一定要和FMMU匹配。
  5. WKC检查:如果从站没反应,先看WKC有没有变化。没变?说明从站没处理你的命令。

我的习惯:每次配置完FMMU和SM,我都会写一个简单的测试程序,发一个LRW命令读写几个字节。如果数据能正确回显,说明配置没问题。这个小习惯帮我省了不少调试时间。

好了,这一章的内容就到这里。数据链路层是EtherCAT的基石,搞懂了它,后面的应用层协议就水到渠成了。下一章咱们聊聊EtherCAT状态机,看看从站是怎么从初始化跑到运行状态的。


公众号:蓝海资料掘金营,微信deep3321