EtherCAT ENI 生成与定制流程:从扫描到 OP 状态验证
总体流程
1 | 扫描实际从站 |
1. 扫描总线
emScanBus() 逐站读 EEPROM/SII,得到默认 SM、默认 PDO 映射、邮箱配置。
2. 栈内生成 ENI
ecatConfigureNetwork(eCnfType_GenOpENI, EC_NULL, 0) —— EniEngine 按扫描结果生成含默认映射的 ENI(demo 不带 -f 时的默认行为)。想留底的话用 emConfigGet 导出 XML 存盘。
3. 手工修改 ENI(三处必须同步改)
<ProcessData>里目标从站的<RxPdo>/<TxPdo>:增删<Entry>(Index/SubIndex/BitLen)。比如 CSP 精简映射删掉0x60FFTargetVelocity,只留0x6040+0x607A+0x6060;- 对应
<Sm2>/<Sm3>的<Pdo>列表,以及<Send>/<Recv>的<BitLength>; <Cyclic>/<Frame>的帧数据长度——这是手改 ENI 最容易翻车的地方,帧布局必须与过程映像严格一致。
4. 把新映射写入从站——两条路线
路线 A:SDO 写进 ENI 的 CoE InitCmds(推荐,主站自动执行)
ENI 里每个从站有 <CoE><InitCmds> 节点。eni.xml 的 873 行起就有现成样例——主站在 PS(PreOp→SafeOP)转换时自动发出:
1 | <InitCmd Fixed="1" CompleteAccess="1"> |
只需仿照这个格式为映射对象本身追加 InitCmd(见下方 CoE 写入顺序),主站切状态时就会自动配置从站。EC-Engineer 生成的定制 ENI 本质上就是干这件事——等于手工做了它的工作。
路线 B:应用代码在 PREOP 阶段手动发 SDO
插入点:EcDemoApp.cpp 的 ecatSetMasterState(SAFEOP) 之前(此时总线已因 ConfigureNetwork 的 InitCmds 到达 PREOP)。
API 用同步的 emCoeSdoDownload(读方向 demo 已有演示:EcSdoServices.cpp 里的 emCoeGetODList/emCoeSdoUpload)。
CoE 写入顺序(两条路线通用)
无论哪条路线,CoE 写入顺序是规范固定的(ETG.1000.5),不可颠倒:
1 | /* 1. 改 RxPdo 映射对象 0x1600 */ |
支持 CompleteAccess 的从站可一次写完整对象(上面 ENI 样例的 CompleteAccess="1" 就是这种写法)。
5. 切 SAFEOP → OP 验证
ecatSetMasterState(SAFEOP) 时主站按 ENI 配 SM/FMMU,从站校验实际映射与 SM 配置一致——一致则 OP 可达。之后 demo 加 -v 能打印每站实际激活的 PDO 与过程映像偏移。
INTERACTION / 讨论与互动
评论与表情点赞