4、PLCopen 标准与功能块:MC_Power、MC_MoveAbsolute、MC_GearInPos 等核心指令

做多轴同步,绕不开 PLCopen。说实话,刚入行那会儿,我觉得各家运动控制器都有自己的指令集,学 PLCopen 干嘛?后来被现实教育了——换一个品牌就得重写一套程序,那滋味可不好受。PLCopen 标准说白了就是给运动控制定了个“普通话”,不管你用贝加莱、倍福还是西门子,核心指令长得差不多,移植起来省大事了。

这一章,我挑几个最常用的功能块跟你聊聊。MC_Power、MC_MoveAbsolute、MC_GearInPos,这三个你搞明白了,多轴同步的基础就算打牢了。

4.1 MC_Power:轴使能,第一步不能错

轴使能是运动控制的第一步。你想想看,轴都没通电,后面发什么指令都是白搭。MC_Power 这个功能块,就是干这个活的。

它的输入输出其实不复杂,但坑不少。我直接给你看一个典型用法:

// 轴使能典型调用
MC_Power_Instance(
    Axis := Axis_1,
    Enable := TRUE,
    bRegulatorOn := TRUE,
    bDriveStart := TRUE,
    Status => Power_Status,
    bRegulatorRealState => Reg_State,
    bDriveStartRealState => Drive_State,
    Error => Power_Error,
    ErrorID => Power_ErrorID
);

这里有几个关键点,我吃过亏,得跟你讲清楚:

  • Enable 和 bRegulatorOn 的关系:Enable 是总开关,bRegulatorOn 是使能调节器。我见过有人只给 Enable 不给 bRegulatorOn,结果轴一直报错。记住,两个都得给 TRUE。
  • bDriveStart 不是必须的:有些驱动器不需要这个信号。我在一个项目里习惯性给了 TRUE,结果驱动器反而报故障。查了半天手册才发现,那款驱动器不支持这个输入。所以,用之前先看手册。
  • Status 信号别急着用:MC_Power 的 Status 输出为 TRUE 不代表轴真的准备好了。我建议你等 100-200 毫秒再发运动指令,给驱动器一点反应时间。
注意: 轴使能失败时,别反复尝试。我曾经在一个项目里遇到使能失败,程序里写了个循环不断重试,结果驱动器过热保护了。正确的做法是:读取 ErrorID,根据错误码做相应处理,比如检查急停、检查驱动器供电。

4.2 MC_MoveAbsolute:绝对定位,精度是关键

绝对定位,说白了就是让轴走到一个指定的位置。听起来简单,但实际用起来,参数设置不对,位置就是跑不准。

看一个标准调用:

// 绝对定位调用
MC_MoveAbsolute_Instance(
    Axis := Axis_1,
    Execute := Move_Trigger,
    Position := 1000.0,      // 目标位置,单位取决于配置
    Velocity := 100.0,       // 最大速度
    Acceleration := 500.0,   // 加速度
    Deceleration := 500.0,   // 减速度
    Jerk := 2000.0,          // 加加速度,可选
    Direction := 0,          // 0: 最短路径, 1: 正方向, 2: 负方向
    Done => Move_Done,
    Busy => Move_Busy,
    Active => Move_Active,
    CommandAborted => Move_Aborted,
    Error => Move_Error,
    ErrorID => Move_ErrorID
);

这里我重点说几个容易忽略的点:

  • Execute 是上升沿触发:不是电平触发。很多人写程序时一直给 TRUE,结果轴只动一次。记住,Execute 给一个脉冲就行。
  • Jerk 参数别乱设:加加速度控制的是加速度的变化率。设得太小,轴启动慢;设得太大,机械冲击大。我一般建议设成加速度的 3-5 倍。比如加速度 500,Jerk 就给 1500-2500。
  • Direction 参数要小心:对于旋转轴,Direction 设为 0(最短路径)时,轴会自己算怎么走最近。但如果你需要轴每次都走同一个方向(比如绕线机),就得指定方向。我踩过这个坑,产品绕线方向乱了,查了半天才发现是 Direction 没设对。
我的习惯: 每次调用 MC_MoveAbsolute 之前,我都会先检查轴的状态。比如用 MC_ReadStatus 读一下轴的当前状态,确保轴已经使能、没有报错、没有正在执行其他运动。这样能避免很多莫名其妙的冲突。

4.3 MC_GearInPos:位置同步,多轴联动的核心

多轴同步,最常用的就是电子齿轮。MC_GearInPos 比普通的 MC_Gear 多了位置同步功能,说白了就是不仅能保证速度比例,还能保证位置关系。

看一个主从轴同步的例子:

