2. EtherCAT报文结构逐字段解析
EtherCAT 的报文并不神秘,它本质上就是一层“标准以太网帧”里塞进了一段可被从站硬件实时解析的 EtherCAT 数据。理解报文结构,是后续抓包、看 WKC、判断寻址是否命中的基础。本节按字节顺序,从最外层以太网帧头一路拆到数据报尾部的 WKC,并结合命令类型与寻址方式说明它们如何共同决定“这一帧发给谁、读还是写、有没有成功”。
一、整体封装:以太网帧头 + EtherCAT 数据
EtherCAT 使用 EtherType = 0x88A4 标识。一个典型 EtherCAT 帧的以太网帧头占 14 字节:目的 MAC(6B)、源 MAC(6B)、类型(2B)。紧随其后的是 EtherCAT 数据区,可包含一个或多个 EtherCAT 数据报(Datagram)。每个数据报由 10 字节数据报头、若干字节数据区、2 字节 WKC 组成。因此,单数据报的最小结构为 10 + 0 + 2 = 12 字节,加上以太网帧头与可能的 FCS,就是抓包工具里看到的一整帧。
需要特别区分两个“头”:EtherCAT 头通常指 EtherCAT 数据区最前面的 2 字节(长度 + 类型/保留位),它描述整个 EtherCAT 数据区的长度和后续数据报的类型;而数据报头是每个数据报自己的 10 字节头部,描述该数据报的命令、索引、地址、长度、中断等。很多初学者把两者混为一谈,导致解析偏移量算错。
二、数据报头 10 字节逐字段
数据报头是解析的核心,10 字节依次为:
- 命令(Cmd,1B):高 4 位为命令码,低 4 位为寻址方式。例如 0x0C 表示 LRD(逻辑读),0x0D 表示 LWR(逻辑写),0x0A 表示 APRD(自动增量读),0x0B 表示 APWR(自动增量写),0x00 表示 NOP(空操作)。
- 索引(Idx,1B):数据报序号,主站用于匹配响应,通常从 0 递增。
- 地址区(Address,4B):含义随寻址方式变化。位置寻址时,前 2 字节为从站地址(Auto Increment 或 Configured Station Address),后 2 字节为偏移量;逻辑寻址时,4 字节整体为 32 位逻辑地址。
- 长度(Len,11 bit):数据区字节数,0~1486。
- 保留位(3 bit):通常为 0。
- 中断(IRQ,2B):用于 AL Event Request,指定从站触发中断的事件类型。
解析时最容易出错的是“命令字节低 4 位是寻址方式”这一点。例如抓到 0x0C,不能只记成“读”,而应拆成 Cmd=0x0(LRD 逻辑读)+ Addr=0xC(逻辑寻址)。同样,0x0A 是 Cmd=0x0(APRD)+ Addr=0xA(自动增量寻址)。把命令码与寻址方式分开看,才能正确解释地址区 4 字节的含义。
三、WKC:判断成功与否的关键
WKC(Working Counter)是 2 字节工作计数器。从站每成功处理一次数据报,就把 WKC 加 1。主站发送时 WKC 通常置 0,收到响应后读取 WKC 值,与预期值比较:
- WKC = 0:没有任何从站处理,通常意味着寻址错误、从站未上电或拓扑断开。
- WKC = 预期值:读写成功,寻址命中。
- WKC < 预期值:部分从站未响应,可能存在掉站、线缆或配置问题。
- WKC > 预期值:通常出现在广播或逻辑寻址中,多个从站同时响应,需结合拓扑判断是否正常。
例如,主站用 LRD 读取 3 个从站的输入过程数据,预期 WKC = 3。若实际收到 WKC = 2,说明有 1 个从站没有参与本次逻辑寻址,应检查该从站的 SM 配置、FMMU 映射或是否处于 OP 状态。
四、命令类型与寻址方式对照
命令码与寻址方式组合后,形成常用的读写命令。下表给出常见组合,便于抓包时快速识别:
| 命令字节 | 命令码 | 寻址方式 | 含义 | 典型用途 |
|---|---|---|---|---|
| 0x0A | APRD | 自动增量 | 自动增量读 | 扫描拓扑、读取站信息 |
| 0x0B | APWR | 自动增量 | 自动增量写 | 配置站地址、初始化 |
| 0x0C | LRD | 逻辑 | 逻辑读 | 读取输入过程数据 |
| 0x0D | LWR | 逻辑 | 逻辑写 | 写入输出过程数据 |
| 0x0E | LRW | 逻辑 | 逻辑读写 | 同时读写过程数据 |
| 0x02 | BRD | 广播 | 广播读 | 读取所有从站寄存器 |
| 0x03 | BWR | 广播 | 广播写 | 广播配置 |
| 0x00 | NOP | — | 空操作 | 占位、保持帧长 |
五、寻址方式的实际含义
位置寻址(Auto Increment / Configured Station Address)按“站地址 + 偏移”定位从站内部寄存器。自动增量寻址在初始化阶段使用,从站按拓扑顺序依次加 1,主站无需预先知道站地址即可逐个访问。配置站地址寻址则在初始化后使用,每个从站被分配唯一站地址,主站直接按地址访问。
逻辑寻址(Logical)使用 32 位逻辑地址,配合 FMMU(Fieldbus Memory Management Unit)把逻辑地址映射到从站的物理存储区。过程数据通常采用逻辑寻址,主站只需按逻辑地址读写,无需关心数据实际落在哪个从站。广播寻址(Broadcast)则面向所有从站,常用于读取统一寄存器或发送全局命令。
ecat 或 eth.type == 0x88a4,展开 EtherCAT 数据报,先看 Cmd 字节拆出的命令码与寻址方式,再看 Address 区按对应方式解释,最后核对 WKC 与预期值。若 WKC 异常,优先检查寻址方式是否与从站配置一致。
掌握以上字段后,再看到一帧 EtherCAT 报文,就可以按“以太网帧头 → EtherCAT 头 → 数据报头 → 数据区 → WKC”的顺序逐层剥离,结合命令码与寻址方式判断这一帧的意图,并用 WKC 验证结果。这是后续主从站联调与报文诊断的基本功。