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

📄 processg73.c

📁 控制电机运动的G代码程序,如果对G代码不清楚,请先看懂G代码,然后再看本程序.
💻 C
📖 第 1 页 / 共 2 页
字号:
			  case 10:	
			  case 11:	
			  case 32:
			  case 33:
				   iM_Code=num;
				   bM_Code=1;
				   break;
			  case 0:		
				   g_IsRun=2;
				   break;
			  default:
				   Error=73;
				   break;
			}		
			break;
		case 'X':
			if(strlen((char *)buf)==0){Error=73;break;}
			if(bU_Code||bX_Code){Error=73;break;}
			G73_Pos_X=BfFromStr(buf);
			if(g_Sysparam.DiaOrRadius)G73_Pos_X=G73_Pos_X/2;
		    bX_Code=TRUE;
			break;
		case 'Z':		
			if(strlen((char *)buf)==0){Error=73;break;}
			if(bW_Code||bZ_Code){Error=73;break;}
			G73_Pos_Z=BfFromStr(buf);
			bZ_Code=TRUE;
			break;
		case 'U':	
		    if(strlen((char *)buf)==0){Error=73;break;}
			if(bX_Code||bU_Code){Error=73;break;}
			G73_Pos_U=BfFromStr(buf);
		    if(g_Sysparam.DiaOrRadius)G73_Pos_U=G73_Pos_U/2;
			bU_Code =TRUE;
			break;
		case 'W':	
			if(strlen((char *)buf)==0){Error=73;break;}
			if(bZ_Code||bW_Code){Error=73;break;}
			G73_Pos_W=BfFromStr(buf);
			bW_Code = 1;
			break;
		case 'I':		
			if(strlen((char *)buf)==0){Error=73;break;}
			if(bI_Code){Error=73;break;}
			G73_Pos_I=BfFromStr(buf);
			bI_Code = TRUE;
			break;
		case 'K':		
			if(strlen((char *)buf)==0){Error=73;break;}
			if(bK_Code){Error=73;break;}
			G73_Pos_K=BfFromStr(buf);
			bK_Code = TRUE;
			break;
		case 'R':		
			if(strlen((char *)buf)==0){Error=73;break;}
			if(bR_Code){Error=73;break;}
			G73_Pos_R=BfFromStr(buf);
			bR_Code = TRUE;
			break;
        default:
	        break;
		}
	    if (Error==0){
	         if (G73ProcessHangCode()==FALSE)Error=7;
	         if (G73_bEnd)Error=6;
			 G73ResetPara();  
		}
		if (Error==73)break;
		if (Error==6)break;
		if (Error==7)break;

    }
	return Error;
}

