3. 单轴运动基础:MC_Power、MC_Home、MC_MoveAbsolute、MC_MoveRelative

各位同学,今天我们来啃单轴运动控制里最基础的四个块。说实话,我当年刚接触PLCopen时,觉得这玩意儿不就是几个功能块嘛,拖进去连上线就完事了。结果第一次调试,轴没使能就发位置指令,轴直接报错停机。嗯,从那以后,我养成了一个习惯——先把每个块吃透,再动手。

今天这四个块,说白了就是单轴运动的“四大金刚”:MC_Power(让轴通电待命)、MC_Home(告诉轴“原点在哪儿”)、MC_MoveAbsolute(去一个固定的位置)、MC_MoveRelative(从当前位置走一段距离)。你想想看,任何一个单轴项目,翻来覆去就是这几招。

核心逻辑: 使能 → 回零 → 绝对/相对运动。顺序不能乱,这是铁律。

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 四个块的“串联”逻辑

在实际项目中,这四个块是按顺序工作的。我一般这样组织代码:

  1. 上电后:立即使能 MC_Power,并保持 Enable 为 TRUE。
  2. 使能完成后:触发 MC_Home 回零。
  3. 回零完成后:根据工艺需求,选择 MC_MoveAbsolute 或 MC_MoveRelative。
  4. 运动过程中:监控 Busy 和 Active 状态,确保前一条指令完成后再发下一条。

嗯,这里要注意:MC_Power 的 Enable 必须一直为 TRUE,不能只给一个脉冲。否则轴会掉使能,然后所有运动指令都会报错。我刚开始学的时候犯过这个错,查了半天才发现是使能掉了。

好了,单轴运动的基础就这些。说白了,就是“通电、找家、走路”。把这四个块练熟,单轴控制你就入门了。下一章我们会聊多轴协同,但前提是——你得先把单轴玩明白。


专注资料整理