首页 / 驱动算法 / CANopen专题

CiA 402 伺服行规:状态机与工作模式

伺服驱动器在 CANopen 网络里怎么"安全地启动和停止"?CiA 402 用一套状态机 + 控制字/状态字 + 七种工作模式统一回答。本文用可交互的状态机演示,把"上电→使能→运行→停机→故障复位"整条链路讲透。

1. CiA 402 是什么

CiA 402 是 CANopen 的驱动与运动控制行规(Device Profile Drives and Motion Control)。它规定了伺服/变频/步进驱动器"长什么样":

简单说:只要会操作一个 CiA 402 驱动器,换任何牌子都能上手——这正是行规的价值。

2. 状态机:驱动器的一生

CiA 402 定义了 8 个状态,任何时刻驱动器只处于其中一个。状态迁移由控制字 6040h 的低 4 位 + bit7 触发:

状态含义状态字特征位
Not ready to switch on初始化/自检中
Switch on disabled上电完成,主回路未使能,可配置bit6=1
Ready to switch on等待合闸bit0=1
Switched on主回路已合闸bit0+bit1=1
Operation enabled正常运行,可执行运动指令bit0+bit1+bit2=1
Quick stop active快速停机中bit5=1
Fault reaction active故障响应中bit3=1
Fault故障锁定bit3+bit6=1

2.1 控制字 6040h:主站发命令

控制字关键位

bit0 Switch on · bit1 Enable voltage · bit2 Quick stop(0=请求停机) · bit3 Enable operation · bit7 Fault reset(0→1 上升沿)

命令从状态 → 目标状态
Disable voltage0x0002任意 → Switch on disabled
Shutdown0x0006Switch on disabled → Ready to switch on
Switch on0x0007Ready → Switched on
Enable operation0x000FSwitched on → Operation enabled
Disable operation0x000FOperation enabled → Switched on
Quick stop0x0003Operation enabled → Quick stop active
Fault reset0x0080Fault → Switch on disabled
💡 同一个 0x000F 是"使能"也是"停机"?

对!0x000F 在 Switched on 状态是"Enable operation",在 Operation enabled 状态是"Disable operation"。命令的含义取决于当前状态——这是状态机设计里最容易迷惑新手的一点。所以从站的命令处理必须先查当前状态,再看命令位。

2.2 状态字 6041h:从站报状态

含义含义
bit0Ready to switch onbit5Quick stop
bit1Switched onbit6Switch on disabled
bit2Operation enabledbit7Warning
bit3Faultbit10Target reached
bit4Voltage enabledbit11Internal limit active

常见组合值:Switch on disabled=0x0250 · Ready=0x0221 · Switched on=0x0223 · Operation enabled=0x0233 · Quick stop=0x0227 · Fault=0x0238。

3. 工作模式:怎么运动

操作模式对象 6060h(选择)/6061h(反馈)。常用模式:

模式号名称指令对象适用
1轮廓位置 PPM目标位置 607Ah、轮廓速度 6081h点到点定位,驱动内插补
3轮廓速度 PVM目标速度 60FFh速度控制
4转矩 PT目标转矩 6071h力矩/张力控制
6回零 HM回零方式 6098h、回零速度 6099h上电找原点
7插补位置 IP插补数据缓冲复杂轨迹
8周期同步位置 CSP目标位置 607Ah(每周期写)EtherCAT/高性能同步
9周期同步速度 CSV目标速度 60FFh(每周期写)同步速度
10周期同步转矩 CST目标转矩 6071h(每周期写)同步转矩

3.1 轮廓模式 vs 周期同步模式

这正好接上上一课的 PDO:周期同步模式里,每个 SYNC 周期一个 TPDO/RPDO 交换——RPDO 带目标值下来,TPDO 把实际值传上去。

4. 同步机制:SYNC 与同步 PDO

主站周期发 SYNC(0x080),所有从站收到后同步执行/采样。同步 PDO(传输类型 1~240)挂在 SYNC 上:

  1. SYNC 到达 → 从站把 TPDO 数据打包发出 / 应用新 RPDO 目标
  2. 传输类型 1:每 1 个 SYNC 发一次;类型 n:每 n 个 SYNC 发一次
  3. 周期同步模式要求SYNC 周期 ≈ 电流环周期整数倍(如 1ms),且 PDO 的 COB-ID、映射在预操作阶段配好
⚠️ 同步丢帧的后果

CSP 模式如果连续几个周期没收到新目标位置,驱动器会进入同步丢失状态并可能触发故障。所以主站要监控 TPDO 的"心跳/实际位置是否在更新",一旦失联立即安全停机,而不是让位置悬空。

5. 交互式演示:状态机迁移

点击下方命令按钮,观察状态机怎么迁移、控制字/状态字怎么变。重点试:0x000F 在"Switched on"是使能、在"Operation enabled"是停机;以及从"Fault"只能靠 0x0080 复位。

CiA 402 状态机交互演示
当前状态:Switch on disabled · 状态字 6041h=0x0250 · 控制字 6040h=0x0000 · 操作模式 6060h=8 CSP

观察要点:Fault reaction active 会短暂停留后进入 Fault;复位只在 Fault 状态有效;快速停机后可重新走 上电→合闸→使能 回到运行。

