2、EtherCAT数据链路层:以太网帧结构、EtherCAT帧头、EtherCAT数据区、FCS校验

好,咱们今天聊聊EtherCAT的数据链路层。说实话,搞运动控制这么多年,我见过不少工程师一上来就扎进应用层,结果遇到通信问题就抓瞎。其实数据链路层才是EtherCAT的根基,你把它搞透了,后面那些同步、抖动、分布时钟的问题,理解起来就顺理成章了。

2.1 以太网帧结构:EtherCAT的“外衣”

EtherCAT本质上还是跑在标准以太网上的。你想想看,它要是自己搞一套物理层,那成本得多高?所以它聪明地借用了标准以太网的帧结构,只是在数据区里做了文章。

一个标准的以太网帧长这样:

| 前导码(7B) | 帧起始定界符(1B) | 目的MAC(6B) | 源MAC(6B) |  EtherType(2B)  |  数据(46-1500B)  |  FCS(4B)  |

嗯,这里要注意,EtherCAT只用了从目的MAC开始到FCS结束的部分。前导码和帧起始定界符那是物理层的事,咱们数据链路层不关心。

我个人习惯把以太网帧比作一个快递包裹:

  • 目的MAC:收件人地址
  • 源MAC:寄件人地址
  • EtherType:包裹里装的是什么东西(0x88A4表示这是EtherCAT报文)
  • 数据:包裹里的实际货物(EtherCAT数据区)
  • FCS:包裹的封条,检查有没有被拆过

这里有个关键点:EtherCAT的EtherType固定是0x88A4。我在项目中遇到过有人把EtherType配错了,结果交换机直接把这个帧当垃圾扔了。你想想看,从站收到帧一看EtherType不对,根本就不会处理,通信自然就断了。

重要提示:EtherCAT使用标准以太网帧,但它的数据区长度可以超过1500字节吗?答案是不行。EtherCAT通过“逻辑寻址”和“多子报文”技术,在一个以太网帧里塞入多个从站的数据,但总长度不能超过标准以太网帧的限制。

2.2 EtherCAT帧头:读懂“快递单”

以太网帧的数据区里,第一个东西就是EtherCAT帧头。它只有2个字节,但信息量很大。

EtherCAT帧头结构:
| 保留(4位) | 类型(4位) | 长度(8位) |
|   bit15-12  |  bit11-8  |  bit7-0   |

说白了,这2个字节告诉接收方两件事:

  • 类型(4位):这个帧是干什么用的。0x01表示EtherCAT命令帧,0x02表示EtherCAT数据帧,0x03表示EtherCAT状态帧。咱们运动控制里最常用的是0x01和0x02。
  • 长度(8位):后面跟着的EtherCAT数据区有多长,单位是字节。注意,这个长度不包括帧头本身。

我记得刚接触EtherCAT时,总搞不清这个长度字段怎么算。后来踩了个坑——有一次我手动构造报文,长度字段填错了,结果从站解析数据时直接跑飞。从那以后,我写代码时都会加一句断言,确保长度和实际数据长度一致。

小技巧:如果你用Wireshark抓EtherCAT报文,可以直接看到帧头的解析结果。我个人习惯先抓一包正常的报文,对照着看帧头字段,这样理解起来特别快。

2.3 EtherCAT数据区:真正的“货物”

帧头后面就是EtherCAT数据区了。这里才是咱们真正关心的东西——伺服驱动器的位置、速度、扭矩,IO模块的输入输出,等等。

EtherCAT数据区由若干个子报文组成。每个子报文的结构如下:

子报文结构:
| 命令(1B) | 索引(1B) | 地址(4B) | 长度(2B) | 数据(NB) | 工作计数器(2B) |

每个字段的作用:

字段 长度 说明
命令 1字节 操作类型,比如读、写、读写等。0x02是写,0x03是读,0x04是读写
索引 1字节 子报文的编号,用于匹配请求和响应
地址 4字节 目标从站的地址,可以是物理地址、逻辑地址或广播地址
长度 2字节 数据字段的长度,单位是字节
数据 N字节 实际要传输的数据,比如PDO映射的数据
工作计数器 2字节 从站处理完这个子报文后,会递增这个值。主站通过它判断从站是否正常响应

你可能会问:一个以太网帧里能塞多少个子报文?这取决于数据区的总长度。标准以太网帧的数据区最大1500字节,减去EtherCAT帧头2字节,剩下1498字节。每个子报文至少10字节(命令+索引+地址+长度+工作计数器),所以最多能塞149个左右。当然,实际项目中不会塞这么满,一般也就几个到十几个子报文。

避坑指南:我曾经在调试一个多轴系统时,发现某个从站总是响应超时。查了半天,原来是子报文的地址字段填错了。EtherCAT的地址模式有几种:物理地址(直接指定从站位置)、逻辑地址(通过FMMU映射)、广播地址(所有从站都处理)。如果你用物理地址,一定要确保从站的站号配置正确。否则,你发给1号站的数据,可能被2号站给吃了。

2.4 FCS校验:最后的“封条”

以太网帧的最后4个字节是FCS(Frame Check Sequence),也就是帧校验序列。它使用CRC32算法,对整个以太网帧(从目的MAC到数据区末尾)进行计算。

FCS的作用很简单:检测数据在传输过程中有没有被篡改。如果接收方计算出的CRC值和发送方的不一致,这个帧就会被丢弃。

嗯,这里要注意,FCS是由以太网控制器硬件自动计算和校验的。咱们做嵌入式软件时,一般不需要手动处理FCS。但如果你在调试时发现通信偶尔丢包,可以看看是不是FCS校验失败导致的。我遇到过一种情况:网线质量不好,导致信号衰减,FCS经常出错。换了一根屏蔽网线后,问题就解决了。

核心要点:EtherCAT的数据链路层,说白了就是“标准以太网帧 + 自定义数据区”。它利用了以太网的成熟硬件和协议,又通过巧妙的帧头设计和子报文结构,实现了高效、实时的数据交换。你只要记住:EtherType=0x88A4,帧头2字节,数据区由子报文组成,FCS由硬件搞定。这四条记住了,数据链路层你就掌握了八成。

2.5 知识体系总览

下面这张图,是我自己画的一个EtherCAT数据链路层结构图。你可以把它当作一个“地图”,以后遇到具体问题时,知道该往哪个方向找。

EtherCAT数据链路层结构总览 标准以太网帧 目的MAC(6B) | 源MAC(6B) | EtherType(2B) | 数据(46-1500B) | FCS(4B) EtherCAT帧头 (2B) 保留(4位) | 类型(4位) | 长度(8位) EtherCAT数据区 (N字节) 子报文1 命令|索引|地址|长度|数据|WKC 子报文2 命令|索引|地址|长度|数据|WKC 子报文N 命令|索引|地址|长度|数据|WKC FCS校验 (4B) CRC32,硬件自动计算/校验 EtherType = 0x88A4 | 子报文最大数量 ≈ 149 | WKC = 工作计数器 以太网帧 帧头 数据区 FCS

这张图把整个数据链路层的结构串起来了。从上到下依次是:以太网帧 → EtherCAT帧头 → 数据区(子报文) → FCS。每个部分各司其职,缺一不可。

好了,这一章的内容就到这里。记住,数据链路层是EtherCAT的基石,搞懂了它,后面那些高级特性才能玩得转。下一章咱们聊聊EtherCAT的寻址方式,那才是真正体现EtherCAT灵活性的地方。


专注资料整理