直线及圆弧插补程序--逐点比较法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
此程序是根据《微型计算机控制技术》(第二版)清华大学出版社
第三章数字控制技术——3.2插补原理中的3.2.1逐点比较法的直线插补,3.2.2逐点比较法圆弧插补编写的。其中的变量定义,原理依据均来源于此,如有疑问,请参考书中的讲解。尤其是例子,以下两个程序的第一个运行图均与例题中的一致。
一、四象限直线插补程序
分别加工第一、二、三、四象限直线,起点均为(0,0),终点坐标为(NX,NY),进行插补计算。
程序中(NX,NY)为终点坐标;NXY为总步数;XOY=1,2,3,4,分别为第一、二、三、四象限; ZF=1,2,3,4,分别代表+x,-x,+y,-y走步方向;FM为加工点偏差,初值为0。
源程序:
# include "stdio.h"
# include "string.h"
# include "math.h"
void main()
{ int NX,NY,NXY,BS,XOY,ZF;
int FM=0;
char a[10]="+X",b[10]="-X",c[10]="+Y",d[10]="-Y",e[10];
printf("\n\n请输入NX,NY\n");
scanf("%d %d",&NX,&NY);
{if(NX>0)
if(NY>0)
XOY=1;
else
XOY=4;
else
if(NY>0)
XOY=2;
else
XOY=3;}
printf("终点在第%d象限\n",XOY);
printf("\n 步数坐标进给偏差计算终点判断\n\n");
BS=fabs(NX) + fabs(NY);
for(NXY= fabs(NX) + fabs(NY)-1;NXY>=0;NXY--)
{ if(FM>=0)
{if(XOY==1||XOY==4)
{ ZF=1;
strcpy(e,a);}
else
{ ZF=2;
strcpy(e,b);
}
FM=FM-fabs(NY);
printf(" %d %s FM=%d NXY=%d\n\n",BS-NXY,e,
.
FM,NXY);}
else
{if(XOY==1||XOY==2)
{
ZF=3;
strcpy(e,c);
}
else
{ZF=4; strcpy(e,d);}
FM=FM+fabs(NX);
printf(" %d %s FM=%d NXY=%d\n\n",BS-NXY,e, FM,NXY);}}}
图一:插补计算过程
第一象限直线OA,起点为(0,0),终点坐标为A(6,4)
图二:插补计算过程
第二象限直线OA,起点为(0,0),终点坐标为A(-3,2)
图三:插补计算过程
第三象限直线OA,起点为(0,0),终点坐标为A(-2,-3)
图四:插补计算过程
第四象限直线OA,起点为(0,0),终点坐标为A(3,-2)
二.四象限逐点比较法圆弧插补
加工逆圆弧(或顺圆弧)A⌒B,圆弧的圆心在坐标原点,已知起点坐标为(X0,Y0)终点坐标(NX,NY)。
程序中(X0,Y0)为起点坐标;(NX,NY)为终点坐标;NXY为总步数;RNS=1,2,3,4,5,6,7,8,分别为八种圆弧(SR1,SR2,SR3,SR4,NR1,NR2,NR3,NR4,其中SR 表示逆圆弧,NR表示顺圆弧,)第一至第四象限的顺圆弧和逆圆弧; ZF=1,2,3,4,分别代表+x,-x,+y,-y走步方向;FM为加工点偏差,初值为0。
圆弧插补计算公式和进给方向
偏差圆弧种类进给方向偏差计算坐标计算
源程序:
# include "stdio.h"
# include "string.h"
# include "math.h"
void main()
{ int NX,NY,NXY,BS,RNS,ZF,X0=0,Y0=0,XM,YM;
int FM=0;
char a[10]="+X",b[10]="-X",c[10]="+Y",d[10]="-Y",e[10];
printf("请输入X0,Y0,NX,NY\n");
scanf("%d %d %d %d",&X0,&Y0,&NX,&NY); {
if(X0 if(Y0>NY) if(X0>0) RNS=7; else RNS=1; else if(X0>0) RNS=8; else RNS=2; else if(Y0>NY) if(X0>0) RNS=4; else RNS=6; else if(X0>0) RNS=5; else RNS=3;} printf("该圆弧为%d\n",RNS); BS=fabs(NX-X0) + fabs(NY-Y0); XM=X0; YM=Y0; for(NXY= fabs(NX-X0) + fabs(NY-Y0)-1;NXY>=0;NXY--) { if(RNS==1||RNS==3||RNS==6||RNS==8) { if(FM>=0) { if(RNS==1||RNS==8) { ZF=1; strcpy(e,a); } else { ZF=2; strcpy(e,b);}