DDA圆弧插补
- 格式:docx
- 大小:304.00 KB
- 文档页数:11
基于VC++的数控DDA圆弧插补轨迹仿真赵万军;邓正华【摘要】本文在分析DDA圆弧插补基本原理及其插补算法的基础上,介绍了采用VC++编程实现DDA圆弧插补轨迹仿真的方法与步骤,给出了VC++插补流程和部分程序代码,实现了插补轨迹的可视化,为学习和研究数控插补原理提供了帮助.【期刊名称】《制造业自动化》【年(卷),期】2012(034)005【总页数】3页(P125-127)【关键词】DDA圆弧插补;仿真;VC++【作者】赵万军;邓正华【作者单位】重庆三峡学院机械工程学院,万州404000;重庆三峡学院机械工程学院,万州404000【正文语种】中文【中图分类】TG659;TP391.90 引言数控插补轨迹仿真研究的目的是提高对插补算法、数控原理、数控系统软件的认识和理解,为从事数控系统维护及数控系统开发奠定基础。
因此,数控插补轨迹仿真的研究方法与思路不论是对于高校学生学习数控技术课程,还是对准备进行数控系统软件开发的工程技术人员而言都具有积极意义。
目前,也有学者进行了这方面的研究工作[1~3],但他们的研究主要是以直线插补为主,由于圆弧插补存在过象限问题,相较直线插补而言要复杂许多,因此上述研究文献甚少涉及圆弧插补,即使有所提及也语焉不详。
有鉴于此,本文以VC++为工具,以数字积分插补法(DDA法)为例来讨论圆弧插补轨迹仿真的实现过程。
1 DDA圆弧插补的基本原理[4]DDA法即数字积分法,它利用数字积分思想确定刀具沿各坐标轴的位移,使刀具沿着所加工的曲线进给。
如图1所示的第一象限逆时针圆弧AB为例说明DDA圆弧插补原理。
图1 DDA圆弧插补图1所示圆弧以原点为圆心,圆的方程为:将(1)式两边对时间t求导,可得动点P沿两个坐标轴的速度分量:由(2)式可得坐标轴方向的微小位移增量:据(3)式可写出第一象限逆圆加工时DDA插补表达式:式中:Δt为插补周期,可取单位时间间隔1;n为插补次数。
图2 DDA第一象限逆圆插补原理图由此,可得DDA圆弧插补的原理如图2所示。
一.实验名称:DDA圆弧插补(四象限、左移规格化、半加载、全加载)二.实验原理:
三.实验内容:
#include<stdio.h>
#include<math.h>
{
int xa,ya,xe,ye; /*起点和终点横纵坐标*/
int jx,jy,rx,ry;
int dx,dy,ex,ey;
int ix,iy; /*ix,iy为在程序运行过程中各点的横纵坐标*/ int a,b,c,d;
int i=1,w;
printf("半加载及左移规格化顺弧请输入1,逆弧输入2\n");
printf("全加载及左移规格化顺弧请输入3,逆弧输入4\n");
scanf("%d",&w);
printf("请输入圆弧的起点和终点坐标\n");
scanf("%d,%d,%d,%d",&xa,&ya,&xe,&ye);
jx=abs(ya),jy=abs(xa);/*给累加变量赋初值*/
rx=ry=dx=dy=0;
ix=xa,iy=ya;/*定义刀具起点*/
ex=abs(xa-xe);
ey=abs(ya-ye);
/*调用顺弧计算程序*/
if (w==1)
{
while(jx<8&&jy<8)
{
jx=jx*2;
jy=jy*2;
i=i*2;
}/*左移规格化*/
rx=ry=16;/*半加载赋值*/
for(;ex>0||ey>0;)
{
if((xa>0&&ya>0)||(xa==0&&ya>0))
a=1,b=-1,c=-1,d=1;
else if((xa<0&&ya>0)||(xa<0&&ya==0))
a=1,b=1,c=1,d=-1;
else if((xa<0&&ya<0)||(xa==0&&ya<0))
a=-1,b=1,c=-1,d=1;
else if((xa>0&&ya<0)||(xa>0&&ya==0))
a=-1,b=-1,c=1,d=-1;
/*给不同象限走刀的变量赋值*/
if(ex!=0)/*x方向走刀的计算*/
{
rx=rx+jx;
if(dx!=0)
{ix=ix+dx;
ex=ex-1;
rx=rx%32;
}
}
if(ey!=0)/*y方向走刀的计算*/
{
ry=ry+jy;
dy=b*ry/32;
if(dy!=0)
{iy=iy+dy;
ey=ey-1;
ry=ry%32;
}
}
printf("ix=%d,iy=%d\n",ix,iy);/*输出刀具所在点坐标*/
if(dy!=0)
jx=jx+c*i;
if(dx!=0)
jy=jy+d*i;
}}
if(w==2)
{
while(jx<8&&jy<8)
{
jx=jx*2;
jy=jy*2;
i=i*2;
}/*左移规格化*/
rx=ry=16;/*半加载赋值*/
for(;ex>0||ey>0;)
{
if((xa>0&&ya>0)||(xa>0&&ya==0))
a=-1,b=1,c=1,d=-1;
else if((xa<0&&ya>0)||(xa==0&&ya>0))
a=-1,b=-1,c=-1,d=1;
else if((xa<0&&ya<0)||(xa<0&&ya==0))
a=1,b=-1,c=1,d=-1;
else if((xa>0&&ya<0)||(xa==0&&ya<0))
a=1,b=1,c=-1,d=1;
/*给不同象限走刀的变量赋值*/
if(ex!=0)
{
rx=rx+jx;
dx=a*rx/32;
if(dx!=0)/*x方向走刀的计算*/
{ix=ix+dx;
ex=ex-1;
rx=rx%32;
}
}
if(ey!=0)/*y方向走刀的计算*/
{
ry=ry+jy;
dy=b*ry/32;
if(dy!=0)
{iy=iy+dy;
ey=ey-1;
ry=ry%32;
}
}
printf("ix=%d,iy=%d\n",ix,iy);/*输出刀具所在点坐标*/
if(dy!=0)
jx=jx+c*i;
if(dx!=0)
jy=jy+d*i;
}}
if (w==3)
{while(jx<8&&jy<8)
{
jx=jx*2;
jy=jy*2;
i=i*2;
}/*左移规格化*/
rx=ry=31;/*全加载赋值*/
for(;ex>0||ey>0;)
{
if((xa>0&&ya>0)||(xa==0&&ya>0))
a=1,b=-1,c=-1,d=1;
else if((xa<0&&ya>0)||(xa<0&&ya==0))
a=1,b=1,c=1,d=-1;
else if((xa<0&&ya<0)||(xa==0&&ya<0))
a=-1,b=1,c=-1,d=1;
else if((xa>0&&ya<0)||(xa>0&&ya==0))
a=-1,b=-1,c=1,d=-1;
/*给不同象限走刀的变量赋值*/
if(ex!=0)/*x方向走刀的计算*/
{
rx=rx+jx;
dx=a*rx/32;
if(dx!=0)
{ix=ix+dx;
ex=ex-1;
rx=rx%32;
}
}
if(ey!=0)/*y方向走刀的计算*/
{
ry=ry+jy;
dy=b*ry/32;
if(dy!=0)
{iy=iy+dy;
ey=ey-1;
ry=ry%32;
}
}
printf("ix=%d,iy=%d\n",ix,iy);/*输出刀具所在点坐标*/
if(dy!=0)
jx=jx+c*i;
if(dx!=0)
jy=jy+d*i;
}}
/*调用逆弧计算程序*/
if(w==4)
{
while(jx<8&&jy<8)
{
jx=jx*2;
jy=jy*2;
i=i*2;
}/*左移规格化*/
rx=ry=31;/*全加载赋值*/
for(;ex>0||ey>0;)
{
if((xa>0&&ya>0)||(xa>0&&ya==0))
a=-1,b=1,c=1,d=-1;
else if((xa<0&&ya>0)||(xa==0&&ya>0))
a=-1,b=-1,c=-1,d=1;
else if((xa<0&&ya<0)||(xa<0&&ya==0))
a=1,b=-1,c=1,d=-1;
else if((xa>0&&ya<0)||(xa==0&&ya<0))
a=1,b=1,c=-1,d=1;
/*给不同象限走刀的变量赋值*/
if(ex!=0)
{
rx=rx+jx;
dx=a*rx/32;
if(dx!=0)/*x方向走刀的计算*/
{ix=ix+dx;
ex=ex-1;
rx=rx%32;
}
}
if(ey!=0)/*y方向走刀的计算*/
{
ry=ry+jy;
dy=b*ry/32;
if(dy!=0)
{iy=iy+dy;
ey=ey-1;
ry=ry%32;
}
}
printf("ix=%d,iy=%d\n",ix,iy);/*输出刀具所在点坐标*/
if(dy!=0)
jx=jx+c*i;
if(dx!=0)
jy=jy+d*i;
}}
}
四.实验结果:
仿真:
半加载及左移规格化顺弧第一象限:
半加载及左移规格化顺弧第三象限:
半加载及左移规格化逆弧第二象限:
半加载及左移规格化逆弧第四象限:
全加载及左移规格化顺弧第三象限:
全加载及左移规格化逆弧第四象限:
分析:
本程序默认寄存器是5位,圆弧圆心在原点,圆弧在但一象限内的情况,不考虑其他情况。