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帧头 → 数据区(子报文) → FCS。每个部分各司其职,缺一不可。
好了,这一章的内容就到这里。记住,数据链路层是EtherCAT的基石,搞懂了它,后面那些高级特性才能玩得转。下一章咱们聊聊EtherCAT的寻址方式,那才是真正体现EtherCAT灵活性的地方。