MDP — 模块化设备
Modular Device Profile (MDP) 是 EtherCAT 中描述模块化设备的标准协议。
通过 slave.MDP 访问。从站不支持 MDP 时为 null。
自动处理
内部会自动处理 MDP 设备的模块检测和 PDO 配置。
绝大多数场景下,用户无需直接操作 MDP。
关于热插拔
SDK 支持 MDP 模块热插拔再配置自修复。
但生产环境中几乎不会出现 MDP 模块热插拔的使用场景。
EtherCAT 从站的模块配置在设备上电后即固定,运行期间不会动态变更。
部署 MDP 模块化设备推荐使用 DENI;
如需自动配置,请先导入对应的 ESI 文件,再调用 AutoStartup()。
属性
ConfiguredModules
public IReadOnlyList<MdpSlotInfo> ConfiguredModules { get; }
已配置模块列表。每次访问实时通过 CoE 读取(索引 0xF030),非可用状态自动切换。
返回值:
IReadOnlyList<MdpSlotInfo>— 已配置模块列表
相关结构:
public class MdpSlotInfo
{
public int SlotIndex { get; } // 槽位索引(从 1 开始)
public uint ModuleIdent { get; } // 模块标识码(32 位)
public string ModuleName { get; } // 模块名称
public uint ModuleType { get; } // 模块设备类型码
public string Status { get; } // 状态("已配置" / "已检测")
public string ModuleIOType { get; } // I/O 类型(Input / Output / I/O / Unknown)
}
ModuleIOType 判定逻辑
优先从 ESI 文件的模块定义中读取 TxPdo / RxPdo 配置:
- 仅有 TxPdo →
"Input"(从站发送到主站) - 仅有 RxPdo →
"Output"(主站发送到从站) - 两者都有 →
"I/O"
ESI 无法判断时回退到模块名称关键字匹配。
示例:
foreach (var slot in slave.MDP.ConfiguredModules)
Console.WriteLine($"Slot {slot.SlotIndex}: {slot.ModuleName} (0x{slot.ModuleIdent:X8})");
DetectedModules
public IReadOnlyList<MdpSlotInfo> DetectedModules { get; }
已检测模块列表,反映物理上实际插入的模块。每次访问实时通过 CoE 读取(索引 0xF050),非可用状态自动切换。
返回值:
IReadOnlyList<MdpSlotInfo>— 已检测模块列表(同ConfiguredModules结构)
示例:
foreach (var slot in slave.MDP.DetectedModules)
Console.WriteLine($"Slot {slot.SlotIndex}: {slot.ModuleName}");
AvailableModules
public IReadOnlyList<MdpAvailableModule> AvailableModules { get; }
ESI 中定义的可选模块列表。需要从站已导入 ESI 文件,否则返回空列表。结果会缓存,仅首次访问时解析。
返回值:
IReadOnlyList<MdpAvailableModule>— 可选模块列表
相关结构:
public class MdpAvailableModule
{
public uint ModuleIdent { get; } // 模块标识码
public uint ModuleType { get; } // 模块设备类型码
public string ModuleName { get; } // 模块名称
public string Description { get; } // 模块描述
}
示例:
foreach (var mod in slave.MDP.AvailableModules)
Console.WriteLine($"{mod.ModuleName} (0x{mod.ModuleIdent:X8})");
方法
GetModulePdoLayout()
public List<MdpModulePdoInfo>? GetModulePdoLayout()
获取各模块在从站 IOmap 中的 PDO 布局。通过 CoE SDORead 读取 PDO Assignment (0x1C12/0x1C13) 和 PDO Mapping 条目,累积计算各模块的字节偏移。
备注
需要从站已完成 DENI 配置(ConfigMap 后可用),不依赖 ESI 文件。CoE 不可用或未检测到模块时返回 null。
返回值:
List<MdpModulePdoInfo>?— 各模块的 PDO 布局信息,无法获取时返回null
相关结构:
public class MdpModulePdoInfo
{
public int SlotIndex { get; } // 槽位索引
public uint InputOffset { get; } // 输入 PDO 偏移(相对于 slave.Ioffset)
public ushort InputSize { get; } // 输入 PDO 字节数
public uint OutputOffset { get; } // 输出 PDO 偏移(相对于 slave.Ooffset)
public ushort OutputSize { get; } // 输出 PDO 字节数
}
示例:
var layout = slave.MDP.GetModulePdoLayout();
if (layout != null)
{
foreach (var mod in layout)
Console.WriteLine($"Slot {mod.SlotIndex}: In={mod.InputSize}B @{mod.InputOffset}, Out={mod.OutputSize}B @{mod.OutputOffset}");
}
自动配置
MDP 设备的自动配置需要先导入对应的 ESI 文件,由以下方法完成:
- 导入 ESI(主站) —
SetEsiFile()/SetEsiFiles() - 自动配置(主站) —
EnableAutoStartup() - 导入 ESI(从站) —
slave.SetEsiFile() - 自动配置(从站) —
slave.AutoStartup()