IgH EtherCAT主站邮箱、FMMU和同步管理器具体工作原理是什么?
摘要:目录一、邮箱协议 (Mailbox Protocols)概览邮箱通信原理邮箱协议概览技术详情邮箱帧格式CoE (CANopen over EtherCAT)SDO 上传下载流程CoE FSM 状态 (21 个状态)EoE (Etherne
目录一、邮箱协议 (Mailbox Protocols)概览邮箱通信原理邮箱协议概览技术详情邮箱帧格式CoE (CANopen over EtherCAT)SDO 上传/下载流程CoE FSM 状态 (21 个状态)EoE (Ethernet over EtherCAT)EoE 帧分片与重组FoE (File Access over EtherCAT)FoE 固件升级流程SoE (Sercos over EtherCAT)VoE (Vendor-specific over EtherCAT)深入源码源码:master/mailbox.h — 邮箱类型枚举源码:master/mailbox.c — 邮箱核心函数各 FSM 状态计数总览二、FMMU 原理与处理流程概览FMMU 是什么?FMMU 地址映射示意图技术详情FMMU 配置字段 (16 Bytes)FMMU 配置处理流程多个 FMMU 条目的协同工作深入源码源码:master/fmmu_config.h源码:master/fmmu_config.c — 关键函数ec_fmmu_config_page() 配置页生成逻辑源码:master/domain.c — FMMU 相关函数三、同步管理器 (Sync Manager)概览Sync Manager 是什么?Sync Manager 缓冲区工作原理技术详情SM 通道典型分配SM 配置寄存器 (每个通道 8 Bytes)Control 寄存器 (+4) 位域邮箱模式 vs 过程数据模式对比SM 配置流程深入源码源码:master/sync.h — ec_sync 结构体源码:master/sync_config.h — ec_sync_config 结构体源码:master/sync.c — 关键函数ec_sync_page() 配置页生成
一、邮箱协议 (Mailbox Protocols)
1.6 — CoE / EoE / FoE / SoE / VoE 邮箱通信原理与流程
概览
邮箱通信原理
EtherCAT 邮箱 (Mailbox) 是主站和从站之间非周期性通信的机制。邮箱使用 Sync Manager 管理的双缓冲区,通过握手机制确保数据完整性。邮箱通信在 Pre-Op 及以上状态可用。
sequenceDiagram
participant M as 主站 Master
participant SM as Sync Manager
participant S as 从站应用
Note over M,S: 主站 → 从站 (写邮箱 SM)
M->>SM: 写入数据到缓冲区 A
SM->>S: 通知: 新数据可用
S->>SM: 读取缓冲区 A 数据
SM->>M: 确认: 缓冲区已空
Note over M,S: 从站 → 主站 (读邮箱 SM)
S->>SM: 写入响应到缓冲区 B
SM->>M: 通知: 响应数据可用
M->>SM: 读取缓冲区 B 数据
SM->>S: 确认: 缓冲区已空
邮箱协议概览
协议
类型码
用途
典型场景
CoE (CANopen over EtherCAT)
0x03
SDO 参数读写、PDO 映射配置、Emergency 消息
配置从站参数、读取对象字典
EoE (Ethernet over EtherCAT)
0x02
通过 EtherCAT 隧道传输标准以太网帧
从站网络管理、远程访问
FoE (File Access over EtherCAT)
0x04
文件上传/下载 (类 TFTP 协议)
固件升级、配置文件下载
SoE (Sercos over EtherCAT)
0x05
伺服驱动器 IDN 参数访问
伺服参数配置
VoE (Vendor-specific over EtherCAT)
0x0F
厂商自定义协议
特定厂商功能
技术详情
邮箱帧格式
偏移
字段
大小
说明
0
Length
2 Bytes
数据长度 (不含邮箱头)
2
Address
2 Bytes
站地址
4
Channel + Priority
1 Byte
通道号 (高6位) + 优先级 (低2位)
5
Type
1 Byte
协议类型 (CoE=0x03, EoE=0x02 等)
6+
Data
可变
协议特定数据
CoE (CANopen over EtherCAT)
CoE 是 EtherCAT 中最重要的邮箱协议,用于从站参数配置。它将 CANopen 的对象字典 (OD) 概念映射到 EtherCAT 邮箱通信中。
SDO 上传/下载流程
sequenceDiagram
participant App as 应用程序
participant Master as IgH Master
participant FSM as CoE FSM
participant Slave as 从站
Note over App,Slave: SDO Download (写参数)
App->>Master: ecrt_sdo_request_write()
Master->>FSM: 启动 CoE FSM
FSM->>Slave: 邮箱发送: SDO Download Request
Slave-->>FSM: 邮箱响应: SDO Download Response
FSM-->>Master: 完成/错误
Note over App,Slave: SDO Upload (读参数)
App->>Master: ecrt_sdo_request_read()
Master->>FSM: 启动 CoE FSM
FSM->>Slave: 邮箱发送: SDO Upload Request
Slave-->>FSM: 邮箱响应: SDO Upload Response
FSM-->>Master: 数据/错误
Note over FSM,Slave: 分段传输 (>4 Bytes 数据)
loop 分段传输循环
FSM->>Slave: SDO Upload Segment Request
Slave-->>FSM: SDO Upload Segment Response
end
CoE FSM 状态 (21 个状态)
stateDiagram-v2
[*] --> coe_down_start: SDO Download
state "Download 分组" as dl {
coe_down_start --> coe_down_request: 构造请求
coe_down_request --> coe_down_check: 发送请求
coe_down_check --> coe_down_response: 检查邮箱
coe_down_response --> coe_down_response_data: 处理响应
coe_down_response_data --> coe_down_seg_check: 需要分段?
coe_down_seg_check --> coe_down_seg_response: 检查分段响应
coe_down_seg_response --> coe_down_seg_response_data: 处理分段
coe_down_seg_response_data --> coe_down_seg_check: 下一分段
}
[*] --> coe_up_start: SDO Upload
state "Upload 分组" as ul {
coe_up_start --> coe_up_request: 构造请求
coe_up_request --> coe_up_check: 发送请求
coe_up_check --> coe_up_response: 检查邮箱
coe_up_response --> coe_up_response_data: 处理响应
coe_up_response_data --> coe_up_seg_request: 需要分段?
coe_up_seg_request --> coe_up_seg_check: 请求分段
coe_up_seg_check --> coe_up_seg_response: 检查分段
coe_up_seg_response --> coe_up_seg_response_data: 处理分段
coe_up_seg_response_data --> coe_up_seg_request: 下一分段
}
coe_down_response_data --> end: 传输完成
coe_up_response_data --> end: 传输完成
coe_down_seg_response_data --> end: 分段完成
coe_up_seg_response_data --> end: 分段完成
EoE (Ethernet over EtherCAT)
EoE 通过 EtherCAT 邮箱隧道传输标准以太网帧。发送方将标准以太网帧分片为适合邮箱大小的片段,接收方重组后交给 TCP/IP 协议栈处理。IgH 主站为每个 EoE 从站创建虚拟网络接口 (如 eoe0s0),可桥接到物理网络。
EoE 帧分片与重组
flowchart LR
A["原始以太网帧<br/>(~1500 Bytes)"] --> B["分片 1"]
A --> C["分片 2"]
A --> D["分片 3"]
B -->|"EoE 邮箱"| E["从站重组"]
C -->|"EoE 邮箱"| E
D -->|"EoE 邮箱"| E
E --> F["完整以太网帧<br/>→ TCP/IP 栈"]
FoE (File Access over EtherCAT)
FoE 类似简化的 TFTP 协议,用于从站固件升级和文件传输。支持读 (RRQ) 和写 (WRQ) 两种操作。
FoE 固件升级流程
sequenceDiagram
participant Tool as ethercat tool
participant Master as IgH Master
participant FSM as FoE FSM
participant Slave as 从站
Tool->>Master: foe_write (文件名, 数据)
Master->>FSM: 启动 FoE 写 FSM
FSM->>Slave: WRQ (Write Request + 文件名)
Slave-->>FSM: ACK (确认就绪)
loop 数据传输循环
FSM->>Slave: DATA (数据块 + 序号)
Slave-->>FSM: ACK (确认接收)
end
Slave-->>FSM: 最终 ACK
FSM-->>Master: 传输完成
Master-->>Tool: 返回结果
SoE (Sercos over EtherCAT)
SoE 将 SERCOS 伺服驱动协议的 IDN (Identification Number) 机制映射到 EtherCAT 邮箱。支持分片传输大数据。操作码:Read Request (0x01)、Read Response (0x02)、Write Request (0x03)、Write Response (0x04)。
VoE (Vendor-specific over EtherCAT)
VoE 提供厂商自定义协议扩展接口,邮箱类型码为 0x0F。IgH 通过 ecrt_slave_config_create_voe_handler() API 创建 VoE 通道,厂商可在此通道上自由定义数据格式和通信协议。
深入源码
源码:master/mailbox.h — 邮箱类型枚举
master/mailbox.h — 邮箱协议类型
typedef enum {
EC_MBOX_TYPE_AOE = 0x01, // ADS over EtherCAT
EC_MBOX_TYPE_EOE = 0x02, // Ethernet over EtherCAT
EC_MBOX_TYPE_COE = 0x03, // CANopen over EtherCAT
EC_MBOX_TYPE_FOE = 0x04, // File Access over EtherCAT
EC_MBOX_TYPE_SOE = 0x05, // Sercos over EtherCAT
EC_MBOX_TYPE_VOE = 0x0F // Vendor-specific over EtherCAT
} ec_mbox_type_t;
源码:master/mailbox.c — 邮箱核心函数
函数
说明
ec_slave_mbox_prepare_send()
准备邮箱发送 Datagram (写入邮箱缓冲区)
ec_slave_mbox_prepare_check()
准备邮箱状态检查 Datagram
ec_slave_mbox_check()
检查邮箱是否有新数据 (从站→主站)
ec_slave_mbox_prepare_fetch()
准备邮箱数据读取 Datagram
ec_slave_mbox_fetch()
读取邮箱数据,解析协议类型和内容
各 FSM 状态计数总览
FSM
源文件
状态数
主要功能
CoE FSM
fsm_coe.c
21
SDO 上传/下载,字典读取 (含分段传输)
EoE FSM
fsm_eoe.c
7
IP 参数设置 (Set IP Request/Response)
FoE FSM
fsm_foe.c
14
文件读/写 (WRQ/RRQ + DATA/ACK 循环)
SoE FSM
fsm_soe.c
12
IDN 参数读/写 (含分片传输)
FSM 共同模式
所有邮箱 FSM 都遵循相同的通用模式:
Start — 验证协议支持,初始化
Request — 通过邮箱发送请求
Check — 轮询检查邮箱响应
Response — 读取并验证响应
Data — 处理数据 (含分片循环)
End/Error — 完成/错误终止
二、FMMU 原理与处理流程
1.7 — Field Memory Management Unit 逻辑地址到物理地址的映射
概览
FMMU 是什么?
FMMU (Field Memory Management Unit,现场内存管理单元) 是 ESC 内部的硬件地址映射单元。它的作用是将主站发起的逻辑地址访问自动转换为从站 ESC 内部的物理地址访问,使得主站可以用连续的逻辑地址空间一次性读写多个从站的过程数据。
FMMU 核心价值
没有 FMMU 时,主站需要为每个从站的每块数据分别发送一个 Datagram。有了 FMMU,主站只需发送一个逻辑地址读写 Datagram (LRD/LWR/LRW),ESC 的 FMMU 硬件自动完成地址转换——这就是 EtherCAT 高带宽利用率的根本原因之一。
FMMU 地址映射示意图
图:FMMU 将主站连续逻辑地址映射到各从站 ESC 的物理地址
技术详情
FMMU 配置字段 (16 Bytes)
偏移
字段
大小
说明
+0
Logical Start Address
4 Bytes
逻辑起始地址 (在 Domain 数据区中的偏移)
+4
Logical Length
2 Bytes
映射的长度 (字节数)
+6
Logical Start Bit
1 Byte
逻辑起始位 (通常 0x00)
+7
Logical End Bit
1 Byte
逻辑结束位 (通常 0x07,表示完整字节)
+8
Physical Start Address
2 Bytes
物理起始地址 (ESC 内部 SM 缓冲区地址)
+10
Physical Start Bit
1 Byte
物理起始位 (通常 0x00)
+11
Direction
1 Byte
方向: 0x01=输入 (读), 0x02=输出 (写)
+12
Enable
2 Bytes
使能: 0x0001=使能, 0x0000=禁用
FMMU 配置处理流程
flowchart TD
A["应用程序创建 Domain"] --> B["ecrt_domain_reg_pdo_entry()<br/>注册 PDO 条目"]
B --> C["ec_domain_add_fmmu_config()<br/>创建 FMMU 配置"]
C --> D["计算逻辑偏移<br/>(在 Domain 数据区中)"]
D --> E["ecrt_master_activate()<br/>激活主站"]
E --> F["ec_domain_finish()<br/>完成 Domain 配置"]
F --> G["设置逻辑基地址<br/>(domain->logical_base_address)"]
G --> H["创建 Datagram 对<br/>(LRD/LWR 或 LRW)"]
H --> I["fsm_slave_config<br/>写入 FMMU 到 ESC"]
I --> J["Slave Config FSM<br/>配置各从站 FMMU 寄存器"]
J --> K["从站 ESC FMMU 硬件<br/>自动完成地址转换"]
多个 FMMU 条目的协同工作
flowchart LR
subgraph Master["主站 Domain 数据区"]
D1["从站1输出<br/>0x0000-0x00FF"]
D2["从站1输入<br/>0x0100-0x01FF"]
D3["从站2输出<br/>0x0200-0x027F"]
D4["从站2输入<br/>0x0280-0x02FF"]
end
subgraph FMMU["FMMU 配置"]
F0["FMMU#0: 写使能"]
F1["FMMU#1: 读使能"]
F2["FMMU#2: 写使能"]
F3["FMMU#3: 读使能"]
end
subgraph Slaves["从站 ESC 物理内存"]
S1O["从站1 输出缓冲区"]
S1I["从站1 输入缓冲区"]
S2O["从站2 输出缓冲区"]
S2I["从站2 输入缓冲区"]
end
D1 --> F0 --> S1O
D2 --> F1 --> S1I
D3 --> F2 --> S2O
D4 --> F3 --> S2I
深入源码
源码:master/fmmu_config.h
master/fmmu_config.h — ec_fmmu_config_t 结构体
typedef struct {
struct list_head list; // Domain 的 FMMU 配置链表节点
const ec_slave_config_t *sc; // 关联的从站配置
const ec_domain_t *domain; // 所属 Domain
uint8_t sync_index; // 使用的 Sync Manager 索引
ec_direction_t dir; // 方向: 输入(读) / 输出(写)
uint32_t logical_domain_offset; // 逻辑偏移 (相对于 domain->logical_base_address)
unsigned int data_size; // 覆盖的 PDO 数据大小
} ec_fmmu_config_t;
源码:master/fmmu_config.c — 关键函数
函数
说明
ec_fmmu_config_init()
初始化 FMMU 配置,加入 Domain 链表
ec_fmmu_set_domain_offset_size()
设置逻辑偏移和数据大小
ec_fmmu_config_page()
生成 16 字节 FMMU 配置页,写入 ESC 寄存器
ec_fmmu_config_page() 配置页生成逻辑
fmmu_config.c — 关键配置逻辑
// 逻辑基地址 = domain 基址 + FMMU 偏移
EC_WRITE_U32(data + 0x00, domain->logical_base_address + fmmu->logical_domain_offset);
// 数据长度
EC_WRITE_U16(data + 0x04, fmmu->data_size);
// 逻辑起始位/结束位
EC_WRITE_U8(data + 0x06, 0x00); // Logical Start Bit
EC_WRITE_U8(data + 0x07, 0x07); // Logical End Bit
// 物理起始地址 (从 Sync Manager 获取)
EC_WRITE_U16(data + 0x08, sync->physical_start_address);
// 物理起始位
EC_WRITE_U8(data + 0x0A, 0x00);
// 方向: 0x01=输入(读), 0x02=输出(写)
EC_WRITE_U8(data + 0x0B, dir == EC_DIR_INPUT ? 0x01 : 0x02);
// 使能
EC_WRITE_U16(data + 0x0C, 0x0001);
源码:master/domain.c — FMMU 相关函数
函数
说明
ec_domain_init()
初始化 Domain,初始化 FMMU 配置链表
ec_domain_add_fmmu_config()
添加 FMMU 配置到 Domain,计算偏移和数据大小
ec_domain_finish()
完成 Domain 配置:设置逻辑基地址,创建 Datagram 对
FMMU 配置流程要点
ecrt_domain_reg_pdo_entry() 触发 FMMU 配置创建
每个 (从站, SM方向) 对应一个 FMMU 配置
ec_domain_finish() 时为所有 FMMU 分配逻辑基地址
逻辑地址按 FMMU 在链表中的顺序连续分配
Domain 为每组连续的同方向 FMMU 创建一个 Datagram (LRD/LWR/LRW)
三、同步管理器 (Sync Manager)
1.8 — Sync Manager 缓冲区管理、邮箱模式与过程数据模式
概览
Sync Manager 是什么?
Sync Manager (SM,同步管理器) 是 ESC 内部的硬件模块,负责管理主站和从站应用 (PDI) 之间的数据缓冲区访问控制。每个 ESC 通常提供 8~16 个 SM 通道,可配置为邮箱模式或过程数据模式。
Sync Manager 核心作用
SM 实现了生产者-消费者模型——控制数据缓冲区的写入和读取权限,确保主站和从站应用不会同时访问同一缓冲区,从而保证数据一致性。SM 还可以产生中断信号通知数据到达或处理完成。
Sync Manager 缓冲区工作原理
图:邮箱模式 (双缓冲) 与过程数据模式 (三缓冲) 的工作原理
技术详情
SM 通道典型分配
SM 通道
用途
模式
方向
说明
SM0
主站→从站邮箱
邮箱 (Buffered)
输出 (写)
CoE/SoE/FoE 请求发送
SM1
从站→主站邮箱
邮箱 (Buffered)
输入 (读)
CoE/SoE/FoE 响应接收
SM2
过程数据输出
过程数据
输出 (写)
PDO 输出数据 (主站→从站)
SM3
过程数据输入
过程数据
输入 (读)
PDO 输入数据 (从站→主站)
SM4~SM7
扩展通道
可配置
可配置
额外的邮箱或过程数据通道
SM 配置寄存器 (每个通道 8 Bytes)
偏移
字段
大小
说明
+0
Physical Start Address
2 Bytes
缓冲区在 ESC 内存中的物理起始地址
+2
Length
2 Bytes
缓冲区长度 (字节数)
+4
Control
1 Byte
控制寄存器 (操作模式、方向、中断使能)
+5
Status
1 Byte
状态寄存器 (缓冲区当前状态,只读)
+6
Activate
1 Byte
使能寄存器 (置位使能 SM 通道)
+7
PDI Control
1 Byte
PDI (从站微控制器) 侧控制
Control 寄存器 (+4) 位域
位
名称
说明
Bit 0-1
Operation Mode
00 = 邮箱缓冲模式, 11 = 过程数据模式
Bit 2
Direction
0 = 主站写/从站读 (输出), 1 = 从站写/主站读 (输入)
Bit 3
ECAT Interrupt Enable
1 = 使能 EtherCAT 侧中断
Bit 4
PDI Interrupt Enable
1 = 使能 PDI 侧中断
Bit 5-7
Reserved
保留
邮箱模式 vs 过程数据模式对比
特性
邮箱模式
过程数据模式
缓冲区数量
2 (双缓冲交替)
3 (三缓冲并发)
数据完整性
保证 (握手协议)
保证 (硬件管理)
并发访问
不支持 (交替访问)
支持 (读写可并行)
吞吐量
中等
最高
延迟
毫秒级
微秒级
适用场景
SDO 参数配置、FoE 传输
周期性 PDO 数据交换
可用状态
Pre-Op 及以上
Safe-Op 及以上
同步方式
SM Status 寄存器握手
SYNC0/SYNC1 信号
SM 配置流程
flowchart TD
A["读取 EEPROM/SII<br/>获取 SM 默认配置"] --> B["Slave Config FSM<br/>配置阶段"]
B --> C{"SM 类型?"}
C -->|邮箱 SM| D["配置 SM0/SM1<br/>邮箱模式 + 地址/长度"]
C -->|过程数据 SM| E["配置 SM2/SM3<br/>过程数据模式 + 地址/长度"]
D --> F["Init → PreOp<br/>邮箱 SM 首先激活"]
E --> G["PreOp → SafeOp<br/>过程数据 SM 配置并激活"]
G --> H["FMMU 关联到 SM<br/>逻辑地址映射"]
H --> I["开始数据交换"]
深入源码
源码:master/sync.h — ec_sync 结构体
master/sync.h — ec_sync_t
typedef struct {
ec_slave_t *slave; // 所属从站
uint16_t physical_start_address; // 物理起始地址
uint16_t default_length; // 默认数据长度
uint8_t control_register; // 控制寄存器值
uint8_t enable; // 使能位
ec_pdo_list_t pdos; // PDO 分配列表
} ec_sync_t;
源码:master/sync_config.h — ec_sync_config 结构体
master/sync_config.h — ec_sync_config_t
typedef struct {
ec_direction_t dir; // 方向: 输入 / 输出
ec_watchdog_mode_t watchdog_mode; // 看门狗模式
ec_pdo_list_t pdos; // 当前 PDO 分配
} ec_sync_config_t;
源码:master/sync.c — 关键函数
函数
说明
ec_sync_init()
初始化 SM,设置默认值
ec_sync_init_copy()
从另一个 SM 复制配置
ec_sync_page()
生成 SM 配置页 (8 字节写入 ESC)
ec_sync_add_pdo()
向 SM 添加 PDO 分配
ec_sync_default_direction()
从控制寄存器位 2-3 获取方向
ec_sync_page() 配置页生成
sync.c — SM 配置页生成逻辑
// 物理起始地址
EC_WRITE_U16(data + 0x00, sync->physical_start_address);
// 数据长度 (可覆盖默认值)
EC_WRITE_U16(data + 0x02, size ? size : sync->default_length);
// 控制寄存器 (方向 + 看门狗模式 + 模式)
EC_WRITE_U8(data + 0x04, control);
// 状态寄存器 (只读,通常写 0)
EC_WRITE_U8(data + 0x05, 0x00);
// 使能寄存器
EC_WRITE_U8(data + 0x06, enable);
SM 与 FMMU 的协作关系
SM 定义了从站内部的数据缓冲区位置和访问控制
FMMU 将主站的逻辑地址映射到 SM 管理的缓冲区物理地址
每个 FMMU 条目关联一个 SM 通道 (fmmu_config.sync_index)
SM 负责缓冲区管理,FMMU 负责地址转换——二者协作实现高效的过程数据交换
