3、基本定位功能(MC_Power / MC_Reset):轴使能、错误复位、状态字解读
各位同学,咱们今天聊点实在的。轴使能和错误复位,这两个功能块是玩转S7-1500T定位控制的基础中的基础。说白了,你连轴都使能不了,后面那些花里胡哨的定位指令全是白搭。
我个人习惯,每次写程序前,先把这两个块搞明白。为什么?因为80%的现场问题,都出在使能没给对,或者报错不知道怎么复位。你想想看,设备一报警,操作工急得满头大汗,你远程一看——嗯,轴没使能。这种场景我见得太多了。
3.1 MC_Power:轴使能,这是第一步
MC_Power这个块,它的任务就是给轴“通电”。不是真的通380V电,而是让驱动器的控制回路准备好,让轴能接受后续的定位指令。
来看一下它的引脚定义,我直接给你列个表,这样最清楚:
| 引脚 | 数据类型 | 说明 |
|---|---|---|
| Axis | TO_AxisObject | 你要控制的轴,就是硬件组态里那个轴对象 |
| Enable | BOOL | 使能信号,给TRUE轴就通电,给FALSE轴就断电 |
| StopMode | INT | 停止模式,0是紧急停止,1是斜坡停止,2是惯性停止 |
| Status | BOOL | 轴状态,TRUE表示轴已使能,可以用了 |
| Busy | BOOL | 忙碌标志,使能过程中为TRUE |
| Error | BOOL | 错误标志,出错了就是TRUE |
| ErrorID | WORD | 错误代码,查手册用的 |
这里有个坑,我必须要说。Enable信号不能随便给个TRUE就完事了。我在项目中遇到过,有人把Enable直接接在OB1的常TRUE上,结果PLC一启动,轴还没准备好,Enable就上去了,然后报错。正确的做法是什么?等驱动器通信建立好了,再给Enable。
核心要点:Enable信号建议用一个延时触点,或者等MC_Power的Status为FALSE时再给Enable。这样能避免启动时的误报错。
StopMode这个参数,我建议你根据工艺来选。如果是急停,用0,轴会以最快速度停下来。如果是正常停止,用1,轴会按你设定的减速度停下来。2这个模式,说白了就是自由停车,电机自己惯性转,一般用在特殊场合。
3.2 MC_Reset:错误复位,别乱按
MC_Reset这个块,它的作用就是清除轴的错误状态。但注意,不是所有错误都能用MC_Reset复位。硬件故障、驱动器报警,这些你得去现场处理。
MC_Reset的引脚很简单:
| 引脚 | 数据类型 | 说明 |
|---|---|---|
| Axis | TO_AxisObject | 轴对象,跟MC_Power用同一个 |
| Execute | BOOL | 上升沿触发复位 |
| Done | BOOL | 复位完成,TRUE表示复位成功 |
| Busy | BOOL | 复位进行中 |
| Error | BOOL | 复位失败 |
| ErrorID | WORD | 错误代码 |
我曾经犯过一个错误,把Execute接在常TRUE上,结果MC_Reset一直在执行复位,轴永远处于复位状态,根本没法用。后来才明白,Execute要用上升沿触发,点一下就行。
警告:MC_Reset的Execute必须用上升沿!不要用常TRUE!否则轴会一直处于复位状态,无法正常工作。
3.3 状态字解读:看懂轴在干什么
状态字,就是轴对象里的一个WORD变量,它告诉你轴当前处于什么状态。S7-1500T的状态字遵循PLCopen标准,我直接给你画个图,这样更直观。
这个图你看懂了吗?状态字的每一位代表一个状态。比如Bit1是Standstill,如果状态字等于2,就表示轴处于静止状态。如果Bit0是1,那就是报错了。
我教你一个实用技巧。在调试时,把状态字用MOVE指令传到DB块里,然后在监控表里看。这样轴的状态一目了然。我曾经在调试一个包装机时,轴老是报错,一看状态字是129(Bit0和Bit7为1),说明轴既报错又未使能。查了半天,原来是急停按钮没复位。
实用技巧:在程序中加一段代码,把状态字拆成单独的BOOL变量,这样HMI上显示更直观。比如:
#AxisStatus.Error := #StatusWord.%X0;
#AxisStatus.Standstill := #StatusWord.%X1;
#AxisStatus.Discrete := #StatusWord.%X2;
#AxisStatus.Homing := #StatusWord.%X4;
#AxisStatus.Disabled := #StatusWord.%X7;
3.4 实战:一个完整的使能+复位程序
说了这么多,咱们来写个完整的程序。我一般这样写:
// 轴使能控制
"MC_Power_Instance"(
Axis := "Axis_1",
Enable := #EnableSignal, // 来自HMI或自动逻辑
StopMode := 1, // 斜坡停止
Status => #AxisStatus,
Busy => #PowerBusy,
Error => #PowerError,
ErrorID => #PowerErrorID
);
// 错误复位控制
"MC_Reset_Instance"(
Axis := "Axis_1",
Execute := #ResetTrigger, // 上升沿触发
Done => #ResetDone,
Busy => #ResetBusy,
Error => #ResetError,
ErrorID => #ResetErrorID
);
// 状态字解析
#AxisState := "Axis_1".StatusWord;
这里有个细节,EnableSignal我建议用SR触发器控制,这样操作工按一下启动按钮,轴就使能了。再按一下停止,轴就断电。比直接用按钮信号更安全。
避坑指南:我曾经在一条生产线上,操作工误操作把Enable信号断开了,轴突然掉电,工件飞出去了。后来我改成用SR触发器,启动信号置位,停止信号复位,中间再加个急停串联。这样即使误操作,轴也不会突然掉电。
好了,关于MC_Power和MC_Reset,今天就讲这么多。你回去把这两个块练熟,后面学MC_MoveRelative、MC_MoveAbsolute就轻松多了。记住,基础打牢,后面才能飞。