// 位置同步电子齿轮
MC_GearInPos_Instance(
    Master := Master_Axis,
    Slave := Slave_Axis,
    Execute := Gear_Trigger,
    RatioNumerator := 2,        // 分子
    RatioDenominator := 1,      // 分母,速比 = 2:1
    MasterOffset := 0.0,        // 主轴偏移
    SlaveOffset := 0.0,         // 从轴偏移
    MasterStartDistance := 0.0, // 主轴同步开始距离
    SlaveStartDistance := 0.0,  // 从轴同步开始距离
    InGear => Gear_InGear,
    Busy => Gear_Busy,
    Active => Gear_Active,
    Error => Gear_Error,
    ErrorID => Gear_ErrorID
);

这个功能块参数多,我挑几个关键的说:

  • RatioNumerator 和 RatioDenominator:速比 = 分子 / 分母。比如主轴转 2 圈,从轴转 1 圈,分子就是 2,分母就是 1。注意,这两个值必须是整数。我见过有人传浮点数进去,结果编译不报错,运行起来速比完全不对。
  • MasterStartDistance 和 SlaveStartDistance:这两个参数控制同步开始的时机。主轴走到某个位置时,从轴才开始同步。这个功能在飞剪、追剪里特别有用。比如主轴走到 100mm 时,从轴开始加速追上。
  • InGear 信号:这个输出为 TRUE 时,表示从轴已经跟上主轴,同步建立了。但别急着做下一步操作,我建议等 2-3 个周期再确认,防止信号抖动。
核心要点: MC_GearInPos 和 MC_Gear 最大的区别在于,前者能保证位置同步,后者只能保证速度同步。如果你的应用需要精确的位置关系(比如印刷机的套准),必须用 MC_GearInPos。如果只是简单的速度跟随(比如传送带),MC_Gear 就够了。

4.4 三个功能块的配合使用

实际项目中,这三个功能块是配合使用的。我给你画个流程图,你看看它们之间的关系:

PLCopen 核心功能块配合流程 MC_Power 轴使能 MC_ReadStatus 状态检查 MC_MoveAbsolute 定位 MC_GearInPos 同步 MC_Power 轴断电 流程说明:使能 → 状态检查 → 定位或同步 → 任务完成 → 断电 定位和同步是互斥操作,同一时间只能执行一个

这个流程我用了很多年,基本没出过问题。有几个细节你注意一下:

  • 状态检查不能省:很多人使能完直接发运动指令,结果轴没准备好,指令被忽略了。我习惯在 MC_Power 的 Status 为 TRUE 后,再用 MC_ReadStatus 读一下轴的具体状态,确认没有报错、没有限位触发。
  • 定位和同步是互斥的:一个轴不能同时执行 MC_MoveAbsolute 和 MC_GearInPos。如果你需要先定位再同步,一定要等定位的 Done 信号来了,再触发同步。
  • 断电前先停止运动:直接断电可能会让轴急停,对机械冲击很大。我一般先发一个 MC_Stop,等轴停稳了再断使能。

4.5 常见错误与避坑指南

做多轴同步这些年,我踩过的坑不少。挑几个典型的跟你说说:

错误现象 可能原因 解决方法
轴使能后无法运动 驱动器未就绪或急停触发 检查驱动器状态,读取 ErrorID
绝对定位位置不准 单位配置错误或回零未做 确认位置单位(mm/度/脉冲),执行回零
电子齿轮同步抖动 速比设置不合理或加减速太大 降低加减速,检查机械间隙
同步建立失败 主轴速度太快或从轴跟不上 降低主轴速度,增加从轴加速度
功能块不响应 Execute 信号未用上升沿 改用上升沿触发,或加一个脉冲
我曾经踩过的坑: 有一次做印刷机套准,MC_GearInPos 的 InGear 信号已经为 TRUE 了,但印刷位置还是偏的。查了两天,最后发现是 MasterStartDistance 设错了。主轴从 0 开始走,我设的 MasterStartDistance 是 100mm,结果主轴走到 100mm 时才开始同步,前面 100mm 的位置偏差根本没补偿。后来我把 MasterStartDistance 改成 0,问题就解决了。所以,这个参数一定要根据你的机械结构来算,别想当然。

4.6 小结

PLCopen 标准让运动控制编程变得规范了。MC_Power、MC_MoveAbsolute、MC_GearInPos 这三个功能块,你掌握了,单轴运动和简单的多轴同步就能搞定了。记住几个要点:使能要稳、定位要准、同步要顺。参数设置别想当然,多看手册,多测试。

嗯,这一章就到这里。内容不多,但都是干货。你回去拿个实际项目练练手,很快就能上手。