[EtherCAT]Module/Slot概念与OD分配
一、为什么需要Module/Slot
EtherCAT基础规范(ETG.1000)原本只定义"SubDevice"这一层:一台 SubDevice拥有一个对象字典(OD),ESI XML中所有 OD 条目固定写死。但当设备本身是复合形态时——比如IO耦合器可以扩展不同数量、不同类型的IO端子、伺服驱动器内含多轴、网关下挂若干数目子总线节点——这种"一份 ESI把全部OD写死"的模式会暴露两个难以解决的问题:
- OD 静态写死:子单元数量可变时,ESI必须为每种组合给一份描述,组合爆炸;
- 配置不灵活:现场插拔子单元后必须更换ESI,无法在线识别。
ETG.5001 Modular Device Profile(MDP) 就是为解决这两点而生。它的核心思想只有一句话:
把设备内部的"子单元"抽象成 Module,把设备上能放 Module 的"位置"抽象成 Slot;ESI 只描述 Slot 集合与 Module 库,运行时由主站根据实际装入的 Module 在线拼装出运行时 OD字典。
这就是 EtherCAT 里 Module(模块) / Slot(插槽) 概念的全部出发点。
二、核心术语
ETG.5001定义了三类 MDP 设备类型:
| 设备类型(Device Type) | "Module"代表什么 |
|---|---|
| Fieldbus Gateway(现场总线网关) | 子总线上每个设备站就是一个 Module |
| Modular Device(模块化设备,如端子耦合器) | 每个可插拔子设备就是一个 Module |
| Module Device(模块设备,如多轴伺服、多通道 IO) | 每个通道(channel)就是一个 Module |
围绕这三类设备,MDP 用一组统一的术语描述它们:
- Slot(槽位):设备上能放置一个 Module 的"位置"。Slot 的属性决定它能放几个实例、允许放哪些 Module、PDO 索引按多大步长递增。
- Module(模块):一个具有独立 OD/PDO/参数/诊断的子单元。每个 Module 由唯一的
ModuleIdent标识。 - SlotGroup / ModuleGroup:当一个设备需要把 Slot 分组管理(例如"高速区"与"普通区"、或不同子总线域)时,把若干 Slot 编为一个 SlotGroup,每个 SlotGroup 关联一个允许的 ModuleGroup(Module 子集)。
- ModulePdoGroup:单个 Module 内部还可以把自己的若干 PDO 编组,用于 PDO 排序、对齐与填充。
三、OD 分区:Module 的 OD 空间
一个 SubDevice 只有一份 OD表,索引范围 (0x0000–0xFFFF)。若要把若干 Module 的数据都装进同一张表,必须保证他们的索引互相不重叠。
| 索引范围 | 区域 | 用途 |
|---|---|---|
| 0x1000–0x1FFF | EtherCAT Communication Area | ETG.1000.6 标准通信对象(Device Type、Syncs、PDO Assign 等) |
| 0x2000–0x5FFF | Manufacturer Specific | 厂商自定义 |
| 0x6000–0x6FFF | Input Area | 各 Module 的输入数据 |
| 0x7000–0x7FFF | Output Area | 各 Module 的输出数据 |
| 0x8000–0x8FFF | Configuration Area | 各 Module 的配置参数 |
| 0x9000–0x9FFF | Information Area | 各 Module 的识别信息(Device Type、Vendor ID、Product Code、版本) |
| 0xA000–0xAFFF | Diagnosis Area | 各 Module 的诊断 |
| 0xB000–0xBFFF | Service Area | 各 Module 的服务接口 |
| 0xF000–0xFFFF | Device Area | 整台设备层的状态/控制/模块清单 |
| 0xF500–0xF5FF | Manufacturer Specific(设备层) | 厂商自定义的设备级对象 |
Modular Device Profile(MDP) 会为每个Module分配OD空间,空间的大小和位置由 Slots/@SlotIndexIncrement 与 Slots/@SlotPdoIncrement 参数决定, 需要使用两个参数来分配Module的OD空间, 是因为分为模块的数据索引空间和PDO映射索引空间。
| 地址空间 | 范围 | 内容 | 增量参数 |
|---|---|---|---|
| OD 对象索引 | 0x6000–0xBFFF | 数据本身(输入、输出、配置、诊断……) | @SlotIndexIncrement |
| PDO 映射索引 | 0x1600–0x17FF(RxPDO) 0x1A00–0x1BFF(TxPDO) |
PDO 的映射条目(一个 PDO 把若干 OD 对象打包) | @SlotPdoIncrement |
3.1 MDP模板的OD分配
在ETG.5001中推荐的MDP模板是:
@SlotIndexIncrement = 0x10
@SlotPdoIncrement = 0x01
假设有2个数字IO端子,分别作为Module0、Module1接入MDP设备。
那么Module0使用的RxPDO映射索引是0x1600, 输入数据的索引范围是0x6000-0x600F; 相应的Module1使用的RxPDO映射索引是0x1600 + @SlotPdoIncrement = 0x1601, 输入数据的索引范围是0x6000 - 0x600F + @SlotIndexIncrement = 0x6010 - 0x601F;

一个MDP设备能放下多个各Module, 取决于单个module的OD空间大小。
按照@SlotPdoIncrement = 0x1, RxPDO映射区索引范围:0x1600 - 0x17FF, 可以放512个module的RxPDO映射索引。
按照@SlotIndexIncrement = 0x10, 输入数据索引范围: 0x6000 -0x6FFF, 可以放下256个module的输入数据索引。
综上,按照MDP模板参数, 可以最多容纳256个Module.
3.2 多轴伺服的OD分配
按照CIA402/ETG.6010, 其OD分配存在不同,单个轴的数据对象就定义了几十个:
0x6040 Control word
0x6041 Status word
0x6060 Modes of operation
0x6061 Mode display
0x6062 Position demand value
0x6064 Position actual value
0x606C Velocity actual value
0x607A Target position
0x607C Home offset
0x6080 Max motor speed
0x6083 Profile acceleration
0x6084 Profile deceleration
0x60B0 Position window
0x60B2 Position window time
0x60B8 Touch probe function
0x60BA Touch probe status
0x60F4 Following error actual value
0x60FF Target velocity
0x6500 Supported drive modes
此时一个Module(轴)使用0x10个OD数据对象空间就不够用了,CIA402按照传统分配约定是每轴分配一个连续的0x800的OD数据对象空间。 一个伺服驱动器最多能支持8个轴。
@SlotIndexIncrement = 0x800
@SlotPdoIncrement = 0x10

3.3 OD空间对比

更多关于ESI文件对Module OD的描述和从站程序对Module的OD的处理,见《EtherCAT|以CIA402例程为例介绍MDP设备的OD描述和处理》
参考资料
- ETG5001_1_V0i10i0_S_D_MDP_GeneralSpec.pdf
- ITW_World_Series_2025_Structuring_CoE_object_dictionary_using_profiles.pdf
- ITW_World_Series_2025_Using_Modules_Slots.pdf