*sys_ext_alm():用于设定外部报警,参考车床刀架自动换刀PLC程序说明。 mod_M_code(0):M指令代码,M00~M99。置“-1”时M指令完成。 mod_T_code(0):T指令代码,T1~T16。置“-1”时T指令完成。 *axis_stat(2):坐标轴2即Z轴状态,共16位每一位表示一种状态,用一个较直观的字符串表示,例如,AX_COORD_SETUP:已回参考点建立了机床坐标系;AX_LOCK:锁住。
*tot_mag_pos():总刀位数,本例包括刀库(16)和主轴(1)共17位。 *cutter_in_mag(0):当前主轴(0刀位)上的刀具号。 get_axis_pos(2):读轴2(Z轴)机床坐标位置。
set_axis_moveto(2,l,to_pp8ms(5000)):令轴2(Z轴)以5000毫米/分钟的速度移动到机床坐标值为l的位置。
to_pp8ms(5000):将5000毫米/分钟的进给速度转换为脉冲当量/插补周期。 get_axis_den(2):0:轴2(Z轴)未完成定位;1:轴2已完成定位。 plc1_time:PLC扫描周期(16毫秒)。
spdl_ctrl:主轴控制字,0:停止,1:正转,2:反转。 mac_lock():机床锁住标记,0:未锁,1:锁住。 mst_lock():MST指令锁住标记,0:未锁,1:锁住。 z_lock():Z轴锁住标记,0:未锁,1:锁住。 mod_T_buf:T指令缓存。
Tool_Counter:选刀时转过的刀位数(-7~-1,1~8)负号表示反转。 Tool_New_Pos:新刀具的位置,0~16。
Tool_Find_Ctrl:选刀控制,0:无选刀要求,1:有选刀要求。 Tool_Find_Stage:选刀过程的顺序标记。
Tool_Find_Finish:选刀过程完成标记,0:未完成,1:完成。 Z_Old_Pos:换刀前Z轴的机床坐标位置。
Tool_Change_ctrl:换刀控制,0:无换刀要求,1:有换刀要求。 Tool_Change_stage :换刀过程的顺序标记。
Tool_Change_finish:换刀过程完成标记,0:未完成,1:完成。 Tool_Change_dwell:换刀过程各顺序步之间的延时时间(单位:毫秒)。
6-43
Air_Dwell:主轴吹气延时时间(单位:毫秒)。 C语言PLC程序如下: 换刀使能判断子程序:
int Tool_Change_Enable(void) //换刀使能判断子程序。 {
if((X[1]&0x40)==0x40) //如果气压报警(X1.6为1) *sys_ext_alm()|=0x400; //则输出10号外部报警,显示气压报警。 else //否则
*sys_ext_alm()&=~0x400; //清楚10号外部报警。
if(((*axis_stat(2)&AX_COORD_SETUP)==0)|| //若Z轴未回过参考点,或 (*axis_stat(2)&AX_LOCK)|| //Z轴处于锁住状态,或 (*sys_ext_alm()&1)|| //有1号外部报警:主轴故障,或 (*sys_ext_alm()&2)|| //有2号外部报警:进给驱动故障,或 (*sys_ext_alm()&0x400)) //有10号外部报警,气压报警,则 return 0; //返回“0”,禁止换刀,并且 //从换刀处理程序返回到PLC主程序(简称“返回”)。
else //否则
return 1; //返回“1”,允许换刀,并且返回。 }
T指令(选刀)处理子程序:
由于T指令选刀必须在换刀的过程中间完成,因此T指令处理子程序只对T指令进行数据传递,即完成。
void exec_T(0) // T指令处理子程序。 {
if(mod_T_code(ch)!=-1) //若有新的T指令输入,
mod_T_buf=mod_T_code(0); //对T指令缓存。 mod_T_code(0)=-1; //T指令完成。 }
与换刀相关的M指令处理子程序:
void exec_M(0) // M指令处理子程序。 {
if(mac_lock()||mst_lock()) //若机床锁住或MST锁住, {
mod_M_code(0)=-1; //M指令完成。 return; }
switch(mod_M_code(0)) //判断当前M指令。 {
case 6: //M06:换刀M指令。
if((mod_T_buf<=0)||(mod_T_buf>16))|| //若T指令不在1到16之间,或
(mod_T_buf==*cutter_in_mag(0))) //所选刀已经是主轴上的刀, {
mod_M_code(ch)=-1; //M指令完成。 break; //退出。 }
if(Tool_Change_Enable()==0) //若换刀不允许,则
{
*sys_ext_alm()| = 0x4000; //输出14号外部报警:换刀不允许。 break; }
6-44
else //否则, *sys_ext_alm()&=~0x4000; //清除换刀不允许报警。
if(Tool_Change_ctrl==0) //若未换刀未启动(换刀控制字为0)。 {
Tool_Change_ctrl=1; //则启动换刀程序(换刀控制字置1)。 Tool_Change_finish=0;
Tool_New_Pos =mod_T_buf; //从T指令缓存读新刀位置。 }
break;
以下为检查、调试换刀过程时所需的临时M指令:
case 21: //M21:刀库正转一个刀位。 Y[1]|=0x40; //刀库电动机启动(Y1.6置1)。 Y[1]&=~0x80; //关刀库反转控制(Y1.7清0)。 if(((~X[1])&(R[101]))&0x80) //若读到刀位计数器信号(X1.7下降沿), {
Y[1]&=~0xc0; //停止刀库。 mod_M_code(0)=-1; //M指令完成。 }
break;
case 22: //M22:刀库反转一个刀位。 Y[1]|=0x40; //刀库电动机启动(Y1.6置1)。 Y[1]|=0x80; //刀库反转控制输出(Y1.7置1)。
if(((~X[1])&(R[101]))&0x80) //若读到刀位计数器信号(X1.7下降沿), {
Y[1]&=~0xc0; //停止刀库(Y1.6、Y1.7置0)。 mod_M_code(0)=-1; //M指令完成。 }
break;
case 23: //M23:刀库停止。
Y[1]&=~0xc0; //停止刀库(Y1.6、Y1.7置0)。 mod_M_code(0)=-1; //M指令完成。 break;
case 31: //M31:刀库退回位,即远离主轴到刀库位置1。 Y[1]|=0x10; //输出刀库退回控制信号(Y1.4置1)。 Y[1]&=~0x20; //关断刀库靠近主轴控制信号(Y1.5置0)。 mod_M_code(ch)=-1; //M指令完成。 break;
case 32: //M32:刀库换刀位,即靠近主轴到刀库位置2。 if((*axis_stat(2)&AX_COORD_SETUP)==0) //若轴2(Z轴)未回参考点, {
mod_M_code(0)=-1; //M指令完成。 break; }
if(get_axis_pos(2)<(-110000)) //若轴2(Z轴)位置低于Z轴位置1(-110.000), {
mod_M_code(0)=-1; //M指令完成。 break; }
Y[1]&=~0x10; //关断刀库退回控制信号(Y1.4置0)。 Y[1]|=0x20; //输出刀库靠近主轴控制信号(Y1.5置1)。 mod_M_code(0)=-1; //M指令完成。 break;
case 33: //M33:关闭刀库平移控制阀。
Y[1]&=~0x10; //关断刀库远离主轴控制信号(Y1.4置0)。 Y[1]&=~0x20; //关断刀库靠近主轴控制信号(Y1.5置0)。 mod_M_code(ch)=-1; //M指令完成。
6-45
break; } }
选刀处理子程序:
void Tool_Find(void) //选刀处理子程序 {
int p1,p2; //定义临时变量
*tot_mag_pos()=16+1; //定义刀位数为16(刀库)+1(主轴)=17。 if(Tool_Find_Ctrl==0) //若选刀控制标记为0,即禁止选刀, {
Tool_Find_Stage=0; //则选刀顺序标记清0,回到初始值。 return; //返回。 }
switch(Tool_Find_Stage) //否则,开始选刀,读取选刀顺序标记。 {
case 0: //选刀第0步 Tool_Find_Finish=0; //选刀完成标记清0。 Tool_Find_Stage=1; //置下次PLC扫描周期进入的选刀顺序标记为1。 break; //退出switch结构,以下相同。 case 1: //选刀第1步
p1=Tool_New_Pos-*cutter_in_mag(0); //计算正转转过的刀位。 if(p1<0) //若<0,表示新刀位<当前位。
p1+=16; //计算正转转过的刀位绝对值。
//如从14号刀到1号刀,需要正转1-14+16=3个刀位。
p2=*cutter_in_mag(0)-Tool_New_Pos; //计算反转转过的刀位。 if(p2<0) //若<0,表示新刀位>当前位。
p2+=16; //计算反转转过的刀位绝对值。
//如从1号刀到4号刀,需要反转1-4+16=13个刀位。
if(p1>p2) p1=-p2; //选则最短路径,并包含旋转方向。 Tool_Counter=p1; //置旋转刀位数
Tool_Find_Stage=2; //置下次PLC扫描周期进入的选刀顺序标记为2。 break;
case 2: //选刀第2步。
if(Tool_Counter>0) //若旋转刀位数>0表示正转选刀。
{
Y[1]| = 0x40; //输出Y1.6启动刀库电动机旋转。 Y[1]&=~0x80; //关闭反转控制Y1.7,电动机正转。 }
if(Tool_Counter<0) //若旋转刀位数<0表示反转选刀。
Y[1]|=0x40; //输出Y1.6启动刀库电动机旋转, Y[1]|=0x80; //输出反转控制Y1.7,电动机反转。
Tool_Find_Stage=3; //置下次PLC扫描周期进入的选刀顺序标记为3。 break;
case 3: //选刀第3步。 if(((~X[1])&(R[101]))&0x80) //读到刀位计数器信号X1.7下降沿,
//注:R[101]为X[1]上一PLC扫描周期的状态。
{
if(Tool_Counter>0) //正转选刀,
Tool_Counter-=1; //则旋转刀位数-1。
if(Tool_Counter<0) //反转选刀,
Tool_Counter+=1; //则旋转刀位数+1。
}
if(Tool_Counter==0) //若旋转刀位数为0,表示已到达目的刀位。
Tool_Find_Stage=4; //置下次PLC扫描周期进入的选刀顺序标记为4。 break;
case 4: //选刀第4步。
6-46
相关推荐: