运动控制教程
适用对象: PLC 工程师、自动化工程师、运动控制初学者 前置知识: 了解 SCL 基本语法、了解伺服/步进电机基本概念 学习目标: 掌握 Darra PLC 运动控制体系的全部核心概念,能独立完成单轴定位、多轴插补、电子齿轮/凸轮等常见运动控制任务
1. 运动控制概述
1.1 运动控制在工业自动化中的角色
运动控制是工业自动化的"肌肉系统"——PLC 是大脑,IO 是感官,运动控制让机器真正动起来。从最简单的传送带到精密的五轴加工中心,运动控制无处不在。
常见应用场景:
| 应用 | 轴数 | 控制要求 | 典型设备 |
|---|---|---|---|
| 传送带定位 | 1~2 轴 | 点到点,精度 ±0.5mm | 食品包装、物流分拣 |
| XY 工作台 | 2 轴 | 直线/圆弧插补,精度 ±0.02mm | 点胶机、激光打标、AOI 检测 |
| 飞剪/追剪 | 1~2 轴同步 | 电子凸轮,相位同步 | 印刷机、包装机、造纸 |
| 龙门同步 | 2 轴 | 双驱防扭,跟随误差 < 1 脉冲 | 大型雕刻机、3D 打印机 |
| 6 轴机器人 | 6 轴 | 多轴协调,正逆运动学 | 搬运、焊接、喷涂 |
| CNC 加工 | 3~5 轴 | 插补 + 前瞻,微秒级 | 数控铣床、车床 |
1.2 Darra 运动控制架构
Darra 运动控制严格遵循 PLCopen Motion Control 标准(IEC 61131-3 扩展部分),并兼容 CiA 402(CANopen/EtherCAT 驱动配置文件)标准。
┌─────────────────────────────────────────────────────┐
│ IDE (工程师电脑) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐│
│ │ 轴配置向导 │ │ 电子凸轮编辑器│ │ 示波器/调试 ││
│ └──────────────┘ └──────────────┘ └──────────────┘│
└──────────────────────┬──────────────────────────────┘
│ DarraLink 18821
┌──────────────────────▼──────────────────────────────┐
│ Darra.PLC.Service (现场永驻) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐│
│ │ PLCopen MC │ │ 轨迹规划器 │ │ 电子凸轮引擎 ││
│ │ 功能块运行时 │ │ (T/S 曲线) │ │ (CAM 表) ││
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘│
└──────────┼─────────────────┼─────────────────┼───────┘
│ GlobalIO Section (零拷贝)
┌──────────▼─────────────────▼─────────────────▼───────┐
│ DarraRT_PLC.sys (1ms 实时周期) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐│
│ │ 位置环 │ │ 插补器 │ │ 同步管理器 ││
│ │ (PID + 前馈) │ │ (直线/圆弧) │ │ (齿轮/凸轮) ││
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘│
└──────────┼─────────────────┼─────────────────┼───────┘
│ EtherCAT
┌──────────▼─────────────────▼─────────────────▼───────┐
│ 伺服驱动器 / 步进驱动器 │
│ 松下 MINAS A6B │ 台达 ASDA-A3 │ 汇川 IS620N │
└───────────────────────────────────────────────────────┘
三层分工:
| 层 | 组件 | 职责 | 实时性 |
|---|---|---|---|
| 策略层 | PLC 程序(SCL) | 调用 MC_* 功能块,编排运动逻辑 | 非实时 (PLC 周期) |
| 规划层 | Service 轨迹规划器 | 生成位置/速度/力矩曲线,CAM 查表 | 1ms 周期 |
| 执行层 | RT 内核 + 驱动器 | 位置环闭环,电流环控制,编码器反馈 | 50μs~250μs |
1.3 轴类型
Darra 支持三种轴类型:
| 轴类型 | 驱动方式 | 定位精度 | 典型应用 | 成本 |
|---|---|---|---|---|
| 虚拟轴 (Virtual Axis) | 纯软件计算,无物理电机 | 无限 | 主轴同步、CAM 主编码器、仿真 | 免费 |
| 伺服轴 (Servo Axis) | 伺服驱动器 + 编码器闭环 | ±0.01mm | 精密定位、插补、力矩控制 | 高 |
| 步进轴 (Stepper Axis) | 步进驱动器 + 脉冲方向 | ±0.05mm | 低成本定位、点胶、小型平台 | 低 |
选型口诀: 要精度选伺服,要成本选步进,做同步用虚拟轴。
// 轴类型在轴配置中定义,程序中通过轴引用变量使用
VAR
// 伺服轴
ServoX : AXIS_REF;
// 步进轴
StepperY : AXIS_REF;
// 虚拟轴(作为主轴)
MasterEncoder : AXIS_REF;
END_VAR
1.4 轴组
轴组 (Group) 将多个轴组合成一个逻辑单元,用于多轴协调运动:
| 轴组类型 | 包含轴数 | 用途 | 运动学 |
|---|---|---|---|
| 单轴组 | 1 轴 | 独立轴控制 | 无 |
| 多轴插补组 | 2~6 轴 | XY 工作台、XYZ 平台 | 直线/圆弧插补 |
| 机器人组 | 4~6 轴 | 关节机器人 | 正/逆运动学 |
| CNC 通道 | 3~5 轴 | 数控加工 | G 代码解析 + 前瞻 |
1.5 坐标系
Darra 运动控制涉及三种坐标系:
工件坐标系 (WCS) 笛卡尔坐标系 (MCS) 轴坐标系
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ 相对于工件 │ │ 相对于机器 │ │ 各轴独立角度 │
│ 的编程坐标 │ │ 基座标系 │ │ 或位置 │
│ │ │ │ │ │
│ 工件原点偏移 │ ───→ │ 机器原点 │ ───→ │ J1=30° │
│ 工件旋转 │ 变换 │ X=100,Y=200 │ 逆运动学 │ J2=-15° │
│ │ │ Z=50 │ │ J3=120° │
└──────────────┘ └──────────────┘ └──────────────┘
| 坐标系 | 说明 | 编程方式 |
|---|---|---|
| 轴坐标系 (Axis) | 各轴独立的位置/角度值 | MC_MoveAbsolute 直接设 Position |
| 笛卡尔坐标系 (MCS) | 机器基座中心的 X/Y/Z 直角坐标 | MC_MoveLinear 走直线 |
| 工件坐标系 (WCS) | 相对工件原点的编程坐标 | MC_SetCartesianTransform 偏移 |
2. 轴配置
2.1 轴参数
在 Darra IDE 中配置轴参数,每个轴有一组统一的参数表:
┌─ 轴配置 ───────────────────────────────────────────────┐
│ 轴名称: Axis_X │
│ 轴类型: [伺服] 步进 虚拟 │
│ │
│ ── 基本参数 ── │
│ 驱动器品牌: [松下 MINAS A6B] 台达 汇川 自定义 │
│ 驱动器站号: 3 (EtherCAT 从站号) │
│ 编码器类型: [增量式] 绝对值 SSI BiSS Endat │
│ 编码器分辨率: 8388608 (23 位绝对值) │
│ │
│ ── 运动参数 ── │
│ 最大速度: 500.0 mm/s │
│ 最大加速度: 5000.0 mm/s² │
│ 最大减速度: 5000.0 mm/s² │
│ 最大跃度: 50000.0 mm/s³ │
│ 软限位正: 500.0 mm │
│ 软限位负: -500.0 mm │
│ 急停减速度: 10000.0 mm/s² │
│ │
│ ── 回零参数 ── │
│ 回零方式: [7: 限位开关 + Z 脉冲] │
│ 回零速度: 50.0 mm/s │
│ 回零逼近速度: 10.0 mm/s │
│ 回零偏移: 0.5 mm │
│ │
│ ── 单位换算 ── │
│ 每转脉冲数: 8388608 │
│ 丝杠螺距: 10.0 mm │
│ 减速比: 1:1 │
│ 显示单位: [mm] 度 脉冲 │
└─────────────────────────────────────────────────────────┘
关键参数说明:
| 参数 | 说明 | 设置建议 |
|---|---|---|
| 最大速度 | 轴允许的最高运行速度 | 不超过驱动器额定转速的 80% |
| 最大加速度 | 轴允许的最大加速度 | 由负载惯量决定,过大导致机械振动 |
| 最大跃度 (Jerk) | 加速度变化率 | 限制启停冲击,通常为加速度的 5~10 倍 |
| 软限位 | 软件位置限制,比硬限位早触发 | 硬限位向内 1~5mm |
| 急停减速度 | 紧急停止时的减速度 | 通常是最大加速度的 2~3 倍 |
2.2 编码器类型
| 编码器类型 | 分辨率 | 特点 | 适用场景 |
|---|---|---|---|
| 增量式 | 1000~5000 PPR | 断电丢失位置,需回零 | 步进电机、低端伺服 |
| 绝对值单圈 | 12~17 位 | 单圈内可知位置 | 旋转台、分度盘 |
| 绝对值多圈 | 16/23 位 + 4096 圈 | 断电保留位置,无需回零 | 精密伺服,推荐 |
| SSI | 12~25 位 | 同步串行接口,抗干扰强 | 远距离编码器 |
| BiSS | 12~26 位 | 开放协议,高速实时 | 高端伺服、机器人 |
| Endat | 12~29 位 | Heidenhain 专有,高精度 | 数控机床、光栅尺 |
推荐配置: 新项目统一使用绝对值多圈编码器(23 位 + 4096 圈),断电不丢位置,生产时无需每次回零。
2.3 驱动器配置
Darra 已预置主流伺服驱动器的参数模板,无需手动配置每个参数:
| 品牌 | 型号 | 通讯协议 | 支持模式 | 推荐场景 |
|---|---|---|---|---|
| 松下 | MINAS A6B | EtherCAT | pp, pv, pt, hm, csp, csv, cst | 通用,性价比高 |
| 松下 | MINAS A6N | EtherCAT | pp, pv, hm, csp | 标准定位 |
| 台达 | ASDA-A3 | EtherCAT | pp, pv, pt, hm, csp, csv, cst | 高性能 |
| 台达 | ASDA-B3 | EtherCAT | pp, pv, hm, csp | 经济型 |
| 汇川 | IS620N | EtherCAT | pp, pv, pt, hm, csp, csv, cst | 国产高性能 |
| 汇川 | SV660N | EtherCAT | pp, pv, hm, csp | 标准伺服 |
| 西门子 | V90 | PROFINET | pp, pv, hm, csp | 西门子生态 |
| 三菱 | MR-J4/JE | CC-Link IE | pp, pv, hm, csp | 三菱生态 |
// 在 IDE 中配置好驱动器后,程序中直接使用轴引用
// 无需再写驱动器初始化代码
// 轴参数自动通过 EtherCAT CoE 下装到驱动器
2.4 回零方式
回零(Homing)是让轴找到机械原点的过程。Darra 支持 10 种 PLCopen 标准回零模式:
| 模式 | 编号 | 描述 | 传感器 | 适用场景 |
|---|---|---|---|---|
| 不回零 | 0 | 当前位置设为原点 | 无 | 绝对值编码器 |
| 负限位+Z | 1 | 找负限位→反向找 Z 脉冲 | 负限位+Z 脉冲 | 常用 |
| 正限位+Z | 2 | 找正限位→反向找 Z 脉冲 | 正限位+Z 脉冲 | 常用 |
| 原点开关+Z | 3 | 找原点开关→继续找 Z 脉冲 | 原点开关+Z 脉冲 | 推荐 |
| 正限位+原点+Z | 4 | 正限位→原点开关→Z 脉冲 | 正限位+原点+Z | 闭环 |
| 负限位+原点+Z | 5 | 负限位→原点开关→Z 脉冲 | 负限位+原点+Z | 闭环 |
| 限位-挡块 | 6 | 碰限位挡块回弹 | 限位挡块 | 低成本 |
| 限位+Z-挡块 | 7 | 碰挡块+找 Z 脉冲 | 挡块+Z 脉冲 | 常用 |
| 直接设原点 | 8 | 当前位置直接设为 0 | 无 | 调试阶段 |
| 距离测量 | 9 | 从触发点移动固定距离 | 原点开关 | 特殊 |
推荐配置:
// 推荐方式 3: 原点开关 + Z 脉冲(最准确)
// 适用于大多数伺服轴
HomeCmd(
Axis := Axis1,
Execute := TRUE,
HomeMode := 3, // 模式 3: 原点开关 + Z 脉冲
Position := 0.0, // 原点位置
Velocity := 50.0, // 快速寻找速度
Acceleration := 500.0, // 加速度
HomeSwitchVelocity := 10.0 // 逼近速度(碰到开关后减速)
);
回零过程图解(模式 3: 原点开关 + Z 脉冲):
速度 ↑
│
│ 快速正向 (50mm/s) 减速
│ ┌────────────────→ ←──────┐
│ 逼近 (10mm/s)
│ ──────→┐
│ │ 找 Z 脉冲
│ │ → │
│ │ Z│──→ 停止
│ ←────┘
│ │
└────────────────────────────────────┴──────→ 位置
原点偏移 0.5mm
↑
原点位置
常见错误:
| 错误现象 | 原因 | 解决 |
|---|---|---|
| 回零超时 | 限位开关/原点开关故障 | 检查传感器接线和 IO 状态 |
| 回零方向反 | 回零方向参数设置错 | 检查 HomeDirection 参数 |
| Z 脉冲找不到 | 编码器信号弱或干扰 | 检查编码器线缆和屏蔽接地 |
| 回零位置不准 | 回零偏移参数错误 | 重新测量并设置偏移量 |
2.5 单位换算
Darra 自动处理单位换算,但理解原理有助于排查问题:
脉冲数 电机旋转圈数 直线位移
┌───────────┐ ┌───────────┐ ┌───────────┐
│ 8388608 │ → │ 1 圈 │ → │ 10 mm │
│ 脉冲 │ │ 编码器 │ │ 丝杠螺距 │
└───────────┘ └───────────┘ └───────────┘
位置 [mm] = 脉冲数 ÷ 编码器分辨率 × 螺距 ÷ 减速比
示例:
脉冲数 = 5000000
编码器分辨率 = 8388608 (23 位)
螺距 = 10 mm
减速比 = 1:1
位置 = 5000000 / 8388608 × 10 / 1 = 5.96 mm
配置示例:
| 机械结构 | 编码器分辨率 | 螺距/转 | 减速比 | 单位换算 |
|---|---|---|---|---|
| 丝杠直连 | 8388608 | 10 mm | 1:1 | 1.19 脉冲/μm |
| 丝杠+减速器 | 8388608 | 10 mm | 3:1 | 3.58 脉冲/μm |
| 旋转台 | 8388608 | 360° | 10:1 | 0.00043°/脉冲 |
| 同步带 | 8388608 | 100 mm/圈 | 2:1 | 0.024 μm/脉冲 |
3. 单轴运动
单轴运动是运动控制的基础。Darra 提供完整的 PLCopen 单轴功能块集。
3.1 MC_Power — 伺服使能/断电
功能: 控制伺服驱动器的使能状态。使用轴之前必须先使能。
参数表:
| 参数 | 类型 | 说明 |
|---|---|---|
| Axis | AXIS_REF | 轴引用 |
| Enable | BOOL | TRUE=使能,FALSE=断电 |
| Status | BOOL | 使能状态 |
| Busy | BOOL | 正在执行 |
| Error | BOOL | 错误标志 |
| ErrorID | UINT | 错误码 |
时序图:
Enable ──┐ ┌─────────────────────────
│ │
└──┘
Status ┌─────────────────────────
────┘
↑ ↑
使能中 使能完成
(约 50ms)
SCL 示例:
PROGRAM AxisPowerCtrl
VAR
// 功能块实例
PowerX : MC_Power;
PowerY : MC_Power;
// 控制信号
bEnable : BOOL := TRUE;
bAllReady : BOOL;
END_VAR
// 使能 X 轴
PowerX(
Axis := Axis_X,
Enable := bEnable
);
// 使能 Y 轴
PowerY(
Axis := Axis_Y,
Enable := bEnable
);
// 两个轴都使能完成才返回 Ready
IF PowerX.Status AND PowerY.Status THEN
bAllReady := TRUE;
ELSE
bAllReady := FALSE;
END_IF;
注意事项:
- 使能需要时间(约 50~200ms),不要立即发运动指令
- 使能失败检查:急停回路、安全门、驱动器报警
- 断电前必须先 MC_Stop 停止运动
3.2 MC_Home — 回原点
功能: 执行回零操作,建立坐标系的参考点。
参数表:
| 参数 | 类型 | 说明 |
|---|---|---|
| Axis | AXIS_REF | 轴引用 |
| Execute | BOOL | 上升沿触发 |
| Position | REAL | 回零后设置的位置值 |
| Mode | INT | 回零模式 (0~9) |
| Velocity | REAL | 高速寻找速度 |
| Acceleration | REAL | 加速度 |
| HomeSwitchVelocity | REAL | 逼近速度(碰到开关后) |
| Done | BOOL | 完成标志 |
| Busy | BOOL | 正在执行 |
| CommandAborted | BOOL | 被中止 |
| Error | BOOL | 错误标志 |
| ErrorID | UINT | 错误码 |
SCL 示例:
PROGRAM HomeSequence
VAR
HomeX : MC_Home;
bHomeCmd : BOOL;
bHomed : BOOL;
step : INT := 0;
END_VAR
// 边沿触发
IF bHomeCmd AND NOT bHomeCmd_Old THEN
bHomeCmd := TRUE;
END_IF;
bHomeCmd_Old := bHomeCmd;
CASE step OF
0: // 等待回零指令
IF bHomeCmd THEN
step := 1;
END_IF;
1: // 执行回零
HomeX(
Axis := Axis_X,
Execute := TRUE,
Mode := 3, // 模式 3: 原点开关 + Z 脉冲
Position := 0.0, // 原点位置设为 0
Velocity := 50.0, // 50 mm/s
Acceleration := 500.0,
HomeSwitchVelocity := 10.0 // 10 mm/s 逼近
);
IF HomeX.Done THEN
HomeX(Execute := FALSE);
bHomed := TRUE;
step := 0;
END_IF;
IF HomeX.Error THEN
// 处理错误
bHomed := FALSE;
step := 0;
END_IF;
END_CASE;
回零轨迹图(模式 3):
原点开关
───┐───
│
────────┘──────── 位置
↑
│
│
50mm/s ──→│ 10mm/s ──→
│ │
│ │→ Z 脉冲 → 原点偏移 0.5mm
3.3 MC_MoveAbsolute — 绝对定位
功能: 将轴移动到指定的绝对位置。不管当前位置在哪,都是相对于坐标系原点的位置。
参数表:
| 参数 | 类型 | 说明 |
|---|---|---|
| Axis | AXIS_REF | 轴引用 |
| Execute | BOOL | 上升沿触发 |
| Position | REAL | 目标位置(单位: mm, 度, 脉冲) |
| Velocity | REAL | 最大速度 |
| Acceleration | REAL | 加速度 |
| Deceleration | REAL | 减速度(默认为 Acceleration) |
| Jerk | REAL | 跃度(默认为 0=不使用) |
| Direction | INT | 方向(0=最短路径, 1=正, 2=负) |
| BufferMode | INT | 运动衔接模式 |
| Done | BOOL | 到达目标位置 |
| Busy | BOOL | 正在执行 |
| Active | BOOL | 已被调度器接收 |
| CommandAborted | BOOL | 被中止 |
| Error | BOOL | 错误标志 |
| ErrorID | UINT | 错误码 |
运动轨迹图:
位置 ↑
│ ╱╲
│ ╱ ╲
│ ╱ ╲
│ ╱ ╲
│ ╱ ╲
│ ╱ ╲
│ ╱ ╲
│ 当前位置 ╱ ╲ 目标位置 100mm
│ 0mm ╱ ╲
└─────────┴──────────────────┴──────→ 时间
↑ ↑
加速段 减速段
(T 曲线) (S 曲线)
SCL 示例:
PROGRAM SingleAxisMove
VAR
MoveAbs : MC_MoveAbsolute;
bMoveCmd : BOOL;
bArrived : BOOL;
END_VAR
// 绝对定位到 100mm 位置
MoveAbs(
Axis := Axis_X,
Execute := bMoveCmd,
Position := 100.0, // 目标位置 100mm
Velocity := 100.0, // 最大速度 100mm/s
Acceleration := 1000.0, // 加速度 1000mm/s²
Deceleration := 1000.0, // 减速度 1000mm/s²
Jerk := 5000.0 // 跃度 5000mm/s³
);
// 到达后复位命令
IF MoveAbs.Done THEN
bArrived := TRUE;
bMoveCmd := FALSE; // 注意: Execute 必须下降沿
END_IF;
常见错误:
| 错误 | 原因 | 纠正 |
|---|---|---|
| 目标位置超出软限位 | Position 在软限位外 | 检查 Position 范围 |
| 轴不动 | 轴未使能 | 先调 MC_Power |
| 运动被中止 | 新指令中断了当前运动 | 检查 BufferMode |
| 到达后过冲 | 减速度不够 | 增大减速度或减小负载惯量 |
3.4 MC_MoveRelative — 相对定位
功能: 从当前位置移动指定的距离。正数正向,负数反向。
运动轨迹图:
位置 ↑
│ ╱╲
│ ╱ ╲
│ ╱ ╲
│ ╱ ╲
│ ╱ ╲
│ ╱ ╲
│ 当前位置 ╱ ╲ Distance=50mm
│ ────────╱ ╲───────
└──────────────────────────────────→ 时间
←── Distance=50mm ──→
SCL 示例:
PROGRAM RelativeMove
VAR
MoveRel : MC_MoveRelative;
iCount : INT := 0;
END_VAR
// 每次触发正向移动 10mm
IF bTrigger THEN
MoveRel(
Axis := Axis_X,
Execute := TRUE,
Distance := 10.0, // 每次移动 10mm
Velocity := 50.0,
Acceleration := 500.0
);
END_IF;
// 如果已经移动了 100mm,改为反向
IF MoveRel.Done THEN
iCount := iCount + 1;
IF iCount >= 10 THEN
// 反向移动
MoveRel(
Axis := Axis_X,
Execute := TRUE,
Distance := -10.0, // 负值表示反向
Velocity := 50.0,
Acceleration := 500.0
);
iCount := 0;
END_IF;
END_IF;
3.5 MC_MoveVelocity — 速度模式
功能: 控制轴以指定速度持续运行,直到被其他指令停止。
运动轨迹图:
速度 ↑
│ ╱────────────────────
│ ╱
│ ╱
│ ╱
│ ╱
└────┴─────────────────────────→ 时间
↑
加速到目标速度
SCL 示例:
PROGRAM VelocityCtrl
VAR
MoveVel : MC_MoveVelocity;
bForward : BOOL;
bBackward : BOOL;
END_VAR
// 正向运行
IF bForward THEN
MoveVel(
Axis := Axis_X,
Execute := TRUE,
Velocity := 100.0, // 100 mm/s 正向
Acceleration := 500.0,
Direction := 1 // 正向
);
END_IF;
// 停止速度模式(用 Halt)
IF bStop THEN
// 停止速度模式运行
END_IF;
// 读取当前速度
// 实际速度 = MoveVel.ActualVelocity
3.6 MC_Halt — 暂停
功能: 让轴减速停止,停下来后处于 Standstill 状态,可接收后续运动指令。
与 MC_Stop 的区别:
| 特性 | MC_Halt | MC_Stop |
|---|---|---|
| 停止后状态 | Standstill(可继续运动) | ErrorStop(需 Reset) |
| 减速度 | 使用正常减速度 | 使用急停减速度 |
| 适用场景 | 正常暂停、换料 | 紧急停止、安全门打开 |
| 恢复方式 | 直接发新指令 | 先 Reset 再发指令 |
SCL 示例:
PROGRAM HaltExample
VAR
HaltCmd : MC_Halt;
StopCmd : MC_Stop;
ResetCmd : MC_Reset;
bEStop : BOOL;
END_VAR
// 正常暂停
IF bPause THEN
HaltCmd(
Axis := Axis_X,
Execute := TRUE,
Deceleration := 1000.0 // 正常减速度
);
END_IF;
// 急停
IF bEStop THEN
StopCmd(
Axis := Axis_X,
Execute := TRUE
);
END_IF;
// 急停后必须复位
IF StopCmd.Done AND NOT bEStop THEN
ResetCmd(
Axis := Axis_X,
Execute := TRUE
);
END_IF;
3.7 MC_Stop — 急停
功能: 立即减速停止,轴进入 ErrorStop 状态,需要 MC_Reset 清除后才能继续运动。
SCL 示例:
PROGRAM EmergencyStop
VAR
StopCmd : MC_Stop;
ResetCmd : MC_Reset;
bEStop : BOOL; // 外部急停信号
bResetReq : BOOL; // 复位请求
END_VAR
// 急停
StopCmd(
Axis := Axis_X,
Execute := bEStop OR bEStop_Group,
Deceleration := 5000.0 // 急停减速度,大加速度
);
// 急停后必须复位
IF StopCmd.Done AND bResetReq THEN
ResetCmd(
Axis := Axis_X,
Execute := TRUE
);
END_IF;
3.8 MC_ReadStatus — 轴状态读取
功能: 读取轴的当前状态(状态机)。
参数表:
| 参数 | 类型 | 说明 |
|---|---|---|
| Axis | AXIS_REF | 轴引用 |
| Valid | BOOL | 数据有效 |
| Busy | BOOL | 正在执行 |
| Error | BOOL | 错误标志 |
| ErrorID | UINT | 错误码 |
| Disabled | BOOL | 轴未使能 |
| Stopping | BOOL | 正在停止 |
| StandStill | BOOL | 轴静止就绪 |
| Moving | BOOL | 正在运动 |
| Accelerating | BOOL | 正在加速 |
| Decelerating | BOOL | 正在减速 |
| ConstantVelocity | BOOL | 匀速 |
| ErrorStop | BOOL | 错误停止 |
SCL 示例:
PROGRAM ReadAxisStatus
VAR
ReadStatus : MC_ReadStatus;
sAxisState : STRING;
END_VAR
// 读取轴状态
ReadStatus(Axis := Axis_X);
// 根据状态显示文字
IF ReadStatus.Disabled THEN
sAxisState := '未使能';
ELSIF ReadStatus.ErrorStop THEN
sAxisState := '错误停止';
ELSIF ReadStatus.Stopping THEN
sAxisState := '减速中';
ELSIF ReadStatus.Moving THEN
sAxisState := '运动中';
ELSIF ReadStatus.StandStill THEN
sAxisState := '就绪';
ELSE
sAxisState := '未知';
END_IF;
// 输出到 HMI 显示
// HMI_State := sAxisState;
3.9 MC_ReadAxisError — 轴错误读取
功能: 读取轴的详细错误信息。
SCL 示例:
PROGRAM ReadAxisError
VAR
ReadErr : MC_ReadAxisError;
sErrorMsg : STRING;
END_VAR
// 读取错误
ReadErr(Axis := Axis_X);
IF ReadErr.Error THEN
// 根据 ErrorID 显示错误描述
CASE ReadErr.ErrorID OF
16#1001: sErrorMsg := '参数无效';
16#2001: sErrorMsg := '状态机不允许';
16#3001: sErrorMsg := '位置超限';
16#4001: sErrorMsg := 'EtherCAT 通讯中断';
16#5001: sErrorMsg := '安全门打开';
16#6001: sErrorMsg := '驱动器报警';
16#6002: sErrorMsg := '过流';
16#6003: sErrorMsg := '过压';
16#6004: sErrorMsg := '编码器故障';
ELSE
sErrorMsg := '未知错误: ' + UINT_TO_STRING(ReadErr.ErrorID);
END_CASE;
END_IF;
3.10 MC_Reset — 轴故障复位
功能: 清除轴的错误状态,使轴从 ErrorStop 回到 Standstill。
SCL 示例:
PROGRAM AxisReset
VAR
ResetCmd : MC_Reset;
bResetBtn : BOOL;
END_VAR
// 故障复位
ResetCmd(
Axis := Axis_X,
Execute := bResetBtn
);
// 复位成功
IF ResetCmd.Done THEN
// 可以继续运动
END_IF;
// 复位失败(可能驱动器还有报警)
IF ResetCmd.Error THEN
// 需要先清除驱动器报警
END_IF;
单轴运动完整示例:传送带定位
PROGRAM ConveyorAxisCtrl
VAR
// 功能块实例
Power : MC_Power;
Home : MC_Home;
MoveAbs : MC_MoveAbsolute;
MoveRel : MC_MoveRelative;
HaltCmd : MC_Halt;
ReadStat : MC_ReadStatus;
ResetCmd : MC_Reset;
// 状态机
State : INT := 0;
bHomed : BOOL := FALSE;
CycleCnt : INT := 0;
// 位置参数(从全局 DB 读取)
PosPick : REAL := 100.0; // 取料位置
PosPlace : REAL := 500.0; // 放料位置
Speed : REAL := 200.0; // 运行速度
Accel : REAL := 2000.0; // 加速度
END_VAR
// ====== 主程序 ======
// 1. 始终使能
Power(Axis := ConveyorAxis, Enable := TRUE);
// 2. 读取状态
ReadStat(Axis := ConveyorAxis);
// 3. 错误处理
IF ReadStat.ErrorStop THEN
// 显示错误到 HMI
// HMI_Error := ReadStat.ErrorID;
// 如果复位按钮按下
IF bResetBtn THEN
ResetCmd(Axis := ConveyorAxis, Execute := TRUE);
IF ResetCmd.Done THEN
State := 0;
END_IF;
END_IF;
RETURN; // 错误状态不执行后续逻辑
END_IF;
// 4. 状态机
IF NOT Power.Status THEN
State := 0;
RETURN;
END_IF;
CASE State OF
0: // 回零
IF NOT bHomed THEN
Home(Axis := ConveyorAxis, Execute := TRUE,
Mode := 3, Position := 0.0,
Velocity := 50.0, Acceleration := Accel);
IF Home.Done THEN
Home(Execute := FALSE);
bHomed := TRUE;
State := 10;
END_IF;
ELSE
State := 10;
END_IF;
10: // 等待取料信号
IF DI[1] = TRUE THEN // 工件到位传感器
State := 20;
END_IF;
20: // 移动到取料位置
MoveAbs(Axis := ConveyorAxis, Execute := TRUE,
Position := PosPick, Velocity := Speed,
Acceleration := Accel, Deceleration := Accel);
IF MoveAbs.Done THEN
MoveAbs(Execute := FALSE);
State := 30;
END_IF;
30: // 等待取料完成
WAIT DI[2] = TRUE, Timeout := 2.0; // 等待夹爪到位
DELAY 0.5; // 等待夹紧
State := 40;
40: // 移动到放料位置
MoveAbs(Axis := ConveyorAxis, Execute := TRUE,
Position := PosPlace, Velocity := Speed,
Acceleration := Accel, Deceleration := Accel);
IF MoveAbs.Done THEN
MoveAbs(Execute := FALSE);
State := 50;
END_IF;
50: // 等待放料完成
DELAY 0.3;
CycleCnt := CycleCnt + 1;
State := 10; // 回到等待
END_CASE;
4. 多轴插补
多轴插补让多个轴协调运动,实现复杂的轨迹。
4.1 MC_MoveLinear — 直线插补 (2D/3D)
功能: 多个轴同时运动,使工具中心点(TCP)沿直线从起点到终点。
参数表:
| 参数 | 类型 | 说明 |
|---|---|---|
| AxisGroup | AXIS_GROUP_REF | 轴组引用 |
| Execute | BOOL | 上升沿触发 |
| EndPoint | ARRAY[1..n] OF REAL | 终点坐标(各轴分量) |
| Velocity | REAL | 轨迹速度 (mm/s 或 deg/s) |
| Acceleration | REAL | 轨迹加速度 |
| Deceleration | REAL | 轨迹减速度 |
| Jerk | REAL | 轨迹跃度 |
| CoordSystem | INT | 坐标系 (0=轴系, 1=笛卡尔) |
| BufferMode | INT | 运动衔接模式 |
| Done | BOOL | 完成标志 |
| Busy | BOOL | 正在执行 |
| Active | BOOL | 已被接收 |
| CommandAborted | BOOL | 被中止 |
| Error | BOOL | 错误标志 |
| ErrorID | UINT | 错误码 |
2D 直线插补轨迹图:
Y ↑
│ ╱ 终点 (100, 80)
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│ 起点 ╱
│ (0,0) ╱
└────────┴──────────────────────→ X
3D 直线插补轨迹图:
Z ↑
│ ╱ 终点 (80, 60, 50)
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│╱ 起点 (0,0,0)
└───────────────→ Y
╲
╲ X
SCL 示例:
PROGRAM LinearInterpolation
VAR
// 轴组引用(在轴配置中定义的 2 轴组)
XY_Group : AXIS_GROUP_REF;
// 功能块
MoveLin : MC_MoveLinear;
MoveLin2 : MC_MoveLinear;
// 状态机
State : INT := 0;
END_VAR
CASE State OF
0: // 使能轴组
// 先使能组内所有轴
PowerX(Axis := Axis_X, Enable := TRUE);
PowerY(Axis := Axis_Y, Enable := TRUE);
IF PowerX.Status AND PowerY.Status THEN
State := 10;
END_IF;
10: // 回零
// 回零代码...
State := 20;
20: // 直线插补到点 (100, 80)
MoveLin(
AxisGroup := XY_Group,
Execute := TRUE,
EndPoint := [100.0, 80.0], // X=100, Y=80
Velocity := 100.0, // 轨迹速度 100mm/s
Acceleration := 1000.0,
Deceleration := 1000.0,
BufferMode := mcBlendingLow // 平滑过渡
);
IF MoveLin.Done THEN
MoveLin(Execute := FALSE);
State := 30;
END_IF;
30: // 继续直线插补到点 (200, 0)
MoveLin2(
AxisGroup := XY_Group,
Execute := TRUE,
EndPoint := [200.0, 0.0],
Velocity := 100.0,
Acceleration := 1000.0,
Deceleration := 1000.0,
BufferMode := mcBlendingLow
);
IF MoveLin2.Done THEN
MoveLin2(Execute := FALSE);
State := 20; // 循环
END_IF;
END_CASE;
4.2 MC_MoveCircular — 圆弧插补
功能: 多个轴沿圆弧运动。支持两种方式:中心点方式和三点方式。
圆弧插补轨迹图:
Y ↑
│
│ 起点 (100, 0)
│ ●───────────────○
│ ╲ ╱
│ ╲ 圆心 ╱
│ ╲ (0,0) ╱
│ ╲ ╱
│ ╲ ╱
│ ╲ ╱
│ ╲╱
│ ●
│ 终点 (0, -100)
└──────────────────────→ X
中心点方式:
// 圆弧插补 - 中心点方式
// 圆心: (0, 0), 起点: (100, 0), 终点: (0, -100)
MoveCirc_Center(
AxisGroup := XY_Group,
Execute := TRUE,
EndPoint := [0.0, -100.0], // 终点
AuxPoint := [0.0, 0.0], // 圆心 (CenterPoint)
PathChoice := 0, // 0=顺时针, 1=逆时针
Velocity := 100.0,
Acceleration := 1000.0,
Deceleration := 1000.0
);
三点方式:
// 圆弧插补 - 三点方式
// 起点: (100, 0), 中间点: (0, 100), 终点: (-100, 0)
MoveCirc_Point(
AxisGroup := XY_Group,
Execute := TRUE,
EndPoint := [-100.0, 0.0], // 终点
AuxPoint := [0.0, 100.0], // 圆弧上中间点
PathChoice := 0,
Velocity := 100.0,
Acceleration := 1000.0
);
4.3 MC_MoveDirectAbsolute — 多轴独立绝对定位
功能: 组内各轴独立运动到各自的目标位置,各轴不需要同步到达。
SCL 示例:
// 多轴独立绝对定位
// X 轴到 200mm,Y 轴到 150mm,各轴独立运动
MoveDirectAbs(
AxisGroup := XY_Group,
Execute := TRUE,
Position := [200.0, 150.0], // 各轴独立目标
Velocity := [100.0, 80.0], // 各轴独立速度
Acceleration := [1000.0, 1000.0],
Deceleration := [1000.0, 1000.0]
);
4.4 插补精度与速度控制
| 参数 | 影响 | 设置建议 |
|---|---|---|
| 插补周期 | 精度越高,CPU 负载越高 | 默认 1ms,高速时 0.5ms |
| 速度波动 | 大加速度导致速度波动 | 使用 S 曲线,设 Jerk 参数 |
| 轮廓误差 | 圆弧插补的弦高误差 | 自动计算,最大 0.01mm |
| 速度前瞻 | 连续轨迹的平滑度 | 默认 10 段,可调至 50 段 |
5. 电子齿轮与电子凸轮
5.1 MC_GearIn — 电子齿轮啮合
功能: 从轴跟随主轴运动,保持固定比例关系。
原理图:
主轴 (Master) ──────┬────── 速度 Vm
│
│ GearIn (比例 = 2:1)
│
▼
从轴 (Slave) ──────┬────── 速度 Vs = Vm × Ratio
参数表:
| 参数 | 类型 | 说明 |
|---|---|---|
| Master | AXIS_REF | 主轴(通常为虚拟轴或编码器) |
| Slave | AXIS_REF | 从轴 |
| Execute | BOOL | 上升沿触发 |
| RatioNumerator | DINT | 比例分子(从轴脉冲数) |
| RatioDenominator | DINT | 比例分母(主轴脉冲数) |
| Acceleration | REAL | 啮合加速度 |
| Deceleration | REAL | 脱开减速度 |
| InGear | BOOL | 已啮合标志 |
| Busy | BOOL | 正在执行 |
| Error | BOOL | 错误标志 |
SCL 示例:
PROGRAM GearControl
VAR
GearIn : MC_GearIn;
GearOut : MC_GearOut;
bEngage : BOOL;
bDisengage : BOOL;
END_VAR
// 啮合: 从轴跟随主轴,比例 2:1
// 即主轴每转 1 圈,从轴转 2 圈
IF bEngage THEN
GearIn(
Master := MasterAxis,
Slave := SlaveAxis,
Execute := TRUE,
RatioNumerator := 2, // 分子
RatioDenominator := 1, // 分母
Acceleration := 1000.0
);
END_IF;
// 脱开
IF bDisengage THEN
GearOut(
Master := MasterAxis,
Slave := SlaveAxis,
Execute := TRUE
);
END_IF;
// 读取状态
IF GearIn.InGear THEN
// 已啮合,从轴同步跟随主轴
END_IF;
齿轮比计算示例:
| 场景 | 主轴速度 | 从轴速度 | 比例 | RatioNumerator | RatioDenominator |
|---|---|---|---|---|---|
| 相同速度 | 1000 rpm | 1000 rpm | 1:1 | 1 | 1 |
| 减速 | 1500 rpm | 500 rpm | 1:3 | 1 | 3 |
| 增速 | 500 rpm | 2000 rpm | 4:1 | 4 | 1 |
| 精确比例 | 2 圈 | 5 圈 | 5:2 | 5 | 2 |
5.2 MC_GearOut — 电子齿轮脱开
功能: 解除从轴与主轴之间的齿轮关系,从轴恢复独立运动。
SCL 示例:
GearOut(
Master := MasterAxis,
Slave := SlaveAxis,
Execute := TRUE,
Deceleration := 1000.0 // 脱开时的减速度
);
5.3 MC_CamIn — 电子凸轮啮合
功能: 从轴跟随主轴运动,但不是简单的比例关系,而是按照 CAM 曲线定义的非线性关系运动。
原理图:
主轴位置 ↑
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│╱
└───────────────────────────→ 从轴位置
CAM 曲线示例——飞剪同步曲线:
从轴位置 ↑
│ ┌──────────────┐
│ ╱ ╲
│ ╱ ╲
│ ╱ ╲
│ ╱ ╲
│ ╱ ╲
│ ╱ ╲
│ ╱ ╲
│╱ ╲
└──────────────────────────────────→ 主轴位置
↑ 同步区 ↑ 回程区
(剪切过程) (等待下一刀)
SCL 示例:
PROGRAM CamControl
VAR
CamIn : MC_CamIn;
CamOut : MC_CamOut;
CamTable : MC_CamTableSelect;
bEngage : BOOL;
bDisengage : BOOL;
END_VAR
// 1. 选择凸轮表
CamTable(
CamTable := 1, // 凸轮表编号(在 IDE 中编辑)
Execute := TRUE
);
// 2. 啮合凸轮
IF bEngage THEN
CamIn(
Master := MasterAxis,
Slave := SlaveAxis,
Execute := TRUE,
CamTable := 1,
MasterStartPos := 0.0, // 主轴起始位置
MasterEndPos := 360.0, // 主轴结束位置
SlaveStartPos := 0.0, // 从轴起始位置
SlaveEndPos := 100.0, // 从轴结束位置
MasterScaling := 1, // 主轴缩放
SlaveScaling := 1, // 从轴缩放
StartMode := 0 // 0=当前位置开始
);
END_IF;
// 3. 脱开凸轮
IF bDisengage THEN
CamOut(
Master := MasterAxis,
Slave := SlaveAxis,
Execute := TRUE
);
END_IF;
5.4 CAM 曲线定义
在 Darra IDE 的凸轮编辑器中,可以直观地编辑 CAM 曲线:
┌─ 凸轮编辑器 ─────────────────────────────────────────┐
│ │
│ 从轴位置 ↑ │
│ 100 │ ┌──────────┐ │
│ │ ╱ ╲ │
│ 80 │╱ ╲ │
│ │ ╲ │
│ 60 │ ╲ │
│ │ ╲ │
│ 40 │ ╲ │
│ │ ╲ │
│ 20 │ ╲ │
│ │ ╲ │
│ 0 └──────────────────────┴──────────────────→ │
│ 0 72 144 216 288 360 │
│ 主轴位置 (度) │
│ │
│ 曲线类型: [多项式 5 次] 同步区间: 60°~180° │
│ 最大速度: 150 mm/s 最大加速度: 5000 mm/s² │
│ │
│ 插入点: 修改点: 删除点: │
│ │
│ ┌─ 曲线参数 ─────────────────────────────────┐ │
│ │ 点 1: (0, 0) | 点 2: (60, 20) | 点 3: ... │ │
│ │ 多项式: 5 次 | 插值: 样条 | 速度: 0 │ │
│ └─────────────────────────────────────────────┘ │
└────────────────────────────────────────────────────────┘
CAM 曲线类型:
| 曲线类型 | 特点 | 适用场景 |
|---|---|---|
| 多项式 3 次 | 速度连续,加速度有跳变 | 低速凸轮 |
| 多项式 5 次 | 速度和加速度都连续,平滑 | 通用推荐 |
| 多项式 7 次 | 速度和加速度二阶导数连续 | 高速凸轮,振动敏感 |
| 样条 (Spline) | 通过所有控制点,完全平滑 | 复杂曲线 |
| 修正正弦 | 修正正弦加速度曲线 | 飞剪、追剪 |
| 自定义 | 自由绘制 | 特殊运动需求 |
飞剪凸轮曲线示例 (5 次多项式):
// 飞剪凸轮曲线参数
// 主轴周期: 360° (一圈)
// 从轴行程: 0~100mm (剪切行程)
// 同步区: 60°~180° (与材料速度同步)
// 回程区: 180°~360° (快速返回,准备下一刀)
CamTableParams := [[0, 0], [60, 20], [180, 100], [200, 95], [360, 0]];
5.5 实际应用:飞剪
飞剪是电子凸轮最经典的应用——旋转刀在材料运动时同步跟随,切断后快速返回:
材料运动方向 ────────────────→
┌───────────────┐
│ 旋转刀 │
│ ┌─────────┐ │
════════════ │ │ 刀片 │ │ ════════════
│ └─────────┘ │
└───────────────┘
↑ 同步区剪切
从轴位置/速度
↑
│ ┌──────────┐
│ ╱ ╲ 速度曲线
│╱ ╲
│ ╲
│ ╲
└──────────────────┴──────────→
↑ 同步 (剪切) ↑ 回程 (快速返回)
SCL 完整示例:
PROGRAM FlyingShear
VAR
// 轴
MaterialAxis : AXIS_REF; // 材料主轴(虚拟轴,跟随编码器)
CutterAxis : AXIS_REF; // 刀具从轴
// 功能块
PowerCutter : MC_Power;
CamIn : MC_CamIn;
CamOut : MC_CamOut;
CutCmd : BOOL;
bInSync : BOOL;
nCutCount : INT := 0;
END_VAR
// 使能刀具轴
PowerCutter(Axis := CutterAxis, Enable := TRUE);
// 主循环
IF PowerCutter.Status AND NOT CamIn.InGear THEN
// 啮合凸轮
CamIn(
Master := MaterialAxis,
Slave := CutterAxis,
Execute := TRUE,
CamTable := 1,
MasterStartPos := 0.0,
MasterEndPos := 360.0,
SlaveStartPos := 0.0,
SlaveEndPos := 100.0
);
END_IF;
// 凸轮已啮合
bInSync := CamIn.InGear;
// 剪切完成计数(在同步区末端触发)
IF bInSync AND CamIn.SlavePosition >= 99.0 THEN
nCutCount := nCutCount + 1;
CutCmd := TRUE;
// 输出剪切信号
DO[1] := TRUE;
DELAY 0.05;
DO[1] := FALSE;
END_IF;
6. 位置控制模式
Darra 伺服驱动器支持 CiA 402 标准定义的所有控制模式:
6.1 模式总览
| 模式 | 缩写 | 代码 | 描述 | 适用场景 |
|---|---|---|---|---|
| 轮廓位置模式 | pp | 1 | 驱动器内部完成位置曲线规划 | 点到点定位 |
| 轮廓速度模式 | pv | 3 | 驱动器内部完成速度曲线规划 | 传送带恒速 |
| 轮廓力矩模式 | pt | 4 | 驱动器内部完成力矩曲线规划 | 压合、拧紧 |
| 回零模式 | hm | 6 | 驱动器执行回零 | 回原点 |
| 插补位置模式 | ip | 7 | 上位机逐周期发位置指令 | 多轴插补(推荐) |
| 循环同步位置 | csp | 8 | 上位机每周期发目标位置 | 通用模式(推荐) |
| 循环同步速度 | csv | 9 | 上位机每周期发目标速度 | 速度同步 |
| 循环同步力矩 | cst | 10 | 上位机每周期发目标力矩 | 力矩控制 |
6.2 模式选择指南
6.3 csp 模式(推荐)
csp 模式(Cyclic Synchronous Position)是 Darra 推荐的默认模式。上位机每个周期(1ms)发送目标位置,驱动器完成速度和电流环。
PLC 周期 (1ms) 驱动器周期 (62.5μs)
│ │
│ 目标位置 ────────→ 位置环
│ │
│ │ 速度环
│ │
│ │ 电流环
│ │
│ 编码器反馈 ←───────│
│ │
└────────────────────┘
配置方式:在轴配置页面选择"csp 模式",或通过 SDO 设置:
// 通过 SDO 设置控制模式为 csp (8)
// 在轴配置时自动完成,一般不需要手动写
// 如果需要切换:
SDO_Write( SlaveID := 3, Index := 16#6060, SubIndex := 0, Value := 8 );
6.4 pp 模式
轮廓位置模式:上机位只发目标位置,驱动器内部完成加减速规划(T 曲线或 S 曲线)。
上位机: 发目标位置 (100mm)
│
▼
驱动器: 内部规划速度曲线
┌────────────────────────┐
│ 100mm ────────────────→│
│ 加速 → 匀速 → 减速 │
└────────────────────────┘
│
▼
电机到达 100mm
优点: 减少上位机通讯负担 缺点: 驱动器之间的同步精度不如 csp
7. 轴组与坐标系
7.1 轴组定义
轴组 (Group) 将多个物理轴组合成一个逻辑单元,实现多轴协调运动。
轴组配置示例:
轴组: XY_Table
├── Axis_X: 伺服轴 (松下 MINAS A6B, 站号 3)
├── Axis_Y: 伺服轴 (松下 MINAS A6B, 站号 4)
└── Kinematics: 2D 直角坐标
├── 正解: (X, Y) = (J1, J2)
└── 逆解: (J1, J2) = (X, Y)
SCL 中引用轴组:
VAR
// 在轴配置中定义好的轴组
XY_Group : AXIS_GROUP_REF;
// 轴组功能块
GrpEnable : MC_GroupEnable;
GrpDisable : MC_GroupDisable;
GrpHome : MC_GroupHome;
GrpStop : MC_GroupStop;
GrpReset : MC_GroupReset;
GrpReadStatus : MC_GroupReadStatus;
END_VAR
// 使能轴组
GrpEnable(AxisGroup := XY_Group, Enable := TRUE);
7.2 正运动学 (FK): 关节→笛卡尔
正运动学:已知各关节角度,求 TCP 在笛卡尔空间的位置。
2 轴直角坐标:
正解: X = J1
Y = J2
6 轴关节机器人:
正解: 使用 DH 参数表
[X, Y, Z, Rx, Ry, Rz] = FK(J1, J2, J3, J4, J5, J6)
7.3 逆运动学 (IK): 笛卡尔→关节
逆运动学:已知 TCP 在笛卡尔空间的目标位置,求各关节角度。
2 轴直角坐标:
逆解: J1 = X
J2 = Y
2 轴平面关节:
┌──────────────────────────────┐
│ 逆解公式: │
│ J2 = arccos((X² + Y² - L1² - L2²) / (2 × L1 × L2)) │
│ J1 = arctan(Y/X) - arctan(L2 × sin(J2) / (L1 + L2 × cos(J2))) │
└──────────────────────────────┘
7.4 工具坐标系 (TCP)
工具坐标系 (TCP, Tool Center Point) 定义工具末端相对机器人法兰的位置和姿态。
配置:
TCP 位置:
X = 0.0 mm (相对法兰中心)
Y = 0.0 mm
Z = 150.0 mm (工具长度 150mm)
TCP 姿态:
Rx = 0.0° (绕 X 轴旋转)
Ry = 0.0° (绕 Y 轴旋转)
Rz = 0.0° (绕 Z 轴旋转)
标定方法:
1. 四点法: 移动机器人到同一参考点,变换 4 个不同姿态
2. 六点法: 更精确,变换 6 个姿态
3. 外部测量: 使用激光跟踪仪或 3D 测量
7.5 工件坐标系 (WCS)
工件坐标系相对机器基座坐标系偏移,编程时坐标直接以工件为参考:
机器基座坐标系 (MCS) 工件坐标系 (WCS)
┌─────┐ ┌─────┐
│ │ X=200,Y=100 │ │
│ │ Z=0,Rz=30° │ │
│ │ ───────────→ │ │
│ │ 平移 + 旋转 │ │
└─────┘ └─────┘
SCL 设置:
// 设置工件坐标系
MC_SetCartesianTransform(
AxisGroup := Robot1,
Execute := TRUE,
Coordinate := WCS, // 工件坐标系
Translation := [200.0, 100.0, 0.0], // 平移
Rotation := [0.0, 0.0, 30.0] // 旋转 (Z 轴 30°)
);
8. CNC 与 G 代码 (P5 预留)
当前状态: P5 预留,正在开发中,预计下一版本可用。
8.1 CNC 架构概述
G 代码文件 ──→ 解析器 ──→ 路径缓存 ──→ 前瞻模块 ──→ 速度规划 ──→ 插补器 ──→ 轴
│ │ │ │ │
│ G01 │ 10 段 │ 自动减速 │ S 曲线 │ 1ms
│ G02 │ │ 拐角处理 │ │
│ G03 │ │ │ │
8.2 G 代码示例
% 加工一个矩形
G21 ; 单位 mm
G90 ; 绝对坐标
G17 ; XY 平面
M03 S1000 ; 主轴 1000 rpm
G00 Z5.0 ; 快速移动到安全高度
G00 X0 Y0 ; 快速移动到起点
G01 Z-1.0 F100 ; 下刀 1mm, 进给 100mm/min
G01 X100 Y0 ; 直线到 (100,0)
G01 X100 Y100 ; 直线到 (100,100)
G01 X0 Y100 ; 直线到 (0,100)
G01 X0 Y0 ; 回到起点
G00 Z5.0 ; 抬刀
M05 ; 主轴停止
M30 ; 程序结束
8.3 当前可实现方案
虽然 CNC 功能模块在 P5 阶段,但您可以使用 MC_MoveLinear + MC_MoveCircular 组合实现基本的数控功能:
// 用 PLCopen 功能块实现 G 代码等效
// 加工矩形轮廓
// G00 Z5.0
MoveAbs(Axis := Z, Position := 5.0, Velocity := 500.0);
// G00 X0 Y0
MoveLin(Group := XY_Group, EndPoint := [0.0, 0.0], Velocity := 500.0);
// G01 Z-1.0 F100
MoveAbs(Axis := Z, Position := -1.0, Velocity := 10.0);
// G01 X100
MoveLin(Group := XY_Group, EndPoint := [100.0, 0.0], Velocity := 50.0);
// G01 X100 Y100
MoveLin(Group := XY_Group, EndPoint := [100.0, 100.0], Velocity := 50.0);
// G01 X0 Y100
MoveLin(Group := XY_Group, EndPoint := [0.0, 100.0], Velocity := 50.0);
// G01 X0 Y0
MoveLin(Group := XY_Group, EndPoint := [0.0, 0.0], Velocity := 50.0);
// G00 Z5.0
MoveAbs(Axis := Z, Position := 5.0, Velocity := 500.0);
9. 实际应用示例
9.1 单轴定位搬运(伺服电机控制)
场景: 传送带上的工件需要从取料位移动到放料位。
设备:
- 1 台伺服电机(松下 MINAS A6B)
- 丝杠模组,行程 500mm
- 到位传感器 × 2
SCL 程序:
PROGRAM SingleAxisTransfer
VAR
// 功能块
Power : MC_Power;
Home : MC_Home;
MoveAbs : MC_MoveAbsolute;
ReadSt : MC_ReadStatus;
Reset : MC_Reset;
// 状态机
State : INT := 0;
bInitialized : BOOL := FALSE;
nCycle : INT := 0;
// 位置参数
cPickPos : REAL := 50.0; // 取料位 50mm
cPlacePos : REAL := 450.0; // 放料位 450mm
cSpeed : REAL := 300.0; // 速度 300mm/s
cAccel : REAL := 3000.0; // 加速度 3000mm/s²
END_VAR
// === 主循环 ===
// 1. 使能轴
Power(Axis := ConveyorAxis, Enable := TRUE);
// 2. 读状态
ReadSt(Axis := ConveyorAxis);
// 3. 错误处理
IF ReadSt.ErrorStop THEN
Reset(Axis := ConveyorAxis, Execute := TRUE);
IF Reset.Done THEN
Reset(Execute := FALSE);
State := 0;
END_IF;
RETURN;
END_IF;
// 4. 轴就绪才能运行
IF NOT Power.Status THEN
State := 0;
RETURN;
END_IF;
// 5. 状态机
CASE State OF
0: // 初始化 - 回零
IF NOT bInitialized THEN
Home(Axis := ConveyorAxis, Execute := TRUE,
Mode := 3, Position := 0.0,
Velocity := 50.0, Acceleration := cAccel);
IF Home.Done THEN
Home(Execute := FALSE);
bInitialized := TRUE;
State := 10;
END_IF;
ELSE
State := 10;
END_IF;
10: // 等待取料信号
IF DI[1] = TRUE THEN // 工件到位传感器
State := 20;
END_IF;
20: // 移动到取料位
MoveAbs(Axis := ConveyorAxis, Execute := TRUE,
Position := cPickPos, Velocity := cSpeed,
Acceleration := cAccel, Deceleration := cAccel);
IF MoveAbs.Done THEN
MoveAbs(Execute := FALSE);
DO[1] := TRUE; // 夹爪闭合
DELAY 0.3;
State := 30;
END_IF;
30: // 移动到放料位
MoveAbs(Axis := ConveyorAxis, Execute := TRUE,
Position := cPlacePos, Velocity := cSpeed,
Acceleration := cAccel, Deceleration := cAccel);
IF MoveAbs.Done THEN
MoveAbs(Execute := FALSE);
DO[1] := FALSE; // 夹爪打开
DELAY 0.3;
nCycle := nCycle + 1;
State := 10; // 回到等待
END_IF;
END_CASE;
9.2 两轴直线插补(XY 工作台)
场景: 点胶机 XY 工作台沿直线路径点胶。
SCL 程序:
PROGRAM XYGluePath
VAR
// 轴组
XY_Group : AXIS_GROUP_REF;
// 功能块
GrpEnable : MC_GroupEnable;
MoveLin1 : MC_MoveLinear;
MoveLin2 : MC_MoveLinear;
MoveLin3 : MC_MoveLinear;
MoveLin4 : MC_MoveLinear;
// 状态机
State : INT := 0;
bGlueOn : BOOL;
END_VAR
// 使能轴组
GrpEnable(AxisGroup := XY_Group, Enable := TRUE);
IF NOT GrpEnable.Status THEN
RETURN;
END_IF;
// 点胶路径: 矩形 + 对角线
CASE State OF
0: // 移动到起点上方
MoveLin1(AxisGroup := XY_Group, Execute := TRUE,
EndPoint := [10.0, 10.0], // X=10, Y=10
Velocity := 200.0, Acceleration := 2000.0,
BufferMode := mcAborting);
IF MoveLin1.Done THEN
MoveLin1(Execute := FALSE);
State := 10;
END_IF;
10: // 开始点胶
bGlueOn := TRUE; // 打开点胶阀
DELAY 0.1;
State := 20;
20: // 直线到 (90, 10)
MoveLin2(AxisGroup := XY_Group, Execute := TRUE,
EndPoint := [90.0, 10.0],
Velocity := 50.0, Acceleration := 1000.0,
BufferMode := mcBlendingLow);
IF MoveLin2.Done THEN
MoveLin2(Execute := FALSE);
State := 30;
END_IF;
30: // 直线到 (90, 90)
MoveLin3(AxisGroup := XY_Group, Execute := TRUE,
EndPoint := [90.0, 90.0],
Velocity := 50.0, Acceleration := 1000.0);
IF MoveLin3.Done THEN
MoveLin3(Execute := FALSE);
State := 40;
END_IF;
40: // 直线到 (10, 90)
MoveLin4(AxisGroup := XY_Group, Execute := TRUE,
EndPoint := [10.0, 90.0],
Velocity := 50.0, Acceleration := 1000.0);
IF MoveLin4.Done THEN
MoveLin4(Execute := FALSE);
bGlueOn := FALSE; // 关闭点胶阀
State := 50;
END_IF;
50: // 回到起点
MoveLin1(AxisGroup := XY_Group, Execute := TRUE,
EndPoint := [10.0, 10.0],
Velocity := 200.0, Acceleration := 2000.0);
IF MoveLin1.Done THEN
MoveLin1(Execute := FALSE);
State := 0; // 完成一个循环
END_IF;
END_CASE;
点胶路径图:
Y ↑
90│ ┌─────────────────┐
│ │ │
│ │ 点胶路径 │
│ │ (针头沿直线) │
│ │ │
│ │ │
10│ └─────────────────┘
│
└──┴─────────────────┴──→ X
10 90
9.3 电子齿轮同步(印刷机从轴跟随主轴)
场景: 印刷机中,印刷辊(从轴)必须跟随材料(主轴)同步运动。
SCL 程序:
PROGRAM PrintingPressSync
VAR
// 轴
MaterialAxis : AXIS_REF; // 材料主轴(虚拟轴,跟随编码器)
PrintRoller : AXIS_REF; // 印刷辊
// 功能块
PowerRoller : MC_Power;
GearIn : MC_GearIn;
GearOut : MC_GearOut;
bRunning : BOOL;
bError : BOOL;
END_VAR
// 使能印刷辊
PowerRoller(Axis := PrintRoller, Enable := bRunning);
// 控制逻辑
IF bRunning THEN
// 啮合齿轮: 印刷辊与材料同步
// 比例: 材料走 100mm,印刷辊转 1 圈
GearIn(
Master := MaterialAxis,
Slave := PrintRoller,
Execute := TRUE,
RatioNumerator := 1, // 从轴转 1 圈
RatioDenominator := 100, // 材料走 100mm
Acceleration := 500.0
);
// 监控同步状态
IF GearIn.InGear THEN
// 同步正常
bError := FALSE;
END_IF;
// 同步丢失处理
IF GearIn.Error THEN
bError := TRUE;
// 报警输出
END_IF;
ELSE
// 脱开齿轮
GearOut(
Master := MaterialAxis,
Slave := PrintRoller,
Execute := TRUE
);
END_IF;
9.4 电子凸轮飞剪(旋转刀剪切)
场景: 连续运动的材料上,旋转刀在材料运动过程中同步剪切,然后快速返回。
PROGRAM FlyingShearFull
VAR
// 轴
Material : AXIS_REF; // 材料主轴(编码器)
CutterMotor : AXIS_REF; // 旋转刀伺服
// 功能块
PowerCutter : MC_Power;
CamIn : MC_CamIn;
CamOut : MC_CamOut;
CamTableSel : MC_CamTableSelect;
// 控制
bCutCycle : BOOL := TRUE;
nCutCount : INT := 0;
bCutOutput : BOOL;
END_VAR
// 使能
PowerCutter(Axis := CutterMotor, Enable := TRUE);
// 选择凸轮表
CamTableSel(CamTable := 1, Execute := TRUE);
// 主循环
IF PowerCutter.Status AND bCutCycle THEN
// 凸轮啮合
IF NOT CamIn.InGear THEN
CamIn(
Master := Material,
Slave := CutterMotor,
Execute := TRUE,
CamTable := 1,
MasterStartPos := 0.0,
MasterEndPos := 360.0,
SlaveStartPos := 0.0,
SlaveEndPos := 360.0,
StartMode := 0
);
END_IF;
// 在同步区触发剪切(由 CAM 曲线保证刀具速度 = 材料速度)
// 检测刀具位置,在同步区末端输出剪切信号
IF CamIn.InGear AND CamIn.SlavePosition >= 180.0
AND CamIn.SlavePosition < 182.0 THEN
bCutOutput := TRUE;
nCutCount := nCutCount + 1;
ELSE
bCutOutput := FALSE;
END_IF;
END_IF;
9.5 3 轴点胶路径规划
场景: 3 轴点胶机,沿三维路径点胶。
PROGRAM ThreeAxisGlue
VAR
// 三轴组
XYZ_Group : AXIS_GROUP_REF;
// 功能块
GrpEnable : MC_GroupEnable;
MoveL1 : MC_MoveLinear;
MoveL2 : MC_MoveLinear;
MoveL3 : MC_MoveLinear;
MoveL4 : MC_MoveLinear;
State : INT := 0;
bGlue : BOOL;
bDone : BOOL;
END_VAR
// 使能
GrpEnable(AxisGroup := XYZ_Group, Enable := TRUE);
IF NOT GrpEnable.Status THEN RETURN; END_IF;
CASE State OF
0: // 快速移动到起点上方
MoveL1(AxisGroup := XYZ_Group, Execute := TRUE,
EndPoint := [10.0, 10.0, 10.0],
Velocity := 200.0, Acceleration := 2000.0);
IF MoveL1.Done THEN MoveL1(Execute := FALSE); State := 10; END_IF;
10: // 下刀到点胶高度
MoveL2(AxisGroup := XYZ_Group, Execute := TRUE,
EndPoint := [10.0, 10.0, 0.5],
Velocity := 20.0, Acceleration := 1000.0);
IF MoveL2.Done THEN MoveL2(Execute := FALSE); bGlue := TRUE; State := 20; END_IF;
20: // 沿 X 方向点胶
MoveL3(AxisGroup := XYZ_Group, Execute := TRUE,
EndPoint := [90.0, 10.0, 0.5],
Velocity := 30.0, Acceleration := 500.0);
IF MoveL3.Done THEN MoveL3(Execute := FALSE); bGlue := FALSE; State := 30; END_IF;
30: // 抬刀
MoveL4(AxisGroup := XYZ_Group, Execute := TRUE,
EndPoint := [90.0, 10.0, 10.0],
Velocity := 50.0, Acceleration := 1000.0);
IF MoveL4.Done THEN MoveL4(Execute := FALSE); bDone := TRUE; END_IF;
END_CASE;
9.6 龙门同步控制(双驱防扭)
场景: 大型龙门 XY 平台,X 轴由两个电机同步驱动,防止龙门扭转。
结构图:
┌──────────────────────────────────┐
│ 横梁 (Gantry) │
│ │
Motor_L ─────────────────────────────── Motor_R
│ │ │
│ │ │
│ 丝杠 L 丝杠 R
│ │ │
└─────┴────────────────────┴──────┘
控制策略:
1. 主从模式: Motor_L 是主,Motor_R 是从,跟随主位置
2. 跟随误差监控: 两个电机的位置差超过阈值 → 报警停止
3. 防扭控制: 实时检测位置差,微调补偿
SCL 程序:
PROGRAM GantrySync
VAR
// 轴
Gantry_Master : AXIS_REF; // 主电机
Gantry_Slave : AXIS_REF; // 从电机
// 功能块
PowerM : MC_Power;
PowerS : MC_Power;
GearIn : MC_GearIn;
MoveAbs : MC_MoveAbsolute;
// 防扭监控
ReadStatusM : MC_ReadStatus;
ReadStatusS : MC_ReadStatus;
fDiffLimit : REAL := 0.1; // 位置差阈值 (mm)
fPositionDiff : REAL;
bTorsionAlarm : BOOL;
END_VAR
// 使能两个电机
PowerM(Axis := Gantry_Master, Enable := TRUE);
PowerS(Axis := Gantry_Slave, Enable := TRUE);
// 从电机跟随主电机(齿轮比 1:1)
IF PowerM.Status AND PowerS.Status THEN
GearIn(
Master := Gantry_Master,
Slave := Gantry_Slave,
Execute := TRUE,
RatioNumerator := 1, // 1:1 同步
RatioDenominator := 1,
Acceleration := 2000.0
);
END_IF;
// 绝对定位(只需发指令给主电机,从电机自动跟随)
IF bMoveCmd THEN
MoveAbs(
Axis := Gantry_Master,
Execute := TRUE,
Position := 300.0,
Velocity := 100.0,
Acceleration := 1000.0
);
END_IF;
// 防扭监控:实时比较两个电机位置
ReadStatusM(Axis := Gantry_Master);
ReadStatusS(Axis := Gantry_Slave);
fPositionDiff := ABS(ReadStatusM.ActualPosition - ReadStatusS.ActualPosition);
IF fPositionDiff > fDiffLimit THEN
bTorsionAlarm := TRUE;
// 停止所有运动
// 输出报警
END_IF;
10. 调试与优化
10.1 轴调试工具
Darra IDE 提供以下运动控制调试工具:
| 工具 | 位置 | 功能 |
|---|---|---|
| Jog 面板 | 工具 → 轴调试 → Jog | 手动点动、回零、使能/断电 |
| 示波器 | 工具 → 轴调试 → 示波器 | 实时采集位置/速度/力矩曲线 |
| 参数整定 | 工具 → 轴调试 → 参数整定 | 自动/手动整定伺服增益 |
| 状态监控 | 在线监控 → 轴状态 | 实时显示轴状态和错误码 |
| 跟随误差 | 在线监控 → 跟随误差 | 实时显示位置偏差 |
10.2 伺服增益整定
伺服驱动器的三个闭环:
位置环 ──→ 速度环 ──→ 电流环 ──→ 电机
↑ │
└──────────────────────┘
编码器反馈
增益参数:
| 参数 | 名称 | 作用 | 增大效果 | 减小效果 |
|---|---|---|---|---|
| Kp | 位置环比例增益 | 位置跟随刚度 | 跟随误差减小,可能振动 | 跟随误差增大,更稳定 |
| Kv | 速度环比例增益 | 速度响应 | 响应更快,可能超调 | 响应变慢,更稳定 |
| Ki | 速度环积分增益 | 稳态误差消除 | 消除稳态误差,可能振荡 | 可能有稳态误差 |
| Kvff | 速度前馈 | 减小跟随误差 | 跟随误差大幅减小 | 跟随误差增大 |
| Kaff | 加速度前馈 | 补偿加速段误差 | 加速段跟随误差减小 | 加速段误差增大 |
整定步骤 (推荐顺序):
第 1 步: 调电流环(通常不动,驱动器默认已调好)
第 2 步: 调速度环 (Kv, Ki)
├── 低速时,增大 Kv 直到轻微振动,然后回调 80%
└── 用示波器观察阶跃响应,无超调为佳
第 3 步: 调位置环 (Kp)
├── 从低到高增加 Kp
└── 观察跟随误差,目标 < 1 脉冲
第 4 步: 加前馈 (Kvff, Kaff)
├── 逐步增加 Kvff 使跟随误差趋近 0
└── 注意: 前馈过大可能导致过冲
10.3 加减速优化
S 曲线 vs T 曲线:
速度 ↑ 速度 ↑
│ ┌──┐ │ ╱╲
│ ╱ ╲ │ ╱ ╲
│ ╱ ╲ │ ╱ ╲
│ ╱ ╲ │╱ ╲
└────────────→ └────────────→
T 曲线 (有冲击) S 曲线 (平滑)
| 曲线 | 特点 | 适用场景 |
|---|---|---|
| T 曲线 | 加速度突变,有冲击 | 低速、大惯性 |
| S 曲线 | 加速度连续,无冲击 | 通用推荐 |
| 修正 S 曲线 | 加速度和跃度都连续 | 高速、精密定位 |
加速时间计算:
给定:
Vmax = 100 mm/s (最大速度)
Accel = 1000 mm/s² (加速度)
Jerk = 5000 mm/s³ (跃度)
S 曲线加速时间:
T_accel = Vmax/Accel + Accel/Jerk
= 100/1000 + 1000/5000
= 0.1 + 0.2
= 0.3 秒
加速段位移:
S_accel = 0.5 × Vmax × T_accel
= 0.5 × 100 × 0.3
= 15 mm
10.4 跟随误差分析
什么是跟随误差?
位置目标 ────→ 位置实际 ───→ 差值 = 跟随误差
↑
└─ 编码器反馈
正常跟随误差范围:
| 控制模式 | 典型跟随误差 | 备注 |
|---|---|---|
| pp 模式 | 0 | 驱动器内部闭环,误差为 0 |
| csp 模式 | ±0.01~0.1mm | 取决于通讯周期和增益 |
| pv 模式 | ±0.5~2mm | 速度模式下跟随误差较大 |
| 高速 (500mm/s+) | ±0.05~0.2mm | 需要前馈补偿 |
跟随误差过大:
| 原因 | 现象 | 解决 |
|---|---|---|
| 增益太低 | 加速段误差大,匀速段误差小 | 增大 Kp, Kv |
| 前馈不够 | 全程误差大 | 增大 Kvff, Kaff |
| 加速度太大 | 高速运行误差大 | 减小加速度或增加 Jerk |
| 机械间隙 | 方向切换时误差突变 | 加背隙补偿或换机械 |
| 通讯延迟 | 周期性误差波动 | 检查 EtherCAT 周期 |
10.5 振动抑制
常见振动类型:
共振 ────╱╲────╱╲──── 频率: 5~50 Hz
╱ ╲ ╱ ╲
╱ ╲╱ ╲
抖动 ────╱╲╱╲╱╲╱╲╱╲ 频率: 50~200 Hz
╱╲╱╲╱╲╱╲╱╲
╱╲╱╲╱╲╱╲╱╲
爬行 ────╱╲╱╲╱╲╱╲╱╲ 低速时的摩擦导致
╱╲╱╲╱╲╱╲╱╲
╱╲╱╲╱╲╱╲╱╲
振动抑制方法:
| 方法 | 原理 | 适用场景 |
|---|---|---|
| 陷波滤波器 | 滤除共振频率 | 机械共振 |
| 低通滤波器 | 衰减高频噪声 | 编码器噪声 |
| 增益降低 | 降低系统响应 | 顽固振动 |
| 阶跃变 S 曲线 | 减小加速度冲击 | 启停振动 |
| 加速度前馈 | 补偿惯性力 | 加减速段振动 |
10.6 常见问题排错
| 问题 | 可能原因 | 排查步骤 | 解决方案 |
|---|---|---|---|
| 轴使能不上 | 急停/安全门/驱动器报警 | 1. 检查安全回路 2. 读驱动器报警码 3. 检查 EtherCAT 通讯 | 按急停复位 → 清除驱动器报警 → 重新使能 |
| 轴运动抖动 | 增益过高/机械共振 | 1. 用示波器看速度曲线 2. 降低增益 3. 增加陷波滤波器 | 降低 Kp 20% → 检查效果 → 逐步调整 |
| 定位不准 | 背隙/编码器故障/丝杠磨损 | 1. 测量往返误差 2. 检查编码器 3. 检查机械 | 增加背隙补偿 → 更换磨损部件 |
| 回零失败 | 传感器故障/参数错误 | 1. 检查传感器 IO 状态 2. 核对回零参数 3. 手动试回零 | 修复传感器 → 核对参数 |
| 跟随误差大 | 增益低/前馈不够/负载重 | 1. 读跟随误差值 2. 增大增益 3. 加前馈 | 逐步增大 Kp, Kv, 加 Kvff |
| 电子齿轮滑脱 | 主轴丢失脉冲/通讯中断 | 1. 检查主轴编码器 2. 检查 EtherCAT 通讯 3. 看 InGear 状态 | 检查编码器接线 → 检查通讯线 |
| 紧急停止后轴动不了 | 处于 ErrorStop 状态 | 1. 读状态 2. 确认急停已复位 3. 执行 MC_Reset | 先 MC_Reset → 再重新运动 |
| 多轴插补轨迹偏离 | 轴间同步误差/机械问题 | 1. 看各轴跟随误差 2. 检查机械传动 3. 检查插补参数 | 调整各轴增益一致 → 改善机械 |
| 凸轮运动异常 | CAM 曲线设计错误 | 1. 检查 CAM 曲线 2. 检查主轴位置 3. 看 InGear 状态 | 重新设计 CAM 曲线 |
| 驱动器过流报警 | 电机堵转/短路/加减速过大 | 1. 检查电机是否卡住 2. 降低加速度 3. 检查电机线 | 排除机械卡死 → 降低加速度 |
附录
A. 运动控制功能块速查表
| 功能块 | 类别 | 功能 | 是否常用 |
|---|---|---|---|
| MC_Power | 管理 | 使能/断电 | ⭐⭐⭐ |
| MC_Home | 管理 | 回零 | ⭐⭐⭐ |
| MC_Stop | 管理 | 急停 | ⭐⭐⭐ |
| MC_Halt | 管理 | 暂停 | ⭐⭐⭐ |
| MC_Reset | 管理 | 复位 | ⭐⭐⭐ |
| MC_ReadStatus | 管理 | 读状态 | ⭐⭐⭐ |
| MC_ReadAxisError | 管理 | 读错误 | ⭐⭐ |
| MC_MoveAbsolute | 单轴 | 绝对定位 | ⭐⭐⭐ |
| MC_MoveRelative | 单轴 | 相对定位 | ⭐⭐⭐ |
| MC_MoveVelocity | 单轴 | 速度模式 | ⭐⭐ |
| MC_MoveAdditive | 单轴 | 追加运动 | ⭐ |
| MC_Jog | 单轴 | 点动 | ⭐⭐ |
| MC_MoveLinear | 多轴 | 直线插补 | ⭐⭐⭐ |
| MC_MoveCircular | 多轴 | 圆弧插补 | ⭐⭐ |
| MC_MoveDirectAbsolute | 多轴 | 独立绝对 | ⭐⭐ |
| MC_GearIn | 同步 | 齿轮啮合 | ⭐⭐ |
| MC_GearOut | 同步 | 齿轮脱开 | ⭐⭐ |
| MC_CamIn | 同步 | 凸轮啮合 | ⭐⭐ |
| MC_CamOut | 同步 | 凸轮脱开 | ⭐⭐ |
| MC_CamTableSelect | 同步 | 选凸轮表 | ⭐⭐ |
| MC_GroupEnable | 轴组 | 组使能 | ⭐⭐⭐ |
| MC_GroupDisable | 轴组 | 组断电 | ⭐⭐ |
| MC_GroupHome | 轴组 | 组回零 | ⭐⭐ |
| MC_GroupStop | 轴组 | 组急停 | ⭐⭐ |
| MC_GroupReset | 轴组 | 组复位 | ⭐⭐ |
| MC_GroupReadStatus | 轴组 | 组状态 | ⭐⭐ |
| MC_SetCartesianTransform | 坐标系 | 设坐标系变换 | ⭐⭐ |
B. 轴状态机状态码
| 状态码 | 名称 | 说明 |
|---|---|---|
| 0 | Disabled | 轴未使能,不响应任何指令 |
| 1 | ErrorStop | 错误停止,需要 Reset |
| 2 | Standstill | 已使能,静止,可接收指令 |
| 3 | DiscreteMotion | 点对点运动(MC_MoveAbsolute/Relative) |
| 4 | ContinuousMotion | 连续运动(MC_MoveVelocity) |
| 5 | Homing | 回零中 |
| 6 | SynchronizedMotion | 同步运动(齿轮/凸轮) |
C. 关键参数推荐值
| 应用场景 | 加速度 | 跃度 | 速度环增益 | 位置环增益 | 速度前馈 |
|---|---|---|---|---|---|
| 传送带定位 | 2000 mm/s² | 10000 mm/s³ | 20 Hz | 30 1/s | 80% |
| XY 工作台 | 3000 mm/s² | 15000 mm/s³ | 30 Hz | 50 1/s | 90% |
| 点胶机 | 1000 mm/s² | 5000 mm/s³ | 15 Hz | 25 1/s | 70% |
| 飞剪 | 5000 mm/s² | 25000 mm/s³ | 40 Hz | 60 1/s | 100% |
| 龙门同步 | 2000 mm/s² | 10000 mm/s³ | 25 Hz | 40 1/s | 85% |
| 机器人 | 5000 mm/s² | 25000 mm/s³ | 50 Hz | 80 1/s | 100% |
D. 学习路径
第 1 步: 读完本节 → 理解概念
第 2 步: 跑单轴示例 → 实践 MC_Power, MC_MoveAbsolute, MC_Home
第 3 步: 跑双轴插补示例 → 实践 MC_MoveLinear
第 4 步: 跑电子齿轮示例 → 实践 MC_GearIn
第 5 步: 跑电子凸轮示例 → 实践 MC_CamIn
第 6 步: 独立设计一个完整项目
E. 相关文档
- PLCopen MC 功能块参考 — 功能块详细参数
- 机器人运动指令 — MOVJ/MOVL/MOVC 指令
- 机器人使能与急停 — 安全操作流程
- 步进电机定位案例 — 完整项目案例
- 6 轴机器人取放案例 — 深度案例
- EtherCAT 通讯 — 驱动通讯配置
- 性能优化 — 实时性调优