CiA402 运动控制协议指南 (CANopen & EtherCAT)

面向初学者与现场调试工程师,帮助快速理解 CiA402 行规、建立实际控制代码,并能在遇到故障时查阅定位。本指南同时覆盖 CANopen 与 EtherCAT/CoE,实现“认知 → 编程 → 排障”的闭环。


快速导航


0. 预备条件与自检

0.1 必要条件

  • 驱动器硬件:强电侧已上电、STO/急停链路闭合,必要的制动电阻/抱闸释放条件满足。
  • 对象字典:获取对应 EDS/ESI 文件,确认 Vendor IDProduct Code、支持的模式列表。
  • 通信栈:CANopen 需配置波特率和节点号;EtherCAT 使用 IgH 或 SOEM,掌握 PDO 映射位置。
  • 测量工具:准备 ethercat slaves/pdos/diagcandump、厂商驱动面板、示波器/绝对编码器读值等。

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 周期同步力矩 压装、磨削 高速链路 + 精确扭矩标定

切换模式常见步骤:

  1. 通过 SDO 写 0x6060 为目标模式。
  2. 读取 0x6061 确认驱动已接受。
  3. 根据模式映射/开启相应 PDO 条目(如 CSP 需要 0x607A)。

4. CiA402状态机与控制字详解

  • CiA402 定义了一个严格的状态机,驱动器必须按照特定顺序才能从“上电”切换到“电机使能”。

4.1 状态机示意

1
2
3
4
5
6
7
8
9
stateDiagram-v2
[*] --> NotReady
NotReady --> SwitchOnDisabled: 初始化完成
SwitchOnDisabled --> Ready: Shutdown (0x06)
Ready --> SwitchedOn: Switch On (0x07)
SwitchedOn --> OperationEnabled: Enable Op (0x0F)
OperationEnabled --> SwitchedOn: Disable Op (0x07)
OperationEnabled --> Fault: 任何故障
Fault --> SwitchOnDisabled: Fault Reset (0x80 -> 0x00)

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 0x00800x0000 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 典型时序

  1. 读取 StatusWord,根据 4.2 判断当前状态。
  2. 写入对应控制字,一般需保持数个周期,直至状态改变。
  3. Operation Enabled 后立即同步 Target Position = Actual Position,避免跳变。
  4. 若状态回落 (如 Ready),应重新执行上一序列并排查硬件原因。

5. 编程模板:CANopen & EtherCAT

5.1 CANopen 轮询示例

CANopen 速率较低,通常使用“发送 -> 等待 -> 确认”的模式。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// 假设使用某种 CANopen 协议栈 API
// handle: 设备句柄, node_id: 节点号

void enable_servo_canopen(int node_id) {
uint16_t status;

// 1. 复位故障 (SDO 写入)
// Index 0x6040, Sub 0, Value 0x0080
canopen_write_sdo(node_id, 0x6040, 0x00, 0x0080);

// 2. 切换到 Ready to Switch On
// 等待状态字变为 xxxx xxxx x01x xxxx
do {
canopen_write_pdo(node_id, 0x6040, 0x0006); // Shutdown
status = canopen_read_pdo(node_id, 0x6041);
delay_ms(10);
} while ((status & 0x006F) != 0x0021);

// 3. 切换到 Switched On
do {
canopen_write_pdo(node_id, 0x6040, 0x0007); // Switch On
status = canopen_read_pdo(node_id, 0x6041);
delay_ms(10);
} while ((status & 0x006F) != 0x0023);

// 4. 切换到 Operation Enabled
do {
canopen_write_pdo(node_id, 0x6040, 0x000F); // Enable
status = canopen_read_pdo(node_id, 0x6041);
delay_ms(10);
} while ((status & 0x006F) != 0x0027);

printf("Motor Enabled via CANopen!\n");
}

5.2 EtherCAT 周期示例 (IgH)

EtherCAT 是周期性通信,我们不能在周期任务中死循环等待。必须根据当前状态,决定下一帧发送什么命令。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
// 假设 domain_pd 是域内存指针
// off_ctrl, off_status 是注册时获取的偏移量

void update_servo_state_machine(uint8_t *domain_pd) {
// 1. 读取当前状态
uint16_t status = EC_READ_U16(domain_pd + off_status);
uint16_t control = 0;

// 2. 状态机判断逻辑
// 优先级: Fault > Switch On Disabled > Ready > Switched On > Enabled

if ((status & 0x0008)) {
// [Fault] 发生故障 -> 发送 Reset (上升沿有效)
// 注意: 实际复位通常需要先置0再置1,这里简化处理
control = 0x0080;
}
else if ((status & 0x004F) == 0x0040) {
// [Switch On Disabled] -> 发送 Shutdown (0x06)
// 目标: Ready to Switch On
control = 0x0006;
}
else if ((status & 0x006F) == 0x0021) {
// [Ready to Switch On] -> 发送 Switch On (0x07)
// 目标: Switched On
control = 0x0007;
}
else if ((status & 0x006F) == 0x0023) {
// [Switched On] -> 发送 Enable Operation (0x0F)
// 目标: Operation Enabled
control = 0x000F;
}
else if ((status & 0x006F) == 0x0027) {
// [Operation Enabled] -> 保持 Enable (0x0F)
// 此时电机已励磁,可以开始更新 Target Position
control = 0x000F;
}
else {
// 未知或过渡状态,保持上一次命令或发送 0
control = 0x0000;
}

// 3. 写入控制字到域内存
EC_WRITE_U16(domain_pd + off_ctrl, control);
}

调用顺序:在周期任务中先 ecrt_master_receiveecrt_domain_process,再调用 cia402_tick,最后写入 Target Position/Velocity,ecrt_domain_queueecrt_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_activatecycle_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 章定位原因。若需扩展特定驱动的特殊对象或宏,可在附录中继续补充。