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

📄 processg73.c

📁 控制电机运动的G代码程序,如果对G代码不清楚,请先看懂G代码,然后再看本程序.
💻 C
📖 第 1 页 / 共 2 页
字号:
   #include "base.h"
/*   
   BOOLEAN    ProcessG73(INT32U StartHang,INT32U EndHang,FP32 G73_Uaction,FP32 G73_Waction,FP32 G73_Uremain,FP32 G73_Wremain,INT8U LoopCount);
   INT8U      G73ProcessAllCode(INT32U EndHang);
   BOOLEAN    G73ProcessHangCode(void);
   INT8U      G73GetNextSeg(INT8U *First,INT8U *buf,INT8U *End);

   INT32U     G73FindStartHang(INT32U Hang);
   FP32       G73ConstructionFunc(FP32 Xpos);
   void       G73ResetPara(void);
   BOOLEAN    G73Motion(void);
*/
   FP32       G73_Pos_U;	
   FP32       G73_Pos_W;
   FP32       G73_Pos_X;
   FP32       G73_Pos_Z;
   FP32       G73_Pos_I;
   FP32       G73_Pos_K;
   FP32       G73_Pos_R;

   FP32       G73_Abs_PosX;
   FP32       G73_Abs_PosZ;
   FP32       G73_Abs_PosI;
   FP32       G73_Abs_PosK;
   FP32       G73_Abs_PosR;
	 
   BOOLEAN     G73_bEnd;
	 
BOOLEAN ProcessG73(INT32U StartHang,INT32U EndHang,FP32 G73_Uaction,FP32 G73_Waction,FP32 G73_Uremain,FP32 G73_Wremain,INT16U LoopCount)
{

  FP32     StartPointX;
  FP32     StartPointZ;
  FP32     ProgStartPointX;
  FP32     ProgStartPointZ;
  FP32     ProgEndPointX;
  FP32     ProgEndPointZ;
  FP32     XAdd;
  FP32     ZAdd;
  FP32     LoopAbsXpos,LoopAbsZpos;
  INT32U   i,j,k;
  INT8U    ret;
  BOOLEAN  bLine;
  BOOLEAN  bCircle;
  FP32     Start_X;
  FP32     Start_Z;
  FP32     TempX;
  FP32     TempZ;
  FP32     TempI;
  FP32     TempK;
    
    
  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;
     CircleValue[i].Cw=0;
  }
  G73_bEnd=0;    
  CircleShapNum=0;
  AllNum=0;
  LineShapNum=0;
  G73ResetPara();
  Xdec=0;Xinc=0;Zdec=0;Zinc=0;
  
  G73.CurrentNum=G73FindStartHang(StartHang);
  if (G73.CurrentNum==0xfffff){
     DispErrCode(19);
     return FALSE;
  }
  if (G73FindStartHang(EndHang)==0xfffff){
     DispErrCode(35);
     return FALSE;
  }
  if (G73ProcessAllCode(EndHang)!=6){
     DispErrCode(21);
     return FALSE;
  } 
  if(AllNum<=1){
     DispErrCode(40);
     return FALSE;
  } 
  
  if(Xdec && Zinc){
       DispErrCode(39);return FALSE;
  }
  if(Xdec && Zdec){
       DispErrCode(39);return FALSE;
  }
  if(Xinc && Zinc){
       bit=FALSE;
  }
  if(Xinc && Zdec){
       bit=TRUE;
  }
  Start_X=Get_AbsPos(1);
  Start_Z=Get_AbsPos(3);
 
  G73_Uaction=fabs(G73_Uaction);
  G73_Waction=fabs(G73_Waction);
  
//  if (LoopCount>=200){DispErrCode(26);return FALSE;}
  if (LoopCount>=LOOPTIMES){DispErrCode(26);return FALSE;}
  if (LoopCount==0){DispErrCode(27);return FALSE;}
  XAdd=(G73_Uaction-G73_Uremain)/LoopCount;
  ZAdd=(G73_Waction-G73_Wremain)/LoopCount;

  ProgStartPointX=Get_AbsPos(1);
  ProgStartPointZ=Get_AbsPos(3);

  ProgEndPointX=Get_AbsPos(1)-G73_Uaction;
  ProgEndPointZ=Get_AbsPos(3)-G73_Waction;
  
  i=1;
  while(1){
        if (CircleValue[i].Pos==1){
	        StartPointX=CircleValue[i].StartX;
	        StartPointZ=CircleValue[i].StartZ;
	        break;
	    }
        if (LineValue[i].Pos==1){
	        StartPointX=LineValue[i].StartX;
	        StartPointZ=LineValue[i].StartZ;
	        break;
	    }
	    i++;
	    if(g_Scram)return FALSE;
  }

  if(bit){
     StartPointX=StartPointX+G73_Uaction;
     StartPointZ=StartPointZ+G73_Waction;
  }
  else{
     StartPointX=StartPointX+G73_Uaction;
     StartPointZ=StartPointZ-G73_Waction;
  }

  i=0;j=0;k=0;bCircle=0;bLine=0;
  while(1){
       if(bit){
           TempX=StartPointX-i*XAdd;TempZ=StartPointZ-i*ZAdd;
       }
       else{
           TempX=StartPointX-i*XAdd;TempZ=StartPointZ+i*ZAdd;
       }
       Set_InpSpeed(g_Sysparam.Max_FastSpeed);
       Target_PosX=TempX;
       Target_PosZ=TempZ;
       bRunInp=FALSE;
       while(1){
           g_MoveMode=1;
	       G01_AbsPos(TempX,TempZ);
	       ret=WaitMotionEnd();
	       if(ret==255)return FALSE;
	       if(ret==0)break;
	   }

	   for (j=1;j<=AllNum;j++){
	        for (k=1;k<=MAXNUMBER;k++){
                 if (LineValue[k].Pos==j){
			           bLine=TRUE;
			           if(bit){
			               LoopAbsXpos=LineValue[k].EndX-LineValue[k].StartX+Get_AbsPos(1);
			               LoopAbsZpos=LineValue[k].EndZ-LineValue[k].StartZ+Get_AbsPos(3);
			           }else{
			               LoopAbsXpos=Get_AbsPos(1)+LineValue[k].EndX-LineValue[k].StartX;
			               LoopAbsZpos=Get_AbsPos(3)+LineValue[k].EndZ-LineValue[k].StartZ;
			           }    
                       break;
	             }
	             if (CircleValue[k].Pos==j){
	                   bCircle=TRUE;
	                   if(bit){
			               LoopAbsXpos=CircleValue[k].EndX-CircleValue[k].StartX+Get_AbsPos(1);
			               LoopAbsZpos=CircleValue[k].EndZ-CircleValue[k].StartZ+Get_AbsPos(3);
			           }else{
			           	   LoopAbsXpos=Get_AbsPos(1)+CircleValue[k].EndX-CircleValue[k].StartX;
			               LoopAbsZpos=Get_AbsPos(3)+CircleValue[k].EndZ-CircleValue[k].StartZ;
			           }
			           break;
			     }
	        }
	        if (bLine){
	               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);
	               Target_PosX=LoopAbsXpos;
                   Target_PosZ=LoopAbsZpos;
	               bRunInp=TRUE;
	               while(1){
	                    g_MoveMode=1;
	                    G01_AbsPos(LoopAbsXpos,LoopAbsZpos);
	                    ret=WaitMotionEnd();
	                    if(ret==255)return FALSE;
	                    if(ret==0)break;
	               }
	        }
            if(bCircle){
	               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(bit){
                        TempK=CircleValue[k].K+(LoopCount-i)*ZAdd;
                        TempI=CircleValue[k].I+(LoopCount-i)*XAdd;
                   }
                   else{
                        TempK=CircleValue[k].K-(LoopCount-i)*ZAdd;
                        TempI=CircleValue[k].I+(LoopCount-i)*XAdd;
                   }
                   Target_PosX=LoopAbsXpos;
                   Target_PosZ=LoopAbsZpos;
	               bRunInp=TRUE;
	               
/**************************************************************************************
除工圆弧拆分
***************************************************************************************/

				if(CircleValue[k].Cw==2){
					ret=G02G03_CW_ZX(LoopAbsXpos,LoopAbsZpos,0,TempK,TempI,FALSE);	
					if(ret)return TRUE;	
					}
				else{					
					ret=G02G03_CW_ZX(LoopAbsXpos,LoopAbsZpos,0,TempK,TempI,TRUE);
					if(ret)return TRUE;
					}
	            /*   while(1){					///改为拆分线段拆分
				            if(CircleValue[k].Cw==2){
					              G02_AbsPos(LoopAbsXpos,LoopAbsZpos,TempI,TempK);
				            }
				            else{
					              G03_AbsPos(LoopAbsXpos,LoopAbsZpos,TempI,TempK);
				            }
				            g_MoveMode=1;
				            ret=WaitMotionEnd();
				            if(ret==255)return FALSE;
				            if(ret==0)break;
			       }*/
	        }
	        bCircle=0;bLine=0;
	  }

      if(bit){
            LoopAbsXpos=ProgStartPointX-(i+1)*XAdd;
            LoopAbsZpos=ProgStartPointZ-(i+1)*ZAdd;
      }else{
            LoopAbsXpos=ProgStartPointX-(i+1)*XAdd;
            LoopAbsZpos=ProgStartPointZ+(i+1)*ZAdd;
      }      
      Set_SipSpeed(1,g_Current_Fast_Rate*g_Sysparam.X_FastSpeed);
	  Set_SipSpeed(3,g_Current_Fast_Rate*g_Sysparam.Z_FastSpeed);
	  Target_PosX=LoopAbsXpos;
      Target_PosZ=LoopAbsZpos;
	  bRunInp=FALSE;
      while(1){
           g_MoveMode=1;
	       G01_AbsPos(LoopAbsXpos,LoopAbsZpos);
	       ret=WaitMotionEnd();
	       if(ret==255)return FALSE;
	       if(ret==0)break;
      }
	  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);
	 g_MoveMode=1;
	 ret=WaitMotionEnd();
	 if(ret==255)return FALSE;
	 if(ret==0)break;
  }
  return TRUE;
  
}


