⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 processg71.c

📁 控制电机运动的G代码程序,如果对G代码不清楚,请先看懂G代码,然后再看本程序.
💻 C
📖 第 1 页 / 共 3 页
字号:
#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 + -