3. EtherCAT应用层协议:CoE、PDO、SDO、FoE与EoE

各位同学,今天我们聊点真正干活的东西——EtherCAT的应用层协议。说实话,很多初学者把精力全放在数据链路层和物理层,觉得把报文收发搞明白就完事了。但真正到了项目里,你会发现应用层才是跟设备功能最贴近的那一层。我最早做EtherCAT从站时,就吃过这个亏,以为底层通了就万事大吉,结果客户要配置参数、要文件下载、要远程维护,一下子把我问懵了。

EtherCAT的应用层协议有好几种,但最常用的就是CoE、FoE和EoE。今天咱们一个一个说清楚。

3.1 CoE:CANopen over EtherCAT

CoE,全称CANopen over EtherCAT。说白了,就是把CANopen那套东西搬到EtherCAT上来跑。为什么这么做?因为CANopen在工业现场已经积累了大量的设备描述文件和工具链,直接复用可以省很多事。

我个人习惯把CoE理解成三个核心要素:对象字典PDOSDO。这三者缺一不可。

3.1.1 对象字典(Object Dictionary)

对象字典是什么?你可以把它想象成一个设备的“寄存器地图”。每个参数、每个功能、每个状态,都在这个字典里有一个唯一的索引(Index)和子索引(SubIndex)。

举个例子,一个伺服驱动器的目标位置,可能就放在索引0x607A,子索引0x00。你要读它或者写它,就得通过这个地址。

我在项目中遇到过一个问题:客户说他的驱动器参数怎么都写不进去。我排查了半天,发现是对象字典的映射关系搞错了——他把索引写成了0x607A,但实际设备用的是0x607A:01。嗯,子索引差一位,整个数据就全乱了。

对象字典的典型结构:

  • 索引0x1000-0x1FFF:通信对象(如设备类型、同步管理器配置)
  • 索引0x2000-0x5FFF:制造商特定对象(各厂家自定义参数)
  • 索引0x6000-0x9FFF:标准化设备对象(如驱动器、IO模块的通用参数)

3.1.2 PDO:过程数据对象

PDO,Process Data Object。它的特点是快,非常快。为什么?因为PDO不需要应答,主站直接往从站里写数据,或者从站直接往总线上丢数据。你想想看,一个周期1ms的EtherCAT网络,如果每个数据都要握手应答,那效率得多低?

PDO分两种:

  • RxPDO:主站发给从站的数据(比如目标位置、控制字)
  • TxPDO:从站发给主站的数据(比如实际位置、状态字)

我建议你在设计从站时,把实时性要求高的数据都走PDO。比如伺服的位置环控制、IO模块的输入输出状态。那些偶尔才改一次的参数,比如PID系数、加速度限制,就别往PDO里塞了,浪费带宽。

小技巧:PDO的映射是可以动态配置的。你可以在启动时通过SDO把需要的对象字典条目映射到PDO里。这样同一个从站硬件,换个应用场景,PDO内容就能跟着变。

3.1.3 SDO:服务数据对象

SDO,Service Data Object。跟PDO相反,SDO是慢的,但它是可靠的。每个SDO请求都会有一个应答,主站发一个读请求,从站必须回一个读响应。这种一问一答的机制,保证了数据不会丢。

SDO适合用来做什么?配置参数、诊断信息、固件版本查询。这些数据不要求实时性,但要求绝对准确。

我曾经在一个项目中,用SDO去读取一个从站的温度传感器值。因为温度变化很慢,几秒钟读一次就够了,完全没必要用PDO。而且SDO还能分段传输大数据,比如一次读几百个字节的日志信息。

注意:SDO的通信模式是“客户端-服务器”模式。主站是客户端,从站是服务器。千万不要在从站里主动发起SDO请求,那是主站干的事。你如果非要从站主动发数据,请走PDO或者用紧急报文(Emergency Message)。

3.2 FoE:文件访问协议

FoE,File Access over EtherCAT。这个协议很简单,就是用来传文件的。最常见的场景是什么?固件升级。

你想想看,一个设备部署在现场,要升级固件,总不能把设备拆下来拿回办公室吧?有了FoE,主站可以直接通过EtherCAT网络把固件文件传给从站,从站收到后写入Flash,然后重启。

