SOEM-EtherCAT 源代码解析(二):已知的从站配置信息列表
解析 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从站信息接口、倍福端子模块、运动控制
推荐阅读
更多工业 AI、智能制造与技术实践文章
手把手做ROS2机器人系统开发(一):开发环境搭建
机器人操作系统(ROS2)是当前机器人应用开发的主流平台,凭借分布式节点架构、丰富的生态组件和良好的实时性支持,被广泛用于工业机器人、移动机器人和智能装备的研发。本系列教程将带领大家从零开始,完成一套完整的ROS2机器人系统开发:以驱动常用工业机器人(SCARA)实现动态抓取目标为最终目标,既支持实
Linux系统篇(十九)——文件(三):底层存储入门:从机房硬件到 CHS/LBA 磁盘寻址全解析
从机房硬件层级讲到磁盘物理结构,再到 CHS 三维寻址与 LBA 线性寻址的转换原理,完整打通底层存储认知。
CMYK色彩管理之印刷配色
本文系统讲解CMYK色彩管理的全流程:RGB与CMYK加色法/减色法的原理差异、常见CMYK配比与总墨量限制(TAC)、ICC配置文件与常用标准(ISO Coated V2/Japan Color 2011等)、印刷色差五大原因与打样方式对比,以及从设计、输出到印刷沟通的标准工作流程与常见问题解答。
Linux系统篇24——通信(二):匿名管道 vs 命名管道,进程之间到底怎么“传话”?
进程之间默认谁也看不见谁,操作系统给它们接了一根“水管”——管道。本文从“对讲机”和“公共信箱”讲起,把匿名管道与命名管道的底层原理、代码写法、常见坑和面试考点一次讲透。
TRIO-Basic 从入门到精通(十八):Trio运动控制器UDP快速交换数据通讯
本文介绍TRIO运动控制器之间基于UDP的快速数据交换通讯方案:将初始化与收发数据核心代码封装为SINOLIB.BAL库,通过dgram数据报通道与IEEE浮点编解码,实现两台MC405控制器周期性实时交换数据,无需预建立连接,通讯稳定不断线。
小龙虾 Skill 技能编写入门:从 Markdown 到工业智能体工具调用
本文从最简单的 SKILL.md 讲起,系统介绍工业智能体“小龙虾”的 Skill 技能编写方法:功能说明、触发条件、执行流程、工具调用、权限分级,并结合 MES、MQTT、RAG、AGV 等工业场景,说明如何让 AI 从“聊天机器人”进化为能查询实时数据、执行任务的工业智能体。
