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标准,我直接给你画个图,这样更直观。

S7-1500T 轴状态字结构 Bit 0 Bit 1 Bit 2 Bit 3 Bit 4 Bit 5 Bit 6 Bit 7 Bit 8 Bit 9 Error 错误 Standstill 静止 Discrete 定位 Continuous 连续 Homing 回零 Sync 同步 Halt 停止 ErrorStop 错误停止 Disabled 未使能 Reserved 保留 轴状态切换流程 ErrorStop Standstill Discrete Homing MC_Reset MC_Move MC_Home 状态字 = 2^0 * Error + 2^1 * Standstill + 2^2 * Discrete + ... 例如:状态字 = 2(二进制 0000 0010)表示轴处于 Standstill 状态

这个图你看懂了吗?状态字的每一位代表一个状态。比如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就轻松多了。记住,基础打牢,后面才能飞。