> ## Content Index
> Fetch the complete content index at: https://www.hubwiz.com/blog/llms.txt
> Use this file to discover other available public pages before exploring further.

# 绝对定位还是相对定位？S7-1500 伺服轴的两套走法
- URL: https://www.hubwiz.com/blog/servo-absolute-vs-relative-positioning-s7-1500/
- Published: 2026-11-12T12:32:04.000Z
- Updated: 2026-11-12T16:17:04.000Z
- Description: 目标给成绝对坐标还是相对距离？这个选择决定了停机、打滑、断电重启之后机器怎么动。含三段 SCL 示例与四个实操要点。
- Author: admin
- Tags: 运动控制, S7-1500, TIA Portal, 伺服

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

![对比图：在同一个伺服轴上执行 MC_MoveAbsolute 到 250 mm，与 MC_MoveRelative 走 100 mm](https://www.hubwiz.com/blog/content/images/2026/11/img_aed31bceefa1dd21e84f22de0056a9a0-800-1.jpg)

## 什么是绝对运动？

绝对运动把轴送到一个固定坐标。你说「去 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 程序、工艺对象、伺服驱动器与伺服电机](https://www.hubwiz.com/blog/content/images/2026/11/img_272e0226e823036e90412d0ff83b50e7-800-1.jpg)

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

## 示例 1：使能与回零

在任何绝对运动之前，先用 MC\_Power 使能轴，再用 MC\_Home 回零。下面的 SCL 代码展示了这两次调用。

```pascal
// 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。无论从哪个起始位置，这个调用都成立。

```pascal
"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，与它当前的坐标无关。

```pascal
"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](https://tia.hubwiz.com/tia-link?utm%5Fsource=blog&utm%5Fmedium=article&utm%5Fcampaign=servo-abs-rel)，它在本机读工程、只读不改、不上传项目文件）。有了这张图，上面那四条判据才有地方落：回零由谁触发、误差收口写在哪、CommandAborted 被谁消费、目标位置从哪个 DB 读。

来源：[Absolute vs Relative Motion in Servo Motion Control](https://www.automation-fair.com/absolute-vs-relative-motion-control/?ref=hubwiz.com)（Automation-Fair.com，2026-11-11）。文中引用的西门子资料：[S7-1500 Motion Control 功能手册](https://support.industry.siemens.com/cs/attachments/109766459/s71500%5Fs71500t%5Fmotion%5Fcontrol%5Foverview%5Ffunction%5Fmanual%5Fen-US%5Fen-US.pdf?ref=hubwiz.com)、[MC\_MoveAbsolute 参考](https://docs.tia.siemens.cloud/r/en-us/v20/s7-1200-motion-control-s7-1200/s7-1200-motion-control-v4...5-s7-1200/mc%5Fmoveabsolute-s7-1200/mc%5Fmoveabsolute-absolute-positioning-of-axis-v4...5-s7-1200?ref=hubwiz.com)。

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

> **这是「AI × 工业 / PLC」专题的一部分。**完整地图见：[AI × 工业 / PLC 完全指南](https://www.hubwiz.com/blog/ai-industrial-stack/)