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&¢ery>cord[m+1].y)theta0=3/2.*PI;
else if(centerx==cord[m+1].x&¢ery<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&¢ery<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&¢ery>cord[m+1].y)theta0=3/2.*PI;
else if(centerx==cord[m+1].x&¢ery<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&¢ery<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('+');
}
}