📄 processg71.c
字号:
#include "base.h"
FP32 G71_Pos_U;
FP32 G71_Pos_W;
FP32 G71_Pos_X;
FP32 G71_Pos_Z;
FP32 G71_Pos_I;
FP32 G71_Pos_K;
FP32 G71_Pos_R;
FP32 G71_Abs_PosX;
FP32 G71_Abs_PosZ;
FP32 G71_Abs_PosI;
FP32 G71_Abs_PosK;
FP32 G71_Abs_PosR;
BOOLEAN G71_bEnd;
//--------------------------------------------------------------------------------------------------------------//
BOOLEAN ProcessG71(INT32U StartHang,INT32U EndHang,FP32 XaddPerTime,FP32 Zremain,FP32 Xremain,FP32 BackValue)
{
INT32U i;
INT8U ret;
FP32 LoopStartXpos;//,LoopStartXpos1;
FP32 LoopStartZpos;
FP32 LoopEndXpos;
FP32 LoopEndZpos;
INT16U LoopCount;
FP32 Temp,TempX,TempZ;
FP32 Start_X;
FP32 Start_Z;
// INT8U str[10];
G71_bEnd=0;
for (i=0;i<MAXNUMBER;i++)
{
LineValue[i].Pos=0;
CircleValue[i].Pos=0;
LineValue[i].StartX=0;
CircleValue[i].StartZ=0;
LineValue[i].EndX=0;
CircleValue[i].EndZ=0;
LineValue[i].K=0;
CircleValue[i].K=0;
CircleValue[i].I=0;
}
G71ResetPara();
CircleShapNum=0;
LineShapNum=0;
AllNum=0;
Xdec=0;Xinc=0;Zdec=0;Zinc=0;
//Uart_Printf("\n ook");
// FixtureFtoStr(XaddPerTime,str);
// Uart_Printf("\n 进刀量=%s",str);
// FixtureFtoStr(Xremain,str);
// Uart_Printf("\n X轴余量=%s",str);
G71.CurrentNum=G71FindStartHang(StartHang);
if (G71.CurrentNum==0xfffff) //循环开始行
{
DispErrCode(19);
return FALSE;
}
if (G71FindStartHang(EndHang)==0xfffff)//循环结束行
{
DispErrCode(35);
return FALSE;
}
if (G71ProcessAllCode(EndHang)!=6)//起始行与结束行相同时代码错误
{
DispErrCode(21);
return FALSE;
}
if(AllNum<=1) //代码段描述错误轮廓描述错误
{
DispErrCode(40);
return FALSE;
}
if(Xdec && Zinc) //不技持X递减Z递加
{
DispErrCode(39);return FALSE;
}
if(Xdec && Zdec)
{
XaddPerTime=fabs(XaddPerTime);BackValue=fabs(BackValue);bit=TRUE;
}
if(Xinc && Zinc) //X递增Z轴递增
{
XaddPerTime=fabs(XaddPerTime);BackValue=fabs(BackValue);bit=FALSE;
}
if(Xinc && Zdec) //X递增Z轴递减
{
XaddPerTime=fabs(XaddPerTime);BackValue=fabs(BackValue);bit=TRUE;
}
Start_X=Get_AbsPos(1);//获取加工前XZ轴绝对座标值
Start_Z=Get_AbsPos(3);
i=0;
while(1) //查找第一段外形XZ轴结束点坐标与Z轴起点坐标
{
if (CircleValue[i].Pos==1)
{
LoopEndXpos=CircleValue[i].EndX;
LoopEndZpos=CircleValue[i].EndZ;
LoopStartZpos=CircleValue[i].EndZ;//循环入切点Z起点坐标
break;
}
if (LineValue[i].Pos==1)
{
LoopEndXpos=LineValue[i].EndX;
LoopEndZpos=LineValue[i].EndZ;
LoopStartZpos=LineValue[i].EndZ;
break;
}
if(g_Scram)return FALSE;//急停标志
i++;
}
// FixtureFtoStr(LoopEndXpos,str);
// Uart_Printf("\n LoopEndXpos=%s",str);
i=0;
while(1) //查找最后一段外形X轴结束点坐标位置
{
if (CircleValue[i].Pos==AllNum)
{
LoopStartXpos=CircleValue[i].EndX;
break;
}
if (LineValue[i].Pos==AllNum)
{
LoopStartXpos=LineValue[i].EndX; //循环入切点X起点坐标
break;
}
if(g_Scram)return FALSE;
i++;
}
i=0;
if(Xremain>=0&&Zremain>=0){LoopEndXpos=LoopEndXpos+Xremain;inner=TRUE;}// 预留外圆粗车时精车余量
else if(Xremain<0&&Zremain>=0) {LoopStartXpos=LoopStartXpos-Xremain; inner=FALSE; } //预留内圆粗车时减精车余量
if(Xremain>=0&&Zremain>=0)LoopCount=(INT16U)(fabs((LoopStartXpos-LoopEndXpos)/XaddPerTime));//外圆粗车循环次数
else if(Xremain<0&&Zremain>=0)
{
LoopCount=(INT16U)(fabs((LoopEndXpos-LoopStartXpos)/XaddPerTime));//内圆粗车 循环次数
}
if (LoopCount>LOOPTIMES){DispErrCode(26);return FALSE;}
if (LoopCount==0){DispErrCode(27);return FALSE;}
// g_djsz=LoopCount;
// g_Fjsz=TRUE;//置复合循环标志
Set_InpSpeed(g_Sysparam.Max_FastSpeed);
while(1) //刀具移动到循环开始坐标
{
G01_AbsPos(LoopStartXpos,LoopStartZpos);
g_MoveMode=1;
ret=WaitMotionEnd();
if(ret==255)return FALSE;
if(ret==0)break;
}
i=0;
while(1)
{
g_Current_ASpeed=g_Current_PSpeed*g_Current_Inp_Rate;//当前实际速度
if(g_Current_ASpeed>g_Sysparam.Max_FastSpeed) //最大进给速度
g_Current_ASpeed=g_Sysparam.Max_FastSpeed;
Set_InpSpeed(g_Current_ASpeed); //设置速度
if(Xremain>=0&&Zremain>=0)
{
if(bit)
{
Temp=G71ConstructionFunc1(LoopStartXpos-i*XaddPerTime)+Zremain;//解释
}
else
{
Temp=G71ConstructionFunc1(LoopStartXpos-i*XaddPerTime)-Zremain;
}
}
else if(Xremain<0&&Zremain>=0)
{
if(bit)
{
Temp=G71ConstructionFunc(LoopStartXpos+i*XaddPerTime)+Zremain;//解释
}
else
{
Temp=G71ConstructionFunc(LoopStartXpos+i*XaddPerTime)-Zremain;
}
}
bRunInp=TRUE; //当前处于插补状态
if(LoopCount==i) //最后一刀
{
if((Xremain>=0&&Zremain>=0))
{
Target_PosX=LoopEndXpos;
}
if((Xremain<0&&Zremain>=0))
{
Target_PosX=LoopEndXpos;
}
}else Target_PosX=Get_AbsPos(1);
Target_PosZ=Temp;
/* FixtureFtoStr(LoopEndXpos,str);
Uart_Printf("\n LoopEndXpos=%s",str);
FixtureFtoStr(Target_PosX,str);
Uart_Printf(" \n Target_PosX=%s",str);
*/
while(1)
{
G01_AbsPos(Target_PosX,Target_PosZ);//切削
g_MoveMode=1;
ret=WaitMotionEnd();
if(ret==255)return FALSE;
if(ret==0)break;
}
g_Current_ASpeed=g_Current_PSpeed*g_Current_Inp_Rate;
if(g_Current_ASpeed>g_Sysparam.Max_FastSpeed)
g_Current_ASpeed=g_Sysparam.Max_FastSpeed;
Set_InpSpeed(g_Current_ASpeed);
if(Xremain>=0&&Zremain>=0)
{
if(bit)//退45度角
{
TempX=Get_AbsPos(1)+BackValue;TempZ=Get_AbsPos(3)+BackValue;
}
else
{
TempX=Get_AbsPos(1)+BackValue;TempZ=Get_AbsPos(3)-BackValue;
}
}
else if(Xremain<0&&Zremain>=0)
{
if(bit)//退45度角
{
TempX=Get_AbsPos(1)-BackValue;TempZ=Get_AbsPos(3)+BackValue;
}
else
{
TempX=Get_AbsPos(1)-BackValue;TempZ=Get_AbsPos(3)-BackValue;
}
}
Target_PosX=TempX;
Target_PosZ=TempZ;
bRunInp=TRUE; //当前处于插补状态
while(1)
{
G01_AbsPos(TempX,TempZ);//退45度角
g_MoveMode=1;
ret=WaitMotionEnd();
if(ret==255)return FALSE;
if(ret==0)break;
}
Set_SipSpeed(1,g_Current_Fast_Rate*g_Sysparam.X_FastSpeed);//设置单轴速度
Set_SipSpeed(3,g_Current_Fast_Rate*g_Sysparam.Z_FastSpeed);//设置单轴速度
Target_PosZ=LoopStartZpos;
bRunInp=FALSE;
while(1)
{
Move_AbsPos(3,LoopStartZpos); //Z轴退到开始位置
g_MoveMode=1; // 运动任务
ret=WaitMotionEnd(); //等待运结束
if(ret==255)return FALSE;
if(ret==0)break;
}
Set_SipSpeed(1,g_Current_Fast_Rate*g_Sysparam.X_FastSpeed);//设置单轴速度
Set_SipSpeed(3,g_Current_Fast_Rate*g_Sysparam.Z_FastSpeed);//设置单轴速度
if(Xremain>=0&&Zremain>=0)Target_PosX=Get_AbsPos(1)-XaddPerTime-BackValue;
else if(Xremain<0&&Zremain>=0)Target_PosX=Get_AbsPos(1)+XaddPerTime+BackValue;
bRunInp=FALSE;
while(1)
{
Move_AbsPos(1,Target_PosX);//移动到X轴目标位置
g_MoveMode=1; // 运动任务
ret=WaitMotionEnd(); //等待运结束
if(ret==255)return FALSE;
if(ret==0)break;
}
i++;
// if(i<=LoopCount) g_djsz=LoopCount-i;
// else {g_Fjsz=FALSE;ClearArea(0,224,160,16,LCD_COLOR15);}
//if((LoopCount-i)>0) Uart_Printf("\n 剩余次数=%d",LoopCount-i);
if (i>LoopCount)break;
}
Set_InpSpeed(g_Sysparam.Max_FastSpeed);
Target_PosX=Start_X;
Target_PosZ=Start_Z;
bRunInp=FALSE;
while(1){
G01_AbsPos(Start_X,Start_Z);//移动到G71指令前定位指令坐标
g_MoveMode=1;
ret=WaitMotionEnd();
if(ret==255)return FALSE;
if(ret==0)break;
}
return TRUE;
}
INT8U G71GetNextSeg(INT8U *First,INT8U *buf,INT8U *End)
{
INT8U s;
INT16U i;
for(;;)
{
s=g_DataBuf.DataBuf[G71.CurrentNum];
switch(s)
{
case '%':
*First=s;
buf[0]=0x0;
return 4;
break;
case '(':
case '/'://注释
*First=s;
i=0;
while(i<=255)
{
G71.CurrentNum++;
if(g_iCurrentNum>=g_DataBuf.DataLength)
{
buf[0]=0x0;
*End=FALSE;
return 255;
}
s=g_DataBuf.DataBuf[G71.CurrentNum];
if(s!=0x0a && s!=0x0d)
{
buf[i]=s; //不为换行与回车存入BUF
}
else if(s==0x0a)
{
buf[i]=0x00;
*End=FALSE;
G71.CurrentNum++;//为换行符指向下一段
if(G71.CurrentNum>=g_DataBuf.DataLength)return 255;
return 0;//一行代码结束
}
i++;
}
buf[0]=0x0;
*End=TRUE;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -