4. 基本轴功能:MC_Power、MC_Reset、MC_Home、MC_MoveAbsolute、MC_MoveRelative

各位好,我是老张。搞了十几年运动控制,今天咱们聊聊S7-1500T最核心的五个轴控指令。说白了,这五个指令就是轴控的"五虎上将",你玩转了它们,基本就能搞定90%的单轴应用场景。

我记得刚入行那会儿,带我的师傅跟我说:"小张,轴控这东西,会这五个指令就算入门了。"当时我不信,后来才发现——嗯,还真是这么回事。

核心逻辑:任何轴的运动控制,都逃不开"上电→复位→回零→绝对/相对运动"这个闭环。你想想看,是不是这个理?

S7-1500T 轴控核心指令流程 MC_Power 上电 MC_Reset 复位 MC_Home 回零 MC_MoveAbsolute MC_MoveRelative 绝对定位 vs 相对定位:一个认位置,一个认距离

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 五个指令的协同工作流

实际项目中,这五个指令不是孤立用的。我一般按这个顺序来:

  1. 上电:MC_Power 使能轴
  2. 复位:MC_Reset 清除可能存在的错误
  3. 回零:MC_Home 建立坐标系
  4. 运动:根据工艺需求,选 MC_MoveAbsolute 或 MC_MoveRelative

你可能会问:"每次都要回零吗?" 不一定。如果你用的是绝对值编码器,且电池没掉电,回零可以省略。但增量编码器的话——嗯,每次上电都必须回零,没得商量。

核心总结:

  • MC_Power:轴控的"总闸",必须先合上
  • MC_Reset:轴控的"清障车",报错时用
  • MC_Home:轴控的"指南针",建立坐标系
  • MC_MoveAbsolute:轴控的"狙击手",指哪打哪
  • MC_MoveRelative:轴控的"步测员",说走就走

好了,这五个基本轴功能就聊到这儿。说白了,它们就是轴控的"五步走"——上电、复位、回零、绝对/相对运动。你把这五个指令吃透了,单轴控制基本就稳了。


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