首页 / CANopen专题

CiA 402 控制字/状态字详解:6040h 与 6041h 位级手册

让一台伺服"上电、使能、跑起来、停下来"靠的不是发一条指令,而是主站写控制字 6040h、从站回状态字 6041h 的一来一回握手。本文按位拆解两个对象:控制字每一位的含义与常用命令值(0x0006 Shutdown / 0x0007 Switch on / 0x000F Enable operation / 0x0080 Fault reset / 0x0002 快停)、状态字每一位与状态位组合(Ready/Switched on/Operation enabled/Quick stop/Fault…)、16 条状态迁移命令表、典型启停时序、快速停止(605A/605B)与故障复位流程,配"发命令看状态"交互状态机演示与可编译 C 状态机模块。这是《CiA 402 伺服行规》的深化篇,两篇配合读。

1. 为什么伺服启停要"握手":状态机的存在理由

如果主站直接发"转动",从站怎么知道该不该动、动了安全吗?CiA 402(IEC 61800-7)用一台状态机规定:伺服只能按固定路径在状态间迁移,每一次迁移都要主站先给控制字、从站用状态字确认。三个设计动机:

⚠️ 最常见的新手错误

写完 0x000F(Enable operation)立刻发位置指令,不等状态字出现 Operation enabled(bit2=1)——从站可能还在 Switch on disabled 或正迁移中,指令被丢弃或行为未定义。每条命令都要等状态字确认,再发下一条,这是伺服通信的铁律。

2. 状态机总览:8 个状态

状态含义典型状态字可做什么
Not ready to switch on初始化中(瞬态)0x0000内部自检,不响应命令
Switch on disabled上电默认态:禁用主回路0x0240SDO 配置、参数下载
Ready to switch on主回路就绪,未通电0x0221—
Switched on主回路通电,未使能运行0x0223—
Operation enabled使能运行:收 PDO 执行运动0x0227位置/速度/力矩控制
Quick stop active快停进行中0x0213按 605A 减速度停机
Fault reaction active故障反应(瞬态)0x0208按 605E 选项处理
Fault故障锁定0x0008只响应 Fault reset

状态字典型值含 bit9(远程=1)与 bit4(电压使能);纯状态位组合见第 4 节。设备上电后进入 Switch on disabled,之后一切操作从这里开始。

3. 控制字 6040h:主站 → 从站的命令位

位名称功能有效逻辑(0 有效 / 1 有效)
bit0Switch on请求通电(进入 Switched on)1 有效:置 1 = 请求上电
bit1Enable voltage使能主回路电压1 有效:置 1 = 允许母线供电
bit2Quick stop快停开关反逻辑(0 有效):1 = 快停使能(常态),0 = 触发急停
bit3Enable operation运行使能(进入 Operation enabled)1 有效:置 1 = 允许电机出力
bit4~6保留(模式相关)部分厂商用于模式特定功能规范保留,写 0
bit7Fault reset故障复位上升沿有效(0→1):电平持续无效,须先回落再触发
bit8Halt暂停(不离开 Operation enabled,按 605D 停止)1 有效:置 1 = 暂停
bit9~10保留规范保留写 0
bit11~15厂商自定义如原点回归触发等视厂商定义
常用命令值效果
Shutdown0x0006(bit1,2=1)→ Ready to switch on
Switch on0x0007(bit0,1,2=1)→ Switched on
Enable operation0x000F(bit0,1,2,3=1)→ Operation enabled
Disable voltage0x0000→ Switch on disabled(断主回路)
Quick stop0x000B(bit2=0 其余保持)→ Quick stop active
Fault reset0x0080(bit7 上升沿)清故障 → Switch on disabled
✅ 控制字不乱的底层逻辑:它就是 4 个开关

把 bit0~bit3 想成 4 个拨杆开关,命令值就是"开关状态快照"——不需要背值,看懂开关就会用(1=推上去,0=拉下来):

命令值bit3 运行bit2 快停bit1 电压bit0 通电语义
0x0000 Disable voltage0000全拉下:断主回路
0x0006 Shutdown0110电压+快停正常:就绪
0x0007 Switch on0111再推上 bit0:通电
0x000F Enable operation1111全推上:使能运行
0x000B Quick stop1011只有 bit2 掉下来:急停
0x0080 Fault reset不碰 0~3 位,只给 bit7 一个上升沿复位故障

记忆心法:使能 = 一路把开关往上推:bit1,2 先推上(0x0006 电压+快停正常)→ 推 bit0(0x0007 通电)→ 推 bit3(0x000F 使能);停机 = 一路往回撤(0x0007→0x0006→0x0000);bit2 全程保持 1——它一掉下来(0x000B)就快停。4 个开关 + 6 个快照,覆盖全部日常操作。

3.1 状态机一图速查:主链 + 分支