BOOLEAN G73ProcessHangCode(void)
{

    INT8U   i;
    
	if(iM_Code!=100 && iM_Code!=98&& iM_Code!=99)
	{
		switch(iM_Code)		
		{
		case  3:case 4:case 5:case 8:case 9:case 10:case 11:
		case 12:case 13:case 32:case 33:case 41:case 42:case 43:case 44:
	    DispErrCode(73);
        return FALSE;
		}
		g_DelayTime=g_Sysparam.M_DelayTime/5;
	    if(WaitDelayEnd())return TRUE;
	}
	if(iM_Code==99 || iM_Code==98 || (iM_Code>=50 && iM_Code<=59))		
	{
	    DispErrCode(23);
        return FALSE;
	}
	if(bX_Code||bZ_Code||bU_Code||bW_Code)
	{				
		switch(iG_Code)
		{
		
		case 0:		
		    LineShapNum++;
			AllNum++;
			if (AllNum!=1){
			    for (i=1;i<MAXNUMBER;i++){
			       if (CircleValue[i].Pos==(AllNum-1)){
			          LineValue[LineShapNum].StartX=CircleValue[i].EndX;
			          LineValue[LineShapNum].StartZ=CircleValue[i].EndZ;
			          break;
			       }
			       if (LineValue[i].Pos==(AllNum-1)){
			          LineValue[LineShapNum].StartX=LineValue[i].EndX;
			          LineValue[LineShapNum].StartZ=LineValue[i].EndZ;
			          break;
			       }
			    }
			}
			else{
			     if(bX_Code)	  G73_Abs_PosX=G73_Pos_X;
			     else if(bU_Code) G73_Abs_PosX=G73_Pos_U+Get_AbsPos(1);
			     else             G73_Abs_PosX=Get_AbsPos(1);
			     if(bZ_Code)      G73_Abs_PosZ=G73_Pos_Z;
			     else if(bW_Code) G73_Abs_PosZ=G73_Pos_W+Get_AbsPos(3);
			     else             G73_Abs_PosZ=Get_AbsPos(3);
			     LineValue[LineShapNum].StartX=G73_Abs_PosX;
			     LineValue[LineShapNum].StartZ=G73_Abs_PosZ;
			     LineValue[LineShapNum].EndX=G73_Abs_PosX;
			     LineValue[LineShapNum].EndZ=G73_Abs_PosZ;
			     LineValue[LineShapNum].Pos=AllNum;
			     break;     
			}
			if(bX_Code)		 G73_Abs_PosX=G73_Pos_X;
			else if(bU_Code) G73_Abs_PosX=G73_Pos_U+LineValue[LineShapNum].StartX;
			else             G73_Abs_PosX=LineValue[LineShapNum].StartX;
			if(bZ_Code)      G73_Abs_PosZ=G73_Pos_Z;
			else if(bW_Code) G73_Abs_PosZ=G73_Pos_W+LineValue[LineShapNum].StartZ;
			else             G73_Abs_PosZ=LineValue[LineShapNum].StartZ;
			
			LineValue[LineShapNum].EndX=G73_Abs_PosX;
			LineValue[LineShapNum].EndZ=G73_Abs_PosZ;
			LineValue[LineShapNum].Pos=AllNum;
			if (LineValue[LineShapNum].EndX!=LineValue[LineShapNum].StartX)
			       LineValue[LineShapNum].K=(LineValue[LineShapNum].EndX-LineValue[LineShapNum].StartX)/(LineValue[LineShapNum].EndZ-LineValue[LineShapNum].StartZ);
			
			if (LineValue[LineShapNum].EndZ>LineValue[LineShapNum].StartZ)Zinc=1;
			else if (LineValue[LineShapNum].EndZ<LineValue[LineShapNum].StartZ)Zdec=1;
			if (Zdec==1&&Zinc==1){DispErrCode(24);return FALSE;}

			if (LineValue[LineShapNum].EndX>LineValue[LineShapNum].StartX)Xinc=1;
			else if (LineValue[LineShapNum].EndX<LineValue[LineShapNum].StartX)Xdec=1;
			if (Xdec==1&&Xinc==1){DispErrCode(24);return FALSE;}
			break;
			
		case 1:	
		    LineShapNum++;
			AllNum++;	
			if (AllNum!=1){
			    for (i=1;i<MAXNUMBER;i++){
			         if (CircleValue[i].Pos==(AllNum-1)){
			              LineValue[LineShapNum].StartX=CircleValue[i].EndX;
			              LineValue[LineShapNum].StartZ=CircleValue[i].EndZ;
			              break;
			         }
			         if (LineValue[i].Pos==(AllNum-1)){
			              LineValue[LineShapNum].StartX=LineValue[i].EndX;
			              LineValue[LineShapNum].StartZ=LineValue[i].EndZ;
			              break;
			         }
			    }
			}
			else{
			     if(bX_Code)	  G73_Abs_PosX=G73_Pos_X;
			     else if(bU_Code) G73_Abs_PosX=G73_Pos_U+Get_AbsPos(1);
			     else             G73_Abs_PosX=Get_AbsPos(1);
			     if(bZ_Code)      G73_Abs_PosZ=G73_Pos_Z;
			     else if(bW_Code) G73_Abs_PosZ=G73_Pos_W+Get_AbsPos(3);
			     else             G73_Abs_PosZ=Get_AbsPos(3);
			     
			     LineValue[LineShapNum].StartX=G73_Abs_PosX;
			     LineValue[LineShapNum].StartZ=G73_Abs_PosZ;
			     LineValue[LineShapNum].EndX=G73_Abs_PosX;
			     LineValue[LineShapNum].EndZ=G73_Abs_PosZ;
			     LineValue[LineShapNum].Pos=AllNum;	    
			     break;
			     
			}

			if(bX_Code)		 G73_Abs_PosX=G73_Pos_X;
			else if(bU_Code) G73_Abs_PosX=G73_Pos_U+LineValue[LineShapNum].StartX;
			else             G73_Abs_PosX=LineValue[LineShapNum].StartX;
			if(bZ_Code)      G73_Abs_PosZ=G73_Pos_Z;
			else if(bW_Code) G73_Abs_PosZ=G73_Pos_W+LineValue[LineShapNum].StartZ;
			else             G73_Abs_PosZ=LineValue[LineShapNum].StartZ;
			
			LineValue[LineShapNum].EndX=G73_Abs_PosX;
			LineValue[LineShapNum].EndZ=G73_Abs_PosZ;
			LineValue[LineShapNum].Pos=AllNum;
			if (LineValue[LineShapNum].EndX!=LineValue[LineShapNum].StartX)
			       LineValue[LineShapNum].K=(LineValue[LineShapNum].EndX-LineValue[LineShapNum].StartX)/(LineValue[LineShapNum].EndZ-LineValue[LineShapNum].StartZ);
			

			if (LineValue[LineShapNum].EndZ>LineValue[LineShapNum].StartZ)Zinc=1;
			else if (LineValue[LineShapNum].EndZ<LineValue[LineShapNum].StartZ)Zdec=1;
			if (Zdec==1&&Zinc==1){DispErrCode(24);return FALSE;}

			if (LineValue[LineShapNum].EndX>LineValue[LineShapNum].StartX)Xinc=1;
			else if (LineValue[LineShapNum].EndX<LineValue[LineShapNum].StartX)Xdec=1;
			if (Xdec==1&&Xinc==1){DispErrCode(24);return FALSE;}
			break;
			
		case 2:		
		case 3:	
			CircleShapNum++;
			AllNum++;
            if (AllNum!=1){
			    for (i=1;i<MAXNUMBER;i++){
			       if (CircleValue[i].Pos==(AllNum-1)){
			          CircleValue[CircleShapNum].StartX=CircleValue[i].EndX;
			          CircleValue[CircleShapNum].StartZ=CircleValue[i].EndZ;
			          break;
			       }
			       if (LineValue[i].Pos==(AllNum-1)){
			          CircleValue[CircleShapNum].StartX=LineValue[i].EndX;
			          CircleValue[CircleShapNum].StartZ=LineValue[i].EndZ;
			          break;
			       }
			    }
			}
			else{
			      DispErrCode(22);
                  return FALSE;
			}
			
            if(bX_Code)      G73_Abs_PosX=G73_Pos_X;
			else if(bU_Code) G73_Abs_PosX=G73_Pos_U+CircleValue[CircleShapNum].StartX;
			else             G73_Abs_PosX=CircleValue[CircleShapNum].StartX;
				
			if(bZ_Code)      G73_Abs_PosZ=G73_Pos_Z;
			else if(bW_Code) G73_Abs_PosZ=G73_Pos_W+CircleValue[CircleShapNum].StartZ;
			else             G73_Abs_PosZ=CircleValue[CircleShapNum].StartZ;
			
		    if(bR_Code){
			     if(G73_Pos_R==0){DispErrCode(25);return FALSE;}
				 if(iG_Code==3)G73_Pos_R=-G73_Pos_R;
				 if(GetCircleCenter(G73_Abs_PosX-CircleValue[CircleShapNum].StartX,G73_Abs_PosZ-CircleValue[CircleShapNum].StartZ,G73_Pos_R,&G73_Abs_PosI,&G73_Abs_PosK)){DispErrCode(29);return FALSE;}
				 G73_Abs_PosI+=CircleValue[CircleShapNum].StartX;
				 G73_Abs_PosK+=CircleValue[CircleShapNum].StartZ;
			}
			else
			{
			 	 if(bI_Code) G73_Abs_PosI=G73_Pos_I+CircleValue[CircleShapNum].StartX;
				 else        G73_Abs_PosI=CircleValue[CircleShapNum].StartX;
				 if(bK_Code) G73_Abs_PosK=G73_Pos_K+CircleValue[CircleShapNum].StartZ;
				 else        G73_Abs_PosK=CircleValue[CircleShapNum].StartZ;
			}

			CircleValue[CircleShapNum].EndX=G73_Abs_PosX;
			CircleValue[CircleShapNum].EndZ=G73_Abs_PosZ;
			CircleValue[CircleShapNum].I=G73_Abs_PosI;
			CircleValue[CircleShapNum].K=G73_Abs_PosK;
			CircleValue[CircleShapNum].R=G73_Pos_R;
			CircleValue[CircleShapNum].Pos=AllNum;
			CircleValue[CircleShapNum].Cw=iG_Code;
			
			if (CircleValue[CircleShapNum].EndZ>CircleValue[CircleShapNum].StartZ)Zinc=1;
			else if (CircleValue[CircleShapNum].EndZ<CircleValue[CircleShapNum].StartZ)Zdec=1;
			if (Zdec==1&&Zinc==1){DispErrCode(24);return FALSE;}
			
			if (CircleValue[CircleShapNum].EndX>CircleValue[CircleShapNum].StartX)Xinc=1;
			else if (CircleValue[CircleShapNum].EndX<CircleValue[CircleShapNum].StartX)Xdec=1;
			if (Xdec==1&&Xinc==1){DispErrCode(24);return FALSE;}
			break;
		default:
		    DispErrCode(37);return FALSE;
		    break;
		}
	}
	return  TRUE;
}


FP32 G73ConstructionFunc(FP32  Xpos){

    INT8U      i,Num;
    BOOLEAN    b_Line;
	BOOLEAN    b_Circle;

	for (i=1;i<AllNum;i++){
	     if(Xpos<=LineValue[i].EndX&&Xpos>=LineValue[i].StartX)
	     {
	       Num=i;b_Line=1;
	     }
	     else if(Xpos<=CircleValue[i].EndX&&Xpos>=CircleValue[i].StartX)
	     {
		   Num=i;b_Circle=1;
	     }
	     else{;}
	}
    if(b_Line){
	     return (Xpos-LineValue[Num].StartX)*LineValue[Num].K+LineValue[Num].StartZ;
	}
	if(b_Circle){
	     return sqrt(CircleValue[Num].R*CircleValue[Num].R-(Xpos-CircleValue[Num].I)*(Xpos-CircleValue[Num].I))+CircleValue[Num].K;	
	}
	return 0.0;
}


INT32U G73FindStartHang(INT32U Hang){

    INT32U     i;
	INT8U      j,k,Err;
	INT8U      buf[10];
	INT32U     FindHang;
    
    i=g_DataBuf.ProgAdd[g_Usrparam.CurrentFileNum];
    while(1){
        if (g_DataBuf.DataBuf[i]=='N'){
	      j=0;i++;Err=0;
	      while(g_DataBuf.DataBuf[i]>='0'&&g_DataBuf.DataBuf[i]<='9'){
		     buf[j]=g_DataBuf.DataBuf[i];
		     j++;i++;
		     if (i>=g_DataBuf.DataLength)return 0xfffff;
		     if (j>6){Err=1;break;}
		  }
	      if (Err==0){
	          k=0;FindHang=0;
	          while(j){
	               FindHang=(buf[k]-'0')+FindHang*10; 
              	   k++; 
              	   j--;    
	          }
	          if (Hang==FindHang){
	              return i; 
	          }    

	      }
	      else{;}
	    }
	    else{
	       i++;
		   if (i>=g_DataBuf.DataLength)return 0xfffff;
		   if (g_DataBuf.DataBuf[i]=='%'){
		      return 0xfffff; 
		   }
	    }
    }
}

void  G73ResetPara(void){

   bX_Code=0;
   bZ_Code=0;
   bU_Code=0;
   bW_Code=0;
   bI_Code=0;
   bK_Code=0;
   bR_Code=0;
	 
   bM_Code=0;
   bG_Code=0;
   bN_Code=0;
   
   iM_Code=0;
   iG_Code=0;
    
   G73_Pos_U=0;	
   G73_Pos_W=0;
   G73_Pos_X=0;
   G73_Pos_Z=0;
   G73_Pos_I=0;
   G73_Pos_K=0;
   G73_Pos_R=0;
   
   G73.Xremain=0;
   G73.Zremain=0;
   G73.StartHang=0;
   G73.EndHang=0; 
	        
   G73.Xaction=0;
   G73.Zaction=0;
   G73.LoopCount=0;
}
/*
BOOLEAN G73Motion(void)
{
    
     INT8U  j,k,ret;
     BOOLEAN bCircle,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);
     while(1){
	     g_MoveMode=1;
	     G01_AbsPos(LineValue[1].StartX,LineValue[1].StartZ);
	     ret=WaitMotionEnd();
	     if(ret==255)return TRUE;
	     if(ret==0)break;
	 }
	 
	 bCircle=0;bLine=0;
   	 for (j=2;j<=AllNum;j++){
		  for (k=1;k<MAXNUMBER;k++){
	         if (CircleValue[k].Pos==j){
	            bCircle=1;
			    break;
			 }
			 if (LineValue[k].Pos==j){
			    bLine=1;
                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);
	          while(1){
	              g_MoveMode=1;
	              G01_AbsPos(LineValue[k].EndX,LineValue[k].EndZ);
	              ret=WaitMotionEnd();
	              if(ret==255)return TRUE;
	              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(CircleValue[k].Cw==2)
				//{
				//	ret=G02G03_CW_ZX(CircleValue[k].EndX,CircleValue[k].EndZ,0,CircleValue[k].I,CircleValue[k].K,FALSE);	
				//	if(ret)return TRUE;	
				//}
				//else
				//{					
				//	ret=G02G03_CW_ZX(CircleValue[k].EndX,CircleValue[k].EndZ,0,CircleValue[k].I,CircleValue[k].K,TRUE);
				//	if(ret)return TRUE;
				//}
				
	         
	          while(1){
				   if(CircleValue[CircleShapNum].Cw==2)
					  G02_AbsPos(CircleValue[k].EndX,CircleValue[k].EndZ,CircleValue[k].I,CircleValue[k].K);
				   else
					  G03_AbsPos(CircleValue[k].EndX,CircleValue[k].EndZ,CircleValue[k].I,CircleValue[k].K);
				   g_MoveMode=1;
				   ret=WaitMotionEnd();
				   if(ret==255)return TRUE;//停止运行
				   if(ret==0)break;//运行结束
			  }
			  
	      }
	      bCircle=0;bLine=0;
	      
	 }
     return TRUE;
}
*/

⌨️ 快捷键说明

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