MoveC 圆弧运动
MoveC (Move Circular) 是让 TCP 沿圆弧轨迹运动的指令。MoveJ 走关节空间, MoveL 走直线, MoveC 走圆弧, 三者覆盖绝大多数运动需求。典型应用: 圆弧焊、圆周涂胶、法兰密封、避障绕行。
概述
圆弧的确定
空间一个圆弧需要三个点:
- 起点 (P1) — 当前机器人位置 (程序执行 MoveC 时的所在点)
- 辅助点 / 中间点 (P2) — 圆弧经过的某一点, 用来定义圆弧平面和方向
- 终点 (P3) — 圆弧结束位置
系统由 P1 / P2 / P3 反推出圆心 O 和半径 R, 然后让 TCP 沿此圆弧从 P1 到 P3。
典型应用
| 应用 | 圆弧性质 | 姿态变化 |
|---|---|---|
| 圆形焊缝 (法兰密封) | 全圆或大弧 | 姿态保持垂直焊缝 |
| 汽车门洞涂胶 | 多段弧 + 直线 | 姿态跟随切线方向 |
| 管道焊接 | 小弧段 + 直线连接 | 姿态沿管壁法线 |
| 水泵叶轮打磨 | 螺旋弧 | 姿态跟随叶片角度 |
| 绕柱搬运 (避障) | 半圆 | 姿态固定 |
| 拉伸旋转 (圆盒开盖) | 90° 弧 | 姿态与弧同步转动 |
基本 MoveC 语法
PLCopen MC_MoveCircularAbsolute
VAR
mcCircle : MC_MoveCircularAbsolute;
END_VAR
mcCircle(
Robot := Robot1,
Execute := bStart,
PathMode := CIRC_BORDER, // CIRC_BORDER (经过中间点) 或 CIRC_CENTER (指定圆心)
AuxPoint := pArc_Mid, // 辅助点 (P2)
EndPoint := pArc_End, // 终点 (P3)
Velocity := 50.0, // TCP 切向速度 mm/s
Acceleration := 200.0,
Deceleration := 200.0,
Jerk := 1000.0,
OriMode := ORI_PATH_FOLLOW, // 姿态模式: 跟随路径 / 保持起点 / 终点插值
Zone := 0.0, // 与下一段的平滑半径
ToolId := 1,
UserFrameId := 1
);
IF mcCircle.Done THEN
; // 下一步
END_IF;
两种圆弧模式
| 模式 | 定义方式 | 适用 |
|---|---|---|
| CIRC_BORDER | 起点 + 中间点 + 终点 | 一般弧, 开放圆弧 |
| CIRC_CENTER | 起点 + 圆心 + 终点 + 方向位 | 已知圆心半径, 如绕柱 |
CIRC_CENTER 示例
mcCircle(
Robot := Robot1,
Execute := TRUE,
PathMode := CIRC_CENTER,
CenterPoint := pCircle_Center, // 圆心
EndPoint := pArc_End,
Direction := DIR_CCW, // CCW 逆时针 / CW 顺时针
Velocity := 50.0
);
起点 → 圆心的向量 + 圆心 → 终点的向量决定圆弧平面和半径. 如果起点到圆心的距离 ≠ 圆心到终点的距离, 系统会报"非法圆弧"错。
全圆 (Full Circle)
单次 MoveC 只能走**小于 360°**的圆弧 (因为起终点重合时方向模糊)。完整圆用两段 MoveC:
// 圆心 (100, 100, 50), 半径 50, 起终点在 X 轴上
// 起点 (150, 100, 50) → 过 (100, 150, 50) → 终点对面 (50, 100, 50) → 回起点
mcCircle_1_of_2(
Robot := Robot1, Execute := bStart,
AuxPoint := p_top, // (100, 150, 50)
EndPoint := p_opposite, // (50, 100, 50)
Velocity := 50.0
);
IF mcCircle_1_of_2.Done THEN
mcCircle_2_of_2(
Robot := Robot1, Execute := TRUE,
AuxPoint := p_bottom, // (100, 50, 50)
EndPoint := p_start, // (150, 100, 50) 回到起点
Velocity := 50.0
);
END_IF;
或者用 MC_MoveCircularAbsoluteFullCircle (部分实现提供):
mcFullCircle(
Robot := Robot1,
Execute := TRUE,
CenterPoint := pCenter,
NormalVec := (X := 0, Y := 0, Z := 1), // 圆所在平面法向
Direction := DIR_CCW,
Turns := 1.0, // 转圈数 (支持非整数如 1.5)
Velocity := 50.0
);
连续圆弧 (Blended Arcs)
多段圆弧用 Zone (平滑半径) 连续过渡:
mcArc1(AuxPoint := p_mid1, EndPoint := p_mid2, Zone := 5.0, Velocity := 50);
mcArc2(AuxPoint := p_mid3, EndPoint := p_mid4, Zone := 5.0, Velocity := 50);
mcArc3(AuxPoint := p_mid5, EndPoint := p_end, Zone := 0.0, Velocity := 50);
Zone > 0 时, TCP 不会精确到达每个 EndPoint, 而是在半径 Zone 的球内平滑过渡。焊接 / 涂胶连续弧必加 Zone, 否则速度波动导致焊道厚薄不匀。
姿态模式 (Orientation Mode)
沿圆弧运动时, TCP 的姿态可以有多种变化方式:
| 模式 | 行为 | 典型应用 |
|---|---|---|
| ORI_PATH_FOLLOW | 姿态跟随切线方向, 工具始终"向前" | 焊接 (枪头总对准焊缝前方) |
| ORI_PATH_NORMAL | 姿态跟随法向, 工具垂直于圆弧平面 | 钻孔, 铣削 |
| ORI_KEEP_START | 姿态全程保持起点姿态不变 | 搬运, 抓取 |
| ORI_INTERPOLATE | 起点到终点姿态线性插值 (四元数 Slerp) | 通用 |
| ORI_WRIST_FREE | 腕部自由, 最小化关节运动 | 大范围移动 |
mcArc(
...
OriMode := ORI_PATH_FOLLOW, // 枪头跟着焊缝走
...
);
圆弧焊接示例
PROGRAM WeldCircularSeam
VAR
mcJ : MC_MoveJointAbsolute;
mcL : MC_MoveLinearAbsolute;
mcC1, mcC2 : MC_MoveCircularAbsolute;
step : INT := 0;
END_VAR
CASE step OF
0: // 接近
mcJ(Robot := Robot1, Execute := TRUE, TargetPosition := pWeld_Approach, Velocity := 200);
IF mcJ.Done THEN step := 10; END_IF;
10: // 下降到焊接起点
mcL(Robot := Robot1, Execute := TRUE, TargetPosition := pWeld_Start, Velocity := 30);
IF mcL.Done THEN
DO_Arc := TRUE; // 起弧
Wait(200);
step := 20;
END_IF;
20: // 第 1 段弧 (前半圆)
mcC1(Robot := Robot1, Execute := TRUE,
AuxPoint := pWeld_Mid1, EndPoint := pWeld_Quarter,
Velocity := 8.0, // 焊接速度 8 mm/s
OriMode := ORI_PATH_FOLLOW,
Zone := 2.0);
IF mcC1.Done THEN step := 30; END_IF;
30: // 第 2 段弧 (后半圆)
mcC2(Robot := Robot1, Execute := TRUE,
AuxPoint := pWeld_Mid2, EndPoint := pWeld_End,
Velocity := 8.0,
OriMode := ORI_PATH_FOLLOW,
Zone := 0.0);
IF mcC2.Done THEN
DO_Arc := FALSE; // 收弧
Wait(300);
step := 40;
END_IF;
40: // 退回
mcL(Robot := Robot1, Execute := TRUE, TargetPosition := pWeld_Approach, Velocity := 50);
IF mcL.Done THEN step := 0; END_IF;
END_CASE;
辅助点选取准则
辅助点 P2 的位置对圆弧精度影响极大:
| 位置 | 圆弧形状 | 精度 |
|---|---|---|
| 起点 - 辅助 - 终点 近似等距 | 好 | 高 |
| 辅助点偏向起点或终点 | 圆弧偏 | 中 |
| 三点近似共线 | 退化为直线 (系统报错) | - |
| 辅助点极近起点或终点 | 病态, 半径巨大 | 低 |
黄金法则: 辅助点取在圆弧角度一半的位置, 即 P1 和 P3 的弧中点。
参数表
| 参数 | 类型 | 单位 | 范围 | 默认 | 说明 |
|---|---|---|---|---|---|
| PathMode | ENUM | - | BORDER/CENTER | BORDER | 定义方式 |
| AuxPoint | ROBOT_POS | - | - | - | 辅助点 (BORDER 模式) |
| CenterPoint | ROBOT_POS | - | - | - | 圆心 (CENTER 模式) |
| EndPoint | ROBOT_POS | - | - | - | 终点 |
| Direction | ENUM | - | CW/CCW/SHORTEST | SHORTEST | 圆弧方向 |
| Velocity | LREAL | mm/s | 0.1..1000 | 50 | 切向速度 |
| Acceleration | LREAL | mm/s² | 1..10000 | 500 | 加速度 |
| Jerk | LREAL | mm/s³ | 1..100000 | 5000 | 跃度 |
| OriMode | ENUM | - | - | PATH_FOLLOW | 姿态模式 |
| Zone | LREAL | mm | 0..100 | 0 | 平滑半径 |
| MinRadius | LREAL | mm | 0.1..10 | 1.0 | 最小容许半径, 更小报错 |
排错清单
| 现象 | 原因 | 解决 |
|---|---|---|
| 报"三点共线不构成圆" | P1/P2/P3 近似一条线 | 检查辅助点是否偏离直线 |
| 报"圆弧半径过大" | 三点张角太小 | 改用 MoveL 或调整辅助点 |
| 焊道速度波动 | Zone=0 相邻弧段停顿 | 中间弧段 Zone > 2 |
| 姿态剧烈翻转 | OriMode 错用 ORI_INTERPOLATE 且起终点差 180° | 用 ORI_PATH_FOLLOW 或加中间点 |
| 圆心模式报"非法圆心" | 起到圆心距离 ≠ 圆心到终点 | 用 BORDER 模式重算 |
| 圆弧方向反了 | Direction 错 | 切 CW / CCW |
| 多段弧整体路径跑偏 | 累积误差 | 每 5 段加一个精确点 (Zone=0) 重对齐 |
最佳实践
- 小弧用 MoveL + Zone 近似: 半径 > 1 m 的大弧, 用多段 MoveL 加 Zone 近似, 系统负担小
- CAD 直出点位: 圆弧焊从 CAD 焊接路径导出点位, 比手工示教精度高
- 速度 8~15 mm/s: 圆弧焊速度推荐范围, 过快焊道薄, 过慢烧穿
- 进弧 + 收弧专点: 起弧 (Arc On) 前有进弧点, 收弧 (Arc Off) 后有收弧点, 避免熔池溅落
- 姿态跟随切线: 焊 / 涂胶几乎都用
ORI_PATH_FOLLOW - Zone 合理设置: 相邻弧 Zone = 焊枪直径的 1~2 倍, 不能 > 半径的 1/3
- 圆弧不跨奇异点: 弧长跨越腕奇异 → 插入关节 MoveJ 过渡