绝对定位还是相对定位?S7-1500 伺服轴的两套走法

目标给成绝对坐标还是相对距离?这个选择决定了停机、打滑、断电重启之后机器怎么动。含三段 SCL 示例与四个实操要点。

分享
绝对定位还是相对定位?S7-1500 伺服轴的两套走法

每个伺服轴都需要一个目标。在运动控制里,你可以用两种方式给出这个目标:绝对位置,或者相对距离。这个选择看起来很小,但它决定了机器在一次停止、一次打滑、或者一次断电重启之后会怎么动作。本文解释这两类运动,并演示如何在 TIA Portal 里、在西门子 S7-1500 上对它们编程。

对比图:在同一个伺服轴上执行 MC_MoveAbsolute 到 250 mm,与 MC_MoveRelative 走 100 mm

什么是绝对运动?

绝对运动把轴送到一个固定坐标。你说「去 250 mm」,轴就去那里。轴从哪里出发无关紧要。如果它在 40 mm,它前进 210 mm;如果它在 280 mm,它后退 30 mm。

这只在控制器知道真实位置时才成立。因此,轴必须先回零(homing)。回零把编码器数值与机床坐标系绑定起来。用绝对编码器,这件事在调试时做一次;用增量编码器,每次上电之后都要重做。

什么是相对运动?

相对运动是在当前位置上加上一段距离。你说「走 100 mm」,轴就从它所在的任何位置走这么远。从 40 mm 出发,你停在 140 mm;从 180 mm 出发,你停在 280 mm。

轴不需要回零,只需要使能。这让相对运动非常适合分度、进给和按节距的动作——在那类任务里,距离比坐标更重要。

绝对 vs 相对:一表看清

特性 绝对运动 相对运动
西门子指令 MC_MoveAbsolute MC_MoveRelative
主要输入 位置(Position) 距离(Distance)
结果 每次都到同一个终点位置 每次都走同一段距离
是否需要回零 需要 不需要
位置误差 每次运动都会纠正 多个周期后可能累积
典型用途 取放、配方、固定工位 分度、进给、定长裁切

指令是怎么到达伺服的

在 S7-1500 上,你并不直接驱动电机。你的程序调用 PLCopen 风格的 Motion Control 指令,这些指令与一个工艺对象(technology object)通信,工艺对象里保存轴的配置、限位和轮廓生成器。然后由它把设定值通过 PROFINET 发给驱动器。

框图:S7-1500 轴上的 PLC 程序、工艺对象、伺服驱动器与伺服电机

先在项目树的工艺对象下添加一个定位轴工艺对象,然后在轴配置里把它与驱动器和编码器关联起来。之后,下面的指令就可以把它当作 Axis 参数使用。

示例 1:使能与回零

在任何绝对运动之前,先用 MC_Power 使能轴,再用 MC_Home 回零。下面的 SCL 代码展示了这两次调用。

