帧结构与寻址
EtherType 0x88A4 · 一帧多 datagram · 四种寻址(位置/节点/逻辑/广播)
本篇是理解 EtherCAT 数据面的核心:datagram + WKC + FMMU + SyncManager
1. EtherCAT 帧格式
EtherCAT 报文嵌在标准以太网帧内(EtherType = 0x88A4),因此普通网卡、普通交换机
(主站侧)、Wireshark 都能直接处理。也可封装在 UDP/IP 中(UDP 端口 0x88A4 = 34980,
用于跨路由段,牺牲实时性,工程上少用)。
1.1 整帧字节布局
1 | 0 6 12 14 16 尾部 |
| 约束 | 值 |
|---|---|
| 帧总长 | 标准以太网限制:64 ~ 1518 字节 |
| 一帧可携带的 datagram 数据 | 最多约 1486 字节 |
| Type 字段 | 0x1 = EtherCAT 命令(datagram),其他值保留 |
| 过程数据超过一帧 | 主站自动拆成多帧,每帧独立 WKC 校验 |
1.2 Datagram(子报文)结构
一帧内可串联多个 datagram,每个 datagram 是一次独立的读/写事务,
有自己的命令、地址和 WKC。
1 | ┌─────┬─────┬───────────────┬───────────────┬─────┬────────────┬─────┐ |
| 字段 | 大小 | 含义 |
|---|---|---|
| Cmd | 1 B | 命令类型(APRD/FPWR/LRW/BRD…,见 §2) |
| Idx | 1 B | 主站自用索引,从站原样带回,用于匹配收发/检测丢帧 |
| Address | 4 B | 含义随寻址方式变:ADP(2B)+ADO(2B) 或 32 位逻辑地址 |
| Len + 标志 | 2 B | 数据长度(11 bit)、C 循环位、M 后续位 |
| IRQ | 2 B | 从站事件请求汇总(各从站按位或写入) |
| Data | 0~1486 B | 读命令:从站往里填;写命令:从站从中取 |
| WKC | 2 B | 工作计数器,被处理一次就递增(见 §3) |
2. 寻址方式详表
Address 字段 4 字节,物理寻址时拆为 ADP(Address Position,选中”哪个从站”)
和 ADO(Address Offset,从站 ESC 内的物理内存偏移)。
| 寻址方式 | 命令 | Address 含义 | 典型用途 |
|---|---|---|---|
| 位置寻址(自动增量) | APRD/APWR/APRW |
ADP=位置计数(每经过一个从站硬件 +1,值为 0 的那个从站执行)+ ADO | 上电初始扫描:此时从站还没有地址 |
| 节点寻址(固定地址) | FPRD/FPWR/FPRW |
ADP=configured station address(主站启动时写入寄存器 0x0010)+ ADO |
扫描后所有单从站访问:读状态、写配置、邮箱 |
| 逻辑寻址 | LRD/LWR/LRW |
32 位逻辑地址(4 GB 逻辑空间),FMMU 命中才处理 | 周期过程数据主用:一个 LRW 服务全网 PDO |
| 广播 | BRD/BWR |
ADP 被每个从站 +1(回程时=从站数),所有从站都执行,ADO 有效 | 全网读 AL Status、广播清零、DC 初始化 |
2.1 完整命令表
| 编号 | 命令 | 含义 |
|---|---|---|
| 0 | NOP | 空操作 |
| 1 / 2 / 3 | APRD / APWR / APRW | 位置寻址 读 / 写 / 读写 |
| 4 / 5 / 6 | FPRD / FPWR / FPRW | 节点寻址 读 / 写 / 读写 |
| 7 / 8 / 9 | BRD / BWR / BRW | 广播 读 / 写 / 读写 |
| 10 / 11 / 12 | LRD / LWR / LRW | 逻辑寻址 读 / 写 / 读写 |
| 13 | ARMW | 位置寻址读,后续所有从站写(多播写,DC 时间分发用) |
| 14 | FRMW | 节点寻址读,后续所有从站写(DC:读参考时钟、分发给全网) |
2.2 位置寻址的细节
初始扫描时从站没有任何配置地址,主站用位置寻址逐个”点名”:
- 帧穿过每个从站时,ESC 硬件把 ADP 加 1;
- 看到 ADP == 0 的从站执行本 datagram;
- 所以主站要访问第 k 个从站(k 从 1 计),发送 ADP =
1 - k(第 1 个用 0,第 2 个用 0xFFFF…)。
扫描完成后主站用 APWR 0x0010 给每个从站写入 configured station address,
之后一律改用 FPxx——因为位置寻址在从站掉线/热插拔时序号会漂移,不可靠。
另有 别名地址(alias,寄存器
0x0012,来自 EEPROM):由用户在从站上预设,
换线序也不变,工程上常用于”按站名找设备”。
3. WKC:工作计数器 = 可靠性心跳
datagram 尾部 2 字节 WKC 发出时置 0,每个从站成功处理一次就按规则递增;
主站收到返回帧后比对”期望 WKC”,不等就说明有从站没干活(掉线、状态不对、配置错)。
| 命令类型 | 从站成功操作 | WKC 增量 |
|---|---|---|
| 读(xRD) | 读成功 | +1 |
| 写(xWR) | 写成功 | +1 |
| 读写(xRW) | 读成功 +1,写成功 +2 | 都成功 +3 |
期望值举例:
| 场景 | 期望 WKC |
|---|---|
BRD 0x0130(广播读 AL Status,全网 N 个从站) |
N |
FPWR 写某一个从站 |
1 |
LRW 过程数据:M 个从站被 FMMU 命中读、K 个被命中写、J 个读+写 |
M×1 + K×2 + J×3 |
工程意义:
- WKC 是 EtherCAT 每周期自带的健康检查,无需额外心跳报文;
- SOEM/IgH 等主站在每个周期检查 WKC,小于期望即报警/降级;
- WKC 只说明”有问题”,不说明”谁有问题”——需再用 FPRD 逐站读状态定位。
4. FMMU:逻辑地址 → 物理内存映射
逻辑寻址的基础。主站把全网过程数据规划成一片连续的4 GB 逻辑地址空间(过程映像),
每个从站的 FMMU 负责认领其中一段:
1 | 主站逻辑过程映像(一个 LRW datagram 覆盖) |
| FMMU 特性 | 说明 |
|---|---|
| 粒度 | 位级:逻辑起始位/结束位、物理起始位都可配,1 个 bit 的 IO 也能紧凑排布 |
| 方向 | 每个 FMMU 单元配置为读(输入)或写(输出) |
| 数量 | 每 ESC 若干个(如 ET1100 有 8 个),配置寄存器区 0x0600 起,每单元 16 字节 |
| 配置者 | 主站在 PreOp→SafeOp 迁移前按 ENI/在线计算写入 |
| 效果 | 全网 PDO 交换压缩为一条 LRW:帧流过时各从站硬件各取所需、各填所属 |
FMMU 配置单元内容(每 16 字节):逻辑起始地址(4B)、长度(2B)、逻辑起始位(1B)、
逻辑结束位(1B)、物理起始地址(2B)、物理起始位(1B)、类型读/写(1B)、激活(1B)、保留(3B)。
5. SyncManager:防撕裂的内存访问协调
ESC 内存同时被两侧访问:总线侧(帧流过)和 PDI 侧(从站本地 MCU)。
SyncManager(SM)保证双方永远读到/写到一致的完整数据,两种模式:
| 缓冲模式(3-buffer) | 邮箱模式(1-buffer 握手) | |
|---|---|---|
| 用途 | 周期过程数据(PDO) | 非周期邮箱(SDO/FoE/EoE…) |
| 缓冲 | 3 个物理缓冲轮转 | 1 个缓冲 |
| 写方 | 永远有空闲缓冲可写,从不阻塞 | 写满后锁定,对方读走前不可再写 |
| 读方 | 永远读到最新的完整一致数据 | 读走后缓冲才释放 |
| 数据丢失 | 允许覆盖旧数据(过程数据只关心最新值) | 不丢失(请求/应答语义) |
| 撕裂 | 硬件保证无撕裂(不会读到半新半旧) | 同 |
典型 SM 分配约定(多数从站遵循):
| SM | 方向 | 模式 | 内容 |
|---|---|---|---|
| SM0 | 主→从 | 邮箱 | 邮箱输出(主站发请求) |
| SM1 | 从→主 | 邮箱 | 邮箱输入(从站回应答) |
| SM2 | 主→从 | 3-buffer | 过程数据输出(RxPDO) |
| SM3 | 从→主 | 3-buffer | 过程数据输入(TxPDO) |
SM 配置寄存器区 0x0800 起,每单元 8 字节:物理起始地址(2B)、长度(2B)、
控制(1B:模式/方向/中断)、状态(1B)、激活(1B)、PDI 控制(1B)。
6. ESC 内存布局概览
| 地址范围 | 内容 |
|---|---|
0x0000 – 0x0FFF |
寄存器区(4 KB,所有 ESC 统一编址) |
0x1000 起 |
过程数据 RAM(用户内存,大小因芯片而异:ET1100 8 KB、LAN9252 4 KB) |
寄存器区常用地址(后续各篇会反复引用):
| 寄存器 | 内容 |
|---|---|
0x0000 |
ESC 类型/版本/支持特性 |
0x0010 |
Configured Station Address(节点寻址用) |
0x0012 |
Configured Station Alias(别名,来自 EEPROM) |
0x0100 / 0x0110 |
DL Control / DL Status(端口环路控制与链路状态) |
0x0120 / 0x0130 / 0x0134 |
AL Control / AL Status / AL Status Code(状态机,见 02 篇) |
0x0300 起 |
各端口 CRC 错误计数器(排查坏线/干扰的利器) |
0x0500 起 |
EEPROM 访问接口(SII) |
0x0600 起 |
FMMU 配置(每单元 16 B) |
0x0800 起 |
SyncManager 配置(每单元 8 B) |
0x0900 起 |
分布式时钟 DC 寄存器(见 03 篇) |
7. EEPROM / SII:从站的”出厂身份证”
每个从站挂一片 EEPROM(I²C),内容称为 SII(Slave Information Interface)。
上电时 ESC 硬件自动加载开头几个字(PDI 配置、别名地址等)到寄存器;
其余由主站通过 0x0500 寄存器接口读取。
| SII 内容(按字地址组织) | 用途 |
|---|---|
| 字 0x0000–0x0007 | PDI 控制/配置、Configured Station Alias、校验和(上电自动加载) |
| 字 0x0008 起 | Vendor ID、Product Code、Revision、Serial Number(主站识别设备、与 ENI 比对) |
| 邮箱配置字段 | 标准/Bootstrap 邮箱的偏移与大小、支持的邮箱协议位图(CoE/FoE/EoE…) |
| 字 0x0040 起:分类区(Category) | Strings、General、FMMU、SyncManager、TxPDO/RxPDO 描述等可变长条目 |
工程要点:
- 主站启动扫描 = 位置寻址逐站读 SII 身份四元组 → 与 ENI 期望比对 → 不符则拒绝进入 Op;
- SII 中的 SM/FMMU 描述让主站可以无 ESI 文件在线组网(SOEM 的默认做法);
- ESI XML 是 SII 的”源文件”,厂商工具把 ESI 烧写进 EEPROM。
下一篇
02-状态机与邮箱协议.md —— ESM 四态迁移、AL Status Code 排错表、邮箱握手与 CoE(SDO/PDO 映射配置全流程)。