电机控制常见问题
伺服/步进电机使能成功但无法运动,或运动行为异常时的排查指南。
核心原则
CiA 402 标准定义了通用接口,但不同厂商的私有对象和默认值差异极大。同一个操作模式在 A 品牌正常工作,换到 B 品牌可能完全失败。遇到问题时,务必参考具体设备的手册。
通用排查方法论
遇到电机控制问题时,按照以下分层思路排查。每层确认通过后再进入下一层,避免在错误的层级浪费时间。
第一层:通信是否正常?
电机控制的前提是 EtherCAT 通信链路正常。
| 检查项 | 方法 | 预期结果 |
|---|---|---|
| 主站是否到 OP | master.State | EcState.OP |
| 从站是否到 OP | 读 0x6041 或 slave.State | 不为 0x0000 |
| PDO 是否有效 | slave.PDO.Ibytes > 0 | 输入字节数 > 0 |
| PDO 数据是否刷新 | 连续读 StatusWord 观察变化 | 不全为零、有变化 |
如果本层不通过,问题在网络/配置层,不是电机控制问题。参考 设备无法连接或控制。
第二层:CiA 402 状态机是否正确推进?
电机必须到达 Operation Enabled 状态才能运动。
排查步骤:
-
读取 StatusWord (0x6041),用掩码解析当前状态:
(sw & 0x4F) == 0x40 → Switch on disabled (需发 0x06)
(sw & 0x6F) == 0x21 → Ready to switch on (需发 0x07)
(sw & 0x6F) == 0x23 → Switched on (需发 0x0F)
(sw & 0x6F) == 0x27 → Operation enabled ✅
(sw & 0x4F) == 0x08 → Fault (需发 0x80 复位) -
如果卡在某个状态不推进:
- 检查 Controlword 是否在每个 PDO 周期持续写入(不是只写一次)
- 部分驱动器要求状态间有延时,每步等待 StatusWord 确认后再推进
- 检查是否有 Fault (bit3=1),先复位再重新使能
-
如果反复 Fault:
- 读 0x603F (Error Code) 获取具体错误码
- 读 0x1003 (Pre-defined Error Field) 获取错误历史
- 对照设备手册查询错误码含义
第三层:操作模式是否生效?
写入模式后必须验证是否被驱动器接受。
- 写入 0x6060 (Modes of Operation) = 目标模式值
- 读取 0x6061 (Modes of Operation Display) 确认返回值一致
- 如果不一致:
- 驱动器可能不支持该模式(查 ESI 或手册中 Supported Modes)
- 部分驱动器要求在特定状态下切换模式(如只允许在 Switched On 状态切换)
第四层:驱动器内部是否有保护机制阻止运动?
这是最容易被忽略的一层。驱动器到达 Operation Enabled 后仍不运动,通常是某种保护机制在起作用。
4a. 硬件限位保护
关键认知:不同操作模式对限位的响应完全不同。
- CSP 模式:多数驱动器忽略硬件限位(主站负责限位保护)
- PP/PV/HM 模式:驱动器内部轨迹规划器检查限位,触发时 QuickStop 或拒绝运动
排查:
- 读 0x60FD (Digital Inputs),检查 bit0 (负限位)、bit1 (正限位)、bit2 (Home 开关)
- 未接物理开关时,如果限位 bit 为 1 → 默认常闭逻辑导致未接线 = 限位触发
- 在设备手册中搜索关键词:
limit、limit stop、sensor logic、input polarity - 找到控制限位行为的私有对象后,通过 SDO 或 Startup 参数修改
4b. 软件限位保护
- 0x607D (Software Position Limit):子索引 1 = 最小位置,子索引 2 = 最大位置
- 如果目标位置超出范围,驱动器拒绝运动
- 排查:读 0x607D:01 和 0x607D:02,确认目标位置在范围内
4c. 厂商特定保护
- 不同厂商有自己的保护对象(安全逻辑、使能条件、输入配置等)
- 唯一可靠的方法是查设备手册
- 在手册中搜索关键词:
protection、inhibit、enable condition、interlock
第五层:运动参数是否正确?
到达 Operation Enabled 且无保护阻止后,检查运动命令本身。
PP 模式排查
| 检查项 | 对象 | 要求 |
|---|---|---|
| 轮廓速度 | 0x6081 ProfileVelocity | 必须 > 0 |
| 轮廓加速度 | 0x6083 ProfileAcceleration | 建议 > 0 (为 0 时部分驱动器拒绝) |
| 轮廓减速度 | 0x6084 ProfileDeceleration | 建议 > 0 |
| 目标位置初始值 | 0x607A TargetPosition | 首次应 = ActualPosition (0x6064) |
| 定位容差 | 0x6067 Position Window | 默认 0 = 精确到达,建议设非零值 |
| bit4 上升沿 | Controlword | 时序: 0x0F → 0x1F → 等 bit12 → 0x0F |
PP 模式 bit4 握手时序(关键):
状态0: 空闲 → cw=0x0F, TargetPosition=ActualPosition
状态1: 准备 → cw=0x0F, 写入 TargetPosition=目标值, 等待数周期稳定
状态2: 触发 → cw=0x1F (bit4=1), 等待 StatusWord bit12 (SetPointAck)
状态3: 清除 → cw=0x0F (bit4=0), 等待 bit12 清除
状态4: 等待 → cw=0x0F, 等待 StatusWord bit10 (TargetReached)
CSP 模式排查
| 检查项 | 要求 |
|---|---|
| 目标位置连续性 | 每周期平滑递增/递减,不能突变 |
| 初始目标位置 | 第一个周期必须 = ActualPosition |
| PDO 结构体字段顺序 | 必须与 PDO 映射顺序一致 |
| DC 同步 | CSP 必须配置 DC Sync0 |
| 周期稳定性 | CSP 建议使用 DarraRT 实时驱动 |
第六层:同步方式是否匹配?
同步配置不当会导致驱动器报错或行为异常。
| 操作模式 | 同步要求 |
|---|---|
| CSP/CSV/CST | 必须 DC Sync0 |
| PP/PV/PT | Free Run 即可 |
| HM (回零) | Free Run 即可 |
Free Run 配置方法:
// PreOp 阶段写入 (标准 CiA 402 对象,非厂商特定)
slave.CoE.SDOWrite(0x1C32, 1, BitConverter.GetBytes((ushort)0x0000)); // SM2 SyncType = Free Run
slave.CoE.SDOWrite(0x1C33, 1, BitConverter.GetBytes((ushort)0x0000)); // SM3 SyncType = Free Run
为什么 PP 不需要 DC?
PP 模式下轨迹由驱动器内部规划,主站只发送目标位置和触发信号。驱动器使用自己的内部定时器执行轨迹,不依赖主站周期精度。CSP 则相反——主站每周期发送精确位置,驱动器直接跟随,因此必须 DC 同步。
排查流程图
电机不运动
│
├─ 主站不在 OP? ──────→ 检查网络/配置 (参考 device-troubleshooting)
│
├─ 从站不在 Op Enabled? → 检查 CiA 402 状态机推进 + Fault 复位
│
├─ 操作模式不生效? ────→ 检查 0x6061 读回值 + 驱动器支持的模式
│
├─ 有保护阻止? ────────→ 检查限位 (0x60FD) + 软限位 (0x607D) + 厂商私有对象
│ ⚠️ CSP 正常但 PP 不动 → 大概率是限位保护
│
├─ 运动参数错误? ──────→ PP: 速度/加速度非零 + bit4 上升沿时序
│ CSP: 目标位置连续 + 初始值=当前位置
│
└─ 同步方式不匹配? ───→ PP/PV/HM 用 Free Run; CSP/CSV/CST 用 DC Sync0