4. 基本轴功能:MC_Power、MC_Reset、MC_Home、MC_MoveAbsolute、MC_MoveRelative
各位好,我是老张。搞了十几年运动控制,今天咱们聊聊S7-1500T最核心的五个轴控指令。说白了,这五个指令就是轴控的"五虎上将",你玩转了它们,基本就能搞定90%的单轴应用场景。
我记得刚入行那会儿,带我的师傅跟我说:"小张,轴控这东西,会这五个指令就算入门了。"当时我不信,后来才发现——嗯,还真是这么回事。
核心逻辑:任何轴的运动控制,都逃不开"上电→复位→回零→绝对/相对运动"这个闭环。你想想看,是不是这个理?
4.1 MC_Power — 轴控的"总开关"
MC_Power 是轴控的第一步。没有它,后面四个指令全是摆设。我见过不少新手上来就调 MC_MoveAbsolute,结果轴一动不动,急得满头大汗——其实就是忘了先上电。
它的核心作用就两个:使能驱动器 + 激活轴控功能。说白了,就是告诉PLC:"嘿,这个轴我要用了,你准备好。"
// MC_Power 典型调用
MC_Power_Instance(
Axis := myAxis, // 轴引用
Enable := TRUE, // 使能信号
StopMode := 0, // 停止模式:0=急停,1=斜坡停止
PowerMode := 0, // 上电模式:0=标准
Status => powerStatus,
Busy => powerBusy,
Error => powerError,
ErrorID => powerErrorID
);
我的习惯:Enable 信号我一般用上升沿触发,而不是持续高电平。为什么?因为一旦轴报错,你拉低 Enable 再拉高,就能重新上电,不用额外写复位逻辑。
这里有个坑——StopMode 参数。0 是急停,1 是斜坡停止。我在项目里吃过亏:有一次用急停模式,结果机械冲击太大,把联轴器都打坏了。从那以后,除非是安全需求,我全用斜坡停止。
4.2 MC_Reset — 轴控的"后悔药"
轴跑着跑着报错了,怎么办?别慌,MC_Reset 就是干这个的。它能清除轴的错误状态,让轴重新回到待机状态。
但注意——MC_Reset 不是万能的。它只能清除PLC侧的轴错误,如果驱动器本身报硬故障(比如过流、过压),你得先处理驱动器那边。
// MC_Reset 典型调用
MC_Reset_Instance(
Axis := myAxis,
Execute := resetTrigger, // 上升沿触发
Restart := FALSE, // 是否重启驱动
Done => resetDone,
Busy => resetBusy,
Error => resetError,
ErrorID => resetErrorID
);
我曾经踩过的坑:Restart 参数设为 TRUE 时,会同时重启驱动器。有一次我在产线运行时点了复位,结果整条线停了3分钟——因为驱动器重启需要时间。所以,生产过程中千万别用 Restart=TRUE,除非你想被领导骂。
你想想看,MC_Reset 和 MC_Power 的关系是什么?我的理解是:MC_Power 是"开门",MC_Reset 是"擦地板"。门开着但地板脏了(报错),你得先擦干净(Reset),才能继续用。
4.3 MC_Home — 轴控的"坐标系原点"
绝对定位的前提是什么?你得知道轴现在在哪儿。MC_Home 就是干这个的——给轴建立一个绝对坐标系的原点。
回零方式有很多种,我挑几个常用的说说:
| 回零模式 | 描述 | 适用场景 |
|---|---|---|
| 0 - 直接回零 | 将当前位置设为原点 | 绝对编码器,断电不丢失位置 |
| 1 - 参考点挡块 | 找硬件限位开关作为原点 | 增量编码器,需要每次上电回零 |
| 2 - 主动回零 | 按设定方向找原点开关 | 大多数标准应用 |
| 3 - 被动回零 | 外部触发信号作为原点 | 特殊机械结构 |
// MC_Home 典型调用(主动回零)
MC_Home_Instance(
Axis := myAxis,
Execute := homeTrigger,
Position := 0.0, // 回零后的位置值
Mode := 2, // 主动回零
Done => homeDone,
Busy => homeBusy,
Error => homeError,
ErrorID => homeErrorID
);
个人建议:如果你用的是绝对值编码器,Mode 选 0 就行,省事。但增量编码器的话,我强烈建议用 Mode 2(主动回零),配合外部限位开关,可靠性最高。
我记得有个项目,客户说轴每次开机位置都不对。我过去一看,好家伙,回零程序根本没写,全靠编码器记忆。换了电池后位置全乱了。嗯,这就是典型的"省了回零,多了麻烦"。
4.4 MC_MoveAbsolute — 指哪打哪
绝对定位,就是告诉轴:"你给我跑到坐标 100.0 的位置。"轴会从当前位置,以你设定的速度和加速度,精确跑到目标位置。
它的核心参数就三个:位置、速度、加速度。但实际项目中,我建议你多关注一个参数——加加速度(Jerk)。虽然它不是必填项,但设了它,运动曲线会更平滑,机械寿命更长。
// MC_MoveAbsolute 典型调用
MC_MoveAbsolute_Instance(
Axis := myAxis,
Execute := moveAbsTrigger,
Position := 100.0, // 目标位置(单位:mm 或 °)
Velocity := 50.0, // 速度
Acceleration := 200.0, // 加速度
Deceleration := 200.0, // 减速度
Jerk := 500.0, // 加加速度(可选)
Done => moveAbsDone,
Busy => moveAbsBusy,
Error => moveAbsError,
ErrorID => moveAbsErrorID
);
我的经验:绝对定位的 Position 值,一定要在轴的正负软限位范围内。否则指令会报错。我习惯在程序里加一段限位检查逻辑,避免运行时撞限位。
4.5 MC_MoveRelative — 说走就走
相对定位和绝对定位的区别,说白了就一句话:绝对定位认位置,相对定位认距离。
比如轴当前在 50.0 的位置:
- MC_MoveAbsolute(100.0) → 轴跑到 100.0
- MC_MoveRelative(100.0) → 轴向前走 100.0,最终停在 150.0
// MC_MoveRelative 典型调用
MC_MoveRelative_Instance(
Axis := myAxis,
Execute := moveRelTrigger,
Distance := 50.0, // 移动距离(正数正向,负数反向)
Velocity := 50.0,
Acceleration := 200.0,
Deceleration := 200.0,
Jerk := 500.0,
Done => moveRelDone,
Busy => moveRelBusy,
Error => moveRelError,
ErrorID => moveRelErrorID
);
注意:Distance 可以是负数。但如果你设了负值,轴会反向运动。我曾经在调试时把 Distance 写成了 -50.0,结果轴"嗖"一下往后窜,差点撞到后面的硬限位。所以,写代码时一定要确认方向。
4.6 五个指令的协同工作流
实际项目中,这五个指令不是孤立用的。我一般按这个顺序来:
- 上电:MC_Power 使能轴
- 复位:MC_Reset 清除可能存在的错误
- 回零:MC_Home 建立坐标系
- 运动:根据工艺需求,选 MC_MoveAbsolute 或 MC_MoveRelative
你可能会问:"每次都要回零吗?" 不一定。如果你用的是绝对值编码器,且电池没掉电,回零可以省略。但增量编码器的话——嗯,每次上电都必须回零,没得商量。
核心总结:
- MC_Power:轴控的"总闸",必须先合上
- MC_Reset:轴控的"清障车",报错时用
- MC_Home:轴控的"指南针",建立坐标系
- MC_MoveAbsolute:轴控的"狙击手",指哪打哪
- MC_MoveRelative:轴控的"步测员",说走就走
好了,这五个基本轴功能就聊到这儿。说白了,它们就是轴控的"五步走"——上电、复位、回零、绝对/相对运动。你把这五个指令吃透了,单轴控制基本就稳了。
公众号:蓝海资料掘金营,微信deep3321