CiA402 运动控制协议指南 (CANopen & EtherCAT)
面向初学者与现场调试工程师,帮助快速理解 CiA402 行规、建立实际控制代码,并能在遇到故障时查阅定位。本指南同时覆盖 CANopen 与 EtherCAT/CoE,实现“认知 → 编程 → 排障”的闭环。
快速导航
- 0. 预备条件与自检
- 1. CANopen 与 EtherCAT 对比
- 2. CiA402 核心对象速查
- 3. 模式 (Modes of Operation) 指南
- 4. 状态机与控制字详解
- 5. 编程模板:CANopen & EtherCAT
- 6. 调试与排障
- 附录 A. 常用对象与缩放备注
0. 预备条件与自检
0.1 必要条件
- 驱动器硬件:强电侧已上电、STO/急停链路闭合,必要的制动电阻/抱闸释放条件满足。
- 对象字典:获取对应 EDS/ESI 文件,确认
Vendor ID、Product Code、支持的模式列表。 - 通信栈:CANopen 需配置波特率和节点号;EtherCAT 使用 IgH 或 SOEM,掌握 PDO 映射位置。
- 测量工具:准备
ethercat slaves/pdos/diag、candump、厂商驱动面板、示波器/绝对编码器读值等。
0.2 最小自检流程
| 步骤 | 命令 / 操作 | 预期 | 失败时排查 |
|---|---|---|---|
| 检查驱动状态 | 观察面板/LED | 显示 Ready 或 Waiting | 若 Fault,复位后再接入主站 |
| 确认对象 | ethercat upload 0 0x1000 0 / candump 读 0x1000 |
返回正确 Vendor ID | 若无响应,复查节点地址和布线 |
| 校验 PDO 映射 | ethercat pdos -p N |
包含 0x6040/0x6041 等关键对象 | 若缺失,需自定义映射或切换模式 |
| 同步基准 | CANopen:确认 SYNC 生产者;EtherCAT:ethercat diag --dc 同步 OK |
报错时调整 DC/周期或先禁用 DC |
经验:在驱动器面板或调试软件上提前设置模式 (如 CSP)、极性、机械参数,可减少应用层调试时间。
1. CANopen 与 EtherCAT 对比
| 特性 | CANopen | EtherCAT (CoE) | 对初学者的含义 |
|---|---|---|---|
| 物理/链路层 | CAN (1 Mbps) | 100 Mbps 全双工以太网 | EtherCAT 延迟更小,对实时线程要求更高 |
| 帧结构 | 8 字节数据 | EtherCAT 帧可打包多个 PDO | CSP/CSV 时 EtherCAT 能携带更多轴数据 |
| 同步手段 | SYNC 报文/事件触发 | 分布时钟 (DC) | EtherCAT 需配置 assign_activate 与周期时间 |
| 协议继承 | 原生 | 通过 CoE 复用 | 两者共享对象字典与 CiA402 状态机,可共用文档与代码逻辑 |
| 调试工具 | candump, cansend, 示波器 |
ethercat CLI, Wireshark ECAT |
熟悉工具可快速判断是链路问题还是应用问题 |
总结:两者在应用层几乎一致,掌握 CiA402 的对象和状态机后,即可在不同总线上复用控制逻辑。
1.1紧密联系 (CoE)
CiA402 (也称为 DS402) 是 CAN in Automation 组织定义的伺服驱动器设备行规。
尽管物理层和数据链路层截然不同,但 EtherCAT 在应用层大量借鉴了 CANopen 的设计,这就是 CoE (CANopen over EtherCAT) 协议。
- 对象字典 (Object Dictionary): 两者都使用索引 (Index) 和子索引 (Sub-Index) 来组织参数(如
0x6040是控制字)。 - 通信对象: 两者都使用 SDO (配置/参数) 和 PDO (实时数据) 的概念。
- 设备行规: 两者都支持 CiA402 标准来控制伺服驱动器。
总结: EtherCAT 就像是给 CANopen 换了一辆“法拉利”跑车(以太网物理层),但车里的驾驶手册(应用层协议)几乎是一样的。
2. CiA402 核心对象速查
| Index | 名称 | 方向 | Bit | 单位/缩放 | 备注 |
|---|---|---|---|---|---|
| 0x6040 | Control Word(控制字) | Master→Slave | 16 | 无 | 控制状态机切换 (启动、停止、复位) |
| 0x6041 | Status Word(状态字) | Slave→Master | 16 | 无 | 反馈当前状态 (故障、就绪、运行中)低 7 位决定状态;高位含 Fault/Warning |
| 0x6060 | Modes of Operation | Master→Slave | 8 | 整数 | 选择模式 (位置 CSP, 速度 CSV, 力矩 CST) |
| 0x6061 | Modes Display | Slave→Master | 8 | 整数 | 驱动反馈当前的实际模式 |
| 0x607A | Target Position | Master→Slave | 32 | 脉冲或编码器格 | 目标位置,CSP 必填;建议以实际位置初始化 |
| 0x6064 | Position Actual Value | Slave→Master | 32 | 同上 | 读取当前编码器值,实际位置反馈 |
| 0x60FF | Target Velocity | Master→Slave | 32 | rpm / pulses/s | 目标速度,CSV 模式下使用 |
| 0x6071 | Target Torque | Master→Slave | 16 | 0.1% 额定力矩 | 目标力矩,CST 模式使用,需提前设定额定力矩 |
| 0x60C1 | Interpolation Time Period | Master→Slave | 16 | us | CSP/CSV 的周期设置,不同厂家名称略有不同 |
| 0x60B1 | Velocity Offset | Master→Slave | 32 | pulses/s | CSP 中叠加速度前馈 |
方向:Master→Slave 表示 PDO/SDO 写入;Slave→Master 表示反馈。
3. 模式 (Modes of Operation) 指南
| 模式 | 值 | 特点 | 典型场景 | 关键要求 |
|---|---|---|---|---|
| PP | 1 | 非实时,点到点轨迹由驱动生成 | 简易点动、搬运 | 需先配置加减速;通过 SDO 触发 |
| PV | 3 | 按给定速度运行 | 恒速送料 | Target Velocity 连续更新,注意加速限制 |
| PT | 4 | 力矩闭环 | 扭矩控制、绕线 | 需设置电流环,配合扭矩限制对象 |
| HM | 6 | 回零 | 原点寻找 | 先配置 0x6098 (索引方式) 等参数 |
| CSP | 8 | 周期同步位置,最常用 | 多轴插补、机械臂 | 需要稳定周期,Target Position 每周期更新 |
| CSV | 9 | 周期同步速度 | 卷材、张力控制 | Target Velocity + 前馈,域内存分辨率需确认 |
| CST | 10 | 周期同步力矩 | 压装、磨削 | 高速链路 + 精确扭矩标定 |
切换模式常见步骤:
- 通过 SDO 写
0x6060为目标模式。 - 读取
0x6061确认驱动已接受。 - 根据模式映射/开启相应 PDO 条目(如 CSP 需要
0x607A)。
4. CiA402状态机与控制字详解
- CiA402 定义了一个严格的状态机,驱动器必须按照特定顺序才能从“上电”切换到“电机使能”。
4.1 状态机示意
1 | stateDiagram-v2 |
4.2 0x6041状态字位定义
| 状态 | 判断表达式 | 典型含义 |
|---|---|---|
| Not Ready | (status & 0x004F) == 0x0000 |
驱动自检中,需等待 |
| Switch On Disabled | (status & 0x004F) == 0x0040 |
硬件准备完成,可发 Shutdown |
| Ready to Switch On | (status & 0x006F) == 0x0021 |
允许合上主电路 |
| Switched On | (status & 0x006F) == 0x0023 |
主电路上电未励磁 |
| Operation Enabled | (status & 0x006F) == 0x0027 |
可执行运动 |
| Fault | (status & 0x0008) == 0x0008 |
报警,需要 Reset |
判断当前状态主要看低 7 位:
| Bit 6 | Bit 5 | Bit 3 | Bit 2 | Bit 1 | Bit 0 | 状态名称 | 掩码 (Mask) | 值 (Value) |
|---|---|---|---|---|---|---|---|---|
| 0 | x | 0 | 0 | 0 | 0 | Not Ready to Switch On | 0x004F | 0x0000 |
| 1 | x | 0 | 0 | 0 | 0 | Switch On Disabled | 0x004F | 0x0040 |
| 0 | 1 | 0 | 0 | 0 | 1 | Ready to Switch On | 0x006F | 0x0021 |
| 0 | 1 | 0 | 0 | 1 | 1 | Switched On | 0x006F | 0x0023 |
| 0 | 1 | 0 | 1 | 1 | 1 | Operation Enabled | 0x006F | 0x0027 |
| 0 | x | 1 | x | x | x | Fault | 0x0008 | 0x0008 |
4.3 0x6040控制字序列
| 当前状态 | 应发送的控制字 | 说明 |
|---|---|---|
| Fault | 0x0080 → 0x0000 |
Fault Reset 需要上升沿:先写 0x80,再写 0x00 或 0x06 |
| Switch On Disabled | 0x0006 |
Shutdown,激活 Ready to Switch On |
| Ready to Switch On | 0x0007 |
Switch On,闭合接触器 |
| Switched On | 0x000F |
Enable Operation,励磁 |
| Operation Enabled | 0x000F |
保持使能;根据需要叠加其它位(如 Quick Stop bit 2) |
提示:若驱动要求 Quick Stop 位保持 1,可改写为
0x000B等;具体以厂商说明为准。
4.4 典型时序
- 读取
StatusWord,根据 4.2 判断当前状态。 - 写入对应控制字,一般需保持数个周期,直至状态改变。
- Operation Enabled 后立即同步
Target Position = Actual Position,避免跳变。 - 若状态回落 (如 Ready),应重新执行上一序列并排查硬件原因。
5. 编程模板:CANopen & EtherCAT
5.1 CANopen 轮询示例
CANopen 速率较低,通常使用“发送 -> 等待 -> 确认”的模式。
1 | // 假设使用某种 CANopen 协议栈 API |
5.2 EtherCAT 周期示例 (IgH)
EtherCAT 是周期性通信,我们不能在周期任务中死循环等待。必须根据当前状态,决定下一帧发送什么命令。
1 | // 假设 domain_pd 是域内存指针 |
调用顺序:在周期任务中先
ecrt_master_receive→ecrt_domain_process,再调用cia402_tick,最后写入 Target Position/Velocity,ecrt_domain_queue→ecrt_master_send。
6. 调试与排障
| 症状 | 可能原因 | 诊断建议 | 处理办法 |
|---|---|---|---|
| 状态字一直是 0x0000 | 未收到 PDO、驱动未上电 | ethercat slaves / candump 查看是否有帧 |
检查布线、确认驱动激活 PDO、重设节点地址 |
卡在 0x0040 Switch On Disabled |
STO 打开、制动未释放、主电未上 | 查看驱动面板、测量 24V 安全链 | 排查急停回路、确认抱闸释放条件 |
频繁 Fault,StatusWord 高位闪动 |
模式与参数不匹配 (如功率不足) | 读取 0x603F 错误代码 |
根据错误码检查 0x6060、力矩/电流限制 |
| CSP 使能后位置跳变 | 未同步 Target=Actual、字节序错误 |
打印 Target/Actual 首帧 |
使能前写入当前实际位置;确认 PDO 顺序与字宽 |
EtherCAT clock diff 报警 |
DC 设置与任务周期不符 | ethercat diag --dc 观察误差 |
调整 assign_activate、cycle_ns,必要时先禁用 DC |
| SDO 超时 | 在实时周期频繁发 SDO | ethercat sdos -p N 或栈日志 |
将 SDO 操作移到初始化线程或降低频率 |
| CANopen 目标已使能但不动 | PDO 未包含 0x607A/0x60FF |
candump 检查 PDO 内容 |
重新映射 PDO 或使用 SDO 配置 RPDO |
| EtherCAT 报 Sync 错误 | DC 同步失败 | 检查 0x6060 是否设为 8 (CSP);检查 DC 配置。 |
6.1 记录与日志
- 状态字序列:在应用层打印
(status & 0x6F),可快速看出停在哪一步。 - 对象读写:善用
ethercat upload/download、厂商驱动监控软件,验证参数是否真的被写入。 - 示波器/编码器:确认实际速度/位置是否与指令一致,判断是软件问题还是机械问题。
附录 A. 常用对象与缩放备注
| Index | 描述 | 默认缩放 | 备注 |
|---|---|---|---|
0x6081:00 |
Profile Velocity | pulses/s | PP/PV 模式下的最大速度 |
0x6083:00 |
Profile Acceleration | pulses/s² | 影响 PP/PV 的加速段 |
0x6091:01 |
Gear Ratio (Numerator) | 整数 | 结合 0x6091:02;可在软件层统一单位 |
0x60C2:01 |
Interpolation Time Index | 指定周期 | 某些驱动需要与主站周期一致 |
0x60FD:00 |
Digital Inputs | bit map | 用于读取驱动急停/限位信号 |
0x60FE:01 |
Digital Outputs | bit map | 可控制制动器、指示灯等 |
不同厂商对单位有差异,使用前应以 EDS/ESI 或手册为准。建议在代码中统一换算为物理量 (rad、mm、Nm)。
通过以上结构,初学者可先完成自检,再查表了解对象/模式,并根据示例快速写出控制代码;遇到问题时参考第 6 章定位原因。若需扩展特定驱动的特殊对象或宏,可在附录中继续补充。