Switch on
disabled
0x0240
0x0006
Shutdown
Ready to
switch on
0x0221
0x0007
Switch on
Switched on
0x0223
0x000F
Enable op
Operation
enabled ⭐
0x0227
0x000B
快停 ↓
Quick stop
active
0x0213
0x0006
快停完成
故障 ↓
Fault
0x0008
0x0080
复位
0x0007 去使能
0x0006 退就绪
0x0000 断压

日常就一条主链(0x0006→0x0007→0x000F)和三条旁路(快停 0x000B、断压 0x0000、复位 0x0080)——其他迁移都是它们的组合,看到"乱"是因为把 16 条迁移当 16 个独立命令,其实 6 个命令值 + 4 个开关就覆盖了全部。

4. 状态字 6041h:从站 → 主站的状态位

位名称置 1 时的含义(状态位均 1 有效)
bit0Ready to switch on已就绪
bit1Switched on已通电
bit2Operation enabled已使能运行(最重要)
bit3Fault故障锁定
bit4Voltage enabled主回路电压已使能
bit5Quick stop反逻辑:1 = 快停未激活(常态),0 = 快停激活中
bit6Switch on disabled禁止上电态
bit7Warning有告警(可继续运行)
bit9Remote控制源为总线(本地=0)
bit10Target reached目标到达/零速(模式相关)
bit12~13模式特定如 CSP 的 Follows command
bit15厂商特定如回原点完成
状态位组合(bit0-6)→ 状态判定

Switch on disabled:bit6=1;Ready:bit0=1;Switched on:bit0+bit1;Operation enabled:bit0+bit1+bit2;Quick stop active:bit0+bit1+bit5=0;Fault:bit3=1

判定顺序:先看 bit3(Fault),再看 bit6(disabled),再按 bit0/1/2/5 组合。常用完整值(含 bit4 电压、bit9 远程):0x0240 / 0x0221 / 0x0223 / 0x0227 / 0x0213 / 0x0008——各厂家手册略有差异,以具体驱动器为准

5. 状态迁移命令表:16 条迁移一次讲清

迁移源状态命令(控制字位)目标状态
2Switch on disabledbit1,2=1(0x0006 Shutdown)Ready to switch on
3Ready to switch onbit0,1,2=1(0x0007 Switch on)Switched on
4Switched onbit0,1,2,3=1(0x000F)Operation enabled
5Operation enabledbit0,1,2=1, bit3=0(0x0007)Switched on(停使能)
6Switched onbit1,2=1, bit3=0(0x0006)Ready to switch on
7Ready to switch on / Switched on / Op enabledbit1,2=1, bit0=0, bit3=0(0x0006 Shutdown)Ready to switch on
8Switched onbit0~3=0(0x0000 Disable voltage)Switch on disabled
9Op enabledbit0,1=1、bit2=0(如 0x000B)Quick stop active
10Op enabledbit0~3=0(0x0000 Disable voltage)Switch on disabled
11Quick stop activebit0~3=0(0x0000 Disable voltage)Switch on disabled(快停完成)
12Quick stop activebit1,2=1(0x0006 Shutdown)Ready to switch on(快停完成)
13任何使能状态故障触发(内部)Fault
14Faultbit7 上升沿(0x0080)Switch on disabled(故障已清)
15Fault reaction active内部完成Fault

要点:迁移 7 与 8 的区分——迁移 7 是"从使能退到就绪"(保留 bit0/bit1),迁移 8/10 是"直接断电压回禁用态"。现场最常见的合法路径就是 2→3→4(使能)和 5→6→8(正常停机)。

6. 典型启停序列:一次完整的手把手演示

步骤主站发 6040h等待 6041h状态
1—(上电)0x0240Switch on disabled
20x0006 Shutdown0x0221Ready to switch on
30x0007 Switch on0x0223Switched on
40x000F Enable operation0x0227Operation enabled
5PDO 目标值…0x0227运行中(bit10 目标到达会置位)
60x0007(去使能)0x0223Switched on
70x0006(退就绪)0x0221Ready to switch on
80x0000(断电压)0x0240Switch on disabled

每一步"发命令 → 轮询状态字 → 确认到位 → 发下一条",中间任何一步状态字不符合预期,就停下来查(可能上一步没生效、可能被快停/故障打断)。

7. 快速停止 Quick Stop:bit2 是"急停旋钮"

快停不是"断电",而是按设定减速度受控停机:

8. 故障处理:从 Fault 回来的正确姿势

✅ 故障复位序列

读到 0x0008 → 发 0x0080(bit7 升沿)→ 等状态字回到 0x0240(Switch on disabled)→ 发 0x0000(命令位回落,为下次复位做准备)→ 重新走 Shutdown/Switch on/Enable 使能。

9. 交互演示:发命令看状态机怎么走

点按钮发控制字,右侧状态字实时更新。试试正常使能、快停、注入故障再复位:

CiA 402 状态机演示:发 6040h 命令,看 6041h 应答
当前状态:Switch on disabled · 状态字 0x0240 · 发送 0x0006 开始使能

观察要点:

