编写运动程序
示教好点位后,在 SCL 编辑器中编写运动程序,控制机器人按顺序执行动作。
基本运动指令
MOVJ — 关节运动
机器人各关节同时转动到目标位置。速度快,但 TCP 路径不确定。用于不关心路径、只要快速到达的场景。
MOVJ Home, Speed := 50; // 50% 速度回到 Home
MOVJ Pick_Above, Speed := 80; // 80% 速度到取料上方
MOVL — 直线运动
TCP(工具中心点)沿直线移动到目标位置。用于需要精确路径的场景,如下降取料、沿边焊接。
MOVL Pick, Speed := 20; // 直线缓慢下降到取料位
MOVL Place, Speed := 20; // 直线缓慢下降到放料位
HOME — 回原点
HOME Speed := 30; // 回到机械原点
速度与加速度
| 参数 | 说明 | 范围 |
|---|---|---|
| Speed | 运动速度 (% 或 mm/s) | 1 ~ 100% |
| Accel | 加速度 (%) | 1 ~ 100% |
| Zone | 转角平滑半径 (mm) | 0 = 精确到位 |
// Zone > 0 时,机器人在接近目标点时不停顿,直接平滑过渡到下一段运动
MOVJ Point1, Speed := 80, Zone := 50; // 50mm 范围内开始过渡
MOVL Point2, Speed := 50, Zone := 10; // 10mm 精度过渡
MOVL Point3, Speed := 50, Zone := 0; // 精确到达,完全停顿
配合 IO 信号
运动程序中经常需要配合 IO 信号控制夹爪、气缸等:
// 等待信号
WAIT DI[1] = TRUE; // 等待传感器检测到工件
WAIT DI[2] = TRUE, Timeout := 5.0; // 最多等 5 秒
// 输出信号
DO[1] := TRUE; // 打开夹爪
DO[2] := FALSE; // 关闭气缸
// 延时
DELAY 0.5; // 等待 0.5 秒
完整取放程序示例
PROGRAM PickAndPlace
VAR
CycleCount : INT := 0;
END_VAR
// 回到初始位置
MOVJ Home, Speed := 50;
WHILE TRUE DO
// === 取料 ===
MOVJ Pick_Above, Speed := 80, Zone := 20; // 快速到取料上方
MOVL Pick, Speed := 15; // 缓慢直线下降
DO[1] := TRUE; // 夹爪关闭
DELAY 0.3; // 等待夹紧
MOVL Pick_Above, Speed := 30; // 抬起
// === 放料 ===
MOVJ Place_Above, Speed := 80, Zone := 20; // 快速到放料上方
MOVL Place, Speed := 15; // 缓慢直线下降
DO[1] := FALSE; // 夹爪打开
DELAY 0.3; // 等待松开
MOVL Place_Above, Speed := 30; // 抬起
CycleCount := CycleCount + 1; // 计数
END_WHILE;
END_PROGRAM
多点路径程序示例
PROGRAM WeldingPath
VAR
WeldOn : BOOL := FALSE;
END_VAR
// 移动到焊接起点上方
MOVJ Weld_Start_Above, Speed := 60;
MOVL Weld_Start, Speed := 10; // 精确到达起点
// 开始焊接
DO[3] := TRUE; // 起弧
DELAY 0.2;
// 沿焊缝直线运动
MOVL Weld_Point1, Speed := 5; // 焊接速度
MOVL Weld_Point2, Speed := 5;
MOVL Weld_Point3, Speed := 5;
MOVL Weld_End, Speed := 5;
// 停止焊接
DO[3] := FALSE; // 收弧
DELAY 0.3;
// 撤回
MOVL Weld_End_Above, Speed := 20;
MOVJ Home, Speed := 50;
END_PROGRAM
编程建议
- 安全高度:取放动作总是先移到上方安全高度,再直线下降,避免碰撞
- Speed 参数:空行程用高速(60
80%),接近工件用低速(1020%) - Zone 参数:连续运动路径用 Zone > 0 提高效率,最后一点用 Zone := 0 精确到位
- DELAY 不要省略:夹爪/气缸需要时间动作,建议至少 0.2~0.5 秒
MOVJ 技术原理
关节空间轨迹
MOVJ 在关节空间插补, 所有关节同时启动、同时到达目标. 每个关节从当前角度 q_start 到目标 q_end 的时间:
T_i = max(|Δq_i| / v_i, sqrt(2 · |Δq_i| / a_i)) (各轴独立)
T_move = max(T_i) (取最慢的那轴)
然后所有轴按同步时间 T_move 放缩速度曲线, 保证同步到达. 这样 TCP 的笛卡尔路径是弧线, 而不是直线。
速度曲线
Darra 支持 3 种速度曲线:
| 曲线 | 加减速段 | 平滑度 | 计算开销 |
|---|---|---|---|
| 梯形 (Trapezoid) | 线性 | C⁰ (加速度有跃变) | 最小 |
| S 曲线 (S-Curve) | 正弦 | C¹ (加加速有跃变) | 小 |
| 7 段 S 曲线 | 抛物线 | C² (平滑) | 中 |
默认使用 7 段 S 曲线, Jerk 受控, 机器人机械振动最小。
高级参数
Jerk (加加速度 / 跃度)
MoveJ(
Target := Home,
Velocity := 100,
Acceleration := 500,
Deceleration := 500,
Jerk := 5000 // mm/s³ 或 °/s³
);
Jerk 大 → 响应快, 机械振动大 Jerk 小 → 响应慢, 平滑
典型工业臂 Jerk = 5000~10000。
同步模式
MoveJ(
Target := P1,
SyncMode := SYNC_JOINT // 所有轴同步到达 (默认)
// SYNC_NONE = 各轴独立跑完, 可能先后到
// SYNC_TIME = 所有轴按同一时间曲线缩放, 时间一致
);
生产环境总是用 SYNC_JOINT, SYNC_NONE 只在调试单轴时用。
MC_MoveJointAbsolute 功能块
VAR
mcJ : MC_MoveJointAbsolute;
END_VAR
mcJ(
Robot := Robot1,
Execute := bStart,
TargetJoint := (J1 := 0, J2 := -90, J3 := 90, J4 := 0, J5 := -90, J6 := 0),
Velocity := 100,
Acceleration := 500,
Deceleration := 500,
Jerk := 5000,
Zone := 0
);
IF mcJ.Busy THEN
// 运动中
END_IF;
IF mcJ.Done THEN
// 到达
mcJ(Execute := FALSE); // 复位
END_IF;
IF mcJ.Error THEN
ErrorHandle(mcJ.ErrorId);
END_IF;
MOVJ 与 MOVL / MOVC 对比
| 指令 | 关节空间/笛卡尔 | TCP 路径 | 速度上限 | 姿态精度 | 典型用途 |
|---|---|---|---|---|---|
| MOVJ | 关节 | 弧 (不可控) | 最快 | 关节级 | 空行程 |
| MOVL | 笛卡尔 | 直线 | 中 | 姿态插值 | 工作行程 |
| MOVC | 笛卡尔 | 圆弧 | 中 | 姿态插值 | 圆弧焊 |
| MOVS (Spline) | 笛卡尔 | 曲线 | 中 | 姿态插值 | 自由曲线 |
不关心路径只要快 → MOVJ, 这是黄金法则。
与 PLCopen 兼容性
MOVJ 简写指令编译后等价于:
MC_MoveJointAbsolute(
Robot := <当前机器人>,
Execute := TRUE,
TargetJoint := <点位对应关节>,
Velocity := <Speed %, 转成 °/s>,
...
);
两种写法可混用, 简写适合快速编程, 功能块适合需要完整状态机 (Busy / Done / Error 判断)。
参数表
| 参数 | 类型 | 单位 | 范围 | 默认 | 说明 |
|---|---|---|---|---|---|
| Target / TargetJoint | ROBOT_JOINT / 点位名 | - | - | - | 目标关节角 |
| Velocity | LREAL | % 或 °/s | 0.1..100 或 >0 | 50 | 速度 |
| Acceleration | LREAL | %/s 或 °/s² | 0.1..100 | 100 | 加速度 |
| Deceleration | LREAL | %/s 或 °/s² | 0.1..100 | 100 | 减速度 |
| Jerk | LREAL | °/s³ | - | 5000 | 跃度 |
| Zone | LREAL | ° 或 mm | 0..50 | 0 | 平滑半径 |
| SyncMode | ENUM | - | NONE/JOINT/TIME | JOINT | 同步模式 |
| BufferMode | ENUM | - | ABORT/BUFFER/BLEND | BUFFER | 连续运动衔接 |
| ToolId | UINT | - | 0..15 | 0 | 工具号 (MOVJ 通常不用, 目标按关节指定) |
排错清单
| 现象 | 原因 | 解决 |
|---|---|---|
| 某关节转了 > 180° | 没用 Turn 记录, 走了长路径 | 用构型正确的点位 |
| 运动卡顿 | Jerk 太大 | 减 Jerk 到 3000~5000 |
| 连续 MOVJ 段间停顿 | Zone = 0 | 中间段设 Zone > 0 |
| 超时报警 | Velocity 设得比机械能力大 | 查机型速度上限 |
| 报 "Target out of limit" | 关节角超限位 | 检查点位值 |
| 到达点位姿不对 | 点位构型错 | 重记录点位保留 Config |
最佳实践
- 空行程首选 MOVJ: 从一个工位到另一个工位, MOVJ 最快
- Zone 合理: 相邻 MOVJ Zone = 20~50, 末段 Zone = 0
- 不要接近奇异: 关节空间运动不受奇异影响, 但到达点的姿态可能在奇异 → 仍要避开
- MOVJ + MOVL 混合: 整个程序 70% MOVJ + 30% MOVL 的比例
- 加减速对称: 加速 = 减速, 机械振动最小
- 初次调试用 30% 速度: 所有点位验证一遍再提速
- 3D 仿真必跑: MOVJ 路径不可预测, 仿真里看 TCP 轨迹有没有穿工装