4. 邮箱数据协议:邮箱报头结构、数据类型(CoE, FoE, SoE, AoE)

好,咱们接着聊。上一节我们把邮箱通信的底层机制——握手和通道管理讲清楚了。这一节,我们聚焦在邮箱里真正传输的“货”——也就是邮箱数据协议。

你想想看,邮箱就像一个快递通道。通道建好了,但里面传的是什么?是配置文件?是固件升级包?还是伺服驱动的参数?不同的“货”,需要不同的打包规则。这就是我们今天要讲的邮箱报头和四种数据类型。

4.1 邮箱报头结构:快递单怎么填?

每一封邮箱报文,前面都带一个固定的报头。这个报头告诉从站:这封邮件是什么类型、多长、有没有分片。

我直接给你看结构,这是EtherCAT规范里定义的:

邮箱报头(Mailbox Header)—— 共6字节
+--------+--------+--------+--------+--------+--------+
| 长度 (2字节) | 通道 (2字节) | 优先级 (1字节) | 类型 (1字节) |
+--------+--------+--------+--------+--------+--------+

咱们拆开来看:

  • 长度(2字节):表示后面跟着的数据长度,单位是字节。注意,这个长度不包括报头本身。我在项目中遇到过有人把总长度算进去,结果从站直接报错——嗯,这个坑我踩过。
  • 通道(2字节):实际上低4位才有效,用来标识邮箱通道号。一般我们只用0,除非你搞多通道。
  • 优先级(1字节):0是正常,1是高优先级。说实话,我很少见到有人用高优先级,因为邮箱本身就不是实时通道。
  • 类型(1字节):这个最关键。它决定了后面的数据怎么解释。0x01是FoE,0x02是SoE,0x03是CoE,0x04是AoE。后面我们一个一个讲。

重点记住:类型字节是解析邮箱数据的“钥匙”。主站发什么类型,从站就必须按同类型解析。否则就是鸡同鸭讲。

4.2 CoE(CANopen over EtherCAT):最常用的协议

CoE,说白了就是把CANopen那一套对象字典搬到了EtherCAT上。这是工业自动化领域用得最多的邮箱协议,没有之一。

为什么?因为CANopen的SDO(服务数据对象)机制太成熟了。你想想看,伺服驱动器、IO模块、编码器,几乎每个设备都有对象字典。CoE就是让这些设备无缝迁移到EtherCAT上。

CoE的邮箱数据格式是这样的:

CoE邮箱数据格式:
+--------+--------+--------+--------+--------+--------+--------+
| 头部 (2字节) | 索引 (2字节) | 子索引 (1字节) | 数据 (N字节) |
+--------+--------+--------+--------+--------+--------+--------+

头部里最关键的是服务类型

  • 0x40:读请求(上传)
  • 0x80:读响应
  • 0x20:写请求(下载)
  • 0x60:写响应
  • 0xA0:信息请求

我个人习惯把CoE通信分成两种场景:

  1. 启动时参数配置:主站通过CoE把伺服驱动的增益、限位、通讯参数写进去。这时候用的是写请求(0x20)。
  2. 运行时诊断读取:比如读当前温度、读错误代码。这时候用读请求(0x40)。

我的经验:CoE的SDO通信是确认模式,主站发一个请求,从站必须回一个响应。如果你发现通信卡住了,八成是从站没响应,或者响应超时。我曾经调试一个驱动器,死活读不到对象字典,最后发现是子索引写错了——0x00写成了0x01,差一个字节,结果完全不一样。

4.3 FoE(File over EtherCAT):传文件用的

FoE,全称是File over EtherCAT。听名字就知道,它是用来传文件的。最常见的场景就是固件升级

你想想看,一个产线上有几十个伺服驱动器,每个都要升级固件。如果用串口一个一个刷,工程师得累死。FoE就是干这个的——主站把固件文件通过邮箱发给从站,从站自己写进Flash。

FoE的报文结构相对简单:

FoE邮箱数据格式:
+--------+--------+--------+--------+--------+--------+
| 头部 (1字节) | 错误码 (4字节) | 文件名 (变长) | 数据 |
+--------+--------+--------+--------+--------+--------+

