我们在数控系统(西门子)中大量使用M指令,比如M3是主轴正转、M5主轴停转等常规通用指令,也有制造商自己开发的某些特定功能或动作的M指令。特别是加工中心换刀程序中写有多个M指令,每一步的动作都有特定的M代码完成,并且有先后顺序,出故障时还能停止,往往还伴有报警。那么这些M指令是怎么编写的,在使用时又是如何做到条件检测的,本文将就这一问题进行讨论。
一、M0-M99动态M功能
在NC程序中M功能执行时(以840D系统为例),会触发一个信号,该信号会传送到PLC接口,通过840D的调试手册可以查出该信号(DB2x.DBX294.0-DB2x.DBX206.3),而这些信号,在PLC中只存在一个扫描周期,所以一般会使用S指令,置位某个地址然后去驱动某个动作。
程序段如下(以通道1为例):
N010 G0 X0 M10 //启动冷却指令M10
...
N080 M11 //当NC程序运行到此步时,M11关闭冷却
在PLC程序中我们编写如下程序:
A DB21.DBX195.2 //M10执行时在nck程序的通道1中编辑,激活一个PLC扫描周期;
S Q0.0 //冷却泵启动(Q0.0为控制泵接触器的输出信号)
A DB21.DBX195.3 //M11执行时在nck程序的通道1中编辑,激活一个PLC扫描周期
R Q0.0 //冷却泵停止
实际上我们很多M指令是“闭环”的,就是指令执行后还要检测执行有没到位信号或者压力信号等,若不到位就无法执行下一步,一直停在该M指令处。这就需要PLC或者NC对指令进行处理了。
PLC的处理方法是在执行动作的同时将“读入使能禁止”(DB21.DBX6.1)激活,同时检测反馈信号,当反馈信号正常时再复位该“读入使能禁止”,此时该M指令就完成“闭环”反馈,执行下一步了。如在某程序中有个松刀动作M20,要求松刀不到位时不能执行下一步,程序如下:
A DB21.DBX196.4 //M20执行时在nck程序的通道1中编辑,激活一个PLC扫描周期
S Q0.1 //驱动松刀电磁阀
S DB21.DBX6.1 //同时激活“读入使能禁止”
A Q0.1
A I0.1 //检测松刀到位信号
R DB21.DBX6.1 //到位后,复位该信号,NC程序继续执行
除了用这种PLC程序做检测外还可以结合NC的IF语句做判断,这在加工中心的换刀程序中大量使用。如某龙门加工中心换刀程序中有段程序:
M93 //刀库门开
_TT:_MM[0]=$A_DBB[80] //Y、Z轴运动条件:开门到位
IF _MM[0]==0 GOTOB _TT
G153 G01 G90 Y=$MA_FIX_POINT_POS[1,AX2] F=HIGHSPEED
G153 G01 G90 Z=$MA_FIX_POINT_POS[1,AX3] F=HIGHSPEED
程序中IF语句就是用来检测开门信号的,如果不到位,Y、Z轴是不能运动的,否则有撞门风险,$A_DBB[80]主要是通过如图1所示的PLC实现的。我们能够清晰的看到以下的逻辑,执行M93后激活DB21.DBX205.5,从而通过M110.7激活开门的气阀Q41.0(Network66),同时Network67在检测信号,当开门信号到位,关门信号脱开时,把1传送给DB91.DBB80。
图 1
再通过如图2所示的PLC,用OB1调用FC21把DB91.DBB0开始的200个字节,都写入$A_DBB[0]开始的200个字节里。这样就实现了$A_DBB[80]能够检测开门信号有没到位的功能了。
图 2
二、静态M功能
该M指令的接口信号地址类型和块编号功能由OEM厂家自行定义,它和PLC地址没有标准对应关系,如M99=125实现开门动作,PLC编写如下:
A(
L 99
L DB21.DBW68
==D) //比较读入的M静态指令是不是M99
A(
L 125
L DB21.DBD70
==D) //比较读入的是不是125
A DB21.DBX58.0
S DBxx.DBXxx.x //确定了执行的M99=125后驱动某个地址
在NC通道执行时99被存入DB21.DBW68的地址中,该变量定义为整形变量。在执行时将125存入DB21.DBD70的地址中,该变量定义为实数变量。还有关键信号DB21.DBX58.0,该变量在M功能代码改变时跳变,信号保持一个PLC周期,可以用它锁存M功能代码读取瞬间的代码数值,以保证存入数据不出错。当NC读入的程序段执行M99=125时激活最后的DBxx.DBXxx.x地址,然后通过这个地址可以做后续的逻辑编写,比如驱动开门,再做开门信号的检测等等。
以上为方便理解,只是简单写出了主要的原理和思路,真正运用时还需要考虑转换数据类型等,部分比较值肯定用索引地址和间接指针寻址代入减少代码使用,逻辑保护也要加强很多。