6. 代码实现(C语言)

6.1 状态机核心

/* CiA 402 状态机:状态枚举 + 命令处理(仅低 4 位 + bit7) */ typedef enum { ST_SWITCH_ON_DISABLED, ST_READY, ST_SWITCHED_ON, ST_OPERATION_ENABLED, ST_QUICK_STOP, ST_FAULT_REACTION, ST_FAULT } cia402_state_t; cia402_state_t g_state = ST_SWITCH_ON_DISABLED; /* 根据控制字低4位和bit7迁移状态(Fault 需 0→1 上升沿复位) */ void cia402_cmd(uint16_t cw) { static uint16_t last_cw = 0; uint8_t fault_reset = (cw & 0x80) && !(last_cw & 0x80); last_cw = cw; if (g_state == ST_FAULT) { if (fault_reset) g_state = ST_SWITCH_ON_DISABLED; return; } switch (g_state) { case ST_SWITCH_ON_DISABLED: if (cw == 0x0006) g_state = ST_READY; /* Shutdown */ break; case ST_READY: if (cw == 0x0007) g_state = ST_SWITCHED_ON; /* Switch on */ else if (cw == 0x0002) g_state = ST_SWITCH_ON_DISABLED; /* Disable voltage */ break; case ST_SWITCHED_ON: if (cw == 0x000F) g_state = ST_OPERATION_ENABLED; /* Enable op */ else if (cw == 0x0006) g_state = ST_READY; break; case ST_OPERATION_ENABLED: if (cw == 0x0003) g_state = ST_QUICK_STOP; /* Quick stop */ else if (cw == 0x000F) g_state = ST_SWITCHED_ON; /* Disable op */ else if (cw == 0x0002) g_state = ST_SWITCH_ON_DISABLED; break; case ST_QUICK_STOP: if (cw == 0x0002) g_state = ST_SWITCH_ON_DISABLED; break; default: break; } } /* 由状态生成状态字(含 bit0/1/2/3/4/5/6) */ uint16_t cia402_statusword(void) { static const uint16_t sw[7] = { 0x0250, 0x0221, 0x0223, 0x0233, 0x0227, 0x022F, 0x0238 }; return sw[g_state]; }

6.2 周期同步 CSP 模式的一拍

/* 每个 SYNC 周期:读 RPDO 目标、跑位置环、写 TPDO 实际值 */ void csp_cycle(const uint32_t target_pos, uint32_t *actual_pos) { if (g_state != ST_OPERATION_ENABLED) return; /* 未使能不执行 */ int32_t err = (int32_t)(target_pos - *actual_pos); int32_t vel = pos_controller(err); /* 位置环 → 速度 */ vel_controller(vel); /* 速度环 → iq */ /* TPDO 上报实际位置与状态字 */ *actual_pos = encoder_read(); tpdo_build(g_tpdo_map, g_tpdo_n, g_tpdo_buf); can_send(0x180 + g_node_id, g_tpdo_buf, 8); }

7. 工程要点与常见误区

要点 1:使能顺序不能跳

必须按 上电(0x06) → 合闸(0x07) → 使能(0x0F) 的顺序走,跳步命令会被忽略。很多"为什么发 0x0F 没反应"其实是当前状态不对。

要点 2:故障复位是上升沿

0x0080 要在故障状态下由 0→1 触发一次。持续发 0x80 不产生重复复位;复位前先清掉故障源,否则复位后又立刻进故障。

要点 3:同步周期 vs 控制周期

CSP 的 SYNC 周期(如 1ms)要 ≤ 位置环周期,且最好是其整数倍;TPDO 把实际位置发回主站做闭环/监控。周期不匹配会出现"位置来回追"的振荡。

要点 4:回零是上电第一件事

增量编码器必须回零后才能用绝对位置;回零方式(限位/原点/力矩堵转)由 6098h 选择,回零未完成前不应下发定位指令。

误区 1:以为 0x000F 永远是"使能"

0x000F 在 Operation enabled 状态下是"Disable operation"(停)——命令含义由当前状态决定。

误区 2:故障后直接发使能

必须先 0x0080 复位回 Switch on disabled,再重新 上电→合闸→使能。跳过复位会一直卡在 Fault。

误区 3:轮廓模式和周期同步模式混用

轮廓模式由驱动内插补、主站只下目标;周期同步模式由主站逐周期下位置。混用会出现"位置被驱动自己改了,又被主站改回来"的打架。

8. 小结

  1. CiA 402 用状态机统一了驱动器的使能/运行/停机/故障流程,命令含义取决于当前状态
  2. 控制字 6040h 发命令(0x02/06/07/0F/03/80),状态字 6041h 报状态(bit0-6 组合)
  3. 工作模式分轮廓模式(驱动内插补)和周期同步模式(主站逐周期下目标)两大类
  4. 周期同步模式依赖 SYNC + 同步 PDO,是运动控制与 FOC 电流环对接的桥梁
  5. 回零、故障复位、同步丢失处理是现场最常踩的坑

下一篇我们把视角切回从站本身——CANopen 从站怎么在 STM32 上落地:CANopenNode 移植、PDO/SDO 配置、心跳与节点 ID,以及总线负载率的工程预算。