之前的分析已搭建 "CoE 协议→OD/SDO/PDO→IgH API" 的核心框架,但缺少两个关键维度:硬件级通讯模式如何支撑 SDO/PDO 的特性 、数据封包与寻址如何实现主从站精准交互。
本文从 "通讯模式(Buffered/Mailbox)、封包结构、寻址模式" 三个底层视角,解释 "SDO 为什么慢而可靠、PDO 为什么快而实时",以及 "主站如何精准定位从站数据"。
本文形成 "协议规则→硬件机制→传输载体→工程实现" 的完整闭环,彻底讲透 EtherCAT 数据交互的底层原理。
一、通讯模式:SDO/PDO 的 "硬件底层实现"
SDO/PDO 的核心差异(实时性 / 可靠性),本质源于从站 ESC 芯片(EtherCAT Slave Controller)的两种硬件通讯模式------ 这是之前分析未深入的 "物理基础":
1. Buffered Mode(缓存模式):PDO 的 "实时性硬件保障"
(1)核心机制(新增文档重点拆解)
-
三缓存设计:从站 ESC 芯片内置 3 个独立缓存区(Buffer0/1/2),实现 "主站写数据" 与 "从站读数据" 完全并行,无冲突:
-
主站按周期将 RxPDO 数据写入缓存区 0;
-
写入完成后,缓存区 0 与 1 交换(确保主站写新数据时,从站不读同一缓存);
-
从站按周期从缓存区 2 读取数据,读取完成后,缓存区 1 与 2 交换(确保从站下次读的是最新数据);
-
-
无锁同步:无需 CPU 干预,缓存交换由 ESC 硬件自动完成,延迟可低至微秒级。
(2)对应 PDO 的核心特性
-
实时性:三缓存并行读写,无等待开销,适配 1ms/100μs 级周期传输;
-
无应答:主站无需等待从站确认,写完即走,进一步降低延迟(对应之前 "PDO 无握手开销");
-
数据覆盖允许:若主站写数据速度快于从站读,旧数据会被覆盖(工业控制中允许,优先保证实时性)。
(3)与 IgH API 的关联
-
缓存模式由从站硬件自动启用,主站无需额外配置,仅需通过
ecrt_domain_process(domain)触发数据同步; -
Domain 内存与从站缓存区直接映射(DMA 搬运),
EC_WRITE_U16()本质是写入主站侧缓存,ESC 硬件自动同步到从站缓存区 0。
2. Mailbox Mode(邮箱模式):SDO 的 "可靠性硬件保障"
(1)核心机制
-
单缓存交替读写:从站 ESC 仅用 1 个缓存区,严格遵循 "主站写→从站读→主站再写" 的顺序,不允许并行操作:
-
主站写 SDO 数据到缓存区→缓存区标记为 "满",主站无法再写;
-
从站读取缓存区数据→读取完成后,缓存区标记为 "空",主站才能再次写入;
-
-
应答机制绑定:从站读完数据后,必须通过另一帧报文向主站返回 "读取确认",主站收到确认后才会发起下一次写入。
(2)对应 SDO 的核心特性
-
可靠性:交替读写 + 应答机制,确保数据不丢失、不重复(适合配置参数,不允许出错);
-
非实时:等待确认的过程导致延迟(ms 级),不适合高频传输;
-
支持长数据:通过分段写入(将长数据拆分为多个 "邮箱帧"),支持无限长度数据传输(如从站固件升级包、长字符串参数)。
(3)与 IgH API 的关联
-
邮箱模式由 CoE 协议自动绑定,主站通过
ecrt_sdo_request_write(req)发起写入后,必须等待ecrt_sdo_request_state(req) == EC_SDO_REQUEST_FINISHED(确认从站已读取),才能进行下一步; -
分段传输由 IgH API 自动处理,开发者无需关心缓存区满 / 空状态,仅需调用接口即可。
3. 通讯模式对比表
|------------|-------------------------|----------------------------------|
| 维度 | Buffered Mode(PDO) | Mailbox Mode(SDO) |
| 硬件缓存 | 3 个独立缓存区 | 1 个共享缓存区 |
| 读写逻辑 | 并行无冲突(主写从读同时进行) | 交替串行(主写完→从读完→主再写) |
| 应答机制 | 无应答,写完即走 | 必须应答,确认后再传输 |
| 延迟级别 | 微秒级(实时) | 毫秒级(非实时) |
| 数据类型 | 短数据(≤64 字节,PDO 条目) | 短 / 长数据(配置参数、分段数据) |
| 核心保障 | 实时性、高效率 | 可靠性、无丢失 |
| IgH API 关联 | ecrt_domain_process() | ecrt_sdo_request_write()+ 状态等待 |
二、封包结构:SDO/PDO 的 "数据传输载体"
EtherCAT 数据最终通过 "以太网帧" 传输,SDO/PDO 的帧格式差异,直接决定了它们的传输效率和适用场景 ------ 新增文档详细拆解了这一 "传输载体":
1. 通用 EtherCAT 帧结构
所有 EtherCAT 数据(SDO/PDO)都基于以下帧格式,核心标识是EtherType=0x88A4(EtherCAT 专属类型):
| 以太网头(14字节) | EtherCAT头(2字节) | EtherCAT数据段(44~1498字节) | FCS校验(4字节) |
|--------------------|--------------------|--------------------------------|------------------|
| 目标MAC+源MAC+类型 | 长度+保留+协议类型 | Datagram(数据报)列表 | 帧校验和 |
- 核心是
EtherCAT数据段,由 1~n 个Datagram(数据报)组成,每个 Datagram 对应一个 "主站→从站" 的操作请求(读 / 写数据)。
2. PDO 的封包结构(Buffered Mode 专属)
(1)核心特点(新增文档重点)
-
Datagram 类型 :使用
LRW(Logical Read/Write)命令(EtherCAT 核心实时命令); -
寻址方式:逻辑寻址(Logical Addressing)------ 主站将所有 PDO 数据映射到一个 4GB 逻辑地址空间,每个从站的 PDO 数据对应一个逻辑地址段;
-
帧结构极简:每个 Datagram 仅包含 "逻辑地址 + 数据长度 + PDO 数据",无额外应答字段,单个帧可包含多个从站的 PDO 数据(单帧多站)。
(2)示例帧结构(传输两个从站的 RxPDO)
EtherCAT数据段:
| Datagram1(从站1 RxPDO) | Datagram2(从站2 RxPDO) |
|--------------------------|--------------------------|
| Cmd=LRW(8bit) | Cmd=LRW(8bit) |
| 逻辑地址=0x10000000(32bit) | 逻辑地址=0x10000040(32bit) |
| 长度=8字节(11bit) | 长度=8字节(11bit) |
| 数据=控制字+目标速度(8字节) | 数据=控制字+目标速度(8字节) |
| WKC=1(16bit) | WKC=1(16bit) |
- WKC(Working Counter):每个 Datagram 处理完成后,从站将 WKC 自增 1,主站通过 WKC 判断数据是否被从站成功接收(对应之前 "Domain 工作计数器")。
3. SDO 的封包结构(Mailbox Mode 专属)
(1)核心特点(新增文档重点)
-
Datagram 类型 :使用
APWR(Auto Increment Write)/APRD(Auto Increment Read)命令; -
寻址方式:节点寻址(Node Addressing)------ 主站通过 "从站地址" 精准定位目标从站,每个 Datagram 仅对应一个从站;
-
帧结构含控制字段:Mailbox Datagram Header 包含 "优先级、协议类型、序列号" 等字段,确保数据可靠传输。
(2)示例帧结构(写 SDO 数据到从站)
EtherCAT数据段:
| Mailbox Datagram Header(10字节) | SDO数据(4字节) | WKC(2字节) |
|----------------------------------|------------------|--------------|
| 长度=4(16bit) | 0x60600003(操作模式=3) | WKC=1 |
| 从站地址=0x01(16bit) | | |
| 优先级=3(2bit) | | |
| 协议类型=CoE(0x3,4bit) | | |
| 序列号=0x01(3bit) | | |
-
协议类型字段 :指定为
0x3(CoE),从站 ESC 收到后会将数据转发给 CoE 协议栈解析(对应之前 "SDO 基于 CoE 协议"); -
序列号字段:用于检测重复帧(每个新 SDO 帧序列号 + 1),避免数据重复写入。
4. 封包结构核心结论
-
PDO 帧:极简设计 + 逻辑寻址 + 单帧多站,追求 "传输效率",适配实时性需求;
-
SDO 帧:控制字段完整 + 节点寻址 + 单帧单站,追求 "传输可靠性",适配配置需求;
-
两者共享 EtherCAT 帧的底层格式,仅通过 "Datagram 命令类型 + 寻址方式" 区分,确保总线兼容性。
三、寻址模式:主从站的 "数据定位方式"
主站如何精准找到从站的目标数据?答案是 EtherCAT 的四种寻址模式------ 不同寻址模式对应不同应用场景,其中逻辑寻址和节点寻址分别绑定 PDO 和 SDO:
1. 四种寻址模式
|-----------------|-----------------------------------|--------------------|--------|
| 寻址模式 | 核心逻辑 | 适用场景 | 对应数据类型 |
| 位置寻址(Position) | 按从站在总线的物理顺序寻址(Position=0 对应第一个从站) | 从站扫描(启动时定位所有从站) | 无(仅扫描) |
| 节点寻址(Node) | 按从站的固定站号寻址(与物理顺序无关) | SDO 配置(精准定位单个从站) | SDO |
| 广播寻址(Broadcast) | 所有从站同时接收并执行同一命令 | 全局初始化(如所有从站复位) | 无(仅命令) |
| 逻辑寻址(Logical) | 主站分配 4GB 逻辑地址空间,从站通过 FMMU 映射到物理地址 | PDO 传输(批量定位多个从站数据) | PDO |
2. 与 SDO/PDO 的绑定逻辑
(1)逻辑寻址→PDO:批量传输的效率保障
-
核心机制 :主站启动时,通过 FMMU(现场总线存储器管理单元)为每个从站的 PDO 数据分配逻辑地址段(如从站 1 RxPDO=0x10000000\++0x10000007,从站 2 RxPDO=0x10000040\++0x10000047);
-
从站侧:FMMU 将逻辑地址映射到自身物理内存(如 0x10000000→0x40000000 控制字寄存器);
-
传输效率:主站只需发送一个包含多个逻辑地址的 PDO 帧,所有从站通过 FMMU 截取自身对应的逻辑地址数据,实现 "单帧多站" 传输(EtherCAT 实时性的核心)。
(2)节点寻址→SDO:精准配置的可靠性保障
-
核心机制:每个从站在配置时分配唯一站号(如 0x01、0x02),主站发送 SDO 帧时,在 Datagram Header 中指定 "从站地址 = 0x01",仅对应站号的从站会接收并处理该帧;
-
适用场景:SDO 配置是 "一对一" 操作(如修改从站 1 的 PDO 映射规则),节点寻址能精准定位目标从站,避免其他从站误操作。
3. 与 IgH API 的关联
-
逻辑寻址:由 IgH 主站自动配置 FMMU,开发者通过
ecrt_domain_reg_pdo_entry_list(domain, regs)将 PDO 条目注册到逻辑地址空间,无需手动分配; -
节点寻址:开发者在创建 SDO 请求时,通过
ecrt_master_slave_config(master, 从站位置, 厂商ID, 产品码)绑定从站站号,API 自动将站号写入 SDO 帧的 "从站地址" 字段。
四、完整协同逻辑:从主站启动到实时控制

