【原创】IgH EtherCAT主站详解(三)--邮箱(Mailbox)、FMMU和同步管理器 (Sync Manager)
一、邮箱协议 (Mailbox Protocols)
1.6 — CoE / EoE / FoE / SoE / VoE 邮箱通信原理与流程
概览
邮箱通信原理
EtherCAT 邮箱 (Mailbox) 是主站和从站之间非周期性通信的机制。邮箱使用 Sync Manager 管理的双缓冲区,通过握手机制确保数据完整性。邮箱通信在 Pre-Op 及以上状态可用。
邮箱协议概览
| 协议 | 类型码 | 用途 | 典型场景 |
|---|---|---|---|
| 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 上传/下载流程
CoE FSM 状态 (21 个状态)
EoE (Ethernet over EtherCAT)
EoE 通过 EtherCAT 邮箱隧道传输标准以太网帧。发送方将标准以太网帧分片为适合邮箱大小的片段,接收方重组后交给 TCP/IP 协议栈处理。IgH 主站为每个 EoE 从站创建虚拟网络接口 (如 eoe0s0),可桥接到物理网络。
EoE 帧分片与重组
FoE (File Access over EtherCAT)
FoE 类似简化的 TFTP 协议,用于从站固件升级和文件传输。支持读 (RRQ) 和写 (WRQ) 两种操作。
FoE 固件升级流程
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 配置处理流程
多个 FMMU 条目的协同工作
深入源码
源码: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 配置流程
深入源码
源码: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 负责地址转换——二者协作实现高效的过程数据交换

浙公网安备 33010602011771号