头部里的命令类型:

  • 0x01:读请求(从站上传文件到主站)
  • 0x02:写请求(主站下载文件到从站)
  • 0x03:数据包
  • 0x04:确认包
  • 0x05:错误包

注意:FoE传输的文件名必须是ASCII字符串,而且长度有限。我曾经见过有人用中文文件名,结果从站根本不认——嗯,这个坑我也踩过。老老实实用英文+数字吧。

4.4 SoE(Servo over EtherCAT):伺服专用协议

SoE,全称是Servo over EtherCAT。它是从SERCOS III继承过来的,专门用于伺服驱动器的参数访问。

SoE和CoE有什么区别?我打个比方:CoE是通用协议,什么设备都能用;SoE是专用协议,只给伺服驱动器用。SoE里定义了IDN(识别号)的概念,每个参数都有一个唯一的IDN编号。

SoE的邮箱数据格式:

SoE邮箱数据格式:
+--------+--------+--------+--------+--------+--------+
| 头部 (2字节) | IDN (2字节) | 数据 (N字节) |
+--------+--------+--------+--------+--------+--------+

头部里的服务类型:

  • 0x01:读请求
  • 0x02:读响应
  • 0x03:写请求
  • 0x04:写响应

说实话,现在很多伺服驱动器同时支持CoE和SoE。我个人更倾向于用CoE,因为通用性更好。但如果你用的是老派的SERCOS用户,他们可能更习惯SoE。

4.5 AoE(ADS over EtherCAT):自动化设备专用

AoE,全称是ADS over EtherCAT。它是Beckhoff的TwinCAT系统里用的协议,用于访问自动化设备内部的ADS变量。

AoE的报文结构:

AoE邮箱数据格式:
+--------+--------+--------+--------+--------+--------+--------+
| 头部 (2字节) | 目标NetId (6字节) | 源NetId (6字节) | 命令 (2字节) | 数据 |
+--------+--------+--------+--------+--------+--------+--------+

AoE最特别的地方是它带了NetId(网络标识符)。这意味着你可以跨设备通信——比如主站通过AoE去读另一个从站的数据。这在TwinCAT的分布式控制里非常常见。

一句话总结四种协议

  • CoE:通用参数访问,最常用
  • FoE:文件传输,固件升级专用
  • SoE:伺服专用,老派SERCOS用户
  • AoE:TwinCAT专用,跨设备通信

4.6 四种协议的对比

我整理了一个表格,方便你对比:

协议 全称 主要用途 典型场景 报文头部长度
CoE CANopen over EtherCAT 对象字典访问 参数配置、诊断 2字节
FoE File over EtherCAT 文件传输 固件升级 1字节+文件名
SoE Servo over EtherCAT 伺服参数访问 驱动器调试 2字节
AoE ADS over EtherCAT 跨设备ADS通信 TwinCAT分布式控制 2字节+NetId

4.7 知识体系图

下面我用一张SVG图来展示本章的知识结构,帮你理清思路:

邮箱数据协议知识体系 邮箱报头(6字节) 长度(2字节) 通道(2字节) 优先级(1字节) 类型(1字节) CoE (0x03) FoE (0x01) SoE (0x02) AoE (0x04) 对象字典访问 文件传输/升级 伺服参数访问 跨设备ADS通信 类型字节决定协议,协议决定数据解析方式 CoE最常用 | FoE升级专用 | SoE伺服专用 | AoE TwinCAT专用

这张图把邮箱报头的四个字段和四种协议的关系画清楚了。你从类型字节出发,就能找到对应的协议,然后就知道怎么解析后面的数据了。

避坑指南:我曾经在一个项目里,主站发了CoE报文,但从站配置成了SoE模式。结果从站一直不回响应,我查了整整一天才找到原因——类型字节对不上。所以,调试时第一件事就是确认主站和从站的协议类型是否一致。

好了,这一节的内容就到这里。邮箱报头是基础,四种协议是工具。你只要记住:类型字节是“钥匙”,协议是“锁”,对上号了,数据就能流通。


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