直线插补流程图
- 格式:doc
- 大小:46.42 KB
- 文档页数:6
《机床数控技术》课程设计说明书班级:0511105学号:*******姓名:指导教师:时间:2015年1月地点:明故宫校区计算中心目录一、简要说明--------------------------------------------------------3二、设计目的和任务--------------------------------------------------3三、设计要求--------------------------------------------------------3四.插补原理及流程图设计------------------------------------------4五.变量说明-------------------------------------------------------------6 六.程序界面及运行截图--------------------------------6七. 源程序代码----------------------------------------------------7八参考文献-------------------------------------18一、简要说明插补(Interpolation)在数控机床中,刀具不能严格地按照要求加工的曲线运动,只能用折线轨迹逼近所要加工的曲线。
插补(interpolation)定义:机床数控系统依照一定方法确定刀具运动轨迹的过程。
也可以说,已知曲线上的某些数据,按照某种算法计算已知点之间的中间点的方法,也称为“数据点的密化”。
数控装置根据输入的零件程序的信息,将程序段所描述的曲线的起点、终点之间的空间进行数据密化,从而形成要求的轮廓轨迹,这种“数据密化”机能就称为“插补”。
插补计算就是数控装置根据输入的基本数据,通过计算,把工件轮廓的形状描述出来,边计算边根据计算结果向各坐标发出进给脉冲,对应每个脉冲,机床在响应的坐标方向上移动一个脉冲当量的距离,从而将工件加工出所需要轮廓的形状。
逐点比较法第一象限直线插补编程逐点比较法是以折线来逼近给定的轨迹,就是每走一步控制系统都要将加工点与给定的图形轨迹相比较,以决定下一步进给的方向,使之逼近加工轨迹。
逐点比较法以折线来逼近直线或圆弧,其最大的偏差不超过一个最小设定单位。
只要将脉冲当量取得足够小,就可以达到精度要求。
逐点比较插补法在脉冲当量为0.01mm,系统进给速度小于3000mm/min时,能很好的满足要求。
一、逐点比较法直线插补如下图所示设直线 oA 为第一象限的直线,起点为坐标原点o (0 , 0) ,终点坐标为, A( ) , P() 为加工点。
若 P 点正好处在直线 oA 上,由相似三角形关系则有即点在直线 oA 上方 ( 严格为直线 oA 与 y 轴正向所包围的区域 ) ,则有即若 P 点在直线 oA 下方 ( 严格为直线 oA 与 x 轴正向所包围的区域 ) ,则有图 3 — 1 逐点比较法第一象限直线插补即令则有:①如,则点 P 在直线 oA 上,既可向 +x 方向进给一步,也可向 +y 方向进给一步;②如,则点 P 在直线 oA 上方,应向 +x 方向进给一步,以逼近oA直线;③如,则点 P 在直线 oA 下方,应向 +y 方向进给一步,以逼近 oA直线一般将及视为一类情况,即时,都向 +x 方向进给一步。
当两方向所走的步数与终点坐标相等时,停止插补。
这即逐点比较法直线插补的原理。
对第一象限直线 oA 从起点 ( 即坐标原点 ) 出发,当 F时, +x 向走一步;当 F<0 时,y 向走一步。
特点:每一步都需计算偏差,这样的计算比较麻烦。
递推的方法计算偏差:每走一步后新的加工点的偏差用前一点的加工偏差递推出来。
采用递推方法,必须知道开始加工点的偏差,而开始加工点正是直线的起点,故。
下面推导其递推公式。
设在加工点 P( ) 处,,则应沿 +x 方向进给一步,此时新加工点的坐标值为新加工点的偏差为即若在加工点 P( ) 处,,则应沿 +y 方向进给一步,此时新加工点的坐标值为,新加工点的偏差为即综上所述,逐点比较法直线插补每走一步都要完成四个步骤 ( 节拍 ) ,即:(1) 位置判别根据偏差值大于零、等于零、小于零确定当前加工点的位置。
电子教案教学程序教学容及教学双边活动与教学方法导入新课讲授探究总结在刀具按要求轨迹运动加工零件轮廓的过程中,不断比较刀具与被加工零件轮廓之间的相对位置,并根据比较结果决定下一步的进给方向,使刀具向减小误差的方向进给。
其算法最大偏差不会超过一个脉冲当量δ。
§1.4 逐点比较法——直线插补一、概述初称区域判别法,又称代数运算法或醉步式近似法。
这种方法应用广泛,能实现平面直线、圆弧、二次曲线插补,精度高。
每进给一步需要四个节拍:(1)偏差判别:判别加工点对规定图形的偏离位置,决定拖板进给的走向。
(2)坐标进给:控制某个坐标工作台进给一步,向规定的图形靠拢,缩小偏差。
(3)偏差计算:计算新的加工点对规定图形的偏差,作为下一步判别的依据。
(4)终点判断:判断是否到达终点。
若到达则停止插补,若没,再回到第一节拍。
介绍讲授图示分析讲授法理解记忆教学程序教学容及教学双边活动与教学方法新课讲授探究总结二、直线插补1.偏差计算公式如图所示第一象限直线OA,起点O为坐标原点,编程时,给出直线的终点坐标A ,直线方程为:●偏差判别:(1)动点m在直线上:(2)动点m在直线上方:(3)动点m在直线下方:偏差判别函数●坐标进给(1)动点m在直线上:,可沿+⊿x轴方向,也可沿+⊿y方向;(2)动点m在直线上方:,沿+⊿x方向;(3)动点m在直线下方:,沿+⊿y方向。
举例板图分析总结e e(,)x ymF<mF≥mF=教学程序教学容及教学双边活动与教学方法探究总结例题讲授例题讲授●新偏差计算+⊿x轴方向进给+⊿y轴方向进给●终点比较用Xe +Ye 作为计数器,每走一步对计数器进行减1计算,直到计数器为零为止。
2.终点判别法分别计数法双向计数法单向计数法3.插补运算过程插补计算时,每走一步,都要进行以下4个步骤(又称4个节拍)的算术运算或逻辑判断:方向判定:根据偏差值判定进给方向。
坐标进给:根据判定的方向,向该坐标方向发一进给脉冲。
DDA法汇编语言四个象限直线插补DDA法汇编语言四个象限直线插补程序流程图如图所示。
四个象限直线插补程序流程图#include <graphics.h>#include <stdlib.h>#include <stdio.h>#include <conio.h>#include <math.h>int xe,ye,jvx,jvy,jrx,jry,xi,yi,jsh,lxy;/* xe、ye终点坐标jvx、jvy被积函数,jrx、jry余数寄存器xi、yi动点坐标,jsh计数长度, ,lxy象限号*/void zxcb1(); //声明第一象限直线插补函数void zxcb2(); //声明第2象限直线插补函数void zxcb3(); //声明第3象限直线插补函数void zxcb4(); //声明第4象限直线插补函数void main() //主函数{ int gd=DETECT,gm; //显示模式变量again: clrscr(); //清屏printf("L1_L4: Please input xe,ye:"); //提示输入终点坐标scanf("%d,%d",&xe,&ye); //等待输入if(xe==0&&ye==0){ printf("input error,enter any continue.");getch();goto again;} //输入错误继续输入if(xe==0&&ye>0)lxy=2; //终点为第2象限if(xe==0&&ye<0)lxy=4; //终点为第4象限if(ye==0&&xe>0)lxy=1; //终点为第一象限if(ye==0&&xe<0)lxy=3; //终点为第3象限if(xe>0&&ye>0)lxy=1; //终点为第一象限if(xe>0&&ye<0)lxy=4; //终点为第4象限if(xe<0&&ye>0)lxy=2; //终点为第2象限if(xe<0&&ye<0)lxy=3; //终点为第3象限xi=320;yi=240; //动点置屏幕中间initgraph(&gd,&gm,""); //图形显示方式jsh=0;jrx=0;jry=0;jvx=abs(xe);jvy=abs(ye);switch(lxy){ case 1: zxcb1();break; //第一象限调用插补程序函数1 case 2: zxcb2();break; //第一象限调用插补程序函数2 case 3: zxcb3();break; //第一象限调用插补程序函数3 case 4: zxcb4();break; //第一象限调用插补程序函数4 }gotoxy(10,24);printf("L%d: xe=%d,ye=%d",lxy,xe,ye); //显示终点坐标 gotoxy(10,25);printf("press any key:"); //提示按任意键 getch(); //等待按键}void zxcb1() //第一象限插补函数1{asm mov cx, xi //显示起点asm mov dx, yiasm mov ah, 0chasm mov al, 2asm int 10hagain: asm mov ax, jvx //X方向积分asm add jrx, axasm jnc next1 //无进位下asm inc xi //下正X方向进给next1: asm mov ax, jvy //Y方向积分asm add jry, axasm jnc next2 //无进位下转asm dec yi //正Y进给next2: asm mov cx, xi //显示动点asm mov dx, yiasm mov ah, 0chasm mov al, 2asm mov dx, 0100h //延时next2a: asm mov cx, 00ffhnext2b: asm dec cxasm jnz next2basm dec dxasm jnz next2aasm inc jsh //计数长度加1asm jnz again //未到终点继续}void zxcb2() //第2象限插补函数1 {asm mov cx, xi //显示起点asm mov dx, yiasm mov ah, 0chasm mov al, 2asm int 10hagain: asm mov ax, jvx //X方向积分asm add jrx, axasm jnc next1 //无进位下asm dec xi //下负X方向进给next1: asm mov ax, jvy //Y方向积分asm add jry, axasm jnc next2 //无进位下转asm dec yi //正Y进给next2: asm mov cx, xi //显示动点asm mov dx, yiasm mov ah, 0chasm mov al, 2asm int 10hasm mov dx, 0100h //延时next2a: asm mov cx, 00ffhnext2b: asm dec cxasm jnz next2basm dec dxasm jnz next2aasm inc jsh //计数长度加1asm jnz again //未到终点继续}void zxcb3() //第3象限插补函数1 {asm mov cx, xi //显示起点asm mov dx, yiasm mov ah, 0chasm int 10hagain: asm mov ax, jvx //X方向积分asm add jrx, axasm jnc next1 //无进位下asm dec xi //下负X方向进给next1: asm mov ax, jvy //Y方向积分asm add jry, axasm jnc next2 //无进位下转asm inc yi //负Y进给next2: asm mov cx, xi //显示动点asm mov dx, yiasm mov ah, 0chasm mov al, 2asm int 10hasm mov dx, 0100h //延时next2a: asm mov cx, 00ffhnext2b: asm dec cxasm jnz next2basm dec dxasm jnz next2aasm inc jsh //计数长度加1asm jnz again //未到终点继续}void zxcb4() //第一象限插补函数1 {asm mov cx, xi //显示起点asm mov dx, yiasm mov ah, 0chasm mov al, 2asm int 10hagain: asm mov ax, jvx //X方向积分asm add jrx, axasm jnc next1 //无进位下asm inc xi //下正X方向进给next1: asm mov ax, jvy //Y方向积分asm add jry, axasm jnc next2 //无进位下转asm inc yi //负Y进给next2: asm mov cx, xi //显示动点asm mov dx, yiasm mov ah, 0chasm mov al, 2asm int 10hasm mov dx, 0100h //延时next2a: asm mov cx, 00ffhnext2b: asm dec cxasm jnz next2basm dec dxasm jnz next2aasm inc jsh //计数长度加1 asm jnz again //未到终点继续}。
数控原理与系统课程设计课题名称:数字积分插补法直线插补专业:班级:姓名:指导老师:数控原理与系统课程设计任务书班级姓名学号课程设计的目的1)了解连续轨迹控制数控系统的组成原理。
2) 掌握数字积分插补的基本原理。
3)掌握数字积分插补的软件实现方法。
二、课程设计的任务数字积分法又称数字微分分析法DDA(Digital Differential Analyzer)。
数字积分法具有运算速度快、脉冲分配均匀、易于实现多坐标联动及描绘平面各种函数曲线的特点,应用比较广泛。
其缺点是速度调节不便,插补精度需要采取一定措施才能满足要求。
由于计算机有较强的计算功能和灵活性,采用软件插补时,上述缺点易于克服。
本次课程设计具体要求如下:1)数字积分插补法基本原理2)数字积分插补法插补软件流程图3)算法描述(逐点比较法算法在VB中的具体实现)4)编写算法程序清单5)软件运行仿真效果二、课程设计报告要求1)按课程设计任务5点要求为标题,编写课程设计报告,最后加一点:此次课程设计小结(包括设计过程中所碰到的问题、解决办法以及有关设计体会等)。
2)字数在3000字左右。
3)仿真软件一份。
三、学生分组学 生 姓 名数控原理与系统课程设计说明书一、数字积分法直线插补的基本原理数字积分法是利用数字积分的方法,计算刀具沿各坐标轴的位移,使得刀具沿着所加工的轮廓曲线运动利用数字积分原理构成的插补装置称为数字积分器,又称数字微分分析器(Digital Differential Analyzer ),简称DDA 。
数字积分器插补的最大优点在于容易实现多坐标轴的联动插补、能够描述空间直线及平面各种函数曲线等。
因此,数字积分法插补在轮廓数控系统中得到广泛的应用。
从几何角度来看,积分运算就是求出函数Y = f (t )曲线与横轴所围成的面积,从t =t 0到t n 时刻,函数Y= f (t )的积分值可表述为⎰⎰==n n tt t t dt )t (Ydt S 00f如果进一步将t ∈[t 0,t n ]的时间区划分为若干个等间隔Δt 的小区间,当Δt 足够小时,函数Y 的积分可用下式近似表示t Y Ydt S n i i tt n ∆∑⎰-=≈=1在几何上就是用一系列的小矩形面积之和来近似表示函数f (t )以下的积分面积。
直线插补与圆弧插补程序设计一.直线插补1.直线插补程序流程图直线插补程序流程图2.直线插补程序设计#include <stdio.h>#include <graphics.h>#include <stdlib.h>void cb_line(int x1, int y1, int x2, int y2) {int dx, dy, n, k, i, f;int x, y;dx = abs(x2-x1);dy = abs(y2-y1);n = dx + dy;if (x2 >= x1) {k = y2 >= y1 ? 1: 4;x = x1;y = y1;} else {k = y2 >= y1 ? 2: 3;x = x2;y = y2;}putpixel(x, y, 1);for (i = 0, f = 0; i < n; i++)if (f >= 0)switch (k) {case 1:putpixel(x++, y, 1);f -= dy;break;case 2:putpixel(x, y++, 1);f -= dx;break;case 3:putpixel(x--, y, 1);f -= dy;break;case 4:putpixel(x, y--, 1);f -= dx;break;}elseswitch (k) {case 1:putpixel(x, y++, 1);f += dx;break;case 2:putpixel(x--, y, 1);f += dy;break;case 3:putpixel(x, y--, 1);f += dx;break;case 4:putpixel(x++, y, 1);f += dy;break;}}int main(){cb_line(0,0,15,20); /* <--- you forgot ; here */return 0;}二.圆弧插补2.1.四象限圆弧插补程序流程图2.1四象限圆弧插补程序设计#include <stdio.h>#include <math.h>int ArcXY(double dfx0,double dfy0,double dfrx, double dfry,int angle); int symbol(double number);main(){ArcXY(0,0,-3,5,360);getch();}int ArcXY(double dfx0,double dfy0,double dfrx, double dfry,int angle) {FILE *f1;double i,j,dx,dy,dfr,x,y,ang,step,f = 0.01;int flag,tempx,tempy,statex,statey,direction = 1;dfr = sqrt((dfrx - dfx0) * (dfrx - dfx0) + (dfry - dfy0) * (dfry - dfy0));if(dfx0 == 0){dfx0 = 1;dfrx = dfrx + 1;statex =1;}if(dfy0 == 0){dfy0 = 1;dfry = dfry + 1;statey =1;}dfrx = 2 * dfx0 - dfrx;i = dfx0 - dfrx;j = dfy0 - dfry;x = dfx0 ;y = dfy0 ;step = ang = 180 * 2 * asin(f/(2*dfr))/3.1415926;if(((dfx0 > 0) && (dfy0 > 0)) || ((dfx0 < 0) && (dfy0 < 0))){flag = direction;}if(((dfx0 < 0) && (dfy0 > 0)) || ((dfx0 > 0) && (dfy0 < 0))) {flag = -direction;}f1=fopen("c:\\c.txt","w+");if(statex ==1){x = x - 1;}if(statey ==1){y = y - 1;}fprintf(f1,"%f,",x);fprintf(f1,"%f\n",y);while(ang < angle){dx = f * (j + flag*(f * i)/(2 * dfr))/dfr;dy = f * (i - flag*(f * j)/(2 * dfr))/dfr;tempx = symbol(x);tempy = symbol(y);x = x + dx;y = y + dy;fprintf(f1,"%f,",x);fprintf(f1,"%f\n",y);if( (tempx !=symbol(x)) || (tempy != symbol(y)) ){flag = -flag;}i = i - dx;j = j + dy;ang = ang + step;}return 0;}int symbol(double number) {if(number > 0){return 1;}else{return -1;}}。
PLC 插补程序设计3.2.3.2逐点比较法直线插补根据以前学过的知识可知,偏差计算是逐点比较法关键的一步,下面以第一象限直线为例导出偏差的计算公式。
如图所示,假定直线OA 的起点为坐 标原点,终点A 的坐标为(x e , y e ) ,P (x i ,y i )为加工点,如 P 点正好处于OA 的直线上那么下式 成立:xyx eei=y i即x e y i - x i y e =0若任意点P (x i ,y i )在直线OA 的上方(严格地说在直线OA 与y 轴所成的夹角区域内),那么有下述关系成立;xyx eei>y i即x e y i -x i y e >0若任意点P (x i ,y i )在直线OA 的下方(严格的说,在直线OA 与x 轴的所成的夹角区域内),那么有下述关系成立;xyx eei<y i亦即x e y i - x i y e <0 由此可以得偏差判别函数F i,i 为F i,i = x e y i - x i y e由F i,i 的数值(称为 “偏差” )就可以判别出P 点相对的位置,即:当Fi,i =0时,点P(xi,yi)正好落在直线上;当Fi,i >点P(xi,yi)落在直线的上方;当Fi,i <点P(xi,yi)落在直线的下方。
若Fi,i ≥0时,则向+x轴发一个脉冲,刀具从(xi,yi)点向x方向前进一步,到达新加工点P(xi+1,yi),xi+1=xi+1,因此新加工点P(xi+1,yi)的偏差值为:Fi+1,i=xeyi-xi+1ye=xeyi-(xi+1)ye=xeyi-xiye-ye=Fi-yeFi+1,i=Fi,i-ye(3-1)如果在某一时刻,加工点P(xi ,yi)的Fi,i<0 ,则向+y轴发出一个进给脉冲,具从这一点向y方向前进一步,新加工点P(xi ,yi+1)的偏差值为:即Fi,i+1=xeyj+1-xiye=xe(yj+1)-xiye=xe yi-xeye+xe=Fi,i+xeFi,i+1=Fi,i+xe(3-2)根据式2-1 和2-2可以看出,新加工点的偏差完全可以用前一加工点的偏差递推出来。
直线插补与圆弧插补程序设计一.直线插补
1.直线插补程序流程图
直线插补程序设计:
#include"stdio.h"
#include"math.h"
void CHABU1 (int F,int n,int Y,int X) /*第一象限调用函数*/
{
int nx=0,ny=0;
for(;n>0; n--)
{
printf("运算前:F=%d ",F);
i f(F>=0)
{
printf("需走步数:
n=%d\n",n);
printf("------向
+xe方向走一步 ");
F=F-Y;
printf("F=%d
",F);
printf("+X\n");
nx++; /*X方向走的总步数*/
}
e lse
{
printf("需走步数:
n=%d\n",n);
printf("------向
+ye方向走一步 ");
F=F+X;
printf("F=%d
",F);
printf("+Y\n");
ny++; /*y方向走的总步数*/
}
}
printf("nx=%d,ny=%d\n",nx,ny);
void CHABU2(int F,int n,int Y,int X) /*第二象限调用函数*/
{
int nx=0,ny=0;
for(;n>0; n--)
{
printf("运算前:F=%d ",F);
if(F>=0)
{
printf("需走步数:
n=%d\n",n);
printf("------向-xe方向走一步 ");
F=F-Y;
printf("F=%d ",F);
printf("-X\n");
nx++; /*X方向走的总步数*/
}
else
{
printf("需走步数:n=%d\n",n);
printf("------向+ye方向走一步 ");
F=F+X;
printf("F=%d ",F);
printf("+Y\n");
ny++; /*y方向走的总步数*/
}
}
printf("nx=%d,ny=%d\n",nx,ny);
}
void CHABU3(int F,int n,int Y,int X) /*第三象限调用函数*/
{
int nx=0,ny=0;
for(;n>0; n--)
{
printf("运算前:F=%d ",F);
if(F>=0)
{
printf("需走步数:n=%d\n",n);
printf("------向-xe方向走一步 ");
F=F-Y;
printf("F=%d ",F);
printf("-X\n");
nx++; /*X方向走的总步数*/
}
else
{
printf("需走步数:n=%d\n",n);
printf("------向-ye方向走一步 ");
F=F+X;
printf("F=%d ",F);
printf("-Y\n");
ny++; /*y方向走的总步数*/
}
}
printf("nx=%d,ny=%d\n",nx,ny);
}
void CHABU4(int F,int n,int Y,int X) /*第四象限调用函数*/
{
int nx=0,ny=0;
for(;n>0; n--)
{
printf("运算前:F=%d ",F);
if(F>=0)
{
printf("需走步数:
n=%d\n",n);
printf("------向+xe方向走一步 ");
F=F-Y;
printf("F=%d ",F);
printf("+X\n");
nx++; /*X方向走的总步数*/
}
else
{
printf("需走步数:n=%d\n",n);
printf("------向-ye方向走一步 ");
F=F+X;
printf("F=%d ",F);
printf("-Y\n");
ny++; /*y方向走的总步数*/
}
}
printf("nx=%d,ny=%d\n",nx,ny);
}
main()
{
int F=0,X=0,Y=0,n,xe,ye,x0,y0,ny,nx;
void CHABU1 (int,int,int,int);/*函数声明*/
void CHABU2(int,int,int,int);
void CHABU3(int,int,int,int);
void CHABU4(int,int,int,int);/*函数声明*/
printf("输入相关数据\n");
printf("x0=");
scanf("%d",&x0);
printf("xe=");
scanf("%d",&xe);
printf("y0=");
scanf("%d",&y0);
printf("ye=");
scanf("%d",&ye);
X=abs(xe-x0); /*取绝对值*/
Y=abs(ye-y0); /*取绝对值*/
/*printf("X=%d\n",X);验证绝对值函数*/
n=X+Y;
printf("n=%d\n",n); /*总步数*/
printf("运动结果如下:\n");
if(x0>=0&&y0>=0&&xe>=0&&ye>=0) { printf("第一象限
\n");CHABU1(F,n,Y,X);}
else if(x0<=0&&y0>=0&&xe<=0&&ye>=0) { printf("第二象限\n");CHABU2(F,n,Y,X);}
else if(x0<=0&&y0<=0&&xe<=0&&ye<=0) { printf("第三象限\n");CHABU3(F,n,Y,X);}
else if(x0>=0&&y0<=0&&xe>=0&&ye<=0) { printf("第四象限\n");CHABU4(F,n,Y,X);}
else printf("跨象限运动");
}。