4. 从站扫描:ec_config()与ec_config_init()区别、从站拓扑发现机制、SII(E2PROM)数据读取
好,咱们进入第四章。这一章聊的是从站扫描,说白了就是主站怎么认识挂在总线上的那些从站设备。很多初学者上来就调用 ec_config(),发现能跑就完事了。但实际项目中,这一步往往是坑最多的地方。我见过不少现场问题,最后追根溯源,都是扫描阶段埋下的雷。
4.1 ec_config() 与 ec_config_init() 的区别
这两个函数,名字很像,但干的活完全不同。我刚开始用SOEM时也搞混过,后来踩了坑才真正理解。
| 函数 | 核心作用 | 调用时机 | 是否写SII |
|---|---|---|---|
| ec_config_init() | 初始化阶段扫描,读取从站基本信息 | 启动时调用一次 | 否 |
| ec_config() | 完整配置,分配地址、映射PDO | ec_config_init()之后调用 | 是(可能写入配置数据) |
ec_config_init() 干的事比较轻量。它只做三件事:
- 检测总线上有多少个从站
- 读取每个从站的基本类型(比如是EL1008还是EK1100)
- 建立从站列表的初始结构
说白了,就是先打个招呼,看看谁在线。
ec_config() 就重多了。它会:
- 给每个从站分配站地址(从1开始递增)
- 读取并解析从站的EEPROM(SII数据)
- 根据配置映射PDO(过程数据对象)
- 检查从站是否支持DC(分布式时钟)
关键点:ec_config() 内部会调用 ecx_config_init() 的扩展版本。所以如果你只调 ec_config(),其实初始化也顺带做了。但反过来不行。
我个人习惯的做法是:调试阶段分开调,方便定位问题。正式代码里直接调 ec_config() 省事。但如果你需要精细控制,比如先看看从站列表再决定怎么配PDO,那就分开调。
小技巧:我曾经在一个项目里发现,某些国产从站对 ec_config_init() 的响应正常,但到 ec_config() 阶段就卡死。后来排查发现是EEPROM里某个保留位被填了非零值。分开调用让我能精准定位到是配置阶段出的问题。
4.2 从站拓扑发现机制
EtherCAT的拓扑发现,跟普通以太网不一样。它不是靠广播ARP包来发现设备,而是靠一种叫「顺序寻址」的机制。
你想想看,EtherCAT报文在总线上是串行流过的。每个从站收到报文后,处理完自己的数据,再把报文原封不动传给下一个。这就形成了一个天然的链式结构。
SOEM的发现过程大致是这样的:
- 主站发送一个特殊的广播帧,要求所有从站响应
- 每个从站在响应时,会把自己的位置信息(端口连接状态)带回来
- 主站根据响应顺序,给从站分配逻辑位置(从1开始)
- 如果某个从站有多个端口(比如EK1100这种耦合器),主站会递归扫描它的下游端口
嗯,这里要注意:SOEM默认只支持线型拓扑。如果你用了环形拓扑(冗余),需要额外配置。我记得有一次在现场,客户把线接成了环,结果SOEM扫描出来只有一半设备。折腾了半天才发现是拓扑类型没设置对。
避坑指南:我曾经遇到过一个奇葩问题——某个从站明明在线,但ec_config_init()返回的数量总少一个。后来用Wireshark抓包发现,那个从站的响应帧延迟太大,超过了SOEM默认的超时时间。解决方案是调大 ec_timeout 参数。
4.3 SII(EEPROM)数据读取
SII,全称是 Slave Information Interface。说白了就是每个从站内部的一个小EEPROM,里面存了它的身份证信息。包括:
- 厂商ID和产品代码
- 设备名称和版本号
- 支持的PDO配置
- 同步管理器配置
- DC能力标志
SOEM读取SII的流程是这样的:
// 伪代码示意
ecx_FPWR(ct, slave, ECT_REG_SII, sizeof(data), &data); // 写SII地址
ecx_FPRD(ct, slave, ECT_REG_SII, sizeof(buf), &buf); // 读SII数据
实际代码里,SOEM封装了 ecx_SIIread() 函数。它会自动处理地址递增和校验。你只需要告诉它读哪个从站、读多少字节就行。
我个人建议,在调试阶段可以手动调用 ecx_SIIread() 把SII内容dump出来看看。很多从站问题,比如PDO映射不对、DC同步失败,都能在SII里找到线索。
实战经验:有一次,一个从站死活配不上PDO。我查了所有配置都没问题。最后dump了SII一看,发现它的TxPDO长度声明是32字节,但实际数据只有16字节。这就是典型的SII数据错误。联系厂家更新了固件才解决。
SII的读取顺序也有讲究。SOEM在 ec_config() 阶段会先读前16字节(头部信息),确认设备类型。然后根据头部信息决定要不要继续读完整的PDO配置。如果头部校验失败,这个从站会被标记为无效。
小提示:如果你发现某个从站总是被跳过,先检查SII头部的前两个字节。第一个字节应该是0x01(表示SII版本),第二个字节是数据长度。如果这两个不对,SOEM会直接放弃这个从站。
4.4 本章知识体系
下面这张图,是我自己总结的从站扫描全流程。你可以把它当作一个检查清单:
这张图把整个流程串起来了。从 ec_config_init() 开始,到拓扑发现,再到SII读取,最后进入 ec_config() 完整配置。每一步都可能出问题,但只要你理解了底层机制,排查起来就有方向。
好了,这一章就到这里。记住:从站扫描是整个EtherCAT通信的基础,基础不牢,地动山摇。下一章咱们聊PDO映射和过程数据交换,那才是真正干活的部分。
公众号:蓝海资料掘金营,微信deep3321