EtherCAT帧结构详解:帧头、数据报、CRC校验、帧尾的组成与功能
核心原理:EtherCAT帧在以太网报文中的“内嵌”方式
EtherCAT协议并不重新定义物理层,而是直接利用标准IEEE 802.3以太网帧,在以太网帧的数据字段(Payload)中“内嵌”一个或多个EtherCAT数据报。从OSI模型看,EtherCAT位于以太网数据链路层之上,但它的帧结构设计使其能够实现“边传输边处理”的实时机制。理解EtherCAT帧结构,首先需要明确:整个EtherCAT报文(包含帧头、数据报、CRC)都位于标准以太网帧的Payload区域,而以太网帧头(目的MAC、源MAC、EtherType)和帧尾FCS仍然保留。
关键认知:EtherCAT帧的“帧头”与“帧尾”是相对于EtherCAT报文自身而言的,并非以太网帧的帧头/帧尾。一个完整的以太网帧中,EtherType字段固定为0x88A4,用于标识上层承载的是EtherCAT协议。
EtherCAT帧头:长度、类型与后续标志
EtherCAT帧头共2字节(16位),紧跟在以太网帧的EtherType字段之后。其结构如下:
- 长度(Length,11位):表示紧随其后的所有EtherCAT数据报的总字节数(不包含帧头本身)。该长度值决定了从站需要处理的数据量。
- 保留位(1位):协议规定必须为0,接收方忽略此位。
- 类型(Type,4位):固定为
0x1,表示这是一个EtherCAT数据报类型。若未来协议扩展,此字段可用于区分不同报文类型。
帧头中没有单独的“帧尾”字段——EtherCAT报文的结束由长度字段隐式确定。当从站解析完长度字段指定的字节数后,即认为EtherCAT报文结束,后续字节属于以太网帧的填充或FCS区域。
EtherCAT数据报:命令、寻址与工作计数器
每个EtherCAT数据报是真正承载读写指令和数据的最小单元。一个数据报由三部分组成:数据报头(10字节)、数据区(0~1486字节)、工作计数器WKC(2字节)。数据报头结构如下表:
| 字段 | 位宽 | 说明 |
|---|---|---|
| 命令 (Cmd) | 8 bit | 定义操作类型:NOP(0x00)、APRD(0x01)、APWR(0x02)、APRW(0x03)、FPRD(0x04)、FPWR(0x05)、FPRW(0x06)、BRD(0x07)、BWR(0x08)、LRD(0x09)、LWR(0x0A)等 |
| 索引 (Idx) | 8 bit | 由主站生成,用于匹配请求与响应,可检测数据报丢失或重复 |
| 地址 (Address) | 32 bit | 从站地址或逻辑地址,具体含义取决于命令类型(如APRD使用从站配置地址,LRD使用逻辑地址) |
| 长度 (Len) | 11 bit | 数据区有效字节数(0~1486),不含WKC |
| 保留 (R) | 3 bit | 必须为0 |
| 中断 (C) | 1 bit | 电路相关标志,通常为0 |
| 下一个 (M) | 1 bit | 后续数据报标志:1表示后面还有数据报,0表示这是最后一个 |
| IRQ | 16 bit | 中断请求寄存器,由从站置位通知主站异常事件 |
工作计数器(WKC)是EtherCAT实现分布式控制的关键机制。每个从站处理完数据报后,会根据命令类型和操作结果对WKC进行递增:读命令成功则WKC+1,写命令成功则WKC+1,读写命令成功则WKC+2。主站通过比较返回的WKC与预期值,即可判断哪些从站成功执行了操作,无需逐站查询。
CRC校验与帧尾:硬件级保障
EtherCAT协议本身不额外添加CRC字段,而是直接依赖以太网帧尾的FCS(Frame Check Sequence,4字节CRC-32)。该FCS由以太网MAC控制器硬件自动计算,覆盖从目的MAC地址到Payload末尾的所有字节。任何一位翻转都会导致CRC校验失败,从而被网卡丢弃。
重要区分:EtherCAT数据报中的“填充位”不是CRC,而是为了满足以太网最小帧长(64字节)要求而插入的0字节。从站通过帧头长度字段即可跳过填充位,不会将其误认为有效数据。
由于CRC校验在硬件层完成,从站收到帧时无需软件参与校验,这大大降低了处理延迟。若发生CRC错误,从站直接丢弃该帧且不转发,主站通过超时机制发现通信故障。
案例场景:一个典型的周期读写过程
假设主站需要读取从站1的输入状态(4字节),并写入从站2的输出数据(4字节)。主站构造一个以太网帧,内含两个数据报:
以太网帧头: 目的MAC=广播/多播, 源MAC=主站MAC, EtherType=0x88A4
EtherCAT帧头: 长度=44, 类型=0x1
数据报1: Cmd=0x04(FPRD), Idx=0x01, 地址=从站1配置地址, Len=4, M=1
数据区=空, WKC=0(待从站填充)
数据报2: Cmd=0x05(FPWR), Idx=0x02, 地址=从站2配置地址, Len=4, M=0
数据区=待写入的4字节输出, WKC=0(待从站填充)
以太网帧尾: FCS(由硬件自动计算)
帧经过从站1时,从站1识别数据报1的地址匹配,读取自身4字节输入写入数据区,并将WKC置为1;随后将整个帧转发给从站2。从站2处理数据报2,将数据区4字节写入输出寄存器,WKC置为1。帧返回主站后,主站检查两个数据报的WKC均为1,确认操作成功。
误区与复盘:常见理解偏差
误区1:认为EtherCAT帧头包含“帧尾”字段。实际上EtherCAT没有独立的帧尾标记,报文结束由长度字段决定。
误区2:混淆以太网帧的FCS与EtherCAT的CRC。EtherCAT不增加额外CRC,完全依赖以太网硬件CRC-32。
误区3:忽略“M”标志的作用。当一帧包含多个数据报时,M位用于指示数据报边界;若M位错误,从站将无法正确解析后续数据报。
误区4:将WKC理解为校验和。WKC是操作成功计数器,不是数据完整性校验值;数据完整性由FCS保证。
复盘建议:在调试EtherCAT通信时,使用Wireshark抓包并启用EtherCAT解析器,重点观察帧头长度字段与实际数据报总长度是否一致、每个数据报的WKC是否符合预期、M位是否正确串联。若出现CRC错误计数持续增长,应检查线缆质量、接地和电磁干扰,而非协议配置。