INT8U G73GetNextSeg(INT8U *First,INT8U *buf,INT8U *End)
{
	INT8U    s;
	INT16U   i;
	
	for(;;)
	{
		s=g_DataBuf.DataBuf[G73.CurrentNum];
		switch(s)
		{
		case '%':       
		     *First=s;
 			 buf[0]=0x0;
			 return 4;
		     break;
		case '(':
		case '/'://注释
			*First=s;
			i=0;
			while(i<=255){
				G73.CurrentNum++;
				if(g_iCurrentNum>=g_DataBuf.DataLength)
				{
					buf[0]=0x0;
					*End=FALSE;
					return 255;			
				}
				s=g_DataBuf.DataBuf[G73.CurrentNum];
				if(s!=0x0a && s!=0x0d){
					buf[i]=s;		
				}
				if(s==0x0a){
					buf[i]=0x00;	
					*End=FALSE;
					G73.CurrentNum++;
					if(G73.CurrentNum>=g_DataBuf.DataLength)return 255;
					return 0;//一行代码结束
				}
				i++;
			}
			buf[0]=0x0;
			*End=TRUE;
			return 2;//注释超长
		case 0x0d:
		     G73.CurrentNum++;
		    break;
		case 0x0a:
			*First=s;
			G73.CurrentNum++;
			if(G73.CurrentNum>=g_DataBuf.DataLength)
			{	
				buf[0]=0x0;
				*End=FALSE;
				return 255;			
			}
			return 0;//一行代码结束
			break;
		case 'A':case 'B':case 'C':case 'D':case 'E':
		case 'F':case 'G':case 'H':case 'I':case 'J':
		case 'K':case 'L':case 'M':case 'N':case 'O':
		case 'P':case 'Q':case 'R':case 'S':case 'T':
		case 'U':case 'V':case 'W':case 'X':case 'Y':case 'Z':
			*First=s;
			i=0;
			while(i<=255){
				G73.CurrentNum++;
				if(G73.CurrentNum>=g_DataBuf.DataLength)
				{
					buf[0]=0x0;
					*End=TRUE;
					return 255;	
				}
				s=g_DataBuf.DataBuf[G73.CurrentNum];
				if((s>='0' && s<='9') || s=='.' || s=='-' || s=='+'){
					buf[i]=s;		
					i++;
				}
				else if(s==0x0d)	
				{
					;
				}
				else if(s==0x0a)    
				{
					buf[i]=0x00;
					*End=FALSE;
					G73.CurrentNum++;
					if(G73.CurrentNum>=g_DataBuf.DataLength)
						return 255;			
					return 0;//一行代码结束
				}
				else 
				{
					buf[i]=0x00;
					*End=FALSE;
					return 5;//字代码结束
				}
			}
			return 2; //数据超长	
		default:
			*First=s;
			buf[0]=0x00;
			*End=TRUE;
			return 3;//其它的字
		}
	}
}
 

INT8U G73ProcessAllCode(INT32U EndHang)
{
	INT8U 		    Error;
	INT8U 		    End;
	INT8U 		    num,len;
	INT8U 		    First,buf[255];
    INT8U           k,j;
    INT32U          Hang;
    
	while(1){			                            
        Error=G73GetNextSeg(&First,buf,&End);
        if(Error != 0 &&  Error !=5)break;
		if(End)break;
		switch(First)
		{
		case '%':		
		case '/':		
		case '(':		
		case 0x0d:
		case 0x0a:
             break;
		case 'N':	  
			 if(strlen((char *)buf)==0){Error=73;break;}
			 if(bN_Code==1) {Error=73;break;}
			 
			 k=0;Hang=0;j=strlen((char *)buf);
	         while(j){
	               Hang=(buf[k]-'0')+Hang*10; 
              	   k++; 
              	   j--;    
	         }
	         
			 if(EndHang==Hang)
			 {
			     G73_bEnd=TRUE;
			     G73ResetPara();
			 }
   		     bN_Code=TRUE;
			 break;
		case 'G':	
			len=strlen((char *)buf);
			if(len !=1 && len !=2 ){Error=73;break;}
			if(len==1) num=buf[0]-'0';
			else       num=(buf[0]-'0')*10+buf[1]-'0';
			switch(num){
			  case 0:		
			  case 1:		
			  case 2:		
			  case 3:	
			  case 4:	
				  bG_Code=1;
				  break;
			  default:
			      Error=73;
				  break;
			}
			iG_Code=num;
			break;
		case 'M':		
			len=strlen((char *)buf);
			if(len !=1 && len !=2 ){Error=73;break;}
			if(len==1) num=buf[0]-'0';
			else       num=(buf[0]-'0')*10+buf[1]-'0';
			switch(num){
			  case 3:		
			  case 4:		
			  case 5:		
			  case 8:		
			  case 9:		

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -