4. 单轴运动进阶:速度模式、点动、停止与暂停

各位同学,欢迎来到第四章。上一章我们聊了绝对运动和相对运动,那是位置控制的基础。今天咱们要进入速度控制的领域了。说白了,位置控制是「我要走到哪」,速度控制是「我要跑多快」。这两者在实际项目中,应用场景完全不同。

我个人习惯把速度控制比作汽车的定速巡航。你设定一个速度,电机就一直按这个速度跑,直到你踩刹车或者改变设定。而点动呢,就像手动挡车的半联动,你按着按钮它就动,松开就停。这两种模式在自动化设备里太常见了。

核心知识点速览

  • MC_MoveVelocity:速度模式,电机按设定速度持续运行
  • MC_MoveJog:点动模式,按下动,松开停
  • MC_Stop:急停,立即停止运动
  • MC_Halt:暂停,按减速度平稳停止
单轴运动进阶指令体系 MC_MoveVelocity 速度模式 持续运行 MC_MoveJog 点动模式 按下动,松开停 MC_Stop 急停 立即停止 MC_Halt 暂停 平稳停止 典型应用场景 传送带恒速运行 MC_MoveVelocity 手动调试/对位 MC_MoveJog 紧急停止/安全 MC_Stop 程序暂停/等待 MC_Halt PLCopen 标准单轴运动控制指令集

4.1 MC_MoveVelocity:速度模式

这个指令,你想想看,就是让电机以一个恒定的速度一直转下去。它不像位置模式那样有个目标位置,它只有目标速度。电机启动后,会加速到你设定的速度,然后一直保持,直到你发别的指令打断它。

我在项目中遇到过这样一个场景:一条包装线上的传送带,需要以每分钟30米的速度恒速运行。这时候用MC_MoveVelocity就特别合适。你设定好速度,它就一直跑,不用管位置。

个人经验:速度模式下的加减速时间一定要设置合理。我见过有人把加速时间设成0,结果电机直接「弹射起步」,把传送带上的产品全震飞了。嗯,这可不是开玩笑。

来看一个典型的调用示例:

// 速度模式调用示例
MC_MoveVelocity(
    Axis := Axis1,          // 轴引用
    Execute := bExecute,    // 上升沿触发
    Velocity := 500.0,      // 目标速度,单位:mm/s
    Acceleration := 1000.0, // 加速度,单位:mm/s²
    Deceleration := 1000.0, // 减速度,单位:mm/s²
    Jerk := 0.0,            // 加加速度,0表示不使用
    Direction := 1,         // 方向:1正向,-1反向
    BufferMode := 0,        // 缓冲模式
    Done => bDone,
    Busy => bBusy,
    Active => bActive,
    CommandAborted => bAborted,
    Error => bError,
    ErrorID => wErrorID
);

这里有个细节要注意:Direction参数。有些驱动器支持通过正负速度值来控制方向,但PLCopen标准里专门有个Direction参数。我个人习惯用Direction来控制方向,这样代码可读性更好。

避坑指南:我曾经在一个项目中,把速度模式下的Execute信号一直置为TRUE,结果发现电机停不下来。后来才意识到,速度模式的Execute是电平触发,不是边沿触发。你一直给TRUE,它就认为你要一直跑。想让它停,必须把Execute拉低,然后调用Stop或Halt。

4.2 MC_MoveJog:点动模式

点动,说白了就是「手按着动,手松开停」。这个在设备调试阶段特别有用。你想想看,当你要手动把机械臂移动到某个位置时,用点动模式最方便。

MC_MoveJog有两个关键输入:JogForwardJogBackward。这两个信号是电平触发的,你按着它就动,松开它就停。嗯,这里和速度模式不一样,速度模式需要你主动发停止指令。

// 点动模式调用示例
MC_MoveJog(
    Axis := Axis1,
    JogForward := bJogFwd,      // 正向点动,TRUE时运动
    JogBackward := bJogBwd,     // 反向点动,TRUE时运动
    Velocity := 100.0,          // 点动速度
    Acceleration := 500.0,
    Deceleration := 500.0,
    Jerk := 0.0,
    BufferMode := 0,
    Busy => bBusy,
    Active => bActive,
    CommandAborted => bAborted,
    Error => bError,
    ErrorID => wErrorID
);

关键区别:MC_MoveJog和MC_MoveVelocity虽然都是速度控制,但行为完全不同:

  • MC_MoveJog:电平触发,信号为TRUE时运动,FALSE时停止
  • MC_MoveVelocity:边沿触发,启动后持续运行,需要主动停止

我记得有一次调试一台贴标机,操作员反映点动时电机反应太慢。我检查后发现,是加速度设得太小了。点动模式下,加速度直接影响响应速度。如果你希望点动时「即按即动」,加速度要设大一些。

实用技巧:点动速度不要设得太快。我一般建议点动速度设为正常工作速度的10%-20%。太快了容易撞机,太慢了调试效率低。这个平衡需要根据实际设备来调。

4.3 MC_Stop:急停

这个指令,说白了就是「不管三七二十一,给我停下来」。它是最优先级的停止指令。一旦触发,所有正在运行的运动指令都会被中止,电机按设定的减速度停下来。

MC_Stop有一个重要参数:Deceleration。这个减速度可以设得很大,实现快速停止。但要注意,减速度太大可能会造成机械冲击。

// 急停调用示例
MC_Stop(
    Axis := Axis1,
    Execute := bStop,           // 上升沿触发
    Deceleration := 5000.0,     // 减速度,可以设得很大
    Jerk := 0.0,
    Done => bDone,
    Busy => bBusy,
    Active => bActive,
    CommandAborted => bAborted,
    Error => bError,
    ErrorID => wErrorID
);

避坑指南:我曾经在一个项目中,把MC_Stop的减速度设成了驱动器允许的最大值。结果一按急停,整个设备剧烈抖动,把导轨都震歪了。后来我学乖了,急停的减速度要综合考虑机械强度和负载惯性。不是越快越好,是「安全地快」才好。

MC_Stop还有一个特性:它执行完后,轴会处于停止状态。如果你想重新启动轴,必须先复位MC_Stop的Done信号,然后再发新的运动指令。这个顺序搞错了,轴是动不了的。

4.4 MC_Halt:暂停

MC_Halt和MC_Stop看起来很像,但用途完全不同。Halt是「温柔地停下来」,Stop是「粗暴地停下来」。Halt主要用于程序逻辑中的暂停,比如等待某个条件满足后再继续。

Halt的减速度通常设得比较平缓,不会对机械造成冲击。而且,Halt执行完后,轴处于「待命」状态,你可以随时发新的运动指令继续运行。

// 暂停调用示例
MC_Halt(
    Axis := Axis1,
    Execute := bHalt,           // 上升沿触发
    Deceleration := 1000.0,     // 减速度,通常设得比较平缓
    Jerk := 0.0,
    Done => bDone,
    Busy => bBusy,
    Active => bActive,
    CommandAborted => bAborted,
    Error => bError,
    ErrorID => wErrorID
);

Stop vs Halt 对比

特性 MC_Stop(急停) MC_Halt(暂停)
优先级 最高,中止所有指令 较高,但低于Stop
减速度 通常很大,快速停止 通常平缓,平稳停止
轴状态 停止后需复位才能再启动 停止后可立即发新指令
应用场景 紧急停止、安全保护 程序暂停、等待条件
机械冲击 较大 较小

你想想看,在实际项目中,这两个指令要配合使用。比如,操作员按了急停按钮,你调用MC_Stop。但如果只是程序逻辑需要暂停一下,比如等待传感器信号,那就用MC_Halt。

个人建议:在编写程序时,我习惯把MC_Stop和MC_Halt分开处理。急停按钮直接硬接线到驱动器的STO(安全转矩关闭)功能,同时通过PLC调用MC_Stop做软件保护。而程序中的暂停逻辑,统一用MC_Halt实现。这样层次清晰,不容易出错。

4.5 实际项目中的配合使用

好了,四个指令都讲完了。咱们来看看它们在实际项目中怎么配合。我以一个简单的传送带系统为例:

  1. 正常运行时:调用MC_MoveVelocity,传送带以设定速度恒速运行
  2. 手动调试时:切换到点动模式,调用MC_MoveJog,操作员手动控制
  3. 程序暂停时:调用MC_Halt,传送带平稳停止,等待条件满足
  4. 紧急情况时:调用MC_Stop,传送带快速停止,确保安全

这里有个编程技巧:状态机管理。我建议用一个状态变量来记录当前轴处于什么模式。比如:

// 状态定义
// 0: 空闲
// 1: 速度模式运行中
// 2: 点动模式
// 3: 暂停中
// 4: 急停中

CASE nAxisState OF
    0: // 空闲
        // 等待指令
    1: // 速度模式
        // 监控MC_MoveVelocity状态
    2: // 点动模式
        // 监控MC_MoveJog状态
    3: // 暂停
        // 监控MC_Halt状态
    4: // 急停
        // 监控MC_Stop状态
END_CASE

嗯,这样管理起来就清晰多了。不会出现「发了速度指令又发点动指令」这种冲突情况。

重要提醒:MC_MoveVelocity和MC_MoveJog不能同时调用。如果你在速度模式下想切到点动,必须先停止当前指令。我见过有人直接同时调用两个指令,结果轴直接报错。记住,一个轴同一时间只能执行一个运动指令。

好了,这一章的内容就到这里。四个指令,各有各的用途。速度模式管持续运行,点动管手动控制,急停管安全,暂停管逻辑。掌握了它们,你的单轴控制就基本入门了。


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