MDP (Modular Device Profile)
新手知识
MDP 是专门为"模块化设备"设计的标准。大多数简单从站(如单个伺服驱动器、I/O 模块)不是 MDP 设备,你可以跳过本章。只有当你使用可扩展耦合器(如 EK1100 + 端子模块)或多通道复合设备时,才需要了解 MDP。
什么是 MDP?
MDP (Modular Device Profile) 是 EtherCAT 中用于描述模块化设备的标准。
模块化设备是指由多个子模块组成的设备,例如一个 EtherCAT 耦合器可包含数字输出、数字输入、编码器等多个模块,每个子模块可以独立配置和控制。
典型的 MDP 设备
常见的 MDP 设备包括:
- I/O 耦合器(如 Beckhoff EK1100 + 各种端子模块)
- 模块化伺服驱动器(多轴驱动器,每个轴为一个模块)
- 复合功能设备(集成 I/O、通信、安全等多种功能模块)
MDP 的特点
- 灵活配置: 每个模块独立配置 PDO 映射,有自己的对象字典,部分设备支持热插拔
- 模块标识: 设备通过主 ID(如
0x00000100)标识,各模块通过 SubIndex 区分 - 统一管理: 主站通过一个设备地址访问所有模块,每个模块分配独立的逻辑地址空间
MDP 与非 MDP 设备的区别
| 非 MDP 设备 | MDP 设备 | |
|---|---|---|
| 功能 | 固定功能,整体配置 | 灵活组合,独立配置 |
| I/O | 固定 I/O,不可拆分 | 每个模块独立 I/O |
| PDO | 整机一套 PDO 映射 | 每个模块独立 PDO 映射 |
| ESI | 单一设备描述 | 包含模块结构描述 |
| 地址 | 单一逻辑地址段 | 每个模块独立地址段 |
代码示例
查看模块列表
// 扫描模块化设备
var slave = master.Slaves[0];
// 打印模块列表
Console.WriteLine($"设备: {slave.Name}");
Console.WriteLine($"模块数量: {slave.MDP.ConfiguredModules.Count}");
Console.WriteLine("模块列表:");
foreach (var slot in slave.MDP.ConfiguredModules)
{
Console.WriteLine($" 模块 {slot.SlotIndex}: {slot.ModuleName}");
Console.WriteLine($" 类型: 0x{slot.ModuleType:X8} ({slot.ModuleIOType})");
Console.WriteLine($" 状态: {slot.Status}");
}
访问模块 PDO 数据
每个模块有独立的 PDO 数据区域,可通过 GetModulePdoLayout() 获取各模块在 IOmap 中的偏移与大小:
// 获取模块化设备
var slave = master.Slaves[0];
// 各模块在 IOmap 中的 PDO 布局 (输入/输出偏移与字节数)
var layout = slave.MDP.GetModulePdoLayout();
if (layout == null) return;
foreach (var mod in layout)
Console.WriteLine($"模块 {mod.SlotIndex}: 输入 {mod.InputSize}B @+{mod.InputOffset}, 输出 {mod.OutputSize}B @+{mod.OutputOffset}");
// 按模块取布局信息 (例如第 1 个模块的输出 PDO、第 2 个模块的输入 PDO)
var doModule = layout[1];
var diModule = layout[2];
工具推荐
建议使用 DARRA EtherCAT Master Tools 配置 MDP:
- 自动识别模块 - 自动扫描并识别所有子模块
- 生成配置文件 - 导出完整的 MDP 配置文件用于部署
- 可视化模块管理 - 图形化界面查看和配置各个模块
- 批量 PDO 映射 - 配置所有模块的 PDO 映射
生产环境强烈建议使用工具配置 MDP,避免手动配置的复杂性和出错风险。
注意事项
- ESI 文件支持: MDP 设备需要完整的 ESI 文件描述模块结构
- 配置顺序: 必须先配置主设备,再配置各个模块
- 地址分配: 每个模块需要独立的逻辑地址空间
- 模块兼容性: 更换模块后需要重新扫描和配置