引子:把从站做好,不算完;让”别人家的主站”也能带上它,才算完
在《EtherCAT 从站研发技术路线全景》里我们说过,从站的本质是”持续做对”的工程能力。但还有一个更硬的问题没回答:你做的从站,凭什么说自己”通用”?
答案不在你自己的测试台上,而在”别人”的主站里。EtherCAT + CiA 402 是开放标准,意味着一台合规的伺服,应该既能被倍福的 TwinCAT 带上,也能被开源的 IgH 主站带上,甚至能被 CODESYS、SOEM、acontis 带上——前提是你真的遵循了标准,而不是只跟某一个主站”调通了”。
这篇文章就用一个最典型、也最考验功力的场景来讲清楚这件事:从站驱动伺服电机,运行在 CSP(周期同步位置,模式 8)下,然后分别用 TwinCAT 3(商业标杆)和 IgH EtherCAT Master(开源标杆)两套主站去验证它的功能与通用性。CSP 是多轴机器人、精密电缸、半导体设备几乎必选的模式,也是从站 CiA 402 实现里坑最多的一档。
下面的图是我们这次验证用的真实台架——一台伺服 + 嵌入式从站控制器 + 笔记本,分别在 Windows/TwinCAT 和 Linux/IgH 下联调:

一、先把 CSP 说透:主站发位置,驱动器闭环
CSP(Cyclic Synchronous Position,周期同步位置,CiA 402 模式值 = 8)的核心分工非常干净:
- 主站负责”想往哪走”——每个 EtherCAT 周期(常见 1 ms,高动态场景 250 µs / 500 µs)算出一个目标位置,通过 RPDO 的
0x607A下发; - 驱动器负责”怎么走到”——它内部的位置环、速度环、电流环自己闭环,主站不参与内环;
- 驱动器再每周期回传实际位置
0x6064(TxPDO),主站据此做下一周期插补。
这种”主站做轨迹规划、驱动器做执行”的分工,正是多轴同步的基石:三轴联动时,主站每周期把规划好的三轴位置分别下发,就能保证三轴在同一时刻到达目标点,跟随误差比脉冲方式小一个数量级。

那为什么 CSP 必须配 DC(分布式时钟)?因为它是周期同步模式——主站和驱动器必须在”同一时刻”更新目标、采样反馈。没有 DC,各从站周期漂移,多轴之间就会出现插补偏差;严重时电机低速爬行、抖动甚至偶发超调。我们讲过 TSN 是在 IP 网络上做同样的事,而 EtherCAT 的 DC 是在链路层硬件里就把这件事做掉了。
CSP 的最小 PDO 映射
一个能跑 CSP 的最简 PDO 集合就这几条(通过 0x1C12/0x1C13 分配),务必记牢,因为它就是后面两个主站”对不对得上”的判据:

| 方向 | 对象 | 名称 | 位宽 | 说明 |
|---|---|---|---|---|
| RxPDO(主站→驱动器) | 0x6040 | Controlword 控制字 | 16 | 状态机命令、使能 |
| RxPDO | 0x6060 | Modes of Operation | 8 | 写入 8 = CSP |
| RxPDO | 0x607A | Target Position 目标位置 | 32 | 每周期下发 |
| TxPDO(驱动器→主站) | 0x6041 | Statusword 状态字 | 16 | 状态机反馈 |
| TxPDO | 0x6061 | Mode display 模式回显 | 8 | 确认已接受 CSP |
| TxPDO | 0x6064 | Actual Position 实际位置 | 32 | 每周期回传 |
使能序列是铁律:0x0006(Shutdown)→ 0x0007(Switch On)→ 0x000F(Enable Operation),每写一次都要读 0x6041 确认迁移完成(状态字指纹:0x21 就绪 / 0x23 已开机 / 0x27 运行使能)。模式要先写 0x6060=8 再进 OP,否则很多驱动器会报 0xFF01(无效模式切换)。这些在《CiA 402 入门到实战》里都展开过,这里不再重复。
顺带把 CSP 和它的”兄弟”摆在一起,你就明白为什么机器人清一色选它:

