很多人第一次接触 EtherCAT,会有一种困惑:
主站明明在“周期性收发过程数据”,但从站内部那么多变量,它到底是怎么知道要收哪些、发哪些?这些数据又是怎么摆进一帧 EtherCAT 报文里的?
答案就藏在三个关键词里:对象字典(OD)、PDO、映射(Mapping)。
你可以把 EtherCAT(CoE 模式)理解成:
- 从站内部有一本“数据目录”(OD),每个数据都有地址(Index/SubIndex)
- 主站周期要用的数据,先“挑选出来”组成 PDO
- “挑选与排队”,就叫 PDO Mapping(PDO 映射)
1. 先建立直觉:PDO 映射到底在做什么?
1.1 两条“数据通道”:Mailbox vs Process Data
在 EtherCAT 里,从站数据交互常见分两类:
- Mailbox(邮箱通讯):像“写邮件” 用于参数配置、诊断、非实时数据(例如 SDO 读写对象字典)
- Process Data(过程数据):像“流水线传送带” 用于实时周期数据(IO、控制字、目标值、传感器采样等)
PDO 就是过程数据的“承载方式”。
它的目标很明确:把周期性要传的变量打包成一段紧凑的字节流,每个周期都按同样的布局收发。
一句话直觉:
PDO 映射 = “选哪些变量 + 按什么顺序 + 每个变量占多少位”
2. 对象字典 OD:一切映射的“变量来源”
在 CoE(CANopen over EtherCAT)里,从站内部变量统一挂在 对象字典(Object Dictionary, OD) 上。
每个对象由:
- Index:16 位(如 0x7000)
- SubIndex:8 位(如 0x7000:01)
- 数据类型/位宽:如 UINT16、UINT32、BOOL 等
你可以把 OD 想象成一个“地址化的变量表”,主站通过 SDO 可以读写它;而 PDO 映射就是从 OD 里“挑变量装箱”。
3. PDO 相关对象:0x1600、0x1A00、0x1C12、0x1C13 是什么关系?
3.1 RxPDO 与 TxPDO:方向先别搞反
RxPDO(Receive PDO):主站 → 从站(从站“接收”)
通常是控制命令、输出量(比如 DO、目标电流/亮度)
TxPDO(Transmit PDO):从站 → 主站(从站“发送”)
通常是状态量、输入量(比如 DI、采样值、状态字)
3.2 0x1600 / 0x1A00:映射表本体(Mapping Object)
0x1600 ~ 0x17FF:RxPDO Mapping 对象
0x1A00 ~ 0x1BFF:TxPDO Mapping 对象
每个映射对象(比如 0x1600)本质是一个 RECORD:
SubIndex 0(0x1600:00):映射条目数(entry count)
SubIndex 1…n(0x1600:01…n):每一条映射内容(每条通常用 32bit 表示)
32bit 映射条目长什么样?
经典格式(也最常用)是:
映射条目=(Index<<16)|(SubIndex<<8)|(BitLength)举例:把 0x7000:01 的 UINT16 映射进去
Index = 0x7000
SubIndex = 0x01
BitLength = 16 (0x10)
那么条目值就是:
0x70000110=>0x70000110再比如 0x7000:02 的 UINT16:
0x70000210=>0x700002103.3 0x1C12 / 0x1C13:把“映射表”挂到 SyncManager 上
你可能会问:
“我定义了很多个映射对象(0x1600、0x1601…),到底哪个会生效?谁来决定主站周期数据用哪一套映射?”
答案是:SM Assignment(同步管理器分配对象)。
- 0x1C12:SyncManager 2 Assignment(通常用于 RxPDO)
- 0x1C13:SyncManager 3 Assignment(通常用于 TxPDO)
它们的结构也类似:
- SubIndex 0:挂载数量(用了几个映射对象)
- SubIndex 1…n:分别写入映射对象的 Index(如 0x1600、0x1601…)
你可以把它理解成“插排”:
- 0x1600/0x1A00 是“插头”(具体映射内容)
- 0x1C12/0x1C13 是“插排”(决定插哪些插头生效)
4. 把四类对象串起来
OD 变量区(比如0x7000、0x6000...) │ │(挑选变量、规定顺序和位宽) ▼ PDO Mapping 对象 Rx:0x1600~0x17FFTx:0x1A00~0x1BFF│ │(把哪些映射对象“挂载启用”) ▼ SM Assignment 对象0x1C12(SM2)->选择 RxPDO 映射(0x1600/0x1601/…)0x1C13(SM3)->选择 TxPDO 映射(0x1A00/0x1A01/…) │ │(最终对应到 ESC 的 Process RAM 布局) ▼ 过程数据(Process Data)在 EtherCAT 帧中按固定布局周期交换5.实战
假设你的从站对象字典有:
- 0x7000:01 UINT16 OUT_STATE
- 0x7000:02 UINT16 DA_VALUE
你希望主站每周期下发 4 字节:
- 前 2 字节 OUT_STATE
- 后 2 字节 DA_VALUE
5.1 配置 0x1600(RxPDO Mapping)
写条目:
- 0x1600:01 = 0x70000110
- 0x1600:02 = 0x70000210
5.2 配置 0x1C12(SM2 Assignment)
挂载映射对象:
0x1C12:01 = 0x1600