10. 代码实现(C语言,可编译模块)

从站侧状态机:输入控制字与故障标志,输出新状态与状态字(与交互演示同一套规则):

/* cia402_sm.c — CiA402 状态机核心(精简) */ #include <stdint.h> typedef enum { ST_SWITCH_ON_DISABLED, ST_READY_TO_SWITCH_ON, ST_SWITCHED_ON, ST_OPERATION_ENABLED, ST_QUICK_STOP_ACTIVE, ST_FAULT } cia_state_t; /* 状态位 → 状态字(bit9 远程、bit4 电压使能按运行态附加) */ uint16_t status_word(cia_state_t st, uint8_t remote) { uint16_t w = remote ? 0x0200 : 0; switch (st) { case ST_SWITCH_ON_DISABLED: return w | 0x0040; case ST_READY_TO_SWITCH_ON: return w | 0x0021; /* bit0 + bit4 */ case ST_SWITCHED_ON: return w | 0x0023; case ST_OPERATION_ENABLED: return w | 0x0027; case ST_QUICK_STOP_ACTIVE: return w | 0x0013; /* bit0+bit1+bit4,bit5=0 快停激活中 */ case ST_FAULT: return w | 0x0008; } return 0; } /* 状态迁移:返回新状态。fault 由外部(驱动保护)置位 */ cia_state_t sm_step(cia_state_t st, uint16_t cw, uint8_t fault, uint8_t* reset_edge) { if (fault && st != ST_FAULT) return ST_FAULT; /* 迁移 13 */ if (st == ST_FAULT) { /* 迁移 14:bit7 上升沿复位 */ if ((cw & 0x0080) && *reset_edge) { *reset_edge = 0; return ST_SWITCH_ON_DISABLED; } return ST_FAULT; } *reset_edge = (cw & 0x0080) ? 1 : 0; /* 记上升沿状态 */ switch (st) { case ST_SWITCH_ON_DISABLED: if ((cw & 0x0007) == 0x0006) return ST_READY_TO_SWITCH_ON; /* 迁移 2 */ break; case ST_READY_TO_SWITCH_ON: if ((cw & 0x0007) == 0x0007) return ST_SWITCHED_ON; /* 3 */ if ((cw & 0x000F) == 0x000F) return ST_OPERATION_ENABLED; /* 4 快捷 */ break; case ST_SWITCHED_ON: if ((cw & 0x000F) == 0x000F) return ST_OPERATION_ENABLED; /* 4 */ if ((cw & 0x000F) == 0x0006) return ST_READY_TO_SWITCH_ON; /* 6 */ break; case ST_OPERATION_ENABLED: if ((cw & 0x000F) == 0x0007) return ST_SWITCHED_ON; /* 5 */ if ((cw & 0x000F) == 0x0006) return ST_READY_TO_SWITCH_ON; /* 7 */ if ((cw & 0x0003) == 0x0003 && (cw & 0x0004) == 0) return ST_QUICK_STOP_ACTIVE; /* 9 快停:bit0,1=1 且 bit2=0(如 0x000B) */ if ((cw & 0x0003) == 0) return ST_SWITCH_ON_DISABLED; /* 10 断压:bit0,1=0 */ break; case ST_QUICK_STOP_ACTIVE: if ((cw & 0x0007) == 0x0006) return ST_READY_TO_SWITCH_ON; /* 12 */ if ((cw & 0x0007) == 0x0000) return ST_SWITCH_ON_DISABLED; /* 11 */ break; default: break; } return st; /* 命令无效:状态不变 */ }

调用:PDO 收到新控制字 → sm_step() → 状态字更新后放回 TxPDO;故障标志来自过流/过压/超差保护。注意快停完成(减速到零)由应用按 605A 减速度计时后走迁移 11/12,代码中可用"快停完成"标志替代。

11. 工程避坑清单

坑现象对策
命令连发不等状态字使能不生效、首帧指令丢失每步轮询 6041h 确认到位再发下一条
0x0080 不回落第二次故障复位无效复位后发 0x0000 回落命令位,保证下次上升沿
急停用 Disable voltage直接断主回路、冲击大/伤机械急停用 0x000B 快停(605A 减速度),日常停机用 0x0006
快停后直接 0x000F从站不响应(还在快停/禁用态)先走迁移 12(0x0006)回 Ready 再重新使能
看错状态字 bit9 远程位本地面板操作时读 0x0200 误判判定用 bit0-6 状态位,bit9 只说明控制源
故障未清就复位复位失败/反复故障先读 603Fh 故障码、排除原因,再 0x0080
厂商自定义位当规范位用换驱动器行为变化bit11-15 是厂商区,跨厂移植先查手册

一句话收尾:6040h 是"油门刹车踏板",6041h 是"仪表盘"——会读状态位、会发命令链、会等确认,伺服就永远不会"失控"。这是 CiA 402 应用层的核心基本功,也是 EtherCAT CoE 伺服(对象索引一模一样)直接复用的知识。