解析g代码c语言程序

g代码如下

T1M6
G17
G0Z5.000
G0X0.000Y0.000S15000M3
G0X6.920Y10.816Z5.000
G1Z0.000F240.0
G1X6.461Y10.758F600.0
G3X6.009Y10.361I0.268J-0.763
G1X5.922Y9.917
Y9.008
G3X6.873Y8.456I0.675J0.067
G3X7.237Y8.775I-0.216J0.614
G3X7.291Y9.325I-1.167J0.392
G1X8.406
G3X8.606Y8.584I0.778J-0.187
G3X9.574I0.484J0.573
G3X9.775Y9.008I-0.363J0.431
G1Y10.071
G3X8.816Y10.816I-0.838J-0.089
G1Y16.796
X10.009
X10.034Y11.219
G3X11.329Y9.669I2.077J0.420
G1Y3.814
G3X10.251Y2.999I0.918J-2.336
G3X9.833Y1.768I1.632J-1.239
G1X14.947
G0Z5.000
G0X0.000Y0.000
G0Z5.000
G0X0.000Y0.000
M30

c语言程序:

struct coord
{
double x;
double y;	
double z;
double i;
double j;
};//g代码参数结构体
struct coord cord[20];
void get012()//读取g代码中012
{
	int h=1;
	int m;
	double centerx,centery,R,theta,theta0,deltatheta;
	if(is2!=0)h=is2;
	for(m=0;m<h;m++)
	{
			
			printf("%s",buf);
					switch (buf[1])
					{
					case '0':{ 
								if(buf[2]=='Z')break;
								else{
								//printf("H%d %f %f",m,cord[m+1].x,cord[0].x);
										quickcoord(cord[0].x*200,cord[m+1].x*200,cord[0].y*200,cord[m+1].y*200);//快速进给函数
										cord[0].x=cord[m+1].x;
										cord[0].y=cord[m+1].y;
										 }								
										break; }
					case '1':{  
										if(buf[2]=='7'){printf("  xy\n");break;}
										else if(buf[2]=='Z')break;
										else 
										{
										printf("    linerun:%f %f %f %f\n",cord[0].x*200,cord[0].y*200,cord[m+1].x*200,cord[m+1].y*200);
										LineRunin(cord[0].x*200,cord[0].y*200,cord[m+1].x*200,cord[m+1].y*200,1);//直线插补函数
										cord[0].x=cord[m+1].x;
										cord[0].y=cord[m+1].y;
										}
										break; }
					case '2': printf("    scircle:\n"); 
								centerx=cord[0].x+cord[m+1].i;
						        centery=cord[0].y+cord[m+1].j;									
						        R=sqrt(cord[m+1].i*cord[m+1].i+cord[m+1].j*cord[m+1].j);	
                       if(cord[m+1].i==0&&cord[m+1].j>0)theta=3/2.*PI;	
							 else 
                                  if(cord[m+1].i==0&&cord[m+1].j<0)theta=1/2.*PI;										
								else if(cord[m+1].i>0)
								   theta=atan(cord[m+1].j/cord[m+1].i)+PI;
								else if(cord[m+1].i<0&&cord[m+1].j>0)										 
                                   theta=atan(cord[m+1].j/cord[m+1].i)+2*PI;
								else if(cord[m+1].i<0&&(cord[m+1].j<0||cord[m+1].j==0))
							       theta=atan(cord[m+1].j/cord[m+1].i);
											 
											 if(centerx==cord[m+1].x&&centery>cord[m+1].y)theta0=3/2.*PI;	
											 else if(centerx==cord[m+1].x&&centery<cord[m+1].y)theta0=1/2.*PI;	
											 else if(centerx>cord[m+1].x)
					theta0=atan((cord[m+1].y-centery)/(cord[m+1].x-centerx))+PI;
											 else if(centerx<cord[m+1].x&&centery<cord[m+1].y)
				 theta0=atan((cord[m+1].y-centery)/(cord[m+1].x-centerx));
else if(centerx<cord[m+1].x&&(centery>cord[m+1].y||centery==cord[m+1].y))
				theta0=atan((cord[m+1].y-centery)/(cord[m+1].x-centerx))+2*PI;
											deltatheta=theta0-theta;
											 if(deltatheta>0)deltatheta=deltatheta-2*PI;					
						        CircleRunin(R*200,theta,deltatheta);//圆弧插补函数
										cord[0].x=cord[m+1].x;
										cord[0].y=cord[m+1].y;
										break;
					case '3': printf("    ncircle:\n"); 
        						centerx=cord[0].x+cord[m+1].i;
						        centery=cord[0].y+cord[m+1].j;
						        R=sqrt(cord[m+1].i*cord[m+1].i+cord[m+1].j*cord[m+1].j);
											 if(cord[m+1].i==0&&cord[m+1].j>0)theta=3/2.*PI;	
											 else if(cord[m+1].i==0&&cord[m+1].j<0)theta=1/2.*PI;									 
											 else if(cord[m+1].i>0)
											   theta=atan(cord[m+1].j/cord[m+1].i)+PI;
											 else if(cord[m+1].i<0&&cord[m+1].j>0)
												 theta=atan(cord[m+1].j/cord[m+1].i)+2*PI;
				 else if(cord[m+1].i<0&&(cord[m+1].j<0||cord[m+1].j==0))
										 theta=atan(cord[m+1].j/cord[m+1].i);
											 
											 if(centerx==cord[m+1].x&&centery>cord[m+1].y)theta0=3/2.*PI;	
											 else if(centerx==cord[m+1].x&&centery<cord[m+1].y)theta0=1/2.*PI;	
											 else if(centerx>cord[m+1].x)
						theta0=atan((cord[m+1].y-centery)/(cord[m+1].x-centerx))+PI;
								else if(centerx<cord[m+1].x&&centery<cord[m+1].y)
							 theta0=atan((cord[m+1].y-centery)/(cord[m+1].x-centerx));
				else if(centerx<cord[m+1].x&&(centery>cord[m+1].y||centery==cord[m+1].y))
						 theta0=atan((cord[m+1].y-centery)/(cord[m+1].x-centerx))+2*PI;
											deltatheta=theta0-theta;
				 if(deltatheta<0)deltatheta=deltatheta+2*PI;
						        CircleRunin(R*200,theta,deltatheta);//圆弧插补函数
										cord[0].x=cord[m+1].x;
										cord[0].y=cord[m+1].y;
										break; 
					default:break;
					}
			if(cord[m+1].z>cord[0].z)//z??????z???
			{
				raisez();//提刀函数
				//printf("raise z:%f\n",cord[1].z);
				cord[0].z=cord[m+1].z;
			}
			if(cord[m+1].z<cord[0].z)
			{
				downz();//落刀函数
				//printf("drop z:%f\n",cord[1].z);
			 cord[0].z=cord[m+1].z;
			}
		}
}
void getxyz()//读取g代码中xyz坐标
{
	int i;
	is2=0;
	//printf("%s",buf);
	cord[1].y = cord[0].y; 
	cord[1].x = cord[0].x;
	cord[1].z=cord[0].z;
  for(i=2;buf[i]!='\0';i++)
	{
	 switch(buf[i])
		{
		case '\n':if (buf[i + 1] == '\0' || buf[i + 1] == 'X' || buf[i + 1] == 'Y' || buf[i + 1] == 'Z')
			{
				is2++;
				cord[is2 + 1].y = cord[is2].y; 
				cord[is2 + 1].x = cord[is2].x;
				cord[is2 + 1].z = cord[is2].z;
			}break;
		case 'X':cord[is2+1].x=atof(&buf[i+1]);break;
		case 'Y':cord[is2+1].y=atof(&buf[i+1]);break;
		case 'Z':cord[is2+1].z=atof(&buf[i+1]);break;
		case 'I':if(is2==0)cord[1].i = atof(&buf[i+1]);break;
		case 'J':if(is2==0)cord[1].j = atof(&buf[i+1]);break;
		default:break;
		}
	}
}
 int main(void)
 {	
	 int i=0;
	 int f=0;
	 int j=0;
	 delay_init();//ÔÚËùÓÐinitǰ
   	Motor_Init();
	 	LED_GPIO_Config();
	NVIC_Configuration();
	Key_GPIO_Config();		
	 USARTx_Config();
	 Microswitch_Init();//ÏÞλ¿ª¹Ø
	 	EXTIX_Init();
	 TIM3_PWM_Init(199,7199);
	
	LED1(1);
	flag = 1;
	downz();
	 printf("%f %f",cord[0].x,cord[0].y);
	while(1)                            
	{	  
		if(ok==1)  
		{
		   printf("%s %d %d",buf,num,flag);
				for(j=0;j<num;)
				{
					if(flag==1)
					{
							if (buf1[j] == 'o')//??g???????o,??????
							 {
							buf[i] = '\n';
							buf[i+1] = '\0';
							//printf("%so\t", buf);
							getxyz();
							get012();
							i = 0;
							f = 0;
							 }
							if (f == 1 && buf1[j] == 'G')
							{ 
								buf[i] = '\0'; 
								//printf("%sG\t", buf); 
								getxyz();
								get012();
								i = 0;
								f=0;
							}
											if (buf1[j] == 'G')//?G???????buf????	
											f = 1;
											
											if (f == 1)
											{
												buf[i] = buf1[j]; 
												//printf("%c",buf[i]);
												i++;
											}
										j++;
							}					
		    }
        printf("finish! ");
				num=0;
				ok=0;	   
		}		
	  LED1(flag);
		//XPosition('+');
	} 
 }

 

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值