新人指导手册 · 从零开始学脉冲定位控制
如果你是一个刚接触 S7-1200 控制伺服的新人,这篇手册的目标是让你在看完后能独立完成一个脉冲定位控制项目。
你需要具备的基础:
什么是不需要的?
💡 虾仁给你的定位:本篇的目标是「你照着做就能动起来」,而不是「你理解所有原理后再动手」。先动起来,再深入理解。
在工业自动化中,S7-1200 控制伺服驱动器最常见的三种方式是:
| 方式 | 说明 | 适用 |
|---|---|---|
| 脉冲+方向 | PLC发脉冲的频率=速度,脉冲数=位置;方向信号决定正反转 | 新手入门、简单定位、成本敏感的项目 |
| PROFINET(总线) | 通过工业以太网直接发位置指令给伺服 | 高端伺服、多轴联动、需要回读参数 |
| 模拟量速度给定 | 0~10V 速度信号 + 开关量方向 | 老式变频器、不需要精确定位的场合 |
新手学脉冲+方向是最友好、最直观的——每个脉冲对应伺服电机转过一个固定的角度(取决于伺服的分辨率设置),你只要知道"发了多少脉冲,电机就走了多少距离"就可以了。
① PTO(Pulse Train Output,脉冲串输出)
S7-1200 通过硬件脉冲发生器输出精确的脉冲序列。PTO 模式下,PLC 可以输出频率可调的方波信号——频率决定电机的速度,脉冲数量决定电机的位置。注意:高速计数器(HSC)主要用于接收高速脉冲,PTO 是输出功能,两者不要混淆。
② 电子齿轮比
伺服驱动器内部有一个参数把"收到的脉冲数"和"电机实际走的距离"关联起来。电子齿轮比 = 分子 / 分母。常见的设置是:
💡 新手建议:先将伺服驱动器的电子齿轮比设为 1:1(即 10000 pulse/rev),这样软件里计算最简单。
③ 加减速时间
机械系统在启停时有惯性——如果一瞬间就从 0 加速到 3000 rpm,电机会过载,机械会震动。S7-1200 的 Motion Control 会按工艺对象参数生成加减速曲线,你需要设置最大速度、加速度和减速度等参数。
| 类型 | PLC输出点 | 说明 |
|---|---|---|
| Pulse + Direction | 1 个脉冲输出 + 1 个方向输出 | 最常用,省输出点。方向为 0 正转,1 反转(可配置) |
| CW/CCW(正反转脉冲) | 2 个脉冲输出 | 正转时一个口发脉冲,反转时另一个口发脉冲。占输出点多 |
| A/B 相(正交编码) | 2 个相位差90°的脉冲 | 一般不用在 PLC 发脉冲的场合,用于编码器反馈 |
本手册以 Pulse + Direction(脉冲+方向) 为例进行讲解。
PTO 功能需要 CPU 固件版本 V4.0 及以上,并且必须使用晶体管输出点或高速信号板/信号模块。继电器输出点不能直接发高速脉冲。不同 CPU 和输出点支持的数量、频率不同,选型时一定要按实际订货号查手册。
| CPU/硬件 | PTO 使用建议 | 典型频率 | 备注 |
|---|---|---|---|
| 晶体管输出型 CPU(DC/DC/DC) | 可用本体高速输出做 PTO | 常见为 100 kHz;1217C 可更高 | 新手优先选 1214C/1215C DC/DC/DC |
| 继电器输出型 CPU(AC/DC/RLY) | 本体继电器点不能做 PTO | — | 需要加高速信号板或晶体管输出模块 |
| SB/SM 高速输出模块 | 用于补充 PTO 输出点或提高频率 | 按模块手册确认 | 不同订货号差异较大,不要只看 CPU 型号 |
| 1217C | 适合更高频率或更复杂的定位应用 | 最高可到 1 MHz 级别 | 成本更高,普通入门项目不必首选 |
💡 新手采购建议:直接选择 CPU 1214C DC/DC/DC 或 CPU 1215C DC/DC/DC 更省事;如果现场已经是继电器型 CPU,再按手册补高速输出信号板或晶体管输出模块。
任何支持"脉冲+方向"控制的伺服驱动器都可以使用。常见品牌:
S7-1200 的脉冲输出点不是随便选的,需要在 TIA Portal 的“脉冲发生器(Pulse generators)”里分配。下面是新人最常用的 PTO/PWM [0] 示例;更多轴请以你的 CPU、信号板和 TIA Portal 实际可选地址为准。
| 示例轴 | 脉冲输出(Pulse) | 方向输出(Direction) |
|---|---|---|
| Axis_1(PTO/PWM [0]) | 常见为 Q0.0 | 常见为 Q0.1 |
| Axis_2 及以上 | 在设备组态中继续启用 PTO/PWM [1]、[2]、[3],按 TIA Portal 给出的可用输出点接线 | |
接线方式(以 Axis_1 = Q0.0 Pulse, Q0.1 Direction 为例):
[ S7-1200 ] [ 伺服驱动器 ]
┌─────────┐ ┌────────────┐
│ Q0.0 ├─────── Pulse ────┤ PULSE+ │ ← 脉冲信号正
│ GND ├──────────────────┤ PULSE- │ ← 脉冲信号负(接COM0)
│ │ │ │
│ Q0.1 ├─────── DIR ─────┤ SIGN+ │ ← 方向信号正
│ GND ├──────────────────┤ SIGN- │ ← 方向信号负
│ │ │ │
│ DO 点 ├─────── EN ──────┤ SON │ ← 伺服使能(Servo On)
│ DO 点 ├─────── RESET ────┤ ALARM_RST │ ← 报警清除
└─────────┘ │ │
│ 24V+ ─────┤ ← 外接24V电源正
│ 0V ─────┤ ← 外接24V电源负
└────────────┘
⚠️ 重要提醒:S7-1200 晶体管输出为 24V 电平,如果伺服驱动器的脉冲输入是 5V 差分信号,需要加 24V→5V 脉冲转换模块(或使用集电极开路接法)。具体以你所用伺服的手册为准。
⚠️ 接线前先确认输出类型:S7-1200 晶体管输出有源型/漏型差异,伺服输入也可能是差分、集电极开路、NPN 或 PNP。PULSE-/SIGN- 不一定都能直接接 PLC 的 0V,必须按伺服手册的输入电路接线。
无论你用什么牌子的伺服,以下几个参数必须设置正确:
| 参数 | 推荐值 | 说明 |
|---|---|---|
| 控制模式 | Pt(位置控制模式 / Position Mode) | 脉冲定位 |
| 脉冲输入类型 | Pulse + Direction(脉冲+方向) | 对应 PLC 的配置 |
| 电子齿轮比/指令脉冲数 | 先设成 10000 pulse/rev 这类易算值 | 不同品牌“分子/分母”的定义可能相反,按驱动器手册确认 |
| 脉冲输入逻辑 | 按 PLC 输出和驱动器输入电路选择 | NPN/PNP、源型/漏型、正逻辑/负逻辑不要混用 |
| SON(伺服使能) | 设置为外部端子控制 | 由 PLC 的数字量输出控制 |
| ALM(报警输出) | 接 PLC 数字量输入 | 读取伺服报警状态 |
本章以 TIA Portal V17 + S7-1200 1214C + 台达 ASDA-B2 为例(其他版本步骤类似)。
1 打开 TIA Portal,点击 创建新项目 → 输入项目名称 → 点击创建。
2 在项目树中双击 添加新设备 → 选择你的 CPU 型号(推荐 CPU 1214C DC/DC/DC 或 CPU 1215C DC/DC/DC)→ 版本号选择你实际的固件版本 → 确定。
⚠️ 注意:如果你的 CPU 是 继电器输出型(RLY),无法直接输出脉冲。继电器输出的响应时间太长,必须在扩展机架上使用 晶体管输出模块(如 SM 1222 DQ 8×24VDC)才能使用 PTO。
3 在设备组态中双击 CPU → 在底部的 属性 标签页中,展开 → 脉冲发生器(Pulse generators)。
你通常会看到 PTO/PWM [0] ~ PTO/PWM [3]。实际可用数量取决于 CPU、信号板/信号模块和输出点是否已被占用。
4 点击 PTO/PWM [0] →
参数设置:
✓ 勾选 启用该脉冲发生器
✓ 信号类型:选 PTO(脉冲串输出)
✓ 硬件输出:示例为 DQ0.0(脉冲输出)和 DQ0.1(方向输出),以你的 TIA Portal 可选项为准
✓ 脉冲格式:选 Pulse_A_Dir_B(脉冲+方向)
CPU 会提醒你需要重新分配输出地址或者配置轴对象,点击确认即可。
这是西门子脉冲定位的核心步骤——在 TIA Portal 里创建一个"轴对象",把所有和这个轴相关的参数都放在里面。
5 在项目树中展开 工艺对象(Technology objects) → 双击 添加新对象。
→ 选择 Motion Control → TO_Axis_PTO(轴) → 输入名称如 Axis_1 → 确定。
6 打开轴对象后,在组态向导中设参数:
① 驱动器:选择你刚刚启用的脉冲发生器(PTO/PWM [0])
② 编码器:选择 编码器未连接(实际值不反馈)(开环脉冲控制,不需要编码器反馈),或接编码器做位置检测跟踪(闭环)
③ 机械参数:这是最重要的设置,我在下面单独讲
| 参数 | 说明 | 示例值 |
|---|---|---|
| 每转脉冲数 | 电机转一圈需要多少个脉冲 | 10000 |
| 每转距离 | 电机转一圈,负载走多远(mm) | 10(丝杠导程 10mm) |
| 速度单位 | 选 mm/s 最直观 | mm/s |
| 最大速度 | 限制最高速度,防止飞车 | 300 mm/s(按实际需求设) |
| 启动/停止速度 | 从 0 加速的起始速度 | 10 mm/s |
| 最大加速度 | 加减速斜率,越大越快但越冲击 | 500 mm/s² |
| 急停加速度 | 急停时更大的减速值 | 2000 mm/s² |
💡 计算示例:
假设丝杠导程 10mm(电机转一圈,滑块走 10mm),伺服设定为 10000 pulse/rev。
→ 每个脉冲对应的距离 = 10mm ÷ 10000 = 0.001 mm = 1 μm
→ 精度为 1 μm/脉冲,对于绝大多数工控定位足够了。
S7-1200 的 Motion Control 是通过调用系统自带的指令块来实现的。最常用的几个:
| 指令 | 功能 | 说明 |
|---|---|---|
MC_Power | 轴软件使能 | 必须循环调用,Enable=1 后轴对象才能接受运动指令。它不等同于硬件安全上电,伺服 SON/STO 仍需单独处理 |
MC_Home | 回原点 | 让轴找到机械参考点,建立坐标零点 |
MC_MoveAbsolute | 绝对定位 | 移动到坐标系中的指定位置(比如到 250mm 处) |
MC_MoveRelative | 相对定位 | 从当前位置继续往前走一段距离(比如再走 50mm) |
MC_MoveVelocity | 速度模式 | 以设定速度持续运行,直到被停止 |
MC_MoveJog | 点动 | 手动模式点动正转或反转,常用于调试 |
MC_Halt | 停止 | 按设定的减速度将轴减速停止 |
MC_Reset | 错误复位 | 轴报错后清除错误状态 |
下面是最小定位逻辑示意。实际项目还应补回零、停止、复位、限位和报警处理。
┌─────────────────────────────────────┐
│ MC_Power_DB │
──────┤ EN ENO ├─────
"Axis1"┤ Axis │
"AxisEnable"┤ Enable │
True ┤ StopMode ┌─────────────────────┐ │
└────────────┤ MC_MoveAbsolute_DB │───────
│ EN ENO │
"Axis1"┤ Axis │
"Go" │ Execute │
250.0 ┤ Position │
50.0 ┤ Velocity │
└───────────────────┘
对应的梯形图逻辑:
// 网络 1:轴软件使能
// MC_Power 需要在 OB1 中循环调用
"AlwaysTrue" MC_Power_DB
──┤├───────────────────────┬─ EN ──────────
│ Axis := "Axis1"
┌─────────┤ Enable := "PLC_Tag_AxisEnable"
│ │ StopMode := 0
│ │ ENO ────────
│ └────────────────
│
▼ // 网络 2:绝对定位
MC_MoveAbsolute_DB
├─ EN ──────────
│ Axis := "Axis1"
│ Execute := "StartMove"
│ Position := 250.0 // 目标位置 250mm
│ Velocity := 50.0 // 速度 50mm/s
│ ENO ────────
└────────────────
💡 每个 MC 指令都需要一个背景数据块(Instance DB)来存储运行数据。当你拖拽指令到编程区时,TIA Portal 会自动弹出提示框让你创建 DB,建议取名和指令对应(如 MC_Power_DB、MC_MoveAbsolute_DB)。
绝对定位前必须先回原点。回原点的三种方式:
| 方式 | 说明 | 适用场景 |
|---|---|---|
| 直接回零(Direct) | 直接把当前位置设为指定坐标 | 调试时最快,上电后把机械移到原点位置后用这个 |
| 主动回零(Active) | 轴按设定速度寻找原点/参考点开关,找到后建立零点 | 脉冲控制项目最常用,适合操作员一键回零 |
| 带编码器零脉冲的回零 | 参考点开关 + 编码器零脉冲 | 需要接入实际编码器反馈,精度更高但接线和组态更复杂 |
// 回零指令(主动回零示例)
"MC_Home_DB"(Axis := "Axis1",
Execute := "HomeTrigger",
Position := 0.0,
Mode := 3); // Mode 值按 TIA 帮助/工艺对象向导确认
⚠️ 回零不是可选项:开环 PTO 控制只知道 PLC 发出了多少脉冲,不知道负载实际在哪里。上电后如果不回零就做绝对定位,坐标基准可能是错的。
1 创建 DB 变量:在 PLC 变量表中创建以下变量
名称 | 数据类型 | 地址 | 注释 ─────────────────┼──────────┼──────────┼──────────────── Axis1_Enable | Bool | M0.0 | 轴软件使能 Axis1_HomeBtn | Bool | M0.1 | 回零按钮 Axis1_StartBtn | Bool | M0.2 | 启动定位按钮 Axis1_StopBtn | Bool | M0.3 | 停止按钮 Axis1_Emergency | Bool | M0.4 | 急停按钮 Axis1_IsHomed | Bool | M0.5 | 已回零标志 Axis1_IsBusy | Bool | M0.6 | 运行中标志 Axis1_TargetPos | Real | MD10 | 目标位置 (mm) Axis1_Speed | Real | MD14 | 运行速度 (mm/s) Axis1_HasError | Bool | M0.7 | 指令错误标志 Axis1_ResetBtn | Bool | M1.0 | 错误复位按钮 Axis1_Done | Bool | M1.1 | 定位完成标志 Axis1_ErrorCode | Word | MW18 | 错误代码
2 编写主程序(Main [OB1]):
网络 1 — 轴软件使能(循环调用)
"Axis1_Enable"
──┤├─────────────────────── MC_Power_DB(EN)
Axis := "Axis1"
Enable := "Axis1_Enable"
StopMode := 0
⚠️ 不要在多个网络重复调用同一个 MC_Power 背景 DB。同一个轴的同一个 MC 指令实例应只保留一处循环调用,通过变量改变 Enable/StopMode,而不是在急停网络里再调用一次。
网络 2 — 回零
"Axis1_HomeBtn" "Axis1_IsHomed"
──┤├───────┤/├────────────────── MC_Home_DB(EN)
Axis := "Axis1"
Execute := "Axis1_HomeBtn"
Position := 0.0
Mode := 3
Done => "Axis1_IsHomed"
网络 3 — 绝对定位
"Axis1_StartBtn" "Axis1_IsHomed" "Axis1_Emergency"
──┤├───────┤├───────┤/├──────── MC_MoveAbsolute_DB(EN)
Axis := "Axis1"
Execute := "Axis1_StartBtn"
Position := "Axis1_TargetPos"
Velocity := "Axis1_Speed"
Busy => "Axis1_IsBusy"
Error => "Axis1_HasError"
ErrorID => "Axis1_ErrorCode"
Done => "Axis1_Done"
💡 Execute 信号建议用上升沿:按钮常常会保持多个扫描周期,正式程序里建议先用 R_TRIG 做启动沿,再把沿信号接到 MC_Home、MC_MoveAbsolute、MC_Halt 的 Execute。
网络 4 — 停止(可选)
"Axis1_StopBtn"
──┤├──────────────────────── MC_Halt_DB(EN)
Axis := "Axis1"
Execute := "Axis1_StopBtn"
网络 5 — 停止与安全急停
// 软件停止:按下 Axis1_StopBtn 时触发 MC_Halt,让轴按减速度停下。 // 安全急停:必须走硬件急停/STO/安全继电器回路,同时复位 Axis1_Enable。 // 不要把“MC_Power Enable := 0”当成唯一急停手段。
网络 6 — 错误复位
"Axis1_ResetBtn"
──┤├──────────────────────── MC_Reset_DB(EN)
Axis := "Axis1"
Execute := "Axis1_ResetBtn"
Axis1_Enable 置 1。Axis1_HomeBtn,观察 Axis1_IsHomed 变为 True。Axis1_TargetPos 设为 50.0,速度设为 20.0,触发 Axis1_StartBtn。观察轴是否移动到 50mm 处。💡 初次调试黄金法则:先低速小距离测试(比如 5mm, 10mm/s),确认方向和位置都正确后再上高速大距离。这一步能避免撞机。
| 问题 | 可能原因 | 解决办法 |
|---|---|---|
| 轴不动,MC_Power 报错 | ① 脉冲发生器未组态 ② 轴对象与脉冲发生器未关联 ③ MC_Power 未循环调用或 Enable 条件不成立 ④ 伺服 SON/STO 未满足 |
检查 PTO 组态;检查轴对象驱动器参数;在线监控 Enable、Status、ErrorID;确认伺服硬件使能链路正常 |
| 电机方向反了 | ① 方向信号极性不对 ② 伺服方向参数设置相反 |
在轴对象中勾选"反向方向",或在伺服驱动器中反转方向参数 |
| 电机运行抖动 | ① 加减速时间过短 ② 速度过低导致脉冲频率过低 ③ 伺服刚性参数不合适 |
增大加速时间;提高最低速度;调整伺服驱动器刚性增益 |
| 定位不准确,误差大 | ① 电子齿轮比计算错误 ② 每转脉冲数/距离设置错误 ③ 丝杠有间隙或打滑 |
重新校准机械参数;检查电子齿轮比(用示波器测脉冲数) |
| MC_MoveAbsolute 不执行 | ① 轴未回零(绝对定位未建立坐标基准) ② Execute 没有形成有效上升沿 ③ 轴仍处于 Busy、Error 或未使能状态 |
先执行 MC_Home;用 R_TRIG 产生 Execute 上升沿;在线监控 Busy、Error、ErrorID 和 Status |
| 轴运行一段后突然停 | ① 驱动器报警(过载/过流/编码器断线) ② 伺服使能被断开 |
查看伺服驱动器报警代码,对照手册排错 |
| CPU SF/BF 灯亮 | PTO/PWM 输出地址被普通 DQ、PWM 或其他工艺功能重复使用 | 在设备组态中确认 Q0.0/Q0.1 等 PTO 输出点没有被重复分配;重新编译硬件组态查看诊断信息 |
⚠️ 最常见的坑:在硬件组态中启用了 PTO 后,对应输出点会被工艺功能占用。如果你在同一工程中又把这些点当普通数字量输出使用,会导致地址冲突或硬件诊断错误。
脉冲控制虽然简单,但有一些局限性:
当你的项目出现以下情况,建议考虑 PROFINET 总线控制(如西门子 V90 PN 或汇川 IS810N):
🚨 安全第一
① 调试时先拆开负载联轴器,或把伺服速度/转矩限制到很低,确认方向、回零和限位都正确后再带载。
② 必须安装硬件急停和伺服安全断能回路(如 STO/安全继电器/主接触器),不要只依赖 PLC 程序停止。
③ 正限位、负限位和原点开关要接入 PLC,并在工艺对象或程序中同时设置软件限位。
④ 首次运行前确认机械行程内无人、无工具、无夹具干涉,再用低速小距离测试。
"脉冲控制是运动控制的基础——就像学车先学手动挡。如果你能把脉冲控制搞明白,将来上总线控制时你会理解得更深,踩坑也更少。"
—— 虾仁