SOEM-EtherCAT 源代码解析(二):已知的从站配置信息列表
👁 1
分类:机器人自动化
解析 SOEM 主站库的从站配置信息列表:ec_configlist_t 结构体字段含义、dtype 设备类型解释、倍福 EK1100/EL 系列端子预配置表,以及未知从站如何回退到 EEPROM 读取配置。
SOEM-EtherCAT 源代码解析(二):已知的从站配置信息列表
一、项目背景
在上一篇《SOEM-EtherCAT 源代码解析(一):数据类型定义》中,我们拆解了 ec_type.h 中的基础类型、报文结构体与各类枚举。本篇文章继续深入 SOEM 源码,聚焦从站配置信息列表(Slave Configuration List)。
EtherCAT 主站上电后需要识别并配置每一个从站。对于常见型号(如倍福 EK1100 耦合器、EL 系列端子模块),主站如果内置了它们的配置参数,就可以跳过繁琐的 EEPROM 逐项读取,直接按已知参数完成配置,大幅加快启动速度。SOEM 正是通过一张"已知从站配置表"实现这一机制的。
二、技术方案:从站配置结构体
SOEM 用 ec_configlist_t 结构体描述一个已知从站的全部配置参数,并将所有已知从站放进一张静态表 ec_configlist[] 中:
/** Slave configuration structure */
/*从站配置结构体*/
typedef const struct
{
uint32 man; // 从站厂家制造商代码
uint32 id; // 从站产品代码
char name[EC_MAXNAME + 1]; // 从站产品型号名称
uint8 Dtype; // 数据类型
uint16 Ibits; // 输入位数量
uint16 Obits; // 输出位数量
uint16 SM2a; // SyncManager 2 起始地址
uint32 SM2f; // SyncManager 2 标志位
uint16 SM3a; // SyncManager 3 起始地址
uint32 SM3f; // SyncManager 3 标志位
uint8 FM0ac; // FMMU 0 有效
uint8 FM1ac; // FMMU 1 有效
} ec_configlist_t;
各字段含义:
- man / id:厂商代码与产品代码,是识别从站型号的唯一键值,与 EEPROM SII 中的 Vendor ID、Product ID 对应;
- name:可读的型号名称,如 "EK1100"、"EL1002",便于日志输出与调试;
- Dtype:设备类型编码,见下方说明;
- Ibits / Obits:输入/输出位数量,决定过程数据映射时分配的位宽;
- SM2a / SM2f、SM3a / SM3f:同步管理器 SM2、SM3 的起始地址与标志位,邮箱(Mailbox)或过程数据(Process Data)通过它们组织;
- FM0ac / FM1ac:FMMU 0 / FMMU 1 是否激活,用于逻辑地址到物理地址的映射。
Dtype 设备类型说明
源码注释给出了 7 种设备类型的定义:
1: static device with no IO mapping ie EK1100 // 静态设备,无IO映射(如EK1100耦合器)
2: input device no mailbox ie simple IO device // 输入设备,无邮箱(简单IO模块)
3: output device no mailbox // 输出设备,无邮箱
4: input device with mailbox configuration // 输入设备,带邮箱配置
5: output device with mailbox configuration // 输出设备,带邮箱配置
6: input/output device no mailbox // 输入输出设备,无邮箱
7: input.output device with mailbox configuration // 输入输出设备,带邮箱配置
三、系统架构:已知从站配置表
#define EC_CONFIGEND 0xffffffff
ec_configlist_t ec_configlist[] = {
{/*Man=*/0x00000002,/*ID=*/0x044c2c52,/*Name=*/"EK1100",/*dtype=*/1,...},
{/*Man=*/0x00000002,/*ID=*/0x03ea3052,/*Name=*/"EL1002",/*dtype=*/2,/*Ibits=*/2,...},
{/*Man=*/0x00000002,/*ID=*/0x03ec3052,/*Name=*/"EL1004",/*dtype=*/2,/*Ibits=*/4,...},
{/*Man=*/0x00000002,/*ID=*/0x07d23052,/*Name=*/"EL2002",/*dtype=*/3,/*Obits=*/2,...},
{/*Man=*/0x00000002,/*ID=*/0x0c1e3052,/*Name=*/"EL3102",/*dtype=*/4,/*Ibits=*/48,
/*SM2a*/0x1000,/*SM2f*/0x00000024,/*SM3a*/0x1100,/*SM3f*/0x00010020,/*FM0ac*/0,/*FM1ac*/1},
{/*Man=*/0x00000002,/*ID=*/0x0fc03052,/*Name=*/"EL4032",/*dtype=*/5,/*Obits=*/32,...},
{/*Man=*/0x00000002,/*ID=*/0x13ed3052,/*Name=*/"EL5101",/*dtype=*/7,/*Ibits=*/40,/*Obits=*/24,...},
{/*Man=*/EC_CONFIGEND,/*ID=*/0x00000000,/*Name=*/"" ,...} // 表结束标志
};
关键设计点:
- 表结构:每行一个已知从站,从第一个元素到
EC_CONFIGEND(0xffffffff)结束。主站遍历该表即可完成所有已知从站的匹配; - 覆盖范围:表中收录了倍福 EK1100 耦合器、EL1002/EL1004/EL1012/EL1014/EL1018 数字量输入、EL2002/EL2004/EL2008/EL2032 数字量输出、EL3102/EL3112/EL3122/EL3142/EL3152/EL3162 模拟量输入、EL4032/EL4102/EL4112/EL4122/EL4132 模拟量输出、EL5101 计数器等常用模块;
- 输入输出位宽:如 EL1002 为 2 位输入、EL2002 为 2 位输出、EL3102 为 48 位输入(16 位 × 3 通道模拟量)、EL5101 为 40 位输入 + 24 位输出(计数器 + 控制字),与实际硬件完全对应。
四、实施过程:配置匹配与回退机制
SOEM 在 ec_config_init() 阶段执行从站识别,其逻辑为:
- 依次读取总线上每个从站的 EEPROM(SII),获取厂商代码与产品代码;
- 遍历
ec_configlist[]表,用man+id与表项比对; - 命中:直接使用表内配置(Dtype、Ibits/Obits、SM/FMMU 参数),完成快速配置;
- 未命中:从从站 EEPROM 中读取完整配置信息(SII 的通用段、SM 段、FMMU 段、PDO 段),动态建立配置——这就是"未知从站"的通用处理路径。
这种"已知表 + EEPROM 回退"的双轨设计,让主站既能在常见场景下秒级启动,又能兼容任意第三方从站。
五、应用价值
- 启动加速:常见倍福 IO 模块免去 EEPROM 全量解析,配置时间大幅缩短;
- 兼容性保障:未知从站自动回退到 SII 读取,保证主站对任意 EtherCAT 从站的通用性;
- 调试友好:表中型号名称直接输出到日志,现场排查从站识别问题一目了然;
- 扩展方式:遇到新的常用从站型号,开发者只需在表中追加一行
man/id/name/dtype/Ibits/Obits即可固化配置,代码零侵入。
六、SEO关键词
SOEM、EtherCAT主站、从站配置、ec_configlist_t、EK1100、EL1002、EtherCAT源码解析、从站EEPROM、SII从站信息接口、倍福端子模块、运动控制
