第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从站有一个标准的状态机,包括:
- Init:初始化状态。主站和从站建立通信,配置参数。
- Pre-Operational:预运行状态。SDO通信可用,PDO通信不可用。
- Safe-Operational:安全运行状态。从站输出被禁止,但输入数据可以更新。
- 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实现纳秒级同步的关键。到时候我会结合一个实际的多轴同步案例,给大家演示怎么配置和调试。
好,今天就到这里。有什么问题,咱们课后交流。