二、从站侧要准备好的三件事
两套主站再标准,也救不了一个没做对的从站。在联调之前,从站固件和 ESI 必须齐活(对应从站研发路线的 M3–M5 阶段):
- 对象字典与 CiA 402 应用层:用 Beckhoff SSC 生成协议栈,按 CiA 402 设备行规实现状态机、模式处理,把
0x6040/0x6041/0x6060/0x6061/0x607A/0x6064这些对象真正接进你的电机控制任务; - PDO 映射要”三一致”:ESI(XML)里声明的 PDO 内容、映射顺序、数据长度,必须和 EEPROM(SII)里存的实际配置、以及从站对象字典完全一致——长度错一个字节整个 PDO 就丢;
- DC 与 SYNC 中断:在 ESC 上配置 SYNC0,把同步中断接到 MCU 最高优先级;时钟电路用优于 25 ppm 的晶振。这是 DC 抖动的天花板,软件救不回来。
这三条是从站的”地基”。地基不稳,主站侧怎么调都会卡在 0x001A(SM 配置无效)、0x0017(无效 SM 配置)这类错上。
三、用 TwinCAT 3 验证(商业主站标杆)
TwinCAT 是 EtherCAT 的”原厂”主站,也是工业界部署最广的标杆。能在 TwinCAT 下干净地跑起来,是从站合规的第一道关卡。
步骤 1:装 ESI,扫描设备
把厂商提供的 ESI(XML)复制到 TwinCAT 的 ESI 仓库(TwinCAT 3 默认路径 C:\TwinCAT\3.1\Config\Io\EtherCAT),然后在 XAE 里右键 EtherCAT → Reload Device Descriptions,让从站出现在设备目录里。别改 ESI 文件名——XML 里内嵌的 Vendor ID 是 TwinCAT 在线扫描时匹配硬件的索引,改名或 Vendor ID 对不上,下一次扫描就会报 “Slave not found”。
进入 Config Mode,右键 Devices → Scan Devices,TwinCAT 广播 BRD 命令列出所有可达从站;再对每个从站 Scan Boxes,把 ESI 里定义的 PDO 暴露出来。
步骤 2:确认 PDO 映射,配置 DC
对 CSP,绝大多数驱动器的”预定义 PDO 映射”已经就包含了上面的六条对象,直接用即可;如果需要改,在 Slot 页或 PDO 页手动增删,TwinCAT 会自动改写 0x1C12/0x1C13。
然后从站 → DC → Operational 开启分布式时钟,把 Sync Unit Cycle Time 设成和驱动器本地周期一致(典型 1 ms;高动态 250 µs / 500 µs),Shift Time 先设 0。一个关键细节:CSP 模式下要把”Position Lag Monitoring / 位置偏差监控”设成 FALSE——因为跟随误差本来就该由驱动器内部的位置环去管,主站/NC 层再判一遍反而会误触发报警。
步骤 3:在线调试与使能
编译 → Login → Run,状态栏变绿、所有从站报 OP,说明 PDO、SM、DC 都没问题(此时电机还没转)。接下来在线写控制字走完 0x0006 → 0x0007 → 0x000F,再往 0x607A 写目标位置,看 0x6064 实际位置稳定跟随,验证就完成了。
要做得更像产品,可以把从站加为一根 NC 轴(引用 TcMc.lib / TcMc2.lib),TwinCAT 的 NC PTP / I / CNC 就能直接做多轴插补。对正式调伺服来说,TwinCAT 的图形化在线变量、示波器和趋势图效率远高于文本操作。
TwinCAT 端两个高频报错
- 0x0017(Invalid SM Configuration,无效 SM 配置):绝大多数是 ESI 里的 Vendor ID / Product Code 与 EEPROM 实际值不符;先核对 ESI 版本和物理固件版本是否匹配;
- 0x002A(Invalid DC SYNCH Configuration):DC 没在进 OP 之前使能,或者主站在 OP 状态下直接把 FreeRun 切到 DC——驱动器要求必须在 Pre-Op → Safe-Op → Op 的过程中就让 SYNC0 脉冲出现在 IRQ 线上,否则它会强制回 Init。
四、用 IgH EtherCAT Master 验证(开源主站标杆)
IgH(etherlab)是 Linux 下事实标准的开源实时主站,被 LinuxCNC、ROS 生态和各种研究平台广泛采用。它的代码库和 TwinCAT 毫无关系,所以能从站在这边也跑通,才真正说明你遵循的是标准,而不是”和某个主站碰巧调通了”。
环境
IgH 对实时性敏感:建议 Ubuntu + PREEMPT_RT 实时内核,编译并加载主站模块(/dev/EtherCAT0)。非实时内核也能跑通通信,但周期抖动会大,验证同步质量时建议锁 CPU 频率(如 Jetson 上的 jetson_clocks)保证稳定。
用户态程序骨架(C,节选)
// 1) 初始化主站与域
master = ecrt_request_master(0);
domain = ecrt_master_create_domain(master);
sc = ecrt_master_slave_config(master, VID, PID); // 按 Vendor/Product 找到从站
// 2) 注册 PDO 条目(RxPDO: 控制字/模式/目标位置;TxPDO: 状态字/模式回显/实际位置)
ecrt_slave_config_pdos(sc, EC_END, pdos);
ecrt_domain_reg_pdo_entry_list(domain, entries);
// 3) 配置 DC 同步:1 ms 周期(单位纳秒)
ecrt_slave_config_dc(sc, 0x0300, 1000000, 0, 0, 0);
// 4) 激活,取得过程数据指针
ecrt_master_activate(master);
domain_pd = ecrt_domain_data(domain);
// 5) 实时周期循环(1 kHz)
while (running) {
ecrt_master_receive(domain);
ecrt_domain_process(domain);
// 读状态字 0x6041,确认状态机
// 写控制字 0x6040(0x0006→0x0007→0x000F)、模式 0x6060=8
// 写目标位置 0x607A,读实际位置 0x6064
ecrt_domain_queue(domain);
ecrt_master_send(domain);
}
CiA 402 的使能序列用 SDO(配置阶段,Pre-Op / Safe-Op 下)或 PDO(进 OP 后)写都行,关键是要逐步来、每步之间留几十毫秒让状态机迁移;写完后读 0x6061 确认模式真的变成了 8,再开始周期下发 0x607A。第一次目标位置建议保守一点(比如 5000 个脉冲、速度限在额定 10% 以内),确认不飞车再往上加。
IgH 的命令行调试三板斧
ethercat slaves:看每个从站的状态和 DC 标志——同步建立后状态里会显示DC;ethercat pdos:列出当前从站实际生效的 PDO,和代码里注册的条目逐条比对,不一致就是映射没生效;ethercat sdo -p 0 .../ethercat state -Op:手动读写对象字典、切 OP 状态。
两个最常见的坑:卡在 INIT 进不了 PRE-OP,多半是 ESI 与固件版本不匹配或 EEPROM 被锁,去官网取对应版本的 ESI、必要时恢复出厂;控制字写进去了但状态机不切换,几乎都是 PDO 映射没生效,用 ethercat pdos 一比对就现形。