FoE的流程大致是这样的:

  1. 主站发送一个“读请求”或“写请求”报文
  2. 从站根据文件名找到对应的存储区域
  3. 数据以块(Block)的形式传输,每块带CRC校验
  4. 传输完成后,主站发送“结束”命令,从站确认

我个人习惯在从站代码里,把FoE的缓冲区单独划分出来,跟正常的应用数据区隔开。这样即使FoE传输过程中出了意外,也不会影响设备当前的运行状态。

FoE的典型应用:

  • 固件升级(.bin、.hex文件)
  • 配置文件下载(如XML设备描述文件)
  • 日志文件上传(用于远程诊断)

3.3 EoE:以太网穿透

EoE,Ethernet over EtherCAT。这个协议有点意思,它把标准的以太网帧封装在EtherCAT报文里传输。说白了,就是让EtherCAT网络能跑普通的TCP/IP协议。

为什么要这么做?因为很多工业设备除了EtherCAT,还需要HTTP、FTP、Modbus TCP这些协议。比如一个视觉相机,它可能用EtherCAT传实时图像数据,但同时还需要一个Web界面来配置参数。这时候EoE就派上用场了。

EoE的实现方式:主站会为每个EoE从站分配一个虚拟的MAC地址和IP地址。从站收到EtherCAT报文后,把里面的以太网帧解出来,交给本地的TCP/IP协议栈处理。

我记得有一次调试一个EoE设备,怎么都ping不通。查了半天,发现是虚拟网卡的MTU设置不对。EtherCAT的报文最大长度有限制,如果以太网帧太大,就会被截断。嗯,这种细节问题,不踩一次坑真的很难记住。

性能提醒:EoE的实时性不如PDO。因为以太网帧的封装和解封装需要时间,而且TCP/IP协议本身就有重传和确认机制。如果你需要实时控制,请用PDO;如果你需要远程维护和配置,用EoE更合适。

3.4 知识体系总览

为了让你更直观地理解这些协议之间的关系,我画了一张图。你可以看到,EtherCAT的数据链路层之上,CoE、FoE、EoE各自负责不同的应用场景。

EtherCAT应用层协议体系 EtherCAT 数据链路层 + 物理层 CoE CANopen over EtherCAT 对象字典 (Object Dictionary) PDO (过程数据) - 高速 SDO (服务数据) - 可靠 FoE File Access over EtherCAT 固件升级 配置文件下载 日志文件上传 EoE Ethernet over EtherCAT TCP/IP协议栈穿透 HTTP/FTP/Modbus TCP 远程维护与配置 核心原则 实时控制 → 用PDO(CoE) 参数配置 → 用SDO(CoE) 文件传输 → 用FoE | 网络穿透 → 用EoE

3.5 实际项目中的选择建议

好了,理论说完了,咱们聊聊实际怎么选。

如果你在做伺服驱动器、变频器这类运动控制设备,CoE是首选。因为CiA 402(驱动器行规)就是基于CoE定义的,对象字典里0x6000系列全是标准化的驱动参数,省得你自己从头定义。

如果你在做IO模块、传感器这类简单设备,CoE也够用。PDO传实时数据,SDO做配置,基本覆盖所有需求。

如果你需要远程升级固件,FoE必须支持。我建议你在从站设计初期就把FoE的存储区规划好,别等到量产了才发现Flash空间不够。

如果你需要设备支持Web配置或者Modbus TCP,那就加上EoE。但要注意,EoE会占用一定的带宽和CPU资源,别在实时性要求极高的环路上滥用。

我的个人习惯:在从站代码里,我会把CoE、FoE、EoE的处理函数分开写,每个协议一个独立的模块。这样调试的时候可以单独测试,出了问题也容易定位。另外,对象字典的映射表我建议用工具自动生成,手写太容易出错了。

最后说一句,协议只是工具,真正重要的是你清楚你的设备需要什么。别为了用而用,也别因为怕麻烦就省略。嗯,今天就到这里,下次我们聊聊如何用SSC工具快速生成从站代码。


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