3. 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 三个指令的配合使用
实际项目中,这三个指令很少单独用。我一般这样搭:
- 上电阶段:先调用 MC_Power,等 Status 为 TRUE。
- 回零阶段:调用 MC_Home(后面章节会讲),建立坐标系。
- 运行阶段:根据工艺,切换调用 MC_MoveAbsolute 或 MC_MoveVelocity。
- 停止阶段:调用 MC_Stop 停止运动,最后关闭 MC_Power。
我的经验:在切换指令时,一定要等前一个指令的 Active 或 Busy 变为 FALSE。否则新指令可能不执行。我见过有人用同一个 Execute 信号同时触发两个运动指令,结果电机乱跑。嗯,时序很重要。
3.5 常见错误与排查
| 现象 | 可能原因 | 解决方法 |
|---|---|---|
| 电机不动 | MC_Power 未使能 | 检查 Enable 信号 |
| 电机飞车 | 速度单位配置错误 | 核对轴参数配置 |
| 定位不准 | 未执行回零 | 先调用 MC_Home |
| 指令不执行 | 前一个指令仍在 Active | 等待 Done 或 Active 变 FALSE |