核心要点(整合三篇文档)
-
寻址模式切换:启动时用位置寻址扫描从站,配置时用节点寻址(SDO),运行时用逻辑寻址(PDO);
-
通讯模式切换:Pre-Operational 态自动启用 Mailbox Mode(SDO),Operational 态自动启用 Buffered Mode(PDO);
-
硬件 - 协议 - API 协同:FMMU(硬件)实现逻辑寻址,CoE 协议(软件)定义 SDO/PDO 帧格式,IgH API(工程实现)封装所有底层细节,开发者无需关心寻址、缓存、封包,仅需调用接口即可。
五、实操避坑指南
1. PDO 相关误区
-
误区 1:认为 PDO 无缓存,直接读写物理内存→纠正:从站用三缓存机制,主站写的是缓存区 0,从站读的是缓存区 2,API 自动处理缓存交换,无需手动干预;
-
误区 2:逻辑地址与物理地址混淆→纠正:逻辑地址是主站分配的虚拟地址(如 0x10000000),物理地址是从站寄存器地址(如 0x40000000),FMMU 负责映射,开发者无需关心;
-
误区 3:PDO 帧越长越好→纠正:单帧总长度≤1514 字节,PDO 条目过多会导致帧长度超限,需拆分到多个 Domain 或 PDO 映射对象。
2. SDO 相关误区
-
误区 1:SDO 可以并行写入多个从站→纠正:节点寻址是 "一对一",一次只能写一个从站,并行写入需创建多个 SDO 请求句柄;
-
误区 2:忽略 Mailbox Mode 的序列号→纠正:API 自动处理序列号,但若网络丢包,需重新发起 SDO 请求,避免重复写入;
-
误区 3:长数据传输无需分段→纠正:单个 SDO 帧数据长度≤1486 字节,长数据(如 > 2KB)需依赖 IgH API 的分段传输,无需手动拆分。
3. 寻址模式相关误区
-
误区 1:逻辑地址可以手动修改→纠正:逻辑地址由 IgH 主站自动分配,与 PDO 条目注册顺序相关,开发者仅需通过 offset 访问,无需修改;
-
误区 2:节点地址与物理顺序绑定→纠正:节点地址是固定配置(如从站拨码开关设置),与总线物理顺序无关,支持热插拔后重新定位。
六、终极总结:EtherCAT 的 "技术栈闭环"
EtherCAT 的高效性和兼容性,源于 "硬件机制→协议规则→工程实现" 的完美协同,核心逻辑可概括为:
硬件层(ESC芯片):三缓存(PDO)/单缓存(SDO)→ 支撑实时性/可靠性;
协议层(CoE/EtherCAT):逻辑寻址(PDO)/节点寻址(SDO)+ 标准化帧格式→ 支撑跨品牌兼容;
API层(IgH):Domain(PDO)/SDO请求句柄→ 封装底层细节,降低开发门槛;
应用层(用户代码):调用API读写数据→ 实现控制逻辑。
-
PDO 的核心:三缓存 + 逻辑寻址 + 单帧多站,极致优化传输效率,满足实时控制需求;
-
SDO 的核心:单缓存 + 节点寻址 + 应答机制,极致保障传输可靠性,满足配置需求;
-
OD 的核心:标准化索引 + 子索引,作为 SDO/PDO 的 "数据字典",实现跨品牌兼容。
掌握这一闭环,无论面对何种从站设备(伺服、IO、传感器),都能快速定位问题、优化性能,从 "会用" 升级到 "懂原理" 的工业控制工程师。
从站是怎么识别来自主站报文的pdo数据的?
一、核心
从站识别主站报文的逻辑是「先按 "逻辑地址 / FMMU" 定位 PDO 数据块,再按 "0x1600 映射规则" 拆分条目,最后用 "0x6060:00" 匹配 OD 参数」------0x1600、0x6060、0x00 是三层不同作用的 "识别标识",而非简单叠加识别。
二、从站识别主站 PDO 报文的完整流程
结合之前的协议知识和新文档的 "逻辑寻址 / FMMU""PDO 映射" 内容,从站接收主站 PDO 报文后,会按以下 4 步精准识别数据,每一步都对应一个关键标识:
步骤 1:按 "EtherCAT 报头 + 逻辑地址" 定位 PDO 数据块(硬件级识别)
- 主站发送的 PDO 报文,报头包含「逻辑地址」(新文档 "逻辑寻址" 核心),这个地址是主站通过 FMMU(现场总线存储器管理单元)预配置给从站的;
- 从站的 ESC 芯片(EtherCAT 从站控制器)收到报文后,先解析报头的逻辑地址,通过 FMMU 映射表,直接定位到自身 PDRAM(过程数据 RAM)中的 PDO 数据块(如 RxPDO 对应的内存区域);
- 关键标识:逻辑地址(而非 0x1600/0x6060),这是 "粗定位",确保从站只接收属于自己的 PDO 数据块,不处理其他从站的数据。
步骤 2:按 "同步管理器(SM2)" 确认数据方向(RxPDO)
- 新文档明确:SM2 绑定 RxPDO(主站→从站)、SM3 绑定 TxPDO(从站→主站),且 SM 配置为 "Buffered Mode(缓存模式)";
- 从站通过 SM2 的配置,确认当前接收的数据是 RxPDO(控制指令),并启用缓存机制(三缓冲区)避免数据冲突;
- 关键标识:SM2 编号 + 数据方向,这是 "中定位",确认数据是 "主站发给自己的控制指令"。
步骤 3:按 "0x1600 映射规则" 拆分 PDO 条目(协议级识别)
- 0x1600 是 RxPDO 的 "映射索引"(新文档 + 之前协议知识),从站 OD 中 0x1600 的子索引存储着 "PDO 条目清单":
- 子索引 0x00:条目数量(如 3 个);
- 子索引 0x01:第一个条目(如 0x6040:00 16 位);
- 子索引 0x02:第二个条目(如 0x6060:00 8 位);
- 子索引 0x03:第三个条目(如 0x60FF:00 32 位);
- 从站根据这个清单,将步骤 1 定位到的 "PDO 数据块" 按字节拆分:
- 前 2 字节→第一个条目(0x6040:00);
- 第 3 字节→第二个条目(0x6060:00);
- 第 4-7 字节→第三个条目(0x60FF:00);
- 关键标识:0x1600 映射规则,这是 "细拆分",将连续的数据块拆成单个可识别的 PDO 条目。
步骤 4:按 "0x6060:00" 匹配 OD 参数(数据级识别)
- 拆分后的每个条目,通过 "索引 + 子索引"(如 0x6060:00)匹配从站 OD 中的具体参数:
- 0x6060 是 OD 中的 "操作模式" 逻辑索引(CiA402 标准);
- 子索引 0x00 是该参数的唯一子项;
- 从站固件通过 OD 映射表,找到 0x6060:00 对应的物理寄存器地址(如 0x40000002),将拆分后的第 3 字节数据写入该寄存器;
- 关键标识:索引(0x6060)+ 子索引(0x00),这是 "最终识别",明确数据对应的具体功能(操作模式)。
三、关键澄清:三个标识的不同作用(避免混淆)
| 标识 | 作用层级 | 核心功能 | 类比场景 |
|---|---|---|---|
| 逻辑地址 | 硬件级(ESC) | 定位属于本从站的 PDO 数据块 | 快递的 "小区地址" |
| 0x1600 | 协议级(CoE) | 拆分数据块为单个 PDO 条目 | 快递的 "收件人姓名 + 快递袋" |
| 0x6060:00 | 数据级(OD) | 匹配具体参数(操作模式) | 快递里的 "单个物品标签" |
四、结合新文档的补充细节(关键验证)
- 逻辑寻址的核心作用:新文档强调 "逻辑寻址用于 PDO 传输",主站通过 FMMU 将所有从站的 RxPDO 数据块映射到同一逻辑地址空间,从站只需通过自身 FMMU 配置,即可快速定位自己的数据块 ------ 这一步是 0x1600/0x6060 发挥作用的前提;
- 缓存模式的配合:新文档的 "Buffered Mode" 三缓冲区机制,确保步骤 3 拆分数据、步骤 4 写入寄存器时,不会与主站下一个周期的 PDO 数据冲突 ------ 从站识别数据的同时,保障实时性;
- 无应答的底层原因:从站的识别流程(ESC 硬件 + SM+OD 映射)全程无 CPU 参与,纯硬件 / 固件处理,因此 PDO 报文无需应答(新文档 "Buffered Mode 无握手"),延迟低至微秒级。
五、总结:从站识别 PDO 报文的核心逻辑
从站不是简单通过 "0x1600+0x6060+0x00" 叠加识别,而是分层定位、逐步拆分:
- 硬件层(ESC+FMMU):用「逻辑地址」定位自己的 PDO 数据块;
- 协议层(SM+CoE):用「SM2+0x1600」确认数据方向并拆分条目;
- 数据层(OD):用「索引 + 子索引(0x6060:00)」匹配具体参数。
这个流程既保证了识别的准确性(不混淆其他从站 / 其他参数),又通过硬件级处理保障了实时性 ------ 这也是 EtherCAT PDO 传输 "高速 + 可靠" 的核心原因。
如何让通过igh主战获取对象字典 Object Dictionary?
利用igh主战的命令:
ethercat sdos 来获取从站的od。
ethercat 命令里的 SDO 字典 是否就是 EtherCAT 中的 对象字典(Object Dictionary,OD)?
SDO 字典不是严格等同 OD,但它是 OD 最核心、最常用的呈现形式,日常使用中可以近似认为 SDO 字典就是 OD 的可视化版本。
详细解释两者的关系
1. 先明确核心概念
- 对象字典(OD,Object Dictionary):是 EtherCAT 从站的 "数据总表",是从站内部所有可配置、可访问的数据 / 参数的集合(包括 PDO 映射、设备配置、状态参数、厂商自定义参数等),是从站的核心数据结构。
- SDO(Service Data Object) :不是数据本身,而是访问 OD 的一种通信协议 / 方式(非实时、可靠的读写方式),专门用于读写 OD 中不适合实时传输的配置类参数。
- SDO 字典 :是
ethercat工具通过sdos命令展示的、能通过 SDO 协议访问的 OD 条目集合------ 简单说,它是 OD 的 "子集(几乎全覆盖)+ SDO 访问属性标注"。
2. 为什么你会觉得两者 "一样"?
因为 EtherCAT 从站的 OD 中,99% 以上的核心条目都支持 SDO 访问 ,所以 ethercat sdos 输出的 SDO 字典,几乎包含了 OD 的所有关键内容(索引、子索引、数据类型、访问权限、描述等)。日常使用中,我们通过 ethercat sdos 查看的 "SDO 字典",就是从站 OD 的完整可视化呈现,两者在实操层面可以划等号。
3. 微小的区别(仅理论层面)
OD 中极少数条目(比如纯实时 PDO 映射的过程数据,仅用于实时传输,不支持 SDO 读写),不会出现在 SDO 字典里 ------ 但这类条目通常不会通过 ethercat 命令手动访问,所以对你的实操没有影响。