3. EtherCAT通信协议:数据链路层、应用层协议、CoE与SoE概述

好,咱们进入第三讲。这一讲我打算把EtherCAT的协议栈掰开揉碎了讲清楚。很多初学者一上来就被「数据链路层」、「应用层」、「CoE」、「SoE」这些词搞懵了。说实话,我当年刚接触EtherCAT时也晕过一阵子。

但你别怕。咱们一层一层剥开看,其实没那么复杂。

3.1 数据链路层:EtherCAT的「高速公路」

数据链路层,说白了就是数据怎么在物理线路上跑。EtherCAT的数据链路层跟标准以太网不太一样。标准以太网是「发出去就不管了」,每个节点收到数据包,看看是不是给自己的,是就收下,不是就扔掉。

EtherCAT呢?它用的是「集总帧」技术。什么意思?

主站发一个数据帧出来,这个帧里包含了所有从站的数据。帧从第一个从站进去,每个从站把自己要发的数据填进去,把要收的数据取出来,然后传给下一个从站。最后一个从站处理完,再把帧原路返回给主站。

你想想看,这效率多高?一个帧就搞定了所有从站的通信。

关键点:EtherCAT数据链路层工作在第二层(MAC层),不依赖IP和TCP/UDP。这意味着它没有TCP/IP协议栈的开销,实时性极强。

我在项目中遇到过一件事。有个客户非要在EtherCAT网络里用交换机,结果通信死活不稳定。为什么?因为交换机有存储转发延迟,会破坏EtherCAT的「直通转发」机制。后来换成EtherCAT专用的集线器,问题立刻解决。

3.2 应用层协议:CoE与SoE

数据链路层把数据传过来了,但数据怎么理解?这就需要应用层协议了。

EtherCAT支持多种应用层协议,最常见的是CoE和SoE。嗯,这里要注意,选哪个协议取决于你的设备类型和行业习惯。

3.2.1 CoE(CANopen over EtherCAT)

CoE是目前伺服驱动领域最常用的协议。它把CANopen的通信机制搬到了EtherCAT上。如果你用过CANopen,那CoE上手会非常快。

CoE的核心概念有三个:

  • 对象字典(Object Dictionary):所有参数都放在一个字典里,每个参数有个索引号。比如0x6040是控制字,0x6041是状态字。
  • PDO(过程数据对象):用于实时交换数据,比如位置、速度、电流。PDO是周期性传输的,周期可以做到微秒级。
  • SDO(服务数据对象):用于非实时参数读写,比如修改驱动器参数。SDO是邮箱通信,有确认机制。
对象 索引 说明
控制字 0x6040 控制驱动器启停、使能等
状态字 0x6041 读取驱动器当前状态
目标位置 0x607A 位置模式下设定目标位置
实际位置 0x6064 读取编码器实际位置

我个人习惯把PDO配置成固定映射,这样通信效率最高。曾经有个项目,我为了省事用了默认PDO映射,结果周期时间长了20%。后来手动优化了映射,才把性能提上来。

小技巧:配置PDO时,尽量把同类型的对象放在同一个PDO里。比如所有位置相关的放一个PDO,所有状态相关的放另一个PDO。这样调试时方便定位问题。

3.2.2 SoE(SERCOS over EtherCAT)

SoE是从SERCOS协议移植过来的。SERCOS在伺服驱动领域有很长的历史,很多老牌驱动器厂商都用它。

SoE的核心是IDN(Identification Number)。每个参数都有一个IDN号,比如S-0-0036是位置指令,S-0-0040是速度指令。SoE的通信模式也分周期性和非周期性。

说实话,SoE在国内用得不如CoE多。我接触过的项目中,只有一家德国设备商坚持用SoE,因为他们的驱动器从SERCOS时代就用这套协议,不想改。

但SoE有个优点:它的状态机跟SERCOS完全一致,如果你有SERCOS的开发经验,切换到SoE几乎零成本。

3.3 CoE与SoE的对比

咱们做个对比,方便你选型时参考:

特性 CoE SoE
起源 CANopen SERCOS
参数组织 对象字典(索引+子索引) IDN编号
实时数据 PDO AT/MDT(同步数据)
非实时数据 SDO 服务通道
行业应用 通用伺服、IO、传感器 高端伺服、数控系统
学习曲线 中等(CANopen基础) 较陡(SERCOS基础)

我个人建议,如果你做通用伺服驱动开发,选CoE准没错。市面上90%的EtherCAT驱动器都支持CoE。如果你做数控系统或者高端运动控制,可以看看SoE,它的同步性能在某些场景下更优。

3.4 实际应用中的避坑指南

讲到这里,我分享几个实际项目中踩过的坑:

  • PDO映射不要乱改:我曾经在调试时改了PDO映射,结果驱动器直接报错。后来发现是映射长度不对。改PDO映射前,一定要先停止通信。
  • SDO超时设置:SDO通信有超时机制。如果网络中有多个从站同时读写SDO,超时时间要设大一点,否则容易误报。
  • 状态机切换:CoE的状态机从「预运行」到「安全运行」再到「运行」,每一步都要检查状态字。跳步会导致驱动器不响应。

警告:千万不要在生产线上用SDO修改驱动器参数!SDO是非实时通信,可能会被高优先级的PDO数据打断,导致参数写入不完整。正确的做法是在调试阶段用SDO配置好参数,然后保存到EEPROM中。

3.5 小结

这一讲咱们聊了EtherCAT的数据链路层和应用层协议。数据链路层负责高效传输,应用层协议负责数据解析。CoE和SoE各有千秋,选哪个取决于你的应用场景。

下一讲我会深入CoE的对象字典和PDO配置,到时候咱们手把手写一个PDO映射的示例。嗯,那才是真正动手的时候。

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