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

📄 yuanyuan.c

📁 数控机床刀具半径补偿圆弧接圆弧C程序代码
💻 C
字号:
/*圆弧接圆弧*/
#include <stdio.h>
#include <math.h>
main()
{
float R1,R2,r,I1,J1,I2,J2,x0,y0,x1,y1,x2,y2,xl1,yl1,xl2,yl2,xs1,ys1,xs2,ys2,xs3,ys3,xs4,ys4,xl,yl,x01,y01,x02,y02,d1,d2,f;
int sgn;/*定义一个正负变量*/
char g1[3],g2[3],g3[3];/*字符数组存储半径补偿命令和圆弧插补命令*/
printf("input r:");
scanf("%f",&r);
printf("input R1,R2,I1,J1,I2,J2 Separated by commas:"/*用逗号隔开*/);
scanf("%f,%f,%f,%f,%f,%f",&R1,&R2,&I1,&J1,&I2,&J2);
printf("input x0,y0,x1,y1,x2,y2 Separated by commas:");
scanf("%f,%f,%f,%f,%f,%f",&x0,&y0,&x1,&y1,&x2,&y2);
printf("input G41 or G42:");
scanf("%s",g1);

printf("input G02 or G03 for R1:");
scanf("%s",g2);

printf("input G02 or G03 for R2:");
scanf("%s",g3);
if(g1[2]=='2')/*判断刀补方向*/
r=-r;
if(g2[2]=='3')/*判断R1圆弧插补方向*/
R1=-R1;
if(g3[2]=='3')/*判断R2圆弧插补方向*/
R2=-R2;
if(r>0) sgn=1;/*判断sng的值*/
else sgn=-1;
x01=(x0+I1)-x1;
y01=(y0+J1)-y1;
x02=I2;
y02=J2;
xl1=-y01/R1;
yl1=x01/R1;
xl2=-y02/R2;
yl2=x02/R2;

if(sgn*(yl2*xl1-xl2*yl1)>=0/*加=包括特殊情况*/)/*判断为缩短型*/
  {
   printf("type of Reduction!\n");/*提示缩短型*/
   /*刀补进行*/
   if((yl2*xl1-xl2*yl1)==0)
   {
	if((g1[2]=='1'&&g2[2]=='2'&&g3[2]=='3')||(g1[2]=='2'&&g2[2]=='3'&&g3[2]=='2'))
	{
     /*按缩短型原来公式计算*/	 
     d1=sqrt(pow(x02-x01,2)+pow(y02-y01,2));
     d2=(r*(R1-R2))/d1;
     xl=(y02-y01)/d1;
     yl=-(x02-x01)/d1; 
     f=sqrt(pow(R2+r,2)-pow(xl*y01-yl*x01-d2,2));  
     if((xl*x01+yl*y01)>0) sgn=1;/*判断sgn的值*/
     else sgn=-1;
     xs1=x1+xl*(xl*x01+yl*y01)-d2*yl-sgn*xl*f;
     ys1=y1+yl*(xl*x01+yl*y01)-d2*xl-sgn*yl*f;
     printf("xs1=%.2f\nys1=%.2f",xs1,ys1);/*输出补偿转接点坐标*/
	}
	else if((g1[2]=='2'&&g2[2]=='2'&&g3[2]=='3')||(g1[2]=='1'&&g2[2]=='3'&&g3[2]=='2'))
	{
     xs1=x1-r*yl1;
     ys1=y1+r*xl1;
     xs2=x1-r*yl1+abs(r)*xl1;
     ys2=y1+r*xl1+abs(r)*yl1;
     xs3=x1-r*yl2-abs(r)*xl2;
     ys3=y1+r*xl2-abs(r)*yl2;
     xs4=x1-r*yl2;
     ys4=y1+r*xl2;
     printf("xs1=%.2f\nys1=%.2f\nxs2=%.2f\nys2=%.2f\nxs3=%.2f\nys3=%.2f\nxs4=%.2f\nys4=%.2f",xs1,ys1,xs2,ys2,xs3,ys3,xs4,ys4);/*输出补偿转接点坐标*/ 
	}
	else
	{
     xs1=x1-r*yl1;
     ys1=y1+r*xl1;
	 printf("xs1=%.2f\nys1=%.2f",xs1,ys1);/*输出补偿转接点坐标*/
	}
   }
  else
   {
    f=sqrt(pow(R2+r,2)-pow(xl*y01-yl*x01-d2,2));
    d1=sqrt(pow(x02-x01,2)+pow(y02-y01,2));
    d2=(r*(R1-R2))/d1;
    xl=(y02-y01)/d1;
    yl=-(x02-x01)/d1;   
    if((xl*x01+yl*y01)>0) sgn=1;/*判断sgn的值*/
    else sgn=-1;
    xs1=x1+xl*(xl*x01+yl*y01)-d2*yl-sgn*xl*f;
    ys1=y1+yl*(xl*x01+yl*y01)-d2*xl-sgn*yl*f;
    printf("xs1=%.2f\nys1=%.2f",xs1,ys1);/*输出补偿转接点坐标*/
   }
  }
else if(sgn*(yl2*xl1-xl2*yl1)<0&&(yl2*yl1+xl2*xl1)>=0)/*判断为伸长型*/
  {
   printf("type of Elongation!\n");/*提示伸长型*/   
   /*刀补进行*/
   xs1=x1-r*yl1;
   ys1=y1+r*xl1;
   xs2=x1+((xl2-xl1)*r)/(xl1*yl2-xl2*yl1);
   ys2=y1+((yl2-yl1)*r)/(xl1*yl2-xl2*yl1);
   xs3=x1-r*yl2;
   ys3=y1+r*xl2;
   printf("xs1=%.2f\nys1=%.2f\nxs2=%.2f\nys2=%.2f\nxs3=%.2f\nys3=%.2f",xs1,ys1,xs2,ys2,xs3,ys3);/*输出补偿转接点坐标*/
  
  }
else if(sgn*(yl2*xl1-xl2*yl1)<0&&(yl2*yl1+xl2*xl1)<0)/*判断为插入型*/
  {
   printf("type of Insertion!\n");/*提示插入型*/
   /*刀补进行*/
   xs1=x1-r*yl1;
   ys1=y1+r*xl1;
   xs2=x1-r*yl1+abs(r)*xl1;
   ys2=y1+r*xl1+abs(r)*yl1;
   xs3=x1-r*yl2-abs(r)*xl2;
   ys3=y1+r*xl2-abs(r)*yl2;
   xs4=x1-r*yl2;
   ys4=y1+r*xl2;
   printf("xs1=%.2f\nys1=%.2f\nxs2=%.2f\nys2=%.2f\nxs3=%.2f\nys3=%.2f\nxs4=%.2f\nys4=%.2f",xs1,ys1,xs2,ys2,xs3,ys3,xs4,ys4);/*输出补偿转接点坐标*/ 
  }
}

⌨️ 快捷键说明

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