3. PLC运动控制指令详解:MC_Power、MC_MoveVelocity、MC_MoveAbsolute

做运动控制,说白了就是让电机听话。你让它转,它就得转;让它停,它就得停。但PLC和驱动器之间怎么沟通?靠的就是这些运动控制指令。

今天咱们就聊聊最常用的三个指令:MC_Power、MC_MoveVelocity 和 MC_MoveAbsolute。这三个指令,我几乎每个项目都会用到。嗯,先看一张总览图,心里有个谱。

PLC运动控制核心指令体系 运动控制指令 MC_Power MC_MoveVelocity MC_MoveAbsolute 使能/复位轴 伺服上电 速度模式 连续运转 位置模式 绝对定位

3.1 MC_Power —— 轴的"总开关"

MC_Power 是啥?说白了就是给伺服驱动器上电、使能。没有这一步,后面的指令全白搭。

我记得刚入行那会儿,有个项目调试,电机就是不动。查了半天,发现是 MC_Power 的 Enable 信号没给。嗯,这种低级错误,犯过一次就记住了。

指令结构

参数 数据类型 说明
Axis AXIS_REF 轴引用,关联硬件配置
Enable BOOL 使能信号,TRUE 时上电
Status BOOL 轴状态,TRUE 表示就绪
Busy BOOL 正在执行
Error BOOL 错误标志

关键点:MC_Power 的 Enable 必须保持为 TRUE,轴才能持续使能。一旦 Enable 变 FALSE,轴会立即掉电。很多新手在这里栽跟头。

典型用法

// 使能轴
MC_Power_0(
    Axis := Axis_1,
    Enable := bEnableAxis,
    Status => bAxisReady,
    Busy => bPowerBusy,
    Error => bPowerError
);

我的习惯:我会在程序启动时先给 Enable 一个上升沿,然后自锁保持。这样即使程序扫描周期抖动,轴也不会意外掉电。

3.2 MC_MoveVelocity —— 让电机"跑起来"

MC_MoveVelocity 是速度模式指令。你给它一个目标速度,电机就一直转,直到你发停止指令。

你想想看,传送带、风机、搅拌器,这些不需要精确定位的场合,用这个指令最合适。

指令结构

参数 数据类型 说明
Axis AXIS_REF 轴引用
Execute BOOL 上升沿触发启动
Velocity REAL 目标速度(单位:用户定义)
Acceleration REAL 加速度(正值)
Deceleration REAL 减速度(正值)
Direction MC_Direction 方向:正转/反转/最短路径

注意:Velocity 的单位取决于轴配置。有的用 mm/s,有的用 r/min。我曾经在项目里吃过这个亏——设了个 100,结果电机飞车了。后来发现单位是 0.1 mm/s,实际速度是 10 mm/s。嗯,配置一定要核对。

典型用法

// 以 500 mm/s 的速度正转,加速度 1000 mm/s²
MC_MoveVelocity_0(
    Axis := Axis_1,
    Execute := bStart,
    Velocity := 500.0,
    Acceleration := 1000.0,
    Deceleration := 1000.0,
    Direction := MC_Direction.Positive,
    InVelocity => bAtSpeed,
    Active => bMoving,
    Error => bVelError
);

避坑指南:Acceleration 和 Deceleration 不要设得太小。太小了电机响应慢,影响生产效率;太大了可能触发驱动器过流报警。我一般先设一个中间值,比如 500,然后根据实际效果微调。

3.3 MC_MoveAbsolute —— 指哪打哪

MC_MoveAbsolute 是绝对定位指令。你给它一个目标位置,电机就转到那个位置。不管当前位置在哪,它都会算好路径走过去。

这个指令在数控机床、机械手、包装机械里用得最多。说白了,就是"指哪打哪"。

指令结构

参数 数据类型 说明
Axis AXIS_REF 轴引用
Execute BOOL 上升沿触发启动
Position REAL 目标绝对位置
Velocity REAL 最大速度
Acceleration REAL 加速度
Deceleration REAL 减速度

典型用法

// 绝对定位到 1000 mm 位置,速度 300 mm/s
MC_MoveAbsolute_0(
    Axis := Axis_1,
    Execute := bGoHome,
    Position := 1000.0,
    Velocity := 300.0,
    Acceleration := 800.0,
    Deceleration := 800.0,
    Done => bPosReached,
    Active => bPosMoving,
    Error => bPosError
);

核心区别:MC_MoveAbsolute 和 MC_MoveVelocity 最大的不同在于——前者有目标位置,到了就停;后者没有目标位置,一直转。选哪个,看工艺需求。

3.4 三个指令的配合使用

实际项目中,这三个指令很少单独用。我一般这样搭:

  1. 上电阶段:先调用 MC_Power,等 Status 为 TRUE。
  2. 回零阶段:调用 MC_Home(后面章节会讲),建立坐标系。
  3. 运行阶段:根据工艺,切换调用 MC_MoveAbsolute 或 MC_MoveVelocity。
  4. 停止阶段:调用 MC_Stop 停止运动,最后关闭 MC_Power。

我的经验:在切换指令时,一定要等前一个指令的 Active 或 Busy 变为 FALSE。否则新指令可能不执行。我见过有人用同一个 Execute 信号同时触发两个运动指令,结果电机乱跑。嗯,时序很重要。

3.5 常见错误与排查

现象 可能原因 解决方法
电机不动 MC_Power 未使能 检查 Enable 信号
电机飞车 速度单位配置错误 核对轴参数配置
定位不准 未执行回零 先调用 MC_Home
指令不执行 前一个指令仍在 Active 等待 Done 或 Active 变 FALSE