3. 单轴运动基础:MC_Power、MC_Home、MC_MoveAbsolute、MC_MoveRelative
各位同学,今天我们来啃单轴运动控制里最基础的四个块。说实话,我当年刚接触PLCopen时,觉得这玩意儿不就是几个功能块嘛,拖进去连上线就完事了。结果第一次调试,轴没使能就发位置指令,轴直接报错停机。嗯,从那以后,我养成了一个习惯——先把每个块吃透,再动手。
今天这四个块,说白了就是单轴运动的“四大金刚”:MC_Power(让轴通电待命)、MC_Home(告诉轴“原点在哪儿”)、MC_MoveAbsolute(去一个固定的位置)、MC_MoveRelative(从当前位置走一段距离)。你想想看,任何一个单轴项目,翻来覆去就是这几招。
核心逻辑: 使能 → 回零 → 绝对/相对运动。顺序不能乱,这是铁律。
3.1 MC_Power —— 让轴“活过来”
MC_Power 是轴控的“总开关”。没有它,后面所有运动指令都是废的。我个人习惯,在程序启动的第一个扫描周期就把 MC_Power 的 Enable 置为 TRUE,并且保持住。
为什么?因为轴使能需要时间。伺服驱动器上电、抱闸松开、通讯建立,这一套下来少说几十毫秒。如果你在使能的同时就发运动指令,轴会直接报错。
我的经验: 使能完成后,检查 Status 输出是否为 TRUE,再允许后续指令。别偷懒,用 Status 做互锁。
// 典型使能逻辑(结构化文本)
MC_Power_0(
Axis := AxisRef,
Enable := bEnable,
bRegulatorOn := TRUE,
bDriveStart := TRUE,
Status => bPowerStatus,
Busy => bPowerBusy,
Error => bPowerError,
ErrorID => wPowerErrorID
);
// 只有 Status 为 TRUE,才允许后续运动
IF bPowerStatus THEN
// 可以执行回零或运动指令
END_IF
| 参数 | 说明 | 我踩过的坑 |
|---|---|---|
| Enable | 使能触发信号,上升沿有效 | 别用脉冲,要用持续 TRUE |
| bRegulatorOn | 调节器使能,一般直接给 TRUE | 有些驱动器需要先给这个再给 DriveStart |
| bDriveStart | 驱动器启动,一般直接给 TRUE | 我曾经忘记给这个,轴一直报“跟随误差超限” |
| Status | 使能完成标志 | 用它做互锁,别用 Busy |
3.2 MC_Home —— 告诉轴“家在哪里”
回零,说白了就是让轴找到一个物理参考点。绝对定位依赖这个参考点。如果没回零就发绝对定位指令,轴要么不动,要么跑到一个莫名其妙的位置。
我记得有一次在调试一台贴标机,操作员没回零就直接按了启动,结果轴直接撞到硬限位。从那以后,我在程序里加了强制回零逻辑——上电后必须回零,否则所有运动指令都被屏蔽。
警告: 绝对定位指令(MC_MoveAbsolute)依赖回零后的坐标系。如果轴是增量编码器,每次上电都必须回零。绝对值编码器虽然可以记住位置,但我建议首次上电也做一次回零,确保机械原点与电气原点一致。
// 回零逻辑示例
MC_Home_0(
Axis := AxisRef,
Execute := bHomeTrigger, // 上升沿触发
HomeMode := HOME_MODE_REF, // 参考点模式
Position := 0.0, // 回零后位置设为0
Done => bHomeDone,
Busy => bHomeBusy,
Error => bHomeError,
ErrorID => wHomeErrorID
);
// 回零完成后,才能执行绝对定位
IF bHomeDone THEN
// 允许绝对定位
END_IF
回零模式有很多种:直接找限位开关、找编码器Z脉冲、或者两者结合。我个人最常用的是“限位+Z脉冲”模式,精度高,重复性好。
3.3 MC_MoveAbsolute —— 去一个“确定”的位置
绝对定位,就是让轴运动到一个固定的坐标位置。比如,让丝杠走到 100mm 处。这个 100mm 是相对于回零后的原点而言的。
你想想看,如果原点没找对,绝对定位就是“绝对错误”。所以,我每次调试时,都会先手动回零,然后发一个绝对定位指令,用千分表打一下实际位置,确认坐标系没问题。
// 绝对定位示例
MC_MoveAbsolute_0(
Axis := AxisRef,
Execute := bMoveAbsTrigger,
Position := 100.0, // 目标位置,单位取决于轴配置
Velocity := 50.0, // 速度
Acceleration := 200.0, // 加速度
Deceleration := 200.0, // 减速度
Jerk := 1000.0, // 加加速度(可选)
Done => bMoveDone,
Busy => bMoveBusy,
Active => bMoveActive,
Error => bMoveError,
ErrorID => wMoveErrorID
);
| 参数 | 说明 | 建议值 |
|---|---|---|
| Position | 目标位置(绝对坐标) | 根据工艺设定 |
| Velocity | 最大速度 | 不超过机械允许值 |
| Acceleration | 加速度 | 别太大,否则机械冲击大 |
| Deceleration | 减速度 | 一般等于加速度 |
| Jerk | 加加速度(急动度) | 用于平滑启停,可选 |
避坑指南: 我曾经把加速度设得太大,结果轴启动时“咣”一声,联轴器直接崩了。后来我养成了习惯——加速度先设小,跑起来再慢慢加大,直到找到最优值。
3.4 MC_MoveRelative —— 走一段“相对”的路
相对定位,就是让轴从当前位置走一段距离。比如,当前在 100mm,发一个相对位移 50mm,轴就会走到 150mm。
相对定位不依赖原点。所以,即使没回零,相对定位也能执行。这一点和绝对定位完全不同。我有时候在调试初期,会用相对定位来“试探”轴能不能动,而不必先做回零。
// 相对定位示例
MC_MoveRelative_0(
Axis := AxisRef,
Execute := bMoveRelTrigger,
Distance := 50.0, // 相对位移量,正数正向,负数反向
Velocity := 50.0,
Acceleration := 200.0,
Deceleration := 200.0,
Done => bMoveDone,
Busy => bMoveBusy,
Active => bMoveActive,
Error => bMoveError,
ErrorID => wMoveErrorID
);
注意,Distance 可以是负数,表示反向运动。我见过有人把 Distance 写成绝对值,然后通过 Direction 参数控制方向——其实没必要,正负号就搞定了。
绝对 vs 相对:
- 绝对定位:去一个固定的“地址”,需要回零。
- 相对定位:走一段“路程”,不需要回零。
- 应用场景:绝对定位用于固定工位(如取料点、放料点),相对定位用于步进式运动(如每次前进10mm)。
3.5 四个块的“串联”逻辑
在实际项目中,这四个块是按顺序工作的。我一般这样组织代码:
- 上电后:立即使能 MC_Power,并保持 Enable 为 TRUE。
- 使能完成后:触发 MC_Home 回零。
- 回零完成后:根据工艺需求,选择 MC_MoveAbsolute 或 MC_MoveRelative。
- 运动过程中:监控 Busy 和 Active 状态,确保前一条指令完成后再发下一条。
嗯,这里要注意:MC_Power 的 Enable 必须一直为 TRUE,不能只给一个脉冲。否则轴会掉使能,然后所有运动指令都会报错。我刚开始学的时候犯过这个错,查了半天才发现是使能掉了。
好了,单轴运动的基础就这些。说白了,就是“通电、找家、走路”。把这四个块练熟,单轴控制你就入门了。下一章我们会聊多轴协同,但前提是——你得先把单轴玩明白。