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 毫秒再发运动指令,给驱动器一点反应时间。
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 没设对。
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 个周期再确认,防止信号抖动。
4.4 三个功能块的配合使用
实际项目中,这三个功能块是配合使用的。我给你画个流程图,你看看它们之间的关系:
这个流程我用了很多年,基本没出过问题。有几个细节你注意一下:
- 状态检查不能省:很多人使能完直接发运动指令,结果轴没准备好,指令被忽略了。我习惯在 MC_Power 的 Status 为 TRUE 后,再用 MC_ReadStatus 读一下轴的具体状态,确认没有报错、没有限位触发。
- 定位和同步是互斥的:一个轴不能同时执行 MC_MoveAbsolute 和 MC_GearInPos。如果你需要先定位再同步,一定要等定位的 Done 信号来了,再触发同步。
- 断电前先停止运动:直接断电可能会让轴急停,对机械冲击很大。我一般先发一个 MC_Stop,等轴停稳了再断使能。
4.5 常见错误与避坑指南
做多轴同步这些年,我踩过的坑不少。挑几个典型的跟你说说:
| 错误现象 | 可能原因 | 解决方法 |
|---|---|---|
| 轴使能后无法运动 | 驱动器未就绪或急停触发 | 检查驱动器状态,读取 ErrorID |
| 绝对定位位置不准 | 单位配置错误或回零未做 | 确认位置单位(mm/度/脉冲),执行回零 |
| 电子齿轮同步抖动 | 速比设置不合理或加减速太大 | 降低加减速,检查机械间隙 |
| 同步建立失败 | 主轴速度太快或从轴跟不上 | 降低主轴速度,增加从轴加速度 |
| 功能块不响应 | Execute 信号未用上升沿 | 改用上升沿触发,或加一个脉冲 |
4.6 小结
PLCopen 标准让运动控制编程变得规范了。MC_Power、MC_MoveAbsolute、MC_GearInPos 这三个功能块,你掌握了,单轴运动和简单的多轴同步就能搞定了。记住几个要点:使能要稳、定位要准、同步要顺。参数设置别想当然,多看手册,多测试。
嗯,这一章就到这里。内容不多,但都是干货。你回去拿个实际项目练练手,很快就能上手。