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 负责地址转换——二者协作实现高效的过程数据交换