解析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('+');
	} 
 }

 

  • 11
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: 解析 G 代码的 C 语言程序主要包括以下几个步骤: 1. 定义 G 代码语法规则:根据 G 代码的语法规则,定义相应的数据结构和变量类型,例如定义表示坐标的结构体,定义指令类型的枚举等。 2. 读取 G 代码文件:通过 C 语言提供的文件读取函数,读取 G 代码文件的内容,并将其保存到内存中的数据结构中,可以使用数组、链表等数据结构进行存储。 3. 解析 G 代码:遍历存储 G 代码的数据结构,逐行解析 G 代码指令。根据 G 代码的语法规则,判断每行代码的指令类型,并提取相应的参数。 4. 执行解析后的指令:根据不同的指令类型,编写相应的函数进行处理。例如,在绘制直线的指令中,可以编写函数实现直线绘制的算法。 5. 输出结果:根据需要,可以将解析后的指令结果进行输出,可以是图形界面的显示,也可以是文本输出。 在实际编写解析 G 代码的 C 语言程序时,还需要考虑异常处理、错误检测等因素。例如,对于 G 代码文件格式错误的情况,可以通过异常处理机制进行处理,并给出相应的错误提示。此外,还可以添加其他功能,如步进调试、图形显示等。 总结来说,解析 G 代码的 C 语言程序需要定义语法规则、读取 G 代码文件、解析指令、执行指令和输出结果等步骤。编写程序时要注重代码的可读性和可维护性,同时考虑异常处理和错误检测等因素,以实现一个高效、稳定的 G 代码解析器。 ### 回答2: 解析G代码C语言程序可以根据具体的需求进行编写,通常包括以下步骤: 1. 定义数据结构:首先需要定义适当的数据结构来存储G代码的各个参数,例如坐标值、刀具半径等。可以使用结构体或类来表示这些参数,并根据实际需要定义相应的成员变量。 2. 读取G代码文件:通过文件操作函数,如fopen、fread等,打开G代码文件并进行读取。可以使用循环逐行读取文件内容,并将每行的G代码解析成相应的指令。 3. 解析G代码指令:对于每个读取到的G代码指令,需要进行解析,提取出其中的关键信息。可以使用字符串处理函数,如strstr、strtok等,查找并提取关键字和对应的数值。 4. 根据解析结果执行相应操作:根据解析的结果,可以使用条件语句或开关语句来执行相应的操作。例如,如果解析到G00指令,可以将其视为快速定位指令,并根据解析出的坐标值进行相应的运动控制。 5. 输出结果或进行后续处理:在执行相应操作后,可以根据需要将结果输出到文件或显示屏上,或者进行一些后续处理操作。例如,可以将每次运动的轨迹点保存到文件或通过串口发送给硬件控制器。 6. 清理资源:在程序结束时,需要进行适当的资源清理工作,如关闭文件、释放内存等,以避免资源的泄漏。 需要注意的是,G代码解析过程可能会较为复杂,需要根据具体的需求和G代码的规范进行适当的扩展和调整。以上是一个基本的框架,具体实现还需要根据实际情况进行细化和完善。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值