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 就是控制加速度的变化率,让运动更柔和。

我的习惯:如果设备对冲击敏感(比如抓取易碎品),我一般会设置 Jerk = 2~3 倍的加速度值。如果追求效率,Jerk 可以设大一些甚至不设。

4.1.2 速度曲线规划

绝对定位的速度曲线通常是梯形S形。梯形曲线简单粗暴,加速-匀速-减速。S形曲线则多了加加速和加减速段,更平滑。

我画了一张图,大家看看这两种曲线的区别:

绝对定位速度曲线对比 梯形曲线 S形曲线 速度 时间

嗯,这里要注意:梯形曲线虽然效率高,但加减速瞬间有冲击。S形曲线更柔和,但总时间会长一点。怎么选?看你的工艺要求。

4.2 相对定位 MC_MoveRelative

相对定位就简单了——它是在当前位置的基础上移动一段距离。比如轴现在在50mm,你给一个相对距离100mm,那它就会走到150mm。

核心区别:绝对定位看「终点坐标」,相对定位看「移动距离」。

4.2.1 指令参数详解

MC_MoveRelative 的参数和绝对定位几乎一样,只有一个关键区别:

参数 说明
Distance 相对移动距离(正数正向,负数反向)
Velocity 最大速度
Acceleration 加速度
Deceleration 减速度

注意看,绝对定位用的是 Position,相对定位用的是 Distance。这个千万别搞混。我曾经见过一个同事,在相对定位里填了绝对坐标,结果轴直接冲过限位……嗯,那次差点撞机。

避坑指南:相对定位的 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信号,结果只动一次。
  • 位置不准?检查机械间隙和电子齿轮比。我遇到过一台机器,因为同步带松动,绝对定位每次都差几毫米。
  • 报错?看看是不是超限位了。绝对定位的目标位置不能超过软限位范围。
重要提醒:绝对定位和相对定位不能同时触发。如果你在绝对定位执行中又触发了相对定位,轴会报错。记得用 Busy 信号做互锁。

好了,关于绝对定位和相对定位,今天就讲这么多。这两个指令是运动控制的基础,一定要熟练掌握。下一节我们会讲更高级的定位方式,但基础打牢了,后面就轻松了。


公众号:蓝海资料掘金营,微信deep3321