1. 为什么伺服启停要"握手":状态机的存在理由
如果主站直接发"转动",从站怎么知道该不该动、动了安全吗?CiA 402(IEC 61800-7)用一台状态机规定:伺服只能按固定路径在状态间迁移,每一次迁移都要主站先给控制字、从站用状态字确认。三个设计动机:
- 安全上电:先切断/确认母线电压安全,才能谈使能——防止上电瞬间电机动一下撞伤人;
- 可预期停机:任何时刻主站都能用明确的命令(Shutdown / Quick stop / Disable voltage)把轴带回安全态,从站行为可预期;
- 故障可追溯:故障进入 Fault 态,主站必须显式复位(0x0080 上升沿)才能重新使能——避免故障后自动重启伤人。
写完 0x000F(Enable operation)立刻发位置指令,不等状态字出现 Operation enabled(bit2=1)——从站可能还在 Switch on disabled 或正迁移中,指令被丢弃或行为未定义。每条命令都要等状态字确认,再发下一条,这是伺服通信的铁律。
2. 状态机总览:8 个状态
| 状态 | 含义 | 典型状态字 | 可做什么 |
|---|---|---|---|
| Not ready to switch on | 初始化中(瞬态) | 0x0000 | 内部自检,不响应命令 |
| Switch on disabled | 上电默认态:禁用主回路 | 0x0240 | SDO 配置、参数下载 |
| 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 有效) |
|---|---|---|---|
| bit0 | Switch on | 请求通电(进入 Switched on) | 1 有效:置 1 = 请求上电 |
| bit1 | Enable voltage | 使能主回路电压 | 1 有效:置 1 = 允许母线供电 |
| bit2 | Quick stop | 快停开关 | 反逻辑(0 有效):1 = 快停使能(常态),0 = 触发急停 |
| bit3 | Enable operation | 运行使能(进入 Operation enabled) | 1 有效:置 1 = 允许电机出力 |
| bit4~6 | 保留(模式相关) | 部分厂商用于模式特定功能 | 规范保留,写 0 |
| bit7 | Fault reset | 故障复位 | 上升沿有效(0→1):电平持续无效,须先回落再触发 |
| bit8 | Halt | 暂停(不离开 Operation enabled,按 605D 停止) | 1 有效:置 1 = 暂停 |
| bit9~10 | 保留 | 规范保留 | 写 0 |
| bit11~15 | 厂商自定义 | 如原点回归触发等 | 视厂商定义 |
| 常用命令 | 值 | 效果 |
|---|---|---|
| Shutdown | 0x0006(bit1,2=1) | → Ready to switch on |
| Switch on | 0x0007(bit0,1,2=1) | → Switched on |
| Enable operation | 0x000F(bit0,1,2,3=1) | → Operation enabled |
| Disable voltage | 0x0000 | → Switch on disabled(断主回路) |
| Quick stop | 0x000B(bit2=0 其余保持) | → Quick stop active |
| Fault reset | 0x0080(bit7 上升沿) | 清故障 → Switch on disabled |
把 bit0~bit3 想成 4 个拨杆开关,命令值就是"开关状态快照"——不需要背值,看懂开关就会用(1=推上去,0=拉下来):
| 命令值 | bit3 运行 | bit2 快停 | bit1 电压 | bit0 通电 | 语义 |
|---|---|---|---|---|---|
| 0x0000 Disable voltage | 0 | 0 | 0 | 0 | 全拉下:断主回路 |
| 0x0006 Shutdown | 0 | 1 | 1 | 0 | 电压+快停正常:就绪 |
| 0x0007 Switch on | 0 | 1 | 1 | 1 | 再推上 bit0:通电 |
| 0x000F Enable operation | 1 | 1 | 1 | 1 | 全推上:使能运行 |
| 0x000B Quick stop | 1 | 0 | 1 | 1 | 只有 bit2 掉下来:急停 |
| 0x0080 Fault reset | 不碰 0~3 位,只给 bit7 一个上升沿 | 复位故障 | |||
记忆心法:使能 = 一路把开关往上推:bit1,2 先推上(0x0006 电压+快停正常)→ 推 bit0(0x0007 通电)→ 推 bit3(0x000F 使能);停机 = 一路往回撤(0x0007→0x0006→0x0000);bit2 全程保持 1——它一掉下来(0x000B)就快停。4 个开关 + 6 个快照,覆盖全部日常操作。
3.1 状态机一图速查:主链 + 分支
disabled
0x0240
Shutdown
switch on
0x0221
Switch on
0x0223
Enable op
enabled ⭐
0x0227
快停 ↓
active
0x0213
快停完成
0x0008
复位
0x0006 退就绪
0x0000 断压
日常就一条主链(0x0006→0x0007→0x000F)和三条旁路(快停 0x000B、断压 0x0000、复位 0x0080)——其他迁移都是它们的组合,看到"乱"是因为把 16 条迁移当 16 个独立命令,其实 6 个命令值 + 4 个开关就覆盖了全部。
4. 状态字 6041h:从站 → 主站的状态位
| 位 | 名称 | 置 1 时的含义(状态位均 1 有效) |
|---|---|---|
| bit0 | Ready to switch on | 已就绪 |
| bit1 | Switched on | 已通电 |
| bit2 | Operation enabled | 已使能运行(最重要) |
| bit3 | Fault | 故障锁定 |
| bit4 | Voltage enabled | 主回路电压已使能 |
| bit5 | Quick stop | 反逻辑:1 = 快停未激活(常态),0 = 快停激活中 |
| bit6 | Switch on disabled | 禁止上电态 |
| bit7 | Warning | 有告警(可继续运行) |
| bit9 | Remote | 控制源为总线(本地=0) |
| bit10 | Target reached | 目标到达/零速(模式相关) |
| bit12~13 | 模式特定 | 如 CSP 的 Follows command |
| bit15 | 厂商特定 | 如回原点完成 |
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 条迁移一次讲清
| 迁移 | 源状态 | 命令(控制字位) | 目标状态 |
|---|---|---|---|
| 2 | Switch on disabled | bit1,2=1(0x0006 Shutdown) | Ready to switch on |
| 3 | Ready to switch on | bit0,1,2=1(0x0007 Switch on) | Switched on |
| 4 | Switched on | bit0,1,2,3=1(0x000F) | Operation enabled |
| 5 | Operation enabled | bit0,1,2=1, bit3=0(0x0007) | Switched on(停使能) |
| 6 | Switched on | bit1,2=1, bit3=0(0x0006) | Ready to switch on |
| 7 | Ready to switch on / Switched on / Op enabled | bit1,2=1, bit0=0, bit3=0(0x0006 Shutdown) | Ready to switch on |
| 8 | Switched on | bit0~3=0(0x0000 Disable voltage) | Switch on disabled |
| 9 | Op enabled | bit0,1=1、bit2=0(如 0x000B) | Quick stop active |
| 10 | Op enabled | bit0~3=0(0x0000 Disable voltage) | Switch on disabled |
| 11 | Quick stop active | bit0~3=0(0x0000 Disable voltage) | Switch on disabled(快停完成) |
| 12 | Quick stop active | bit1,2=1(0x0006 Shutdown) | Ready to switch on(快停完成) |
| 13 | 任何使能状态 | 故障触发(内部) | Fault |
| 14 | Fault | bit7 上升沿(0x0080) | Switch on disabled(故障已清) |
| 15 | Fault reaction active | 内部完成 | Fault |
要点:迁移 7 与 8 的区分——迁移 7 是"从使能退到就绪"(保留 bit0/bit1),迁移 8/10 是"直接断电压回禁用态"。现场最常见的合法路径就是 2→3→4(使能)和 5→6→8(正常停机)。
6. 典型启停序列:一次完整的手把手演示
| 步骤 | 主站发 6040h | 等待 6041h | 状态 |
|---|---|---|---|
| 1 | —(上电) | 0x0240 | Switch on disabled |
| 2 | 0x0006 Shutdown | 0x0221 | Ready to switch on |
| 3 | 0x0007 Switch on | 0x0223 | Switched on |
| 4 | 0x000F Enable operation | 0x0227 | Operation enabled |
| 5 | PDO 目标值… | 0x0227 | 运行中(bit10 目标到达会置位) |
| 6 | 0x0007(去使能) | 0x0223 | Switched on |
| 7 | 0x0006(退就绪) | 0x0221 | Ready to switch on |
| 8 | 0x0000(断电压) | 0x0240 | Switch on disabled |
每一步"发命令 → 轮询状态字 → 确认到位 → 发下一条",中间任何一步状态字不符合预期,就停下来查(可能上一步没生效、可能被快停/故障打断)。
7. 快速停止 Quick Stop:bit2 是"急停旋钮"
快停不是"断电",而是按设定减速度受控停机:
- 触发:运行中把控制字 bit2 清 0(如发 0x000B,即 0x000F 保持 bit0/1/3 只清 bit2)→ 从站进 Quick stop active,按 605Ah 快速停止减速度减速到零;
- 停止选项:605Bh 决定停稳后进哪个状态(默认 → Switch on disabled);
- 恢复:快停完成后迁移 12(发 0x0006)回 Ready,或直接迁移 11 进 Switch on disabled;
- 对比:Shutdown(0x0006)是斜坡停机(按 6085/6086 减速度)、Disable voltage(0x0000)是立即切断主回路——三种停机语义不同,急停选快停,日常停机选 Shutdown。
8. 故障处理:从 Fault 回来的正确姿势
- 从站内部故障 → 状态字 bit3=1(0x0008),进 Fault 态,按 605Eh 故障反应选项处理(停机/自由/维持);
- 故障原因在 603Fh(故障码)等对象里,先读原因再复位;
- 复位必须上升沿:发 0x0080(bit7=1)→ 从站清故障回 Switch on disabled → 再发 0x0000 复位命令位,下次故障才能再触发上升沿——一直发 0x0080 不回落,等于永远没有复位,这是现场高频 bug。
读到 0x0008 → 发 0x0080(bit7 升沿)→ 等状态字回到 0x0240(Switch on disabled)→ 发 0x0000(命令位回落,为下次复位做准备)→ 重新走 Shutdown/Switch on/Enable 使能。
9. 交互演示:发命令看状态机怎么走
点按钮发控制字,右侧状态字实时更新。试试正常使能、快停、注入故障再复位:
观察要点:
- 状态迁移必须"链式"合法:没到 Ready 就发 0x000F 会被忽略(命令无效,状态不变);
- 运行中发 0x000B(bit2=0)进 Quick stop active,状态字 bit5 变 0;
- 注入故障进 Fault(0x0008)后,只有 0x0080 上升沿能复位——先回落 0x0000 再发 0x0080 才有效。
10. 代码实现(C语言,可编译模块)
从站侧状态机:输入控制字与故障标志,输出新状态与状态字(与交互演示同一套规则):
调用: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 伺服(对象索引一模一样)直接复用的知识。