帧结构与寻址

帧结构与寻址

EtherType 0x88A4 · 一帧多 datagram · 四种寻址(位置/节点/逻辑/广播)
本篇是理解 EtherCAT 数据面的核心:datagram + WKC + FMMU + SyncManager


1. EtherCAT 帧格式

EtherCAT 报文嵌在标准以太网帧内(EtherType = 0x88A4),因此普通网卡、普通交换机
(主站侧)、Wireshark 都能直接处理。也可封装在 UDP/IP 中(UDP 端口 0x88A4 = 34980,
用于跨路由段,牺牲实时性,工程上少用)。

1.1 整帧字节布局

1
2
3
4
5
6
7
8
9
10
11
 0        6        12    14   16                                       尾部
┌────────┬────────┬─────┬────┬──────────┬──────────┬───┬──────────┬────┬─────┐
│ 目的MAC │ 源MAC │0x88A4│ECAT│datagram 1│datagram 2│...│datagram n│ pad│ FCS │
│ 6B │ 6B │ 2B │头2B│ │ │ │ │ │ 4B │
└────────┴────────┴─────┴────┴──────────┴──────────┴───┴──────────┴────┴─────┘

EtherCAT 头(2 字节): ▼
┌───────────────────┬──────┬────────┐
│ Length (bit 0-10) │ 保留 │ Type │
│ 后续 datagram 总长 │ 1bit │ 4bit=1 │
└───────────────────┴──────┴────────┘
约束
帧总长 标准以太网限制:64 ~ 1518 字节
一帧可携带的 datagram 数据 最多约 1486 字节
Type 字段 0x1 = EtherCAT 命令(datagram),其他值保留
过程数据超过一帧 主站自动拆成多帧,每帧独立 WKC 校验

1.2 Datagram(子报文)结构

一帧内可串联多个 datagram,每个 datagram 是一次独立的读/写事务
有自己的命令、地址和 WKC。

1
2
3
4
5
6
7
8
9
10
11
12
┌─────┬─────┬───────────────┬───────────────┬─────┬────────────┬─────┐
│ Cmd │ Idx │ Address │ Len + 标志位 │ IRQ │ Data │ WKC │
│ 1B │ 1B │ 4B │ 2B │ 2B │ 0~1486B │ 2B │
└─────┴─────┴───────────────┴───────────────┴─────┴────────────┴─────┘
头部固定 10 字节 尾部 2 字节

Len+标志位(2B):
┌──────────────────┬────────┬───┬───┐
│ Length (bit 0-10)│ 保留3b │ C │ M │
└──────────────────┴────────┴───┴───┘
C = Circulating(帧在环内循环标记)
M = More(=1 表示后面还有 datagram)
字段 大小 含义
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
2
3
4
5
6
7
8
9
10
      主站逻辑过程映像(一个 LRW datagram 覆盖)
0x00010000 ┌──────────────┐
│ 从站1 输出 2B │──FMMU(写)──▶ 从站1 物理 0x1100
├──────────────┤
│ 从站2 输出 8B │──FMMU(写)──▶ 从站2 物理 0x1100
├──────────────┤
│ 从站1 输入 4B │◀─FMMU(读)─── 从站1 物理 0x1180
├──────────────┤
│ 从站2 输入 8B │◀─FMMU(读)─── 从站2 物理 0x1180
└──────────────┘
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 映射配置全流程)。

文章互动

阅读 --

留言

0 条留言

正在加载留言…