// Enable the axis
"MC_Power_DB"(Axis := "Axis_1",
              Enable := #bEnable,
              StartMode := 1,
              StopMode := 0,
              Status => #bAxisEnabled,
              Error => #bPowerError);

// Active homing (needs a reference switch)
"MC_Home_DB"(Axis := "Axis_1",
             Execute := #bHome,
             Position := 0.0,
             Mode := 3,
             Done => #bHomed,
             Error => #bHomeError);

示例 2:绝对定位

现在轴可以去一个固定坐标了。在这个例子里,bGoPick 上的上升沿把轴以 100 mm/s 送到 250 mm。无论从哪个起始位置,这个调用都成立。

"MC_MoveAbsolute_DB"(Axis := "Axis_1",
                     Execute := #bGoPick,
                     Position := 250.0,
                     Velocity := 100.0,
                     Done => #bPickDone,
                     Busy => #bPickBusy,
                     Error => #bPickError,
                     ErrorID => #wPickErrorId);

把目标位置存进一个配方数据块,而不是把数值写死在代码里。这样操作员改一个工位位置时,不必碰程序。

示例 3:相对定位

相对运动适合每个周期前进一个节距的进料机构。这里 bIndex 上的每一个脉冲都把轴移动 120 mm,与它当前的坐标无关。

"MC_MoveRelative_DB"(Axis := "Axis_1",
                     Execute := #bIndex,
                     Distance := 120.0,
                     Velocity := 200.0,
                     Done => #bIndexDone,
                     Busy => #bIndexBusy,
                     Error => #bIndexError,
                     ErrorID => #wIndexErrorId);

实操要点

  • 注意指令被覆盖。 在 S7-1500 上,一条新的定位指令会中止仍在运行的那一条。所以要么等到 Done 再发下一条,要么有意识地接受这次中止。
  • Execute 用上升沿。 指令在上升沿启动。Execute 要保持为高,直到 Done、Error 或 CommandAborted 回报结果。
  • 注意误差累积。 如果负载会打滑,一长串相对运动就会漂移。这种情况下,每个周期结束用一次绝对运动收口,或者重新回零一次。
  • 旋转台用模数轴。 在模数轴上,位置每一圈重复。此时绝对指令可以让你选择方向,包括走最近的路径。

该怎么选?

当位置在机床里有含义时——工位、配方、端位挡块——用绝对运动。当距离才是目标时——进给长度、节距——用相对运动。很多真实机器两者都用。例如:轴先回零一次,用相对步进做分度,再用一次绝对运动回到安全位置。

我们的整理:四个落地判据

原文给了「什么时候用哪个」,工程上更需要「怎么防止用错」。四条判据:

  1. 回零依赖是首要代价,不是次要细节。 绝对运动在增量编码器上意味着每次上电都要回零——如果这台机器一天断电三次,那么「绝对定位更安全」这条优势会被回零动作本身吃掉。真正省事的组合是绝对编码器 + 绝对定位,两者配套才成立。
  2. 误差累积要能被「收口」。 相对进给的漂移不是突然出现的,是每个周期欠一点。可执行的做法是:设定「每 N 个周期做一次绝对对位或回零」的固定规则,并把它写进程序而不是写进作业指导书。
  3. 指令覆盖要显式处理。 「新指令中止旧指令」在调试时最容易被误读成「轴乱跑」。程序里要区分 CommandAborted 与 Error:前者通常是自己发的下一条指令造成的,后者才是真故障;把两者混进同一个报警,会让排故方向完全错。
  4. 目标位置别写死在代码里。 配方数据块的做法不仅方便操作员,也让「这个位置是谁改的、什么时候改的」变得可追溯——这一点在验收扯皮时比省事更重要。

另外两个与博途实践相关的补充:

  • 工艺对象是配置,不是代码。 限位、动态值、回零方式都保存在工艺对象里;改这些不需要重新编译程序,但需要重新下载配置。评审时要把「程序逻辑」和「轴配置」分开看,否则会漏掉一类问题(程序对了,限位改了)。
  • 示例代码里的 Mode := 3 是主动回零、需要参考开关。 选择哪种回零方式取决于现场有没有参考开关、以及原点开关的安装位置;这不是可以照抄的参数。

如果要做的是看懂别人写的轴控制块——哪些块在写同一个轴、哪些指令会互相中止、这个位置量从哪里来——先把工程的调用关系与变量写点整理成一张图会快很多(入口:TiaLink,它在本机读工程、只读不改、不上传项目文件)。有了这张图,上面那四条判据才有地方落:回零由谁触发、误差收口写在哪、CommandAborted 被谁消费、目标位置从哪个 DB 读。

来源:Absolute vs Relative Motion in Servo Motion Control(Automation-Fair.com,2026-11-11)。文中引用的西门子资料:S7-1500 Motion Control 功能手册、MC_MoveAbsolute 参考。

本文由汇智网 · Software 2.0 编译整理,转载请注明出处。

这是「AI × 工业 / PLC」专题的一部分。完整地图见:AI × 工业 / PLC 完全指南