五、双主站对照:通用性到底验证了什么
把两套主站摆在一起,差异一目了然:

重点不在于”哪个更好”,而在于它们的实现完全独立:TwinCAT 是商业闭源、Windows 图形化、原生 NC;IgH 是开源、Linux 实时、C API + 命令行。两套代码库对 CiA 402 状态机、PDO 解析、DC 同步的理解,都来自同一份 ETG / CiA 标准文档,而不是来自彼此。
所以”同一台从站、同一份 ESI,在两边都能进 OP、且位置跟随一致“,这件事本身就是最有力的通用性证据——它证明你的从站是在”说标准语言”,而不是在和某一个主站”打暗语”。
更硬的证据是 ESI 的可移植性:TwinCAT、CODESYS、SOEM、acontis、欧姆龙、罗克韦尔……它们消费的 ESI 都是同一个 ETG.2000 XML schema,只是仓库路径不同(CODESYS 在 %ProgramData%\CODESYS\DeviceRepository\,Beckhoff 在 C:\TwinCAT\3.1\Config\Io\EtherCAT)。一份合规的通用 CiA 402 ESI,可以在所有主站间直接移植。这也是为什么很多 VFD/伺服厂商敢说”换品牌只需换 ESI 文件重映射 PDO”。
再往前一步,工业上”通用性”的正式背书来自两件事:
- 一致性测试(CTT,ETG.7010):用官方工具核对 ESI 与 EEPROM、对象字典三者一致,跑 EtherCAT 状态机、CoE/SoE 邮箱、以及 CiA 402 驱动器协议的必选测试项;
- 互操作性测试(Interoperability):在 ETC 测试中心由多厂商设备组成的真实网络里跑,确认你的从站和”别人家”的主站/从站能和平共处——这正是 ETG 鼓励厂商把设备捐进互操作网络的原因。

