← 返回文章列表
TECH NOTE

EtherCAT ENI 生成与定制流程:从扫描到 OP 状态验证

约 5 分钟阅读 2105 字 # EtherCAT# EC-Master# ENI# PDO Mapping# CoE# SDO

总体流程

1
2
3
4
5
6
7
8
9
10
11
12
13
扫描实际从站
↓
EC-Engineer 读取 ESI/SII 和默认 PDO
↓
在 PDO Mapping 页面修改映射
↓
导出完整 ENI(包含 PDO、SM、FMMU、过程映像和 SDO InitCmd)
↓
EC-Master 加载新 ENI
↓
PREOP → SAFEOP 时自动通过 CoE SDO 写入 PDO 映射
↓
SAFEOP → OP,验证 WKC 和过程数据

1. 扫描总线

emScanBus() 逐站读 EEPROM/SII,得到默认 SM、默认 PDO 映射、邮箱配置。

2. 栈内生成 ENI

ecatConfigureNetwork(eCnfType_GenOpENI, EC_NULL, 0) —— EniEngine 按扫描结果生成含默认映射的 ENI(demo 不带 -f 时的默认行为)。想留底的话用 emConfigGet 导出 XML 存盘。

3. 手工修改 ENI(三处必须同步改)

  1. <ProcessData> 里目标从站的 <RxPdo>/<TxPdo>:增删 <Entry>(Index/SubIndex/BitLen)。比如 CSP 精简映射删掉 0x60FF TargetVelocity,只留 0x6040 + 0x607A + 0x6060;
  2. 对应 <Sm2>/<Sm3> 的 <Pdo> 列表,以及 <Send>/<Recv> 的 <BitLength>;
  3. <Cyclic>/<Frame> 的帧数据长度——这是手改 ENI 最容易翻车的地方,帧布局必须与过程映像严格一致。

4. 把新映射写入从站——两条路线

路线 A:SDO 写进 ENI 的 CoE InitCmds(推荐,主站自动执行)

ENI 里每个从站有 <CoE><InitCmds> 节点。eni.xml 的 873 行起就有现成样例——主站在 PS(PreOp→SafeOP)转换时自动发出:

1
2
3
4
5
6
7
8
<InitCmd Fixed="1" CompleteAccess="1">
<Transition>PS</Transition>
<Comment>download pdo 0x1C12 index</Comment>
<Ccs>1</Ccs> <!-- 1 = SDO Download -->
<Index>7186</Index> <!-- 0x1C12 -->
<SubIndex>0</SubIndex>
<Data>...</Data> <!-- SI0=个数 + 各 PDO 索引,CompleteAccess 一次写完 -->
</InitCmd>

只需仿照这个格式为映射对象本身追加 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
2
3
4
5
6
7
8
9
10
11
12
/* 1. 改 RxPdo 映射对象 0x1600 */
SDO Download 0x1600:00 ← 0 /* 清空,映射对象非 0 时禁止写入! */
SDO Download 0x1600:01 ← 0x60400010 /* idx<<16 | sub<<8 | bitlen */
SDO Download 0x1600:02 ← 0x607A0020
SDO Download 0x1600:00 ← 2 /* 写入实际条目数 = 激活 */

/* 2. 改 SM2 的 PDO 分配 0x1C12 */
SDO Download 0x1C12:00 ← 0
SDO Download 0x1C12:01 ← 0x1600
SDO Download 0x1C12:00 ← 1

/* 3. TxPdo 侧同理:0x1A00 映射 + 0x1C13 分配 */

支持 CompleteAccess 的从站可一次写完整对象(上面 ENI 样例的 CompleteAccess="1" 就是这种写法)。

5. 切 SAFEOP → OP 验证

ecatSetMasterState(SAFEOP) 时主站按 ENI 配 SM/FMMU,从站校验实际映射与 SM 配置一致——一致则 OP 可达。之后 demo 加 -v 能打印每站实际激活的 PDO 与过程映像偏移。

INTERACTION / 讨论与互动

评论与表情点赞