逐点比较法插补VC程序设计.docx
- 文档编号:12253036
- 上传时间:2023-04-17
- 格式:DOCX
- 页数:17
- 大小:192.18KB
逐点比较法插补VC程序设计.docx
《逐点比较法插补VC程序设计.docx》由会员分享,可在线阅读,更多相关《逐点比较法插补VC程序设计.docx(17页珍藏版)》请在冰豆网上搜索。
逐点比较法插补VC程序设计
逐点比较法插补原理VC程序设计
一背景
数控机床在加工曲线时,用折线逼近所要加工的曲线。
而确定刀具或绘图笔的过程就称为插补,数控系统中完成插补工作的部分装置称为插补器。
常用的脉冲增量插补方法是逐点比较法。
所谓逐点比较法插补,就是刀具或绘图笔每走一步都要和给定轨迹上的坐标一步的进给方向。
如果原来在给定轨迹的下方,下一步就向给定轨迹的上方走,如果原来在给定轨迹的里面,下一步就向给定轨迹的外面走……如此,走一步,看一看,比较一次,决定下一步走向,以便逼近给定轨迹,即形成逐点比较插补。
逐点比较法是以阶梯折线来逼近直线或者圆弧等曲线的,它与规定的加工直线或圆弧之间的最大误差为一个脉冲当量,因此只要把脉冲当量(第走一步的距离即步长)取得足够小,就可达到加工精度的要求。
二原理与算法
(一)逐点比较法直线插补
不同象限直线插补的偏差符号及坐标进给方向如图1所示。
图1偏差符号与进给方向的关系
由图1可以推导得出,4个象限直线插补的偏差计算公式和坐标进给方向,详见表1,该表中4个象限的终点坐标值取绝对值代入计算式中的
和
。
表1直线插补的进给方向及偏差计算公式
所在象限
进给方向
偏差计算
所在象限
进给方向
偏差计算
一、四
一、二
二、三
三、四
在计算机内存中开辟6个单元XE、YE、NXY、FM、XOY和ZF,分别存放终点横坐标
、终点纵坐标
、总步数
、加工点偏差
、直线所在象限值
和走步方向标志。
这里,
,
等于1、2、3、4分别代表第一、第二、第三、第四象限,
的值可由终点坐标的正、负符号来确定,
的初值为0,ZF=1、2、3、4分别代表
走步方向。
程序流程如图2所示。
图2直线插补程序流程图
(二)逐点比较法圆弧插补
各象限圆弧插补的偏差符号与进给方向如图3所示,用SR和NR分别表示顺圆弧和逆圆弧,并且用SR1、SR2、SR3、SR4和NR1、NR2、NR3、NR48种圆弧分别表示第一至第四象限的顺圆弧和逆圆弧。
图34个象限圆弧插补的对称关系
在计算机内存中开辟8个单元X0、Y0、NXY、FM、RNS、XM、YM和ZF,分别存放起点的横坐标
、起点的纵坐标
、总步数
、加工点偏差
、圆弧种类值RNS、
、
和走步方向标志。
这里
,RNS等于1、2、3、4和5、6、7、8分别代表SR1、SR2、SR3、SR4和NR1、NR2、NR3、NR4,RNS的值可由起点和终点的坐标的正、负符号来确定,
的初值为0,
和
的初值为
和
,ZF=1、2、3、4分别表示
走步方向。
程序流程图如图4所示。
图44象限圆弧插补程序流程图
三程序设计
开发环境:
VisualStudio2010,Windows8
建立的项目:
VC++MFCApplicationSingleDocument
(一)全局变量
intAXIS=600:
坐标轴半轴长像素数(映射到真实长度600*0.1mm=6cm)
intAXIS_SCALE:
坐标轴最大刻度,通过菜单项修改
intS_LEN:
单位长度像素数(=AXIS/AXIS_SCALE)
intsx,sy:
直线插补用到的平移系数
(二)对话框
设置4个Edit框,连接变量m_x1、m_y1、m_x2、m_y2用于存储输入的坐标值。
默认值:
m_x1=10,m_y1=0,m_x2=0,m_y2=10。
(三)菜单
Caption
ID
Function
建立坐标系
坐标系样式
标准大小(20*20)
ID_AXES_O
OnAxesO()
样式1(15*15)
ID_AXES_A
OnAxesA()
样式2(12*12)
ID_AXES_B
OnAxesB()
样式3(10*10)
ID_AXES_C
OnAxesC()
样式4(30*30)
ID_AXES_H
OnAxesH()
样式5(50*50)
ID_AXES_I
OnAxesI()
样式6(60*60)
ID_AXES_J
OnAxesJ()
清空
ID_EDIT_CLC
OnEditClc()
插补类型
直线插补
ID_EDIT_LINE
OnEditLine()
圆弧插补
ID_EDIT_ROUND
OnEditRound()
说明:
同时创建了三个右键菜单与“清空”、“直线插补”、“圆弧插补”同ID。
(四)部分代码
//绘制坐标系
voidCChabuDrawView:
:
DrawAxes(void)
{
CClientDCpDC(this);
//窗口映射,单位像素长度为0.1mm,坐标轴x向右为正,y轴向上为正
pDC.SetMapMode(MM_LOMETRIC);
CRectRecto;
GetClientRect(&Recto);
pDC.SetViewportOrg(Recto.Width()/2,Recto.Height()/2);
//绘制坐标轴
pDC.MoveTo(-AXIS,0);
pDC.LineTo(AXIS,0);
pDC.MoveTo(0,-AXIS);
pDC.LineTo(0,AXIS);
//绘制网格线
for(inti=-AXIS;i<=AXIS;i+=S_LEN)
{
if(i)
{
pDC.MoveTo(i,-AXIS);
pDC.LineTo(i,AXIS);
pDC.MoveTo(-AXIS,i);
pDC.LineTo(AXIS,i);
}
}
//标注坐标
CStringstr;
str.Format(_T("%d"),0);
pDC.TextOutW(-8,15,str);
str.Format(_T("%d"),-AXIS_SCALE);
pDC.TextOutW(-AXIS-30,15,str);
pDC.TextOutW(-25,-AXIS+15,str);
str.Format(_T("%d"),AXIS_SCALE);
pDC.TextOutW(AXIS-15,15,str);
pDC.TextOutW(-15,AXIS+15,str);
}
//画“点”函数(走步控制程序)
voidCChabuDrawView:
:
DrawPoint(intx,inty)
{
inthalf_s_len=S_LEN/2;
//坐标变换
x=x*S_LEN;
y=y*S_LEN;
intx1=x-half_s_len;
inty1=y+half_s_len;
intx2=x+half_s_len;
inty2=y-half_s_len;
x1+=sx*S_LEN;
x2+=sx*S_LEN;
y1+=sy*S_LEN;
y2+=sy*S_LEN;
//绘制矩形
CBrushbrush;
brush.CreateSolidBrush(RGB(255,0,255));
CPenpen;
pen.CreatePen(PS_SOLID,1,RGB(255,0,255));
CClientDCdc(this);
dc.SelectObject(&pen);
dc.SelectObject(&brush);
dc.SetMapMode(MM_LOMETRIC);
CRectRecto;
GetClientRect(&Recto);
dc.SetViewportOrg(Recto.Width()/2,Recto.Height()/2);
dc.Rectangle(x1,y1,x2,y2);
}
//通过坐标平移实现任意两点间直线绘制
voidCChabuDrawView:
:
cb_line(intx1,inty1,intx2,inty2)
{
sx=x1;
sy=y1;
cb_line_std(x2-sx,y2-sy);
sx=0;
sy=0;
}
//以原点为起点画线
voidCChabuDrawView:
:
cb_line_std(intxo,intyo)
{
intfm=0,xe=abs(xo),ye=abs(yo),xoy;
intx=0,y=0;
DrawPoint(x,y);
intnxy=abs(xo)+abs(yo);
//判断象限
if(xo>=0)
xoy=yo>0?
1:
4;
else
xoy=yo>0?
2:
3;
//通过绘制方形模拟刀具进给
for(inti=nxy;nxy>0;nxy--)
{
if(fm>=0)
{
fm-=ye;
if(xoy==1||xoy==4)
DrawPoint(++x,y);
else
DrawPoint(--x,y);
}
else
{
fm+=xe;
if(xoy==1||xoy==2)
DrawPoint(x,++y);
else
DrawPoint(x,--y);
}
}
}
//画圆
voidCChabuDrawView:
:
cb_round_std(intx1,inty1,intx2,inty2)
{
sx=0;sy=0;
intfm=0,xm=abs(x1),ym=abs(y1),rns;
intnxy=abs(x2-x1)+abs(y2-y1);
intx=x1,y=y1;
DrawPoint(x,y);
//判断圆弧类型
if(x2>x1)
{
if(x1>=0)
rns=y1>y2?
1:
8;
elseif(x2<=0)
rns=y1>y2?
7:
2;
else
{
MessageBox(_T("此功能正在学习中!
"));
return;
}
}
elseif(x2 { if(x1<=0) rns=y1>y2? 6: 3; elseif(x2>=0) rns=y1>y2? 4: 5; else { MessageBox(_T("此功能正在学习中! ")); return; } } else { MessageBox(_T("此功能正在学习中! ")); return; } //进给 for(inti=nxy;i>0;i--) { if(rns==1||rns==3||rns==6||rns==8) { if(fm>=0) { fm=fm-2*ym+1; ym--; if(rns==1||rns==6) DrawPoint(x,--y); else DrawPoint(x,++y); } else { fm=fm+2*xm+1; xm++; if(rns==1||rns==8) DrawPoint(++x,y); else DrawPoint(--x,y); } } else { if(fm>=0) { fm=fm-2*xm+1; xm--; if(rns==2||rns==7) DrawPoint(++x,y); else DrawPoint(--x,y); } else { fm=fm+2*ym+1; ym++; if(rns==2||rns==5) DrawPoint(x,++y); else DrawPoint(x,--y); } } } } 四测试与结果 第一步,运行程序。 第二步,建立坐标系 第三步,直线插补 圆弧插补
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 比较法 VC 程序设计
![提示](https://static.bdocx.com/images/bang_tan.gif)