4. 绝对定位与相对定位(MC_MoveAbsolute / MC_MoveRelative):指令参数详解、速度曲线规划
各位同学,今天我们来聊聊定位指令。说实话,在运动控制里,绝对定位和相对定位是最基础、也是最常用的两个指令。你想想看,不管你是做搬运、分拣还是包装,最终都要让轴走到某个位置。怎么走?就是靠这两个指令。
我个人习惯把绝对定位比作「坐地铁到固定站」,相对定位则是「往前走三步」。方向不同,用法也不同。下面我们一个一个拆开讲。
4.1 绝对定位 MC_MoveAbsolute
绝对定位,说白了就是让轴走到一个固定的坐标点。这个坐标是相对于机器原点(Home)的。比如原点在0,你让轴走到100mm,那它每次都会停在100mm的位置,不管它之前在哪。
4.1.1 指令参数详解
我们来看一下 MC_MoveAbsolute 的输入输出参数。我用的是西门子 S7-1500T 的工艺对象,大家注意参数名称可能因版本略有差异,但功能是一样的。
| 参数 | 数据类型 | 说明 |
|---|---|---|
| Execute | BOOL | 上升沿触发启动 |
| Position | LREAL | 目标绝对位置(单位:mm 或 °) |
| Velocity | LREAL | 最大速度(单位:mm/s 或 °/s) |
| Acceleration | LREAL | 加速度(单位:mm/s²) |
| Deceleration | LREAL | 减速度(单位:mm/s²) |
| Jerk | LREAL | 加加速度(可选,用于平滑曲线) |
| Done | BOOL | 定位完成信号 |
| Busy | BOOL | 指令执行中 |
| Error | BOOL | 错误标志 |
这里我要特别提一下 Jerk(加加速度)。我在项目中遇到过一台贴标机,启动和停止时物料总是晃动。后来加了 Jerk 限制,速度曲线变得平滑,问题就解决了。说白了,Jerk 就是控制加速度的变化率,让运动更柔和。
4.1.2 速度曲线规划
绝对定位的速度曲线通常是梯形或S形。梯形曲线简单粗暴,加速-匀速-减速。S形曲线则多了加加速和加减速段,更平滑。
我画了一张图,大家看看这两种曲线的区别:
嗯,这里要注意:梯形曲线虽然效率高,但加减速瞬间有冲击。S形曲线更柔和,但总时间会长一点。怎么选?看你的工艺要求。
4.2 相对定位 MC_MoveRelative
相对定位就简单了——它是在当前位置的基础上移动一段距离。比如轴现在在50mm,你给一个相对距离100mm,那它就会走到150mm。
4.2.1 指令参数详解
MC_MoveRelative 的参数和绝对定位几乎一样,只有一个关键区别:
| 参数 | 说明 |
|---|---|
| Distance | 相对移动距离(正数正向,负数反向) |
| Velocity | 最大速度 |
| Acceleration | 加速度 |
| Deceleration | 减速度 |
注意看,绝对定位用的是 Position,相对定位用的是 Distance。这个千万别搞混。我曾经见过一个同事,在相对定位里填了绝对坐标,结果轴直接冲过限位……嗯,那次差点撞机。
4.2.2 速度曲线规划
相对定位的速度曲线和绝对定位完全一样,也是梯形或S形。但有一个细节:如果距离太短,可能达不到设定速度。比如你设速度100mm/s,但距离只有5mm,那轴可能刚加速就要减速了,根本跑不到100。
这种情况我遇到过很多次。有一次做一个小行程的往复运动,距离只有10mm,我设了很高的速度,结果轴一直在加减速,根本没用上高速。后来我把速度降下来,反而更平稳。
这里我画一个短距离的速度曲线示意图:
你看,实际速度曲线变成了三角形,最高点没达到设定值。这就是为什么我建议:短距离运动,速度不要设太高,否则加减速占用了大部分时间,效率反而低。
4.3 绝对定位 vs 相对定位:怎么选?
这个问题我经常被问到。其实选择很简单:
- 用绝对定位的场景:每次都要回到固定位置,比如取料点、放料点、原点回归后的定位。
- 用相对定位的场景:连续移动固定步长,比如输送带上的等距分拣、往复运动。
我个人习惯是:能用绝对定位就用绝对定位。为什么?因为绝对定位有明确的目标坐标,调试时容易发现问题。相对定位如果累积误差,可能会越走越偏。
4.4 代码示例
下面是一个简单的 SCL 代码片段,演示如何在 S7-1500T 中调用这两个指令:
// 绝对定位:走到 200mm 位置
"MC_MoveAbsolute_Instance"(
Execute := "Start_Abs",
Position := 200.0,
Velocity := 100.0,
Acceleration := 500.0,
Deceleration := 500.0,
Jerk := 1000.0,
Done => "Done_Abs",
Busy => "Busy_Abs",
Error => "Error_Abs"
);
// 相对定位:正向移动 50mm
"MC_MoveRelative_Instance"(
Execute := "Start_Rel",
Distance := 50.0,
Velocity := 80.0,
Acceleration := 400.0,
Deceleration := 400.0,
Done => "Done_Rel",
Busy => "Busy_Rel",
Error => "Error_Rel"
);
注意看,两个指令的调用方式几乎一样,只是目标参数不同。我建议你在调试时,先把 Velocity 设小一点(比如 10mm/s),确认方向正确后再提速。这样安全。
4.5 常见问题与避坑
- 轴不动?检查 Execute 是不是上升沿触发。很多人用常1信号,结果只动一次。
- 位置不准?检查机械间隙和电子齿轮比。我遇到过一台机器,因为同步带松动,绝对定位每次都差几毫米。
- 报错?看看是不是超限位了。绝对定位的目标位置不能超过软限位范围。
好了,关于绝对定位和相对定位,今天就讲这么多。这两个指令是运动控制的基础,一定要熟练掌握。下一节我们会讲更高级的定位方式,但基础打牢了,后面就轻松了。
公众号:蓝海资料掘金营,微信deep3321