直线及圆弧插补程序--逐点比较法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);}

相关文档
最新文档