六、给从站开发者的验证清单
把上面的流程浓缩成一份可直接照着打勾的清单:
| 阶段 | 检查项 | TwinCAT 侧 | IgH 侧 |
|---|---|---|---|
| 前置 | ESI / EEPROM / 对象字典”三一致” | 导入 ESI,Reload Descriptions | 确认 Vendor/Product Code 匹配 |
| 通信 | 从站进 OP,DC 标志建立 | 状态栏全绿,DC 诊断面板稳定 | ethercat slaves 显示 DC |
| 映射 | PDO 内容/顺序/长度一致 | PDO 页核对 | ethercat pdos 比对 |
| 使能 | 状态机 0x0006→0x0007→0x000F | 在线写控制字 | SDO/PDO 序列 + 读 0x6041 |
| 模式 | 0x6060=8,0x6061 回显 8 | 在线写 + 读回显 | SDO 写 + 读回显 |
| 运动 | 写 0x607A,0x6064 稳定跟随 | 在线写目标位置观察跟随 | 周期下发 + 读实际位置 |
| 多轴 | DC 同步,轴间偏差 < 1 µs | NC 轴做插补 | 多从站同域周期 |
建议的节奏:先用 IgH 这种”看得见每一步”的命令行主站把链路打透(哪一步卡住一目了然),再用 TwinCAT 做图形化验收和 NC 插补验证。两边都过,再进 CTT 和互操作测试,你就有底气对外宣称”通用”了。
写在最后
EtherCAT 从站最迷人的地方,就是它把”能不能被用起来”这件事交给标准,而不是交给某一家主站厂商。你做的伺服从站,只要老老实实实现了 CiA 402 状态机、配对了 PDO、做好了 DC,就能被 TwinCAT 带上,也能被 IgH 带上,还能被明天出现的一款新主站带上——这种”一次做对、处处能用”的能力,才是开放标准给设备厂商最大的红利。
这篇是 EtherCAT 系列的又一篇实战。前面我们聊过 从站研发技术路线、CiA 402 驱动行规、TSN 在工业总线上的应用、EtherCAT 市场现状以及 机械臂的电机与减速机。如果你正在做伺服从站、卡在某一步,或者想看更多主站(比如 CODESYS / SOEM)的对接细节,欢迎留言——典型的场景我们挑出来接着写。
(文中对象索引、状态字指纹与控制字序列均依据 CiA 402 / IEC 61800-7-201 及 ETG 公开文档;具体驱动器参数请以各厂商手册为准。)
Pingback: 运动控制器与“普通控制电机运动”到底差在哪?五种连 PC 方式一次说清 - 海川嵌入式电子网