0《机床数控技术及应用》课程设计说明书时间:2011年12月15日1目录一.课程设计要求…………………………………………………………………………2二.编程语言………………………………………………………………………………2三.插补界面说明…………………………………………………………………………2四.逐点比较法直线插补流程图及算法………………………………………………2五.DDA法圆弧插补插补流程图及算法………………………………………………7六.其他程序说明…………………………………………………………………………15七.心得体会………………………………………………………………………………16附录…………………………………………………………………………………………172一.课程设计要求1.直线插补要求:用逐点比较法插补第4象限的直线;2.圆弧插补要求:用DDA法插补1-4象限的顺圆弧;3.界面设计要求:具有数据输入框,具有插补过程动态显示功能,插补步长可调。二.编程语言VisualC++三.插补界面说明插补界面具有逐点比较法插补直线数据输入区,DDA法插补1-4象限顺圆弧的数据输入区,两者公用的步长输入区,图形显示区域,四个按钮实现插补过程的单步、连续显示、图形的清除,插补界面的退出,以及必要的文字说明。界面设计所用到的控件有:1个图像控件,用来显示输出图形;13个编辑框,用来输入插补直线与圆弧所必要的数据;2个单选框,用来选择直线插补和圆弧插补;4个按钮,用来控制插补、清除、退出界面;若干个静态文本,进行相应地文字说明。各控件名称及对应的关联变量名称:按钮控件1,IDC_BUTTON1,m_danbu,实现单步插补功能按钮;按钮控件2,IDC_BUTTON2,m_qingchu,实现清除功能按钮;按钮控件3,IDC_BUTTON3,m_lianxu,实现连续插补功能按钮;按钮控件4,IDC_BUTTON4,m_tuichu,实现退出界面功能按钮;单选框控件1,IDC_RADIO1,m_line,其属性选择GROUP,选择直线插补;单选框控件2,IDC_RADIO2,选择圆弧插补;编辑框控件1,IDC_EDIT1,m_alx,输入直线起点横坐标;编辑框控件2,IDC_EDIT2,m_aly,输入直线起点纵坐标;编辑框控件3,IDC_EDIT3,m_blx,输入直线终点横坐标;编辑框控件4,IDC_EDIT4,m_bly,输入直线终点纵坐标;编辑框控件5,IDC_EDIT5,m_aax,输入圆弧起点横坐标;编辑框控件6,IDC_EDIT6,m_aay,输入圆弧起点纵坐标;编辑框控件7,IDC_EDIT7,m_bax,输入圆弧终点横坐标;编辑框控件8,IDC_EDIT8,m_bay,输入圆弧终点纵坐标;编辑框控件9,IDC_EDIT9,m_ox,输入圆心横坐标;编辑框控件10,IDC_EDIT10,m_oy,输入圆心纵坐标;编辑框控件11,IDC_EDIT11,m_r,输入圆弧半径值;编辑框控件12,IDC_EDIT12,m_n,输入累加器位数;编辑框控件13,IDC_EDIT13,m_bc,输入插补步长;图形控件:IDC_PRINTAREA,实现图形输出功能;若干静态文本控件,IDC_STATIC,作为相关文字说明。四.逐点比较法直线插补流程图及算法1)偏差判别公式的推导设直线的起点坐标为(x1,y1),终点坐标为(x2,y2),直线上的任意一个动点为(x,y),插补的步长为b,则偏差判别函数F=(x2-x1)*y-(y2-y1)*x对位于第四象限的直线,有:当F=0时,向+x方向进给一个脉冲当量,此时x(i+1)=xi+b,则有F(i+1)=Fi-(y2-y1)*b3当F0时,向-y方向进给一个脉冲当量,此时y(j+1)=yj-b,则有F(j+1)=Fj+(x2-x1)*b终点判别器E用来判别脉冲次数,每进给一次E减1,直到其值为0时插补过程结束,E值由下面公式所得:E=((x2-x1)+(y1-y2))/b2)直线插补流程图:YYE=0输入x1,y1,x2,y2,b开始F=0初始化:E=(x2-x1)+(y1-y2),F=0,x=x1,y=y1+X方向走一步F=F-b*(y2-y1),x=x+b-Y方向走一步x1=0,y1=0,x20,y20NYNF=F+b*(x2-x1),y=y-bE=E-1N输出直线不在第四象限结束43)单步插补直线实现程序及变量说明定义静态变量static,变量类型为double型,在每次单击按钮控件执行程序后,该变量的值始终存在可以实现对插补次数的计算和判别。staticdoubleNX=0,NY=0,N=0,m,x,y,F=0;NX为+x方向的进给次数累加,用于横坐标计算;NY为-y方向进给次数累加,用于纵坐标计算;N为x,y两个方向的累加次数,用于和终点判别器比较;m为终点判别器,用来判断插补是否结束;x,y用来存放插补过程中动点坐标;F为偏差判别函数。在插补程序中使用的变量名与流程图中变量的对应关系为:m_alx对应x1,m_aly对应y1,m_blx对应x2,m_bly对应y2,m_bc对应b,m对应E。变量赋的初值为:m_line=0,m_alx=0.0,m_aly=0.0,m_blx=4.0,m_bly=-4.0,m_bc=1.0。插补程序中的一些说明:因为输出的图形坐标数值为像素点,在图形中显示很小,所以在下述的程序中将输出的数值扩大10倍,可以在图形控件上更清晰地显示图形,其值本身并不具有实际的意义。利用UpdateData(true)函数实现获取输入的参数值。设置图形显示区域:CStatic*pWnd=(CStatic*)GetDlgItem(IDC_PRINTAREA);CDC*pdc=pWnd-GetDC();CRectrc;pWnd-GetClientRect(&rc);CRgnrgn;rgn.CreateRectRgn(rc.left+1,rc.top+7,rc.right-2,rc.bottom-2);pdc-SelectClipRgn(&rgn);pdc-SetViewportOrg((rc.left+rc.right)/2,rc.bottom-150);在图形控件上画坐标轴:pdc-MoveTo(-150,0);pdc-LineTo(150,0);pdc-MoveTo(0,-150);pdc-LineTo(0,150);在图形控件上输出原点、x轴、y轴符号:pdc-TextOut(-10,-20,o);pdc-TextOut(150,0,x);pdc-TextOut(-5,-150,y);单步直线插补程序:if(m_line==0)//选择直线插补{pdc-MoveTo(10*m_alx,-10*m_aly);//画出需要插补的直线pdc-LineTo(10*m_blx,-10*m_bly);if((m_alxm_blx)&&(m_alym_bly)&&(m_alx=0)&&(m_aly=0))//判别输入的直线在第4象限,如果不在,结束程序并提示输入第4象限的直线{x=10*m_alx+10*NX*m_bc;//计算动态坐标y=-10*m_aly+10*NY*m_bc;5m=((abs(m_blx)-abs(m_alx))+(abs(m_bly)-abs(m_aly)))/(m_bc)-N;//终点判别器计算if(m0)//终点判别器不为0,执行插补,否则结束{if(F=0)//偏差判别函数大于0,x方向进给{NX=NX+1;//+x方向进给一次N=N+1;//进给次数累加器加1pdc-MoveTo(x,y);//将坐标移到直线起点x=x+10*m_bc;//计算横坐标pdc-SelectObject(newCPen(PS_SOLID,0,RGB(255,0,0)));//改变插补线段的颜色,此处选择红色pdc-LineTo(x,y);//画直线F=F-m_bc*(abs(m_bly)-abs(m_aly));//重新计算偏差判别函数,并结束判断}else//偏差判别函数小于0,y方向进给{NY=NY+1;//-y方向进给一次N=N+1;//进给次数累加器加1pdc-MoveTo(x,y);//将坐标移到直线起点y=y+10*m_bc;//计算纵坐标pdc-SelectObject(newCPen(PS_SOLID,0,RGB(255,0,0)));//改变插补线段的颜色,此处选择红色pdc-LineTo(x,y);//画直线F=F+m_bc*(abs(m_blx)-abs(m_alx));//重新计算偏差判别函数,并结束判断}/*此段函数用于连续插补m=m-1;//终点判别器减1if(m==0)//如果终点判别器为0,关闭定时器1,连续插补结束{KillTimer(1);}/*此段函数用于连续插补}}else//提示输入的直线不在给定的象限AfxMessageBox(请输入位于第四象限的点);}4)连续插补直线的实现方案1:通过定时器实现逐段显示插补轨迹voidCMyDlg::OnButton3(){SetTimer(1,500,NULL);//选择定时器1,定时时间500ms;6}voidCMyDlg::OnTimer(UINTnIDEvent)//定时器1函数,调用OnButton1()函数,定时器关闭如上所述{OnButton1();}方案2:通过循环体,一次实现插补轨迹的显示程序各行的含义同单步插补程序if(m_line==0){pdc-MoveTo(10*m_alx,-10*m_aly);pdc-LineTo(10*m_blx,-10*m_bly);if((m_alxm_blx)&&(m_alym_bly)&&(m_alx=0)&&(m_aly=0)){x=10*m_alx+10*NX*m_bc;y=-10*m_aly+10*NY*m_bc;m=((abs(m_blx)-abs(m_alx))+(abs(m_bly)-abs(m_aly)))/(m_bc)-N;pdc-MoveTo(x,y);while(m0)//通过while循环一次实现插补轨迹显示{if(F=0){F=F-m_bc*(abs(m_bly)-abs(m_aly));x=x+10*m_bc;}else{F=F+m_bc*(abs(m_blx)-abs(m_alx));y=y+10*m_bc;}pdc-LineTo(x,y);m=m-1;}AfxMessageBox(连续插补结束);}7五.DDA法圆弧插补插补流程图及算法1)圆弧插补示意图插补1-4象限的顺圆,要分成两段圆弧来实现,分别为第1象限顺圆弧和第4象限顺圆弧。圆弧插补通过半加载实现,即积分累加器Jrx,Jry中存放寄存器最大容量的一半。假设圆弧起点坐标(x1,y1),终点坐标(x2,y2),根据DDA法插补圆弧的要求,x轴被积函数寄存器Jvx存放y1,y轴被积函数寄存器Jvy存放x1。DDA法插补第1象限顺圆插补器示意图:DDA法插补第4象限顺圆插补器示意图:2)圆弧插补流程图控制脉冲x轴被积函数寄存器Jvx(y1)x轴积分累加器Jrx+y轴被积函数寄存器Jvy(x1)y轴积分累加器Jry++-x轴正向进给y轴负向进给控制脉冲x轴被积函数寄存器Jvx(y1)x轴积分累加器Jrx+y轴被积函数寄存器Jvy(x1)y轴积分累加器Jry+-+x轴负向进给y轴负向进给8流程图中变量说明:静态变量:r1=(x1-x0)^2+(y1-y0)^2r2=(x2-x0)^2+(y2-y0)^2,T=1r1=r^2r2=r1Ym=m-Tx-Ty-T1x-T1yx1=0,y1=0,x2=0,y2=0X=X-M;Ex=Ex-1;Tx=Tx+1;x=x+b;n=n-1;m=m-1;n0N各变量初始化T0Ex=(r+x0-x1)/b;Ey=y1/b;n