第2章:EtherCAT协议栈:数据链路层、应用层协议详解

好,咱们接着往下聊。上一章我讲了EtherCAT的整体架构,说白了就是让大家先有个宏观印象。这一章咱们要扎进去,看看协议栈里最核心的两层——数据链路层和应用层到底在干什么。

我个人习惯,讲协议栈一定要从下往上讲。因为底层决定了性能的上限,上层决定了功能的边界。你想想看,如果数据链路层抖动大,应用层再怎么优化也是白搭。

2.1 数据链路层:EtherCAT的“高速公路”

数据链路层,我更喜欢叫它“帧的搬运工”。它不关心你传的是什么数据,只关心怎么把数据帧从一个站传到下一个站,而且要快、要准。

2.1.1 帧结构:从以太网帧到EtherCAT帧

EtherCAT的数据帧,本质上还是以太网帧。但它把标准以太网帧的数据字段,换成了自己的EtherCAT报文头和数据。

我给大家拆解一下这个帧结构:

+----------------+----------------+----------------+----------------+
| 以太网帧头(14B) | EtherCAT头(2B) | EtherCAT数据   | FCS(4B)        |
+----------------+----------------+----------------+----------------+

这里有个关键点:EtherCAT头里的“长度”字段,不是指整个帧的长度,而是指后面EtherCAT数据的长度。我在项目中遇到过有人把这个搞混,结果报文解析全乱套了。

2.1.2 数据链路层的核心机制:集总帧与“飞读飞写”

EtherCAT最牛的地方,就是它的集总帧机制。什么意思呢?

传统现场总线,比如PROFIBUS,是一个主站轮询所有从站。主站发一个请求,从站1回复,主站再发请求给从站2...这样效率很低。

EtherCAT不一样。主站只发一个帧,这个帧里包含了所有从站的数据。帧从主站出发,经过从站1、从站2...一直到最后一个从站,然后原路返回。每个从站在帧经过时,在几纳秒内就把自己的数据读走,或者把自己的数据写进去。

这就是所谓的“飞读飞写”(Processing on the Fly)。

关键点:每个从站只处理与自己相关的数据位,不解析整个帧。这种“流水线”式的处理方式,让EtherCAT的抖动可以控制在微秒级甚至纳秒级。

2.1.3 从站控制器(ESC)的角色

数据链路层的实现,离不开从站控制器(ESC)。ESC是一个硬件芯片,比如Beckhoff的ET1100、ET1200,或者一些FPGA实现的IP核。

ESC负责:

  • 帧检测:识别EtherCAT帧
  • 数据提取/插入:在帧经过时,从指定位置读取或写入数据
  • 看门狗:监测通信是否中断
  • 分布式时钟:这个后面会专门讲,是同步的关键

嗯,这里要注意:ESC的硬件性能直接决定了数据链路层的抖动。我曾经在一个项目里,因为选了一款便宜的ESC芯片,结果同步精度死活达不到要求。后来换了ET1100,问题立马解决。所以,选型时别光看价格。

2.2 应用层协议:让数据“说话”

数据链路层把数据搬过来了,但搬过来的是什么?怎么用?这就是应用层要解决的问题。

EtherCAT的应用层协议,主要有两种:CoE(CANopen over EtherCAT)SoE(Servo Drive over EtherCAT)。工业自动化里,CoE用得最多,咱们重点讲它。

2.2.1 CoE协议:对象字典与SDO/PDO

CoE的核心思想,就是把CANopen的那套东西搬到EtherCAT上。它定义了:

  • 对象字典(Object Dictionary):一个标准化的数据存储结构。每个参数都有一个唯一的索引(Index)和子索引(Subindex)。比如,驱动器的目标速度,可能对应索引0x6040。
  • SDO(Service Data Object):用于配置参数。它是“邮箱通信”,有应答,速度慢但可靠。我习惯在设备上电初始化时用SDO把参数配好。
  • PDO(Process Data Object):用于实时数据交换。它是“过程数据通信”,无应答,速度快。比如,每个周期把位置、速度、电流这些数据传上去。

我的经验:PDO的映射关系一定要提前规划好。我见过有人把所有数据都塞进PDO,结果一个周期传不完,导致数据链路层超时。记住,PDO只传实时性要求高的数据,配置类的数据走SDO。

2.2.2 状态机:从初始化到运行

EtherCAT从站有一个标准的状态机,包括:

  1. Init:初始化状态。主站和从站建立通信,配置参数。
  2. Pre-Operational:预运行状态。SDO通信可用,PDO通信不可用。
  3. Safe-Operational:安全运行状态。从站输出被禁止,但输入数据可以更新。
  4. Operational:运行状态。所有通信都正常进行。

状态切换的时序,我建议用示波器抓一下。有一次我在调试伺服驱动器时,发现从站一直卡在Safe-Operational状态,后来发现是看门狗超时设置得太短了。

2.2.3 应用层与数据链路层的交互

这两层是怎么配合的?我画个简化的流程图:

应用层(CoE)         数据链路层(ESC)
    |                       |
    |--- SDO请求 ---------->|  (邮箱通信)
    |<-- SDO响应 -----------|
    |                       |
    |--- PDO数据映射 ------->|  (过程数据)
    |<-- PDO数据更新 --------|
    |                       |
    |--- 状态机切换 -------->|  (AL控制寄存器)
    |<-- 状态确认 -----------|

说白了,应用层负责“做什么”,数据链路层负责“怎么做”。应用层把数据打包好,交给数据链路层去发送;数据链路层把收到的数据解包,交给应用层去处理。

2.3 避坑指南:数据链路层与应用层的常见问题

我做了这么多年EtherCAT,踩过不少坑。这里给大家总结几个:

我曾经... 在一个多轴同步项目中,发现抖动很大。排查了三天,最后发现是应用层的PDO映射配置错了,导致数据链路层在“飞读飞写”时,读到了错误的数据位。所以,PDO映射一定要和ESC的硬件配置一致

另外,还有几个常见问题:

  • 帧长度超限:EtherCAT帧最大长度是1518字节(标准以太网帧)。如果数据太多,需要分帧传输。我建议每个周期控制在1000字节以内,留点余量。
  • 状态机切换失败:从站状态切换有严格的时序要求。如果主站发切换命令太快,从站可能来不及响应。我习惯在每次切换后,等待从站确认。
  • 看门狗误触发:看门狗时间设置得太短,会导致通信中断。我一般设置为周期时间的3-5倍。

2.4 小结

这一章咱们把EtherCAT协议栈的两层核心讲清楚了。数据链路层是“高速公路”,负责快速、可靠地传输数据;应用层是“交通规则”,负责定义数据怎么用、什么时候用。

下一章,我会专门讲分布式时钟(DC)——这是EtherCAT实现纳秒级同步的关键。到时候我会结合一个实际的多轴同步案例,给大家演示怎么配置和调试。

好,今天就到这里。有什么问题,咱们课后交流。