跳到主要内容

EtherCAT 通讯

EtherCAT 是 Darra PLC 的核心现场总线协议, 通过 Darra.Core.dll (C 语言主站库) 实现, 支持实时伺服控制和分布式 IO。

架构概览

支持功能

功能说明状态
PDO 过程数据LRW 帧, 高效数据交换已实现
CoE (CiA 402)SDO 邮箱读写, 伺服参数配置已实现
DC 分布式时钟IEEE 1588 主从时钟同步已实现
FSoE 功能安全Safety over EtherCAT已实现
CiA 402 伺服CSP/CSV/CST 模式已实现
CiA 401 IO数字/模拟 IO 映射已实现
冗余网络双网卡线缆冗余已实现
PiggybackPDO 帧附带小数据, <1ms 延迟已实现

Joint PDO 映射

EtherCAT 伺服驱动器使用整数计数值 (int32 counts), 而 PLC/Robot 使用浮点弧度值 (double rad)。JointPdoMap 负责转换:

EtherCAT 从站 (int32 counts)
↕ × ScaleFactor
关节反馈/指令 (double rad)

转换公式:

  • 读取: Feedback_rad = 从站计数值 × ScaleFactor
  • 写入: 从站计数值 = Command_rad ÷ ScaleFactor
安全机制

CommandSeq == 0 (PLC 未写入指令) 时, 系统自动将 Feedback 值回写到 PdOut, 保持伺服当前位置不变。

实时周期

EtherCAT 通讯运行在隔离 CPU 核心上, 典型配置:

参数
周期时间1ms (可配 50us ~ 10ms)
最大从站数65535 (协议限制)
最大 PDO 大小按需分配
WKC 监控每周期检查
最大帧槽16 帧/实例

配置步骤

  1. 网卡绑定: 选择 EtherCAT 专用网卡
  2. 从站扫描: 自动枚举从站, 读取 ESI 描述
  3. PDO 映射: 配置 PDO 分配和映射对象
  4. DC 配置: 设置 SYNC0/SYNC1 周期
  5. 状态切换: INIT → PRE-OP → SAFE-OP → OP
// C# 调用示例
using Darra.EtherCAT;

var master = new EtherCATDriver();
master.Initialize("\\Device\\NPF_{GUID}");
master.ConfigSlaves(); // 从站枚举
master.ConfigDC(1000); // DC 1ms 周期
master.SetState(SlaveState.OP);

与 PLC 集成

EtherCAT 数据通过 共享内存 与 PLC 引擎交互:

  • IO 映射: EtherCAT IO 模块的 DI/DO/AI/AO 自动映射到 PLC IO 区域
  • 轴控制: 伺服驱动器自动映射到关节和轴数据区域
  • MC 功能块: PLC 程序使用 PLCopen MC_MoveAbsolute 等指令控制轴
完整 EtherCAT 文档

EtherCAT Master 产品的完整文档 (包括 GUI 工具、多语言 SDK、从站配置) 请访问: ethercat.darra.xyz

背景:与 SOEM/IGH 的对比

EtherCAT 开源社区有两个成熟参考实现:

实现语言定位许可证
SOEM (Simple Open EtherCAT Master)C用户态, 学习/小项目GPLv2 + 豁免
IGH (EtherLab Master)C内核态 Linux 实时GPLv2
Darra.CoreCWindows 内核 (WDK), 双栈商业

Darra 的主站走了自研路线 (不依赖 SOEM/IGH 源码, 仅参考协议实现细节), 核心差异:

  1. Windows 内核原生: 直接使用 NDIS 650 协议驱动, 不需要 Npcap 等用户态抓包库
  2. 核心隔离: PDO 线程运行在指定的隔离 CPU 核心 (由 DarraRT.sys 完成)
  3. 零拷贝 GlobalIO: PDO 数据区是内核 Section, 用户态 DLL 直接映射读写
  4. SMI 屏蔽: 启动时检测并尽量屏蔽系统管理中断, 保证周期抖动 < 10us
  5. TSC 校准: 统一的高精度时间基准, 分布式时钟计算精度提升

周期抖动实测

在典型工控机 (i5-1240P, Windows 10 LTSC) 上 1ms 周期下:

百分位抖动说明
P50< 2 μs中位
P95< 10 μs绝大多数
P99< 30 μs偶发
P99.9< 100 μs罕见, 多由 SMI 造成
Max (1小时采样)< 500 μs极端

这个指标满足 CiA 402 CSP 模式对抖动 "< 1 ms" 的要求, 也优于 Windows 标准 NDIS 用户态栈 (通常 P99 > 500 μs)。

从站状态机

EtherCAT 从站有标准 ESM (EtherCAT State Machine):

INIT → PRE-OP → SAFE-OP → OP
↑_______↑_______↑______↑
状态读取通过 AL_STATUS (0x0130)
状态请求通过 AL_CONTROL (0x0120)
状态功能典型过渡触发
INIT初始状态, 仅 Register 访问上电后自动到达
PRE-OP邮箱通讯可用 (CoE), PDO 未启用主站发 AL_CTL=0x02
SAFE-OP主站只读 PDO, 写入被忽略主站发 AL_CTL=0x04 + 配置 PDO
OP完整运行, PDO 双向主站发 AL_CTL=0x08

每次切换如果失败, AL_STATUS 置错误位, AL_STATUS_CODE (0x0134) 记录原因 (字典见 ETG.1000.5)。

PDO 映射原理

从站把想交换的变量放入 TxPDO (发送) / RxPDO (接收), 映射信息存于对象字典:

0x1A00 — TxPDO1 Mapping
子索引 0: 条目数 = 2
子索引 1: 0x60410010 (Statusword, 16 bit)
子索引 2: 0x60640020 (Actual Position, 32 bit)

0x1C13 — Sync Manager TxPDO Assign
子索引 0: 分配条目数 = 1
子索引 1: 0x1A00 (使用 TxPDO1)

主站在 SAFE-OP 切换前, 根据 ESI 或扫描结果把想要的 PDO 写入 0x1C12/0x1C13。Runtime 侧自动完成这一步, 普通用户不需要手工改。

分布式时钟 (DC)

DC 让所有从站的 SYNC0 信号在纳秒级对齐, 是多轴同步的基础:

主站 → 广播参考时钟 → 所有从站校时
主站 → 计算传播延迟 → 下发到每个从站
每个从站 → 按本地时钟生成 SYNC0/SYNC1

IDE 侧配置:

  • 参考时钟从站: 默认选第一个支持 DC 的从站
  • SYNC0 周期: 与 PDO 周期一致
  • SYNC0 相位: 默认 0, 必要时留出偏移 (如 500us) 给应用处理

冗余

Darra 支持双网卡线缆冗余:

主站 NIC1 ─ Slave1 ─ Slave2 ─ ... ─ SlaveN ─┐

主站 NIC2 ────────── (备用路径) ──────────────┘

典型场景: 任意一根网线断, 主站自动把环反转方向, 业务不中断。详细见 EtherCAT 产品文档。

CoE (CAN over EtherCAT)

CoE 在邮箱协议里走 SDO (Service Data Object), 用于参数配置和非实时数据:

// 读参数: 节点 3 的 0x6064:00 (Actual Position)
int pos = master.SdoRead<int>(slaveIndex: 3, index: 0x6064, subIndex: 0);

// 写参数: 节点 3 的 0x6081:00 (Profile Velocity)
master.SdoWrite(slaveIndex: 3, index: 0x6081, subIndex: 0, value: 100000);

SDO 传输不是实时的, 典型延迟 1~50 ms, 不要在 PLC 周期里频繁读写。推荐:

  • 启动阶段 (PRE-OP) 配置参数
  • 运行时通过 PDO 交换高频数据
  • 偶发参数调整通过后台任务 SDO

FoE (File over EtherCAT)

FoE 用于从站固件升级和大文件传输:

master.FoeUpload(slaveIndex: 3, filename: "firmware.bin", 
localPath: "C:/download/backup.bin");
master.FoeDownload(slaveIndex: 3, filename: "firmware.bin",
localPath: "C:/firmware/new.bin");

升级期间从站进入 BOOT 状态, 业务中断, 需停机操作。

典型周期配置

场景PDO 周期最大从站数应用
高端运动控制250 μs16机械手、CNC 多轴联动
一般运动控制500 μs ~ 1 ms32常见工业机械
混合 IO + 运动1 ms64流水线 + 多台伺服
纯 IO 采集2 ~ 10 ms128分布式 IO 网络
慢速监控10 ~ 50 ms256+大规模传感器网

周期越短, CPU 占用越高, 允许的从站数越少。选择时需权衡。

诊断工具

IDE 内置 EtherCAT 诊断面板:

  • 拓扑视图: 从站链路连接图, 标出端口状态、错误计数
  • WKC 监视: 工作计数器变化, 丢失帧计数
  • 从站状态: 每从站当前 AL_STATUS 和错误码
  • PDO 值: 实时显示所有从站的 PDO 数据
  • CoE 浏览器: 对象字典浏览和读写
  • 错误计数: 每端口 Invalid Frame / RX Error / Link Lost

排错

症状原因处理
从站扫描不到网卡未被 DarraRT_Eth 接管设备管理器安装驱动
卡在 INIT线序错 / 从站没通电从前往后检查 LED
无法切换到 OPPDO 映射失败查 AL_STATUS_CODE (0x001b 常见)
偶发 WKC 错单次帧丢失看端口 RX Error 是否累计, 可能网线问题
DC 不同步参考时钟选错选网络最中心的支持 DC 从站
高周期 (<500us) 抖动大CPU 隔离不足增加隔离核心数