VB软件 模拟逐点比较法逆圆弧插补的程序设计
逐点比较算法圆弧插补
XXX学院学生课程设计(论文)题目:逐点比较法圆弧插补的连续轨迹控制设计学生姓名: XXX 学号:2006XXXXXXXX 所在院(系):机电工程学院专业:机械设计制造及其自动化班级: 06机制6班指导教师: XXX 职称:教授2009年12月8 日XXX学院本科学生课程设计任务书题目逐点比较法插补的连续轨迹控制设计(圆弧插补)1、课程设计的目的专业课程综合训练目的是本使学生通过对所学主要专业课的综合应用,基本掌握一般机电控制系统的设计方法及步骤。
综合运用所学的基础知识和技能,进一步提高学生的设计能力,培养学生创新意识和创新能力,提高控制系统分析设计的总体意识和工程实践能力。
2、课程设计的内容和要求(包括原始数据、技术要求、工作要求等)设计内容要求:(1)铣床CNC系统硬件原理图及其说明;(2)推导完整的插补公式;(3)设计出插补软件流程图;(4)用高级语言编写插补程序清单;(4)画出插补轨迹模拟图形;(5)将上述内容整理成设计说明书及图纸。
设计结束后提交4000字左右的课程设计论文;包含上述全部内容。
3、主要参考文献[1]、张建民等,《机电一体化系统设计》,北京:高等教育出版社,2002年[2]、赵先仲,《机电系统设计》,北京:机械工业出版社,2004年[3]、吴圣庄,《金属切削机床概论》,北京:机械工业出版社,1993[4]、杨有君,《数控技术》,北京:机械工业出版社,20054、课程设计工作进度计划内容学时总体方案设计8CNC系统硬件设计8插补系统原理及公式设计16插补系统软件设计48软件验证 4绘制所需的各类图及编制技术文件20合计3周指导教师(签字)日期2008年12 月1 日教研室意见:年月日学生(签字):接受任务时间:年月日注:任务书由指导教师填写。
课程设计(论文)指导教师成绩评定表题目名称评分项目分值得分评价内涵工作表现20% 01 学习态度 6 遵守各项纪律,工作刻苦努力,具有良好的科学工作态度。
实验一 逐点比较法圆弧和直线插补实验
Y B(xe,ye)
M(xm,ym)
Rm R
A(x0,y0)
O 图3 圆弧插补原理图 X
圆弧插补原理参见上图,对于第一象限逆圆,设圆弧的起点为 A(x0,y0),终点为 B(xe,ye), 圆弧半径为 R。加工点为 M(xm,ym),它与圆心的距离为 Rm,则
(1)偏差计算
Fm
=
Rm2
− R2
=
xm2
p102=p102-p104 p101=p101+1 x-0.1 else p102=p102+p103 p101=p101+1 y0.1
;计算新的偏差值(Fi+1=Fi-ya) ;步数计数器加一 ;X方向进分别是(-0.1 -0.5 -1.0) ;偏差判别(若P102小于0表示刀具在直线下方) ;计算新的偏差值(Fi+1=Fi+xa) ;步数计数器加一 ;Y方向进给分别是(0.1 0.5 1.0)
endif
endwhile
close
(3)根据直线插补编成格式,编写所给圆弧插补程序。 各组的圆弧的插补任务是: u 第一组:圆弧半径 50,第二象限顺圆;
第二组:圆弧半径 50,第二象限逆圆; 第三组:圆弧半径 60,第三象限顺圆; 第四组:圆弧半径 60,第三象限逆圆; 第五组:圆弧半径 70,第四象限顺圆; 第六组:圆弧半径 70,第四象限逆圆; open prog7 clear linear inc p101=0 p102=0 p103=0 p104=50 while(p101!>100) if(p102!<0) y0.5 p101=p101+1 p102=p102-2*p104+1 p104=p104-1 else -x0.5 p101=p101+1 p102=p102-2*p103+1 p103=103-1 endif endwhile close
插补原理vb程序
第二章 插补原理
——轮廓加工的数学基础
Numerical Control
Date: File:
2006-04 interpolation.1
MECHINCAL ENGINEERING, TUST
Interpolation
数控二维工作台
y 0,0
x
Numerical Control
语法 object.Scale (x1, y1) - (x2, y2) (x1, y1)左上角的水平(x-轴)和垂直(y-轴)坐标。 左上角的水平( 轴 和垂直( 轴 坐标。 左上角的水平 (x2, y2)右下角的水平(x-轴)和垂直(y-轴)坐标。 右下角的水平( 轴 和垂直( 轴 坐标。 右下角的水平
2.1 Cls 方法 清除运行时 所生成的图形和文本。 清除运行时 PictureBox 所生成的图形和文本。 语法 object.Cls 2.2 Line 方法 在对象上画直线和矩形。 在对象上画直线和矩形。 语法 object.Line [Step] (x1, 1) [Step] (x2, y2), [color], [B][F]
建立VB程序的第一步是创见界面, 建立 程序的第一步是创见界面,它是用户与应用程序进行 程序的第一步是创见界面 交互操作的可视部分。 交互操作的可视部分。 窗体和控件是创见界面的基本构造模块。 窗体和控件是创见界面的基本构造模块。也是创见应用程序 是创见界面的基本构造模块 所使用的对象。 所使用的对象。 窗体是一种对象,控件是包含在窗体对象内的对象。它们均 窗体是一种对象,控件是包含在窗体对象内的对象。 对象 对象 是具有自己属性 方法和事件的对象 由属性定义其外关, 属性、 的对象。 是具有自己属性、方法和事件的对象。由属性定义其外关, 由方法定义其行为,由事件定义其与用户的交互。 由方法定义其行为,由事件定义其与用户的交互。
DDA直线插补和圆弧插补VB程序
ElseIf f * Di = 0 Then
If Di = 1 Then
f = f + 2 * y * Di + p
y = y + p
Else
f = f - 2 * x * Di + p
End If
f = f + Abs(xe - x0)
End If
obj.Line -(x, y), vbRed '画折线
n = n - 1
DoEvents
For i = 1 To 2000000 * p
'延时
Next i
Exit Sub
End If
pic.Cls '清屏
axis pic '画坐标轴
p = Val(Combo1.Text) '读取脉冲当量
cmdShow.Enabled = False
If Option1.Value Then '演示直线插补
Text1(2) <> "" And Text1(3) <> "" Then
x1 = Val(Text1(0)): y1 = Val(Text1(1))
x2 = Val(Text1(2)): y2 = Val(Text1(3))
Else
MsgBox "输入坐标不完整!"
Private Sub Text1_Change(Index As Integer)
If Abs(Val(Text1(Index).Text)) > 9 Then
(二)逐点比较法圆弧插补
(二)逐点比较法圆弧插补
逐点比较法圆弧插补是数控加工中常用的一种圆弧插补方法,其原理是通过逐点比较给定的圆弧路径与机床实际移动轨迹的差异,不断调整目标点的加工速度和轨迹实现精细的加工。
1.将给定的圆弧路径分割成若干个目标点,通常每隔一定距离取一个目标点。
2.根据目标点之间的距离和已知的转速,计算每个目标点的加工速度。
3.将目标点逐个输入数控系统,根据当前位置和目标点的位置计算运动轨迹和加工速度。
4.在运动过程中不断比较实际轨迹和目标轨迹之间的误差,根据误差大小调整加工速度,保证加工精度。
5.重复步骤3和4,直到完成整个圆弧的加工。
逐点比较法圆弧插补的优点是在加工过程中能够动态地调整加工速度,避免加工误差的累积。
同时,它对系统精度要求不高,能够适应各种数控系统。
不过,逐点比较法圆弧插补的缺点也是比较明显的。
由于每个目标点的加工速度独立计算,导致加工过程中产生了较大的速度变化,容易引起加工表面的纹路和不良的表面质量。
因此,在实际应用中,需要根据加工要求和机床精度选择合适的加工方法,并进行适当的加工优化。
逐点比较法第一象限直线圆弧插补
逐点比较法第一象限直线,圆弧插补编程逐点比较法是以折线来逼近给定的轨迹,就是每走一步控制系统都要将加工点与给定的图形轨迹相比较,以决定下一步进给的方向,使之逼近加工轨迹。
逐点比较法以折线来逼近直线或圆弧,其最大的偏差不超过一个最小设定单位。
只要将脉冲当量取得足够小,就可以达到精度要求。
逐点比较插补法在脉冲当量为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) 位置判别根据偏差值大于零、等于零、小于零确定当前加工点的位置。
VB软件模拟逐点比较法逆圆弧插补的程序设计说明书
xxxx 学院课程设计说明书设计题目:逐点比较法逆圆弧插补的程序设计系 (部):机电工程系专业:自动化(数控技术)班级: 08数控本(1)班姓名:学号:指导老师(签名):起止时间:20 11年 12月 5 日至20 11年 12月 9 日共 1 周20 11 年 12 月 11 日目录一.课程设计的目的 (1)二.课程设计的任务 (1)三.逐点比较法基本原理 (1)四.算法描述 (6)五.具体算法程序 (10)六.各象限选例展示 (17)七.心得体会 (19)八.参考文献 (19)正文:数控原理与系统课程设计说明书一、课程设计的目的1)了解连续轨迹控制数控系统的组成原理。
2) 掌握逐点比较法插补的基本原理。
3)握逐点比较法插补的软件实现方法。
二.课程设计的任务逐点比较法插补是最简单的脉冲增量式插补算法之一,其过程清晰,速度平稳,但一般只用于一个平面内两个坐标轴的插补运算。
其基本原理是在刀具按要求轨迹运动加工零件轮廓的过程中,不断比较刀具与被加工零件轮廓之间的相对位置,并根据比较结果决定下一步的进给方向,使刀具向减小偏差的方向进给,且只有一个方向的进给。
也就是说,逐点比较法每一步均要比较加工点瞬时坐标与规定零件轮廓之间的距离,依此决定下一步的走向。
如果加工点走到轮廓外面去了,则下一步要朝着轮廓内部走;如果加工点处在轮廓的内部,则下一步要向轮廓外面走,以缩小偏差,这样周而复始,直至全部结束,从而获得一个非常接近于数控加工程序规定轮廓的轨迹。
逐点比较法插补过程中的每进给一步都要经过偏差判别、坐标进给、偏差计算和终点判别四个节拍的处理,其工作流程图如图所示。
三.逐点比较法基本原理逐点比较法I象限逆圆插补在加工圆弧过程中,人们很容易联想到使用动点到圆心的距离与该圆弧的名义半径进行比较来反映加工偏差。
假设被加工零件的轮廓为第Ⅰ象限逆走向圆弧SE ,,圆心在O (0,0),半径为R ,起点为S (XS ,YS ),终点为E (Xe ,Ye ),圆弧上任意加工动点为N (Xi ,Yi )。
逐点比较法插补完整源程序V3.3
y0 = Val(Text2)
xe = Val(Text3)
ye = Val(Text4)
r = Sqr(x0 ^ 2 + y0 ^ 2)
'-----------------------------------------------------------------------画坐标-------------------
Picture2.Print " ----------------------------------------"
'-----------------------------------------------------------------------象限判断,过零转换-------------------
End If
Picture2.Print " ----------------END---------------------"
Picture2.Print " -------------O(∩_∩)O~-----------------"
Picture2.Print " -------------Conanbaby----共"; k; "步------"
If Option5.Value = True And Option6.Value = False And Option1.Value = False Then '逆圆弧
Do
If x0 > 0 And y0 >= 0 Then
If f(m) >= 0 Then
逐点比较插补原理的实现
逐点比较插补原理的实现逐点比较插补原理是一种常用的数值计算方法,用于在给定的数据点之间进行插值,以得到相应的曲线或者函数。
该方法的实现可以通过以下步骤进行:1. 确定数据点:首先,需要确定一组数据点,这些数据点包含了所需插值的函数或者曲线的部份信息。
数据点可以是离散的或者连续的,具体取决于实际应用场景。
2. 计算插值点:根据需要插值的函数或者曲线的特征,确定需要计算的插值点。
插值点是在数据点之间进行插值计算的位置,可以是离散的或者连续的。
3. 选择插值方法:根据实际需求和数据点的特征,选择合适的插值方法。
常见的插值方法包括线性插值、拉格朗日插值、牛顿插值等。
4. 进行插值计算:根据选择的插值方法,对插值点进行计算。
不同的插值方法有不同的计算公式和步骤,但基本思想是通过数据点之间的关系,推导出插值点的函数值或者曲线上的点。
5. 检验插值结果:对插值结果进行检验,确保插值的准确性和可靠性。
可以通过与已知数据点进行比较,计算误差或者残差来评估插值的精度。
逐点比较插补原理的实现可以通过编程语言来实现,例如在Python中可以使用NumPy库和SciPy库提供的函数来进行插值计算。
以下是一个简单的示例代码,演示了如何使用线性插值方法进行逐点比较插补的实现:```pythonimport numpy as npfrom scipy.interpolate import interp1d# 确定数据点x = np.array([1, 2, 3, 4, 5])y = np.array([2, 4, 6, 8, 10])# 计算插值点x_interp = np.linspace(1, 5, 10)# 选择插值方法interp_func = interp1d(x, y, kind='linear')# 进行插值计算y_interp = interp_func(x_interp)# 打印插值结果print("插值点的函数值:", y_interp)```上述代码中,首先确定了一组数据点x和y,然后使用`linspace`函数生成为了插值点x_interp。
VB软件 模拟逐点比较法逆圆弧插补的程序设计 程序
五、算法程序Private Sub Command1_Click()Picture1.ForeColor = vbBlackPicture1.DrawWidth = 2Picture1.Line (0, 4000)-(9000, 4000)Picture1.Line (4500, 0)-(4500, 8000)End SubPrivate Sub Command2_Click()Picture1.ForeColor = vbBluePicture1.DrawWidth = 2If Val(Text1.Text) * Val(Text1.Text) + Val(Text2.Text) * Val(Text2.Text) <> Val(Text3.Text) * Val(Text3.Text) + Val(Text4.Text) * Val(Text4.Text) Thenans = MsgBox("出错了,该象限所绘圆弧不以原点为圆心", 48, "提示信息")Text1.Text = ""Text2.Text = ""Text3.Text = ""Text4.Text = ""Text5.Text = ""Text6.Text = ""ElseIf Option1.Value = True ThenIf Val(Text1) >= 0 And Val(Text2) >= 0 And Val(Text3) >= 0 And Val(Text4) >= 0 And Val(Text1) >= Val(Text3) Then If Int(Text2) = 0 ThenIf Int(Text3) = 0 ThenPicture1.Circle (4500, 4000), Sqr(Val(Text1) * Val(Text1) + Val(Text2) * Val(Text2)) * Int(Text6), , 0, 3.14159 / 2Text5.Text = Sqr(Val(Text1) * Val(Text1) + Val(Text2) * Val(Text2))ElsePicture1.Circle (4500, 4000), Sqr(Val(Text1) * Val(Text1) + Val(Text2) * Val(Text2)) * Int(Text6), , Atn(Val(Text2) / Val(Text1)), 3.14159 / 2Text5.Text = Sqr(Val(Text1) * Val(Text1) + Val(Text2) * Val(Text2))End IfElseIf Int(Text4) = 0 ThenPicture1.Circle (4500, 4000), Sqr(Val(Text1) * Val(Text1) + Val(Text2) * Val(Text2)) * Int(Text6), , 0, Atn(Val(Text2) / Val(Text1))ElsePicture1.Circle (4500, 4000), Sqr(Val(Text1) * Val(Text1) + Val(Text2) * Val(Text2)) * Int(Text6), , Atn(Val(Text2) / Val(Text1)), Atn(Val(Text4) / Val(Text3))Text5.Text = Sqr(Val(Text1) * Val(Text1) + Val(Text2) * Val(Text2))End IfElseans = MsgBox("坐标象限错误或预定圆弧将为顺时针", 48, "提示信息")Text1.Text = ""Text2.Text = ""Text3.Text = ""Text4.Text = ""Text5.Text = ""Text6.Text = ""End IfElseIf Option4.Value = True ThenIf Val(Text1) >= 0 And Val(Text2) <= 0 And Val(Text3) >= 0 And Val(Text4) <= 0 And Val(Text1) <= Val(Text3) Then If Int(Text2) = 0 ThenIf Val(Text3) = 0 ThenPicture1.Circle (4500, 4000), Sqr(Val(Text1) * Val(Text1) + Val(Text2) * Val(Text2)) * Int(Text6), , 3 * 3.14159 / 2, 0Text5.Text = Sqr(Val(Text1) * Val(Text1) + Val(Text2) * Val(Text2))ElsePicture1.Circle (4500, 4000), Sqr(Val(Text1) * Val(Text1) + Val(Text2) * Val(Text2)) * Int(Text6), , Atn(Val(Text4) / Val(Text3)) + 3.14159 * 2, 0Text5.Text = Sqr(Val(Text1) * Val(Text1) + Val(Text2) * Val(Text2))End IfElseIf Val(Text3) <> 0 ThenPicture1.Circle (4500, 4000), Sqr(Val(Text1) * Val(Text1) + Val(Text2) * Val(Text2)) * Int(Text6), , Atn(Val(Text2) / Val(Text1)) + 3.14159 * 2, Atn(Val(Text4) / Val(Text3)) + 3.14159 * 2Text5.Text = Sqr(Val(Text1) * Val(Text1) + Val(Text2) * Val(Text2))ElsePicture1.Circle (4500, 4000), Sqr(Val(Text1) * Val(Text1) + Val(Text2) * Val(Text2)) * Int(Text6), , 3 * 3.14159 / 2, Atn(Val(Text2) / Val(Text1)) + 3.14159 * 2Text5.Text = Sqr(Val(Text1) * Val(Text1) + Val(Text2) * Val(Text2))End IfElseans = MsgBox("坐标象限错误或预定圆弧将为顺时针", 48, "提示信息")Text1.Text = ""Text2.Text = ""Text3.Text = ""Text4.Text = ""Text5.Text = ""Text6.Text = ""End IfElseIf Option2.Value = True ThenIf Val(Text1) <= 0 And Val(Text2) >= 0 And Val(Text3) <= 0 And Val(Text4) >= 0 And Val(Text1) >= Val(Text3) Then If Int(Text2) = 0 ThenIf Val(Text3) = 0 ThenPicture1.Circle (4500, 4000), Sqr(Val(Text1) * Val(Text1) + Val(Text2) * Val(Text2)) * Int(Text6), , 3.14159 / 2, 3.14159Text5.Text = Sqr(Val(Text1) * Val(Text1) + Val(Text2) * Val(Text2))ElsePicture1.Circle (4500, 4000), Sqr(Val(Text1) * Val(Text1) + Val(Text2) * Val(Text2)) * Int(Text6), , Atn(Val(Text4) / Val(Text3)) + 3.14159, 3.14159Text5.Text = Sqr(Val(Text1) * Val(Text1) + Val(Text2) * Val(Text2))End IfElseIf Val(Text3) = 0 ThenPicture1.Circle (4500, 4000), Sqr(Val(Text1) * Val(Text1) + Val(Text2) * Val(Text2)) * Int(Text6), , 3.14159 / 2, Atn(Val(Text4) / Val(Text3)) + 3.14159Text5.Text = Sqr(Val(Text1) * Val(Text1) + Val(Text2) * Val(Text2))ElsePicture1.Circle (4500, 4000), Sqr(Val(Text1) * Val(Text1) + Val(Text2) * Val(Text2)) * Int(Text6), , Atn(Val(Text2) / Val(Text1)) + 3.14159, Atn(Val(Text4) / Val(Text3)) + 3.14159Text5.Text = Sqr(Val(Text1) * Val(Text1) + Val(Text2) * Val(Text2))End IfElseans = MsgBox("坐标象限错误或预定圆弧将为顺时针", 48, "提示信息")Text1.Text = ""Text2.Text = ""Text3.Text = ""Text4.Text = ""Text5.Text = ""Text6.Text = ""End IfElseIf Option3.Value = True ThenIf Val(Text1) <= 0 And Val(Text2) <= 0 And Val(Text3) <= 0 And Val(Text4) <= 0 And Val(Text1) <= Val(Text3) ThenIf Int(Text1) = 0 ThenIf Int(Text4) = 0 ThenPicture1.Circle (4500, 4000), Sqr(Val(Text1) * Val(Text1) + Val(Text2) * Val(Text2)) * Int(Text6), , 3.14159, 3 * 3.14159 / 2Text5.Text = Sqr(Val(Text1) * Val(Text1) + Val(Text2) * Val(Text2))ElsePicture1.Circle (4500, 4000), Sqr(Val(Text1) * Val(Text1) + Val(Text2) * Val(Text2)) * Int(Text6), , Atn(Int(Text4) / Int(Text3)) + 3.14159, 3 * 3.14159 / 2Text5.Text = Sqr(Val(Text1) * Val(Text1) + Val(Text2) * Val(Text2))End IfElseIf Int(Text4) = 0 ThenPicture1.Circle (4500, 4000), Sqr(Val(Text1) * Val(Text1) + Val(Text2) * Val(Text2)) * Int(Text6), , 3.14159, Atn(Int(Text2) / Int(Text1)) + 3.14159Text5.Text = Sqr(Val(Text1) * Val(Text1) + Val(Text2) * Val(Text2))ElsePicture1.Circle (4500, 4000), Sqr(Val(Text1) * Val(Text1) + Val(Text2) * Val(Text2)) * Int(Text6), , Atn(Int(Text2) / Int(Text1)) + 3.14159, Atn(Int(Text4) / Int(Text3)) + 3.14159Text5.Text = Sqr(Val(Text1) * Val(Text1) + Val(Text2) * Val(Text2))End IfElseans = MsgBox("坐标象限错误或预定圆弧将为顺时针", 48, "提示信息")Text1.Text = ""Text2.Text = ""Text3.Text = ""Text4.Text = ""Text5.Text = ""Text6.Text = ""End IfEnd IfEnd IfEnd SubPrivate Sub Command3_Click()If Val(Text1.Text) * Val(Text1.Text) + Val(Text2.Text) * Val(Text2.Text) <> Val(Text3.Text) * Val(Text3.Text) + Val(Text4.Text) * Val(Text4.Text) Thenans = MsgBox("出错了", 48, "提示信息")Text1.Text = ""Text2.Text = ""Text3.Text = ""Text4.Text = ""Text5.Text = ""Text6.Text = ""ElseDim k, m, j, l, n, F(20) As IntegerDim a, b, c, d, e As Integerm = 0l = 0k = 0F(m) = 0a = Int(Text1)b = Int(Text2)c = Int(Text3)d = Int(Text4)e = Int(Text6)Picture1.ForeColor = vbGreenPicture1.DrawWidth = 3j = Abs(c - a) + Abs(d - b)Form1.CurrentX = 15000Form1.CurrentY = 200If Option1.Value = True ThenIf Val(Text1) >= 0 And Val(Text2) >= 0 And Val(Text3) >= 0 And Val(Text4) >= 0 And Option1.Value = True ThenPrint "初始:进给方向 " & "F(m)=0" & " X0=" & Int(Text1) & " Y0=" & Int(Text2) & " ∑ = " & jFor n = 1 To jIf F(m) >= 0 Thenm = m + 1k = k + 1F(m) = F(m - 1) - 2 * a + 1Picture1.Line (4500 + Int(Text1) * e - e * (k - 1), 4000 - Int(Text2) * e - l * e)-(4500 + Int(Text1) * e - e * k, 4000 - Int(Text2) * e - l * e)a = a - 1Form1.CurrentX = 15000Form1.CurrentY = 200 + n * 300Print "第" & m & "步" & " -△x F(" & m & ")= " & F(m) & " " & "x=" & a & " " & "y="; b & " ∑=" & j - nElsel = l + 1m = m + 1Picture1.Line (4500 + Int(Text1) * e - e * k, 4000 - Int(Text2) * e - (l - 1) * e)-(4500 + Int(Text1) * e - e * k, 4000 - Int(Text2) * e - l * e)F(m) = F(m - 1) + 2 * b + 1b = b + 1Form1.CurrentX = 15000Form1.CurrentY = 200 + n * 300Print "第" & m & "步" & " +△y F(" & m & ")= " & F(m) & " " & "x=" & a & " " & "y="; b & " ∑=" & j - nEnd IfNext nElseans = MsgBox("出错", 48, "提示信息")Text1.Text = ""Text2.Text = ""Text3.Text = ""Text4.Text = ""Text5.Text = ""Text6.Text = ""Form1.ClsEnd IfElseIf Option4.Value = True ThenIf Val(Text1) >= 0 And Val(Text2) <= 0 And Val(Text3) >= 0 And Val(Text4) <= 0 And Option4.Value = True ThenPrint "初始:进给方向 " & "F(m)=0" & " X0=" & Int(Text1) & " Y0=" & Int(Text2) & " ∑ = " & jFor n = 1 To jIf F(m) >= 0 Thenm = m + 1l = l + 1F(m) = F(m - 1) - 2 * Abs(b) + 1Picture1.Line (4500 + Int(Text1) * e + e * k, 4000 - Int(Text2) * e - (l - 1) * e)-(4500 + Int(Text1) * e + e * k, 4000 - Int(Text2) * e - l * e)b = b + 1Form1.CurrentX = 15000Form1.CurrentY = 200 + n * 300Print "第" & m & "步" & " +△y F(" & m & ")= " & F(m) & " " & "x=" & a & " " & "y="; b & " ∑=" & j - nElsek = k + 1m = m + 1Picture1.Line (4500 + Int(Text1) * e + e * (k - 1), 4000 - Int(Text2) * e - l * e)-(4500 + Int(Text1) * e + e * k, 4000 - Int(Text2) * e - l * e)F(m) = F(m - 1) + 2 * Abs(a) + 1a = a + 1Form1.CurrentX = 15000Form1.CurrentY = 200 + n * 300Print "第" & m & "步" & " +△x F(" & m & ")= " & F(m) & " " & "x=" & a & " " & "y="; b & " ∑=" & j - nEnd IfNext nElseans = MsgBox("出错", 48, "提示信息")Text1.Text = ""Text2.Text = ""Text3.Text = ""Text4.Text = ""Text5.Text = ""Text6.Text = ""Form1.ClsEnd IfElseIf Option2.Value = True ThenIf Val(Text1) <= 0 And Val(Text2) >= 0 And Val(Text3) <= 0 And Val(Text4) >= 0 And Option2.Value = True ThenPrint "初始:进给方向 " & "F(m)=0" & " X0=" & Int(Text1) & " Y0=" & Int(Text2) & " ∑ = " & jFor n = 1 To jIf F(m) >= 0 Thenm = m + 1l = l + 1F(m) = F(m - 1) - 2 * Abs(b) + 1Picture1.Line (4500 + Int(Text1) * e - e * k, 4000 - Int(Text2) * e + (l - 1) * e)-(4500 + Int(Text1) * e - e * k, 4000 - Int(Text2) * e + l * e)b = b - 1Form1.CurrentX = 15000Form1.CurrentY = 200 + n * 300Print "第" & m & "步" & " -△y F(" & m & ")= " & F(m) & " " & "x=" & a & " " & "y="; b & " ∑=" & j - nElsek = k + 1m = m + 1Picture1.Line (4500 + Int(Text1) * e - e * (k - 1), 4000 - Int(Text2) * e + l * e)-(4500 + Int(Text1) * e - e * k, 4000 - Int(Text2) * e + l * e)F(m) = F(m - 1) + 2 * Abs(a) + 1a = a - 1Form1.CurrentX = 15000Form1.CurrentY = 200 + n * 300Print "第" & m & "步" & " -△x F(" & m & ")= " & F(m) & " " & "x=" & a & " " & "y="; b & " ∑=" & j - nEnd IfNext nElseans = MsgBox("出错", 48, "提示信息")Text1.Text = ""Text2.Text = ""Text3.Text = ""Text4.Text = ""Text5.Text = ""Text6.Text = ""Form1.ClsEnd IfElseIf Option3.Value = True ThenIf Val(Text1) <= 0 And Val(Text2) <= 0 And Val(Text3) <= 0 And Val(Text4) <= 0 And Option3.Value = True ThenPrint "初始:进给方向 " & "F(m)=0" & " X0=" & Int(Text1) & " Y0=" & Int(Text2) & " ∑ = " & jFor n = 1 To jIf F(m) >= 0 Thenm = m + 1k = k + 1F(m) = F(m - 1) - 2 * Abs(a) + 1Picture1.Line (4500 + Int(Text1) * e + e * (k - 1), 4000 - Int(Text2) * e + l * e)-(4500 + Int(Text1) * e + e * k, 4000 - Int(Text2) * e + l * e)a = a + 1Form1.CurrentX = 15000Form1.CurrentY = 200 + n * 300Print "第" & m & "步" & " +△x F(" & m & ")= " & F(m) & " " & "x=" & a & " " & "y="; b & " ∑=" & j - n Elsel = l + 1m = m + 1F(m) = F(m - 1) + 2 * Abs(b) + 1Picture1.Line (4500 + Int(Text1) * e + e * k, 4000 - Int(Text2) * e + (l - 1) * e)-(4500 + Int(Text1) * e + e * k, 4000 - Int(Text2) * e + l * e)b = b - 1Form1.CurrentX = 15000Form1.CurrentY = 200 + n * 300Print "第" & m & "步" & " -△y F(" & m & ")= " & F(m) & " " & "x=" & a & " " & "y="; b & " ∑=" & j - nEnd IfNext nElseans = MsgBox("出错", 48, "提示信息")Text1.Text = ""Text2.Text = ""Text3.Text = ""Text4.Text = ""Text5.Text = ""Text6.Text = ""Form1.ClsEnd IfEnd IfEnd IfEnd SubPrivate Sub Command4_Click()Text1.Text = ""Text2.Text = ""Text3.Text = ""Text4.Text = ""Text5.Text = ""Text6.Text = ""Picture1.ClsForm1.ClsPicture1.ForeColor = vbBlackPicture1.DrawWidth = 2Picture1.Line (0, 4000)-(9000, 4000)Picture1.Line (4500, 0)-(4500, 8000)End SubPrivate Sub Command5_Click()Text1.Text = ""Text2.Text = ""Text3.Text = ""Text4.Text = ""Text5.Text = ""Text6.Text = ""Picture1.ClsForm1.ClsEnd SubPrivate Sub Command6_Click()EndEnd SubPrivate Sub Command7_Click()End Sub。
vb圆弧插补程序(可编辑修改word版)
Private Sub Command1_Click()Const pi = 3.14159265Picture1.ForeColor = vbBlackPicture1.DrawWidth = 2Picture1.Line (50, 500)-(50, 5500)Picture1.Line (50, 5500)-(6500, 5500)Picture1.Line (80, 600)-(50, 500)Picture1.Line (20, 600)-(50, 500)Picture1.Line (6400, 5450)-(6500, 5500) Picture1.Line (6400, 5550)-(6500, 5500) Picture1.ForeColor = vbRedPicture1.DrawWidth = 3If Int(Text1) = 0 ThenPicture1.Circle (50, 5500), Sqr(Int(Text1) *Int(Text1) + Int(Text2) * Int(Text2)) * 400, , Atn(Int(Text4) / Int(Text3)), pi / 2ElsePicture1.Circle (50, 5500), Sqr(Int(Text1) *Int(Text1) + Int(Text2) * Int(Text2)) * 400, , Atn(Int(Text4) / Int(Text3)), Atn(Int(Text2) /Int(Text1))End IfEnd SubPrivate Sub Command2_Click()Dim k, m, j, l, n, F(20) As Integerm = 0l = Text1.Textk = Text2.TextF(m) = 0Picture1.ForeColor = vbGreenPicture1.DrawWidth = 3j = Abs(Int(Text1) - Int(Text3)) + Abs(Int(Text2) - Int(Text4))Form1.CurrentX = 200Form1.CurrentY = 200 Print "初始:进给方向" & "F(m)=0" & " X0=" & Int(Text1) & " Y0=" & Int(Text2) & " ∑= " & jFor n = 1 To jIf F(m) >= 0 And j > 0 Thenm = m + 1k = k - 1F(m) = F(m - 1) - 2 * Abs(k + 1) + 1Picture1.Line (50 + 400 * l, 5500 - k * 400)-(50 + 400 * l, 5500 - (k + 1) * 400)Form1.CurrentX = 200Form1.CurrentY = 200 + m * 300Print "第" & m & "步" & " -△y F(" & m & ")= " & F(m) & " " & "x=" & l & " " & "y="; k & " ∑=" & j - nElsel = l + 1m = m + 1Picture1.Line (50 + 400 * l, 5500 - k * 400)-(50 + 400 * (l - 1), 5500 - k * 400)F(m) = F(m - 1) + 2 * Abs(l - 1) + 1Form1.CurrentX = 200Form1.CurrentY = 200 + m * 300Print "第" & m & "步" & " +△x F(" & m & ")= " & F(m) & " " & "x="; l & " " & "y="; k & " ∑=" & j - nEnd IfNext nEnd SubPrivate Sub Command3_Click()Text1.Text = ""Text3.Text = ""End SubPrivate Sub Command4_Click()EndEnd SubPrivate Sub Command1_Click()Picture1.ForeColor = vbBlackPicture1.DrawWidth = 2Picture1.Line (7500, 8500)-(7500, 500)Picture1.Line (7500, 500)-(500, 500)Picture1.Line (7500, 8500)-(7400, 8400)Picture1.Line (7500, 8500)-(7600, 8400)Picture1.Line (500, 500)-(600, 600)Picture1.Line (500, 500)-(600, 400)Picture1.ForeColor = vbRedPicture1.DrawWidth = 5Picture1.Line (7500, 500)-(7500 + 400 *Int(Text3), 500 - 400 * Int(Text4))End SubPrivate Sub Command2_Click()Form1.ClsDim k, m, j, l, n, F(20) As Integerm = 0l = 0k = 0F(m) = 0Picture1.ForeColor = vbGreenPicture1.DrawWidth = 3j = Abs(Int(Text3)) + Abs(Int(Text4))Form1.CurrentX = 200Form1.CurrentY = 200Print "初始:进给方向" & "F(m)=0" & " Xe=" & Int(Text3) & " Ye=" & Int(Text4) & " ∑= " & jFor n = 1 To jIf F(m) >= 0 And j > 0 Thenm = m + 1l = l - 1F(m) = F(m - 1) - Abs(Int(Text4))Picture1.Line (7500 + 400 * (l + 1), 500 - k * 400)-(7500 + 400 * (l), 500 - k * 400)Form1.CurrentX = 200Form1.CurrentY = 200 + m * 300Print "第" & m & "步" & " △x F(" & m & ")= " & F(m) & " " & "x=" & l & " " & "y="; k & " ∑=" & j - nElsek = k - 1m = m + 1Picture1.Line (7500 + 400 * l, 500 - (k + 1) * 400)-(7500 + 400 * l, 500 - k * 400)F(m) = F(m - 1) + Abs(Int(Text3))Form1.CurrentX = 200Form1.CurrentY = 200 + m * 300Print "第" & m & "步" & " △y F(" & m & ")= " & F(m) & " " & "x="; l & " " & "y="; k & " ∑=" & j - nEnd IfNext nEnd SubPrivate Sub Command3_Click()Text1.Text = ""Text2.Text = ""Picture1.ClsForm1.ClsEnd SubPrivate Sub Command4_Click()EndEnd SubPrivate Sub Form_Load()End SubPrivate Sub Command1_Click()Const pi = 3.14159265Picture1.ForeColor = vbBlackPicture1.DrawWidth = 2Picture1.Line (50, 500)-(50, 5500)Picture1.Line (50, 5500)-(6500, 5500)Picture1.Line (80, 600)-(50, 500)Picture1.Line (20, 600)-(50, 500)Picture1.Line (6400, 5450)-(6500, 5500) Picture1.Line (6400, 5550)-(6500, 5500) Picture1.ForeColor = vbRedPicture1.DrawWidth = 3Picture1.Line (50, 5500)-(50 + 400 * Int(Text3), 5500 - 400 * Int(Text4))End SubPrivate Sub Command2_Click()Dim k, m, j, l, n, F, G As Integerl = 0 k = 0 F = 0 G = 0Picture1.ForeColor = vbGreenPicture1.DrawWidth = 3n = Int(Text5)j = 2 ^ nm = 2 ^ nForm1.CurrentX = 200Form1.CurrentY = 200Print "累加次数" & "F= F + int (text3)" & "+△X " & " G=G +int(text4)" & " +△Y "; ∑ = " & j"Print " n " & " 0 " & " 0 " & " 0 " & " 0 " & jFor n = 1 To mF = F + Int(Text3)G = G + Int(Text4) If F >= m And G >= m Thenl = l + 1 k = k + 1Picture1.Line (50 + 400 * (l - 1), 5500 - (k - 1) * 400)-(50 + 400 * (l), 5500 - k * 400)F = F - mG = G - mPrint " "; n & " " & F & " " & 1 & " " & G & "j - 1" & 1 & " " & ElseIf F >= m And G < m Thenl = l + 1F = F - mPrint " "; n & " " & F & " " & 1 & " " & G & "j - 1" & 0 & " " &Picture1.Line (50 + 400 * (l - 1), 5500 - k * 400)-(50 + 400 * (l), 5500 - k * 400)ElseIf F < m And G >= m Thenk = k + 1 G = G - mPicture1.Line (50 + 400 * l, 5500 - (k - 1) * 400)-(50 + 400 * (l), 5500 - k * 400)Print " "; n & " " & F & " " & 0 & " " & G & " " & 1 & " " & j - 1ElseIf F < m And G < m ThenPrint " "; n & " " & F & " " & 0 & " " & G & " " & 0 & " " & j - 1End Ifj = j - 1Next nEnd SubPrivate Sub Command3_Click()Text1.Text = ""Text2.Text = ""Picture1.ClsForm1.ClsEnd SubPrivate Sub Command4_Click()End End Sub。
VB在逐点比较法直线插补原理中的应用
Label2. Visible = False
Text1. Visible = False
Text2. Visible = False
Text3. Visible = False
Text4. Visible = False
x(0) = Val (Text1. Text)
y(0) = Val (Text2. Text)
SHI Minchnical College , Lianyungang 222006 , China)
Abstract : Comparison teat point by point - straight line plugging is a typical plugging method in processing of numerical control , manufacturing parts by controlling error function between the position the cutting tool moves to and the perfect position. VB program is simple and visual , which can visualize the programming and processing of comparison test point by point - straight line plugging principle. Key Words : plugging ; comparison test point by point ; error function
End If ElseIf (x(0) > = 0) And (y(0) < = 0) And (xa > = 0) And (ya < = 0) Then If f (i) > = 0 Then For j = y(i) To y(i) - 1 Step - 0. 0001 PSet (x(i) , j) Next j y(i + 1) = y(i) - 1 x(i + 1) = x(i) f (i + 1) = f (i) - Abs(xa) Else For j = x(i) To x(i) + 1 Step 0. 0001 PSet (j , y(i) ) Next j x(i + 1) = x(i) + 1 y(i + 1) = y(i) f (i + 1) = f (i) + Abs(ya) End If End If Next i End Sub Private Sub Command2- Click() End End Sub 3 结束语 本文提出了一种用计算机来模拟数控插补的方法 ,在充 分利用 VB 设计语言简单 、直观的基础上 ,使数控插补原理的 实现更为形象化 。
基于VB的比较积分法圆弧插补仿真设计
技大学出版社,2004. [5]曾祥光,张玲玲. 基于 VB 的数控插补原理仿真研究[J]. 北京:
机械工程师,2006,(5):41-42. [6]周 虹. 圆弧插补算法的探讨[J]. 机械制造与自动化,2006,35
关键词: 数控; 插补; 仿真; 圆弧
中图分类号: TP391.9
文献标识码: A
文 章 编 号 :1672-0547 (2008)06-0077-02
1. 引言 随着微电子技术、计算机技术的发展,数 控机床的性能不断完善,其应用范围也不断 增大。而数控技术作为数控机床的关键技术, 越来越得到更多高校的重视,国内许多高校 在机械类和自动化类等专业都开设了数控技 术课程。作为数控技术教学中的一个重要组 成,数控插补算法的教学显得既重要也难掌 握,因此在教学中必须重视数控插补的实验 教学,但由于插补模拟设备价格昂贵,难以从 数量上满足教学的要求,如何较好地讲解数 控插补原理并直观地显示数控机床刀具的走 刀轨迹,是各个高校必须面对的一个问题。作 为数控机床教学型仿真软件的一个模块,作 者开发了用于教学的数控插补原理仿真软 件,较好地解决了数控插补过程的讲解及走 刀轨迹的显示等问题。 目前数控插补算法有多种,且大多数数 控系统都具有直线和圆弧的插补功能。由于 圆弧插补较直线插补复杂得多,本文以脉冲 增量插补法中的一种— — —比较积分法为例, 介绍其圆弧插补算法的仿真实现过程。该模 块是在 Visual Basic 6.0 的环境下利用 Win- dows 技术和面向对象的程序设计方法开发的 一个可视化仿真系统。 2. 比较积分法圆弧插补原理 脉冲增量插补算法主要为各坐标轴进行 脉冲分配计算。其特点是每次插补的结束仅 产生一个行程增量,以一个个脉冲的形式输出 给各进给轴的伺服电动机。目前常用的脉冲 增量插补算法有逐点比较法、数字积分法和比 较积分法。由于数字积分法溢出脉冲频率与 被积函数值大小有关,存在着速度调节不便的 缺点,逐点比较法在使用的方便性上不如数字 积分法插补,而比较积分法插补集数字积分法 插补和逐点比较法插补于一身,能够实现各种 函数和多坐标插补,且插补精度高,直线插补
数控插补的VB实现
第24卷第4期2006年7月北京工商大学学报(自然科学版)Journal of Beijing Techno logy and Business U niversity (N atural Science Editi on )V o l 124N o 14Ju l .2006 文章编号:167121513(2006)0420019204数控插补的VB 实现聂学俊, 高 峰(北京工商大学机械自动化学院,北京 100037)摘 要:插补算法是数控系统控制软件的核心Λ介绍了利用V isual B asic 610编程,对插补算法执行结果进行动态仿真的方法Λ关键词:插补;V isual B asic 610;仿真中图分类号:TH 164;T P 273 文献标识码:A 收稿日期:20060328作者简介:聂学俊(1965-),女,湖南湘乡人,副教授,硕士,主要从事CAD CAM 的教学和研究工作Ζ 在数控系统中,插补的任务是根据数控机床进给速度的要求,在被加工零件轮廓的起点和终点之间计算出若干个中间点的坐标值Ζ由于每个中间点计算所需的时间直接影响数控系统的控制速度,而插补中间点的计算精度又影响到整个数控系统的精度,所以插补算法对整个数控系统的性能指标至关重要,可以说插补是整个数控系统控制软件的核心[1]Ζ目前常用的插补算法有脉冲增量插补和数据采样插补Ζ为了分析各种插补方法的性能好坏,本文以脉冲增量插补中的算法之一——逐点比较法为例,利用可视化对象语言V isual B asic 610进行编程,将插补执行结果在屏幕上动态仿真显示出来,直接观察插补结果Ζ1 插补方法——逐点比较法简介逐点比较法的基本思想是被控制对象在数控系统的控制下,按要求的轨迹运动时,每走一步都要和规定的轨迹比较,根据比较的结果决定下一步移动的方向Ζ其插补步骤分为4步:偏差判别、坐标进给、偏差计算和终点判别Ζ111 逐点比较法直线插补的偏差计算如图1,被加工直线轮廓为OA ,P 点代表加工过程中的动点Ζ根据P 点与被加工直线轮廓OA 的位置关系,得到偏差函数为:F =X e Y i -X i Y e(1)式(1)中,X e 、Y e 为被加工轮廓的终点坐标;X i 、Y i 为加工动点P 的坐标,F 为偏差Ζ图1 逐点比较法直线一象限插补112 逐点比较法圆弧插补的偏差计算如图2,被加工逆圆弧轮廓为A B ,P 点代表加工过程中的动点Ζ根据P 点与被加工逆圆弧轮廓A B 的位置关系,得到偏差函数为:F =X 2i +Y 2i -R 2(2)式(2)中,X i 、Y i 为加工动点坐标,R 为被加工轮廓A B 的半径,F 为偏差Ζ图2 逐点比较法逆圆弧一象限插补将上述一象限直线和逆圆弧的插补方法推广至914个象限,得到直线和圆弧在不同象限的进给方向和偏差的关系分别如图3和图4Ζ图中,X -Y 为计算机屏幕坐标系,X ′-Y ′为工件坐标系,L 1到L 4和C 1到C 4分别为被加工直线和圆弧的理想轮廓,各箭头方向表示对应的坐标轴插补进给方向Ζ图3 逐点比较法直线插补进给方向和偏差的关系图4 逐点比较法逆圆弧插补进给方向和偏差的关系2 插补算法的VB 实现211 V isua l Ba sic 简介M icro soft V isual B asic 是可视化的、面向对象的、采用事件驱动方式的结构化高级程序设计语言,是一套完全独立的开发系统,它提供了开发M i 2cro soft W indow s 应用程序的最迅速、最简捷的方法[2]Λ在本程序实现中,应用了V isual B asic 提供的如下对象:fo rm (窗体)、comm and (命令按钮)、tex t (文本框)、p ictu re (图像对象)、label (标签)等及它们的属性和方法Λ212 插补算法的流程图根据图3和图4,可以方便地得到直线和逆圆弧的逐点比较法四象限插补流程图分别如图5和图6Λ图中,x 0、y 0和x e 、y e 分别为被加工轮廓的起点和终点坐标,n 为插补总步数Λ图5 逐点比较法直线四象限插补流程图6 逐点比较法逆圆弧四象限插补流程213 插补算法的VB 实现应用VB 编程,逐点比较法直线插补的程序如下Λ逐点比较法圆弧插补程序的编写与直线插补的程序类似,不再赘述ΛP rivate Sub Comm and 1-C lick () ’逐点比较法直线插补D i m x e ,y e ,n ,i A s In teger D i m f ,q ,x ,y A s In tegerCall Comm and 3-C lick ’画坐标系x e =In t (V al (T ex t 1.T ex t )) ’输入直线的终点坐标,画直线y e =In t (V al (T ex t 2.T ex t ))2北京工商大学学报(自然科学版)2006年7月 P ictu re1.D rawW idth=1P ictu re1.L ine(0,0)-(x e,y e),vbR edP ictu re1.Cu rren tX=0P ictu re1.Cu rren tY=0If(x e>=0)A nd(y e>=0)T hen ’判断象限 q=1E lse If(x e<0)A nd(y e>=0)T hen q=2E lse If(x e<=0)A nd(y e<0)T hen q=3E lse q=4End Ifn=In t(A b s(x e)+A b s(y e)) ’确定插补次数f=0Fo r i=1To n ’插补开始’ If f>=0T hen ’X方向进给 select case q case1 x=x+1 P ictu re1.L ine-(x,y),vbB lack Call arrow E(x,y) case2 x=x-1 P ictu re1.L ine-(x,y),vbB lack Call arrow W(x,y) case3 x=x-1 P ictu re1.L ine-(x,y),vbB lack Call arrow W(x,y) case4 x=x+1 P ictu re1.L ine-(x,y),vbB lack Call arrow E(x,y) End select f=f-ab s(y e) else ’Y方向进给 select case q case1 y=y+1 P ictu re1.L ine-(x,y),vbB lack Call arrow N(x,y) case2 y=y+1 P ictu re1.L ine-(x,y),vbB lack Call arrow N(x,y) case3 y=y-1 P ictu re1.L ine-(x,y),vbB lack Call arrow S(x,y) case4 y=y-1 P ictu re1.L ine-(x,y),vbB lack Call arrow S(x,y) End select f=f+ab s(x e) End If N ex t i End Sub逐点比较法直线插补和逆圆弧插补的执行结果分别如图7和图8Λ图7 逐点比较法直线四象限插补结果图8 逐点比较法圆弧四象限插补结果在编写程序时,必须注意几个问题:1)由于计算12 第24卷第4期聂学俊等:数控插补的VB实现机屏幕坐标系和工件坐标系不相一致,故在屏幕上显示插补轨迹时,应注意进给方向和屏幕坐标的转换;2)对于跨越不同象限的圆弧,应考虑插补自动过象限问题Λ3 结论数控插补方法有多种,通过在屏幕上动态显示插补轨迹,可以对比各种插补方法的优劣,对已有的插补方法进行改进和创新,有利于数控插补技术的提高Λ参考文献:[1] 任玉田,焦振学,王宏甫.机床计算机数控技术[M].北京:北京理工大学出版社,1996.[2] 希望图书创作室.V isual Basic610教程[M].北京:北京希望电子出版社,1999.VB REAL IZ ING OF INTERPOLATI ONAL G OR ITH M IN NU M ER I CAL CONTROL S Y STE MN IE Xue2jun, GAO Feng(Colleg e of M echan ica l E ng ineering and A u to m a tion,B eij ing T echnology andB usiness U n iversity,B eij ing100037,Ch ina)Abstract:In terpo lati on algo rithm is a co re of the con tro l softw are in num erical con tro l system.A m ethod si m u lating the in terpo lati on resu lt th rough p rogramm ing u sing the V isual B asic610is in2 troduced.Key words:in terpo lati on;V isual B asic610;si m u lating(责任编辑:檀彩莲) (上接第18页)ANALY SE AND OPTI M U M ON THE STRUCTUREOF TESTING SUPPORT PLATFOR MON ANTENNA PREC ISI ON M EASURE M ENTJ I AO Hong2jie1, ZHAN G Y i2du1, X I AN G H u i2yu2, YAN G Zhao1, RON G Zh i2yang1(11R esea rch Cen ter of P recision T rans m ission T echnology,B eij ing U n iversity of A eronau tics andA stronau tics,B eij ing100083,Ch ina;21Colleg e of M echan ica l E ng ineering and A u to m a tion,B eij ing T echnology and B usiness U n iversity,B eij ing100037,Ch ina)Abstract:It is very i m po rtan t that an tenna target suppo rt structu re and rigidity du ring an tenna p recisi on is m easu red in com p act testing fields.B ased on the p recisi on requ irem en t,u sing sub sec2 ti on design,a novel testing suppo rt p latfo rm w h ich satisfies RCS m easu rem en t requ irem en ts is designed.B esides,structu re disto rti on analysis is carried ou t in detail.F inal,structu re di m en2 si on is calcu lated acco rding to target rigidity w eigh t rati o and to tal m ass m in i m izing m ethod.Key words:an tenna;m easu rem en t;suppo rt p latfo rm;p recisi on(责任编辑:檀彩莲) 22北京工商大学学报(自然科学版)2006年7月 。
基于vb的直线插补与圆弧插补实验
主界面面板逐点比较圆弧插补程序如下:Private Sub Command1_Click()Xe = Val(Text1.Text)Ye = Val(Text2.Text)Picture1.Scale (-20, 20)-(20, -20)Picture1.ClsPicture1.Line (-20, 0)-(20, 0), vbBluePicture1.Line (19, 1)-(20, 0), vbbiuePicture1.Line -(19, -1), vbBluePicture1.Print "X"Picture1.Line (0, -20)-(0, 20), vbBluePicture1.Line (1, 19)-(0, 20), vbBluePicture1.Line -(-1, 19), vbBluePicture1.Print "Y"Picture1.Line (0, 0)-(Xe, Ye), vbBluePicture1.Print "("; Xe; ","; Ye; ")"If Text1.Text = none Or Text2.Text = none Then MsgBox "请输入加工终点坐标值。
"Text3.Text = 0Text4.Text = 0Text5.Text = 0End SubPrivate Sub Command2_Click()Dim sum As IntegerXe = Val(Text1.Text)Ye = Val(Text2.Text)Xm = Val(Text3.Text)Ym = Val(Text4.Text)m = Val(Text5.Text)sum = Xe * Ym - Xm * Ye'第一象限开始If Xe > 0 And Ye > 0 And sum >= 0 Then Picture1.Line (Xm, Ym)-(Xm + 1, Ym), vbRed: Text3.Text = Xm + 1If Xe > 0 And Ye > 0 And sum < 0 Then Picture1.Line (Xm, Ym)-(Xm, Ym + 1), vbRed: Text4.Text = Ym + 1If Abs(Xm) + Abs(Ym) >= Abs(Xe) + Abs(Ye) - 1 Then MsgBox "加工完毕!"'第二象限开始If Xe < 0 And Ye > 0 And sum >= 0 Then Picture1.Line (Xm, Ym)-(Xm, Ym + 1), vbRed: Text4.Text = Ym + 1If Xe < 0 And Ye > 0 And sum < 0 Then Picture1.Line (Xm, Ym)-(Xm - 1, Ym), vbRed: Text3.Text = Xm - 1If Abs(Xm) + Abs(Ym) >= Abs(Xe) + Abs(Ye) + 1 Then MsgBox "加工完毕!"'第三象限开始If Xe < 0 And Ye < 0 And sum >= 0 Then Picture1.Line (Xm, Ym)-(Xm - 1, Ym), vbRed:Text3.Text = Xm - 1If Xe < 0 And Ye < 0 And sum < 0 Then Picture1.Line (Xm, Ym)-(Xm, Ym - 1), vbRed: Text4.Text = Ym - 1If Abs(Xm) + Abs(Ym) >= Abs(Xe) + Abs(Ye) Then MsgBox "加工完毕!"'第四象限开始If Xe > 0 And Ye < 0 And sum >= 0 Then Picture1.Line (Xm, Ym)-(Xm, Ym - 1), vbRed: Text4.Text = Ym - 1If Xe > 0 And Ye < 0 And sum < 0 Then Picture1.Line (Xm, Ym)-(Xm + 1, Ym), vbRed: Text3.Text = Xm + 1If Abs(Xm) + Abs(Ym) >= Abs(Xe) + Abs(Ye) Then MsgBox "加工完毕!"Text5.Text = Abs(Val(Text3.Text)) + Abs(Val(Text4.Text))End SubPrivate Sub Command3_Click()Form2.HideForm1.ShowEnd Sub数字积分器法圆弧插补程序如下:Private Sub Command1_Click()Xe = Val(Text1.Text)Ye = Val(Text2.Text)Picture1.Scale (-20, 20)-(20, -20)Picture1.ClsPicture1.Line (-20, 0)-(20, 0), vbBluePicture1.Line (19, 1)-(20, 0), vbbiuePicture1.Line -(19, -1), vbBluePicture1.Print "X"Picture1.Line (0, -20)-(0, 20), vbBluePicture1.Line (1, 19)-(0, 20), vbBluePicture1.Line -(-1, 19), vbBluePicture1.Print "Y"Picture1.Line (0, 0)-(Xe, Ye), vbBluePicture1.Print "("; Xe; ","; Ye; ")"Text3.Text = 0Text4.Text = 0Text5.Text = 0Text6.Text = 0Text7.Text = 0End SubPrivate Sub Command2_Click()Xe = Val(Text1.Text)Ye = Val(Text2.Text)ax = V al(Text3.Text)ay = Val(Text4.Text)n = Val(Text7.Text)Xm = Val(Text5.Text)Ym = Val(Text6.Text)If Text1.Text = none Or Text2.Text = none Then MsgBox "请输入加工终点坐标值。
插补程序源代码
插补程序源代码目录1逐点比较法插补c语言程序源代码 (02)2 逐点比较法圆弧插补VB源程序 (07)3 逐点比较法直线插补VB源程序 (11)4 时间分割法直线插补参考VB程序 (13)5 时间分割法圆弧插补VB源程序 (14)1 逐点比较法插补c语言程序源代码#include "conio.h"#include "graphics.h"#include "process.h"#define Ni_circle 0#define Shun_circle 1void init_graph();void draw_Base_circle();void draw_cabu_circle();void close_graph();void acrroods();static float x0,y0;void line_cabu(), draw_line(),draw_line_cabu();void line_cabu() /*此函数控制直线插步两次*/{int i;init_graph();sleep(1);for(i=0;i<2;i++){line(0,120,300,120); outtextxy(310,120,"Z");line(100,10,100,300); outtextxy(110,300,"X");outtextxy(90,130,"O");draw_line();if(i==0)draw_line_cabu(6);else draw_line_cabu(2);gotoxy(50,5);getch();cleardevice();setcolor(WHITE);}}void draw_line()/*画直线*/{line(100,120,600,450);textcolor(YELLOW);directvideo=0;gotoxy(45,5); cprintf("Line from:X0 Y0 Z0 ");gotoxy(45,6); cprintf("Line to :X500 Y0 Z330");gotoxy(45,7); cprintf("Units :Pixel");gotoxy(45,8); cprintf("Line now:");}void draw_line_cabu(int step)/*关键的直线插补函数*/{int Xe=600,Ye=450;float Fm,Xm=100,Ym=120;setcolor(RED);moveto(Xm,Ym);while(Xm<=Xe&&Ym<=Ye){Fm=(Ym-120)*(Xe-100)-(Xm-100)*(Ye-120);if(Fm>=0)Xm=Xm+step;elseYm=Ym+step;lineto(Xm,Ym);gotoxy(55,8); printf("X%3.0f Y0 Z%3.0f",Xm-100,Ym-120);delay(1100);}}/* 圆插补部分的函数区*/void init_graph() /*图形系统初始化*/{int gdrive=DETECT,gmode;initgraph(&gdrive,&gmode,"");cleardevice();}void acrroods() /*屏幕中心坐标*/{x0=getmaxx()/2;y0=getmaxy()/2;}void draw_Base_circle() /*画圆及写参数*/{line(x0-200,y0,x0+200,y0); outtextxy(x0+220,y0,"Z");line(x0,y0-180,x0,y0+180); outtextxy(x0+10,y0+180,"X");outtextxy(x0-10,y0+10,"O");circle(x0,y0,150);textcolor(YELLOW);directvideo=0;gotoxy(46,2);cprintf("Circle start:X0 Y0 Z150");gotoxy(46,3);cprintf("Circle end :X0 Y0 Z150");gotoxy(46,4);cprintf("Units :Pixel");gotoxy(46,5);cprintf("Circle now:");}void close_graph() /*关图形系统*/{closegraph();}void draw_cabu_circle(int sstep,int Directory)/*关键的圆插补函数*/{int flag=0;float Fm,Xm,Ym;Xm=x0+150; Ym=y0;moveto(Xm,Ym);setcolor(RED);while(1) /*分象限,顺圆和逆圆讨论*/{Fm=(Xm-x0)*(Xm-x0)+(Ym-y0)*(Ym-y0)-150*150;/*圆判断公式*/ if(Fm>=0){if(!Directory){ /*逆圆判断*/if(Xm>=x0&&Ym<=y0){if(flag) break; /*if语句判断象限,以下一样*/else Xm=Xm-sstep;}if(Xm<=x0&&Ym<=y0){flag=1; Ym=Ym+sstep;}if(Xm<=x0&&Ym>=y0)Xm=Xm+sstep;if(Xm>=x0&&Ym>=y0)Ym=Ym-sstep;}else { /*it is Directory's else*/if(Xm>x0&&Ym<y0)Ym=Ym+sstep;if(Xm<=x0&&Ym<=y0)Xm=Xm+sstep;if(Xm<x0&&Ym>y0) {flag=1; Ym=Ym-sstep;}if(Xm>=x0&&Ym>=y0) {if(flag) break;Xm=Xm-sstep;}}}else{ /*it is Fm's else*/if(!Directory) {if(Xm>x0&&Ym<y0){if(flag) break;else Ym=Ym-sstep;}if(Xm<=x0&&Ym<=y0){flag=1; Xm=Xm-sstep;}if(Xm<=x0&&Ym>=y0)Ym=Ym+sstep;if(Xm>=x0&&Ym>=y0)Xm=Xm+sstep;}else{if(Xm>x0&&Ym<y0)Xm=Xm+sstep;if(Xm<=x0&&Ym<=y0)Ym=Ym-sstep;if(Xm<=x0&&Ym>=y0){flag=1; Xm=Xm-sstep;}if(Xm>=x0&&Ym>=y0) {if(flag) break;else Ym=Ym+sstep;}}}lineto(Xm,Ym);gotoxy(58,5); printf("X%3.0f Y0 Z%3.0f ",Ym-y0,Xm-x0);delay(800);}}void circle_demo(int Directory) /*控制圆插补两次*/{int i=0,sstep;init_graph();sleep(2);acrroods(&x0,&y0);for(i=0;i<2;i++){draw_Base_circle(150);if(i==0){sstep=6;draw_cabu_circle(sstep,Directory);}else{sstep=1;draw_cabu_circle(sstep,Directory);}getch();cleardevice();setcolor(WHITE);}}/* 圆插补部分的函数区结束*/main()/*主函数负责写封面和函数调用*/{int choice=0;init_graph();while(choice!=4){setfillstyle(1,RED);bar(200,30,400,80);setcolor(GREEN);settextstyle(3,0,10);outtextxy(220,50,"DEMO PROGRAM BY P.Y.F");setcolor(WHITE);settextstyle(0,0,1);outtextxy(200,120,"1. Line demo.");outtextxy(200,140,"2. Shun_Circle demo.");outtextxy(200,160,"3. Ni_Circle demo.");outtextxy(200,180,"4. Quit the program.");outtextxy(160,200,"Please enter your choice:"); gotoxy(46,13);scanf("%d",&choice);switch(choice){case 1: line_cabu();break;case 2: circle_demo(Ni_circle);break;case 3: circle_demo(Shun_circle);break;case 4: break;default: printf("\nChoice wrong,try again!");}}close_graph();}2 逐点比较法圆弧插补VB源程序Sub 偏差计算()偏差= Sqr((x动点- x圆心) 2 + (z动点- z圆心) 2) - R End SubSub 插补()x动点= x起点: z动点= z起点:动点象限判别xx: Select Case 象限标志Case 1: 单步连续判断If 顺逆标志= "顺" Then '第一象限插补Do Until (x动点- x终点) = 0 And (z动点- z终点) = 0 If 偏差>= 0 Thenx动点= x动点- 1:Line -Step(0, -x步长), vbRedElsez动点= z动点+ 1:Line -Step(z步长, 0), vbRedEnd If偏差计算动点象限判别If 象限标志<> 1 ThenGoTo xxEnd If单步连续判断LoopElseIf 顺逆标志= "逆" ThenDo Until (x动点- x终点) = 0 And (z动点- z终点) = 0If 偏差>= 0 Thenz动点= z动点- 1:Line -Step(-z步长, 0), vbRedElsex动点= x动点+ 1:Line -Step(0, x步长), vbRedEnd IfDoEvents偏差计算动点象限判别If 象限标志<> 1 ThenGoTo xxEnd IfLoopEnd IfCase 2: 单步连续判断If 顺逆标志= "顺" Then '第二象限插补Do Until (x动点- x终点) = 0 And (z动点- z终点) = 0If 偏差>= 0 Thenz动点= z动点- 1:Line -Step(-z步长, 0), vbRedElsex动点= x动点- 1:Line -Step(0, -x步长), vbRedEnd If偏差计算动点象限判别If 象限标志<> 2 ThenGoTo xxEnd IfLoopElseIf 顺逆标志= "逆" ThenDo Until (x动点- x终点) = 0 And (z动点- z终点) = 0If 偏差>= 0 Thenx动点= x动点+ 1:Line -Step(0, x步长), vbRedElsez动点= z动点+ 1:Line -Step(z步长, 0), vbRedEnd If偏差计算动点象限判别If 象限标志<> 2 ThenGoTo xxEnd IfLoopEnd IfCase 3: 单步连续判断If 顺逆标志= "顺" Then '第三象限插补Do Until (x动点- x终点) = 0 And (z动点- z终点) = 0If 偏差>= 0 Thenx动点= x动点+ 1:Line -Step(0, x步长), vbRedElsez动点= z动点- 1:Line -Step(-z步长, 0), vbRedEnd IfDoEvents偏差计算动点象限判别If 象限标志<> 3 ThenGoTo xxEnd IfLoopElseIf 顺逆标志= "逆" ThenDo Until (x动点- x终点) = 0 And (z动点- z终点) = 0 If 偏差>= 0 Thenz动点= z动点+ 1:Line -Step(z步长, 0), vbRedElsex动点= x动点- 1:Line -Step(0, -x步长), vbRedEnd If偏差计算动点象限判别If 象限标志<> 3 ThenGoTo xxEnd IfLoopEnd IfCase 4: 单步连续判断If 顺逆标志= "顺" Then '第三象限插补Do Until (x动点- x终点) = 0 And (z动点- z终点) = 0 If 偏差>= 0 Thenz动点= z动点+ 1:Line -Step(z步长, 0), vbRedElsex动点= x动点+ 1:Line -Step(0, x步长), vbRedEnd If偏差计算动点象限判别If 象限标志<> 4 ThenGoTo xxEnd IfLoopElseIf 顺逆标志= "逆" ThenDo Until (x动点- x终点) = 0 And (z动点- z终点) = 0 If 偏差>= 0 Thenx动点= x动点- 1:Line -Step(0, -x步长), vbRedElsez动点= z动点- 1:Line -Step(-z步长, 0), vbRedEnd If偏差计算动点象限判别If 象限标志<> 4 ThenGoTo xxEnd IfLoopEnd IfEnd SelectEnd Sub3 逐点比较法直线插补VB源程序Sub 偏差计算()偏差 = Abs(x终点) × z动点 - x动点× Abs(z终点) End SubSub 插补()Dim c As IntegerSelect Case 象限标志Case 1: '第一象限插补Do Until x动点 + z动点 >= 总步数If 偏差 >= 0 Thenx动点 = x动点 + 1:Line -Step(0, x步长), vbRedElsez动点 = z动点 + 1:Line -Step(z步长, 0), vbRedEnd If偏差计算LoopCase 2: '第二象限插补c = x终点: x终点= z终点: z终点= -cc = x步长: x步长 = z步长: z步长 = -cDo Until x动点 + z动点 >= 总步数If 偏差 >= 0 Thenx动点 = x动点 + 1:Line -Step(x步长, 0), vbRedElsez动点 = z动点 + 1:Line -Step(0, z步长), vbRedEnd If偏差计算LoopCase 3: '第三象限插补x步长 = -x步长: z步长 = -z步长Do Until x动点 + z动点 >= 总步数If 偏差 >= 0 Thenx动点 = x动点 + 1:Line -Step(0, x步长), vbRedElsez动点 = z动点 + 1:Line -Step(z步长, 0), vbRedEnd If偏差计算LoopCase 4: '第四象限插补c = x终点: x终点= -z终点: z终点 = cc = x步长: x步长 = -z步长: z步长 = cDo Until x动点 + z动点 >= 总步数If 偏差 >= 0 Thenx动点 = x动点 + 1: Line -Step(x步长, 0), vbRedElsez动点 = z动点 + 1: Line -Step(0, z步长), vbRedEnd If偏差计算LoopEnd SelectEnd Sub4 时间分割法直线插补参考VB程序Sub 插补()Dim l, K, a, B, f1, tx动点对起点= 0: z动点对起点= 0f1 = f × 10: t = Ts / 60000l = Sqr((x终点对起点^ 2 + z终点对起点^ 2))K = f1 × t / la = Sqr((x动点对起点- x终点对起点) ^ 2 + (z动点对起点- z终点对起点) ^ 2)x步长= K × x终点对起点: z步长= K × z终点对起点:B = Sqr(z步长^ 2 + x步长^ 2)Do Until a <= B / 2x动点对起点= x动点对起点+ x步长: z动点对起点= z动点对起点+ z步长a = Sqr((x动点对起点- x终点对起点) ^ 2 + (z动点对起点- z终点对起点) ^ 2)Line -Step(z步长×系数, x步长×系数), vbRedx动点对原点= x动点对起点+ x起点对原点: y动点对原点= y动点对起点+y起点对原点: z动点对原点= z动点对起点+ z起点对原点LoopEnd Sub5 时间分割法圆弧插补VB源程序圆弧(切线法):Sub 插补()Dim 区间符号As IntegerDim x, y, z As DoubleDim KDim 径向误差, R动As Double顺逆符号判别读数据If R < 0.001 ThenElseTs = Ts / 60000步长= f × Ts:K = 步长/ Rx动点对圆心= -x圆心对起点/ 系数: z动点对圆心= -z圆心对起点/ 系数End Ifx = ((x动点对圆心- x终点对圆心) ^ 2 + (z动点对圆心- z终点对圆心) ^ 2) ^ 0.5y = 3 ×步长×系数Do Until x <= ydeltaZ = -顺逆符号× K × x动点对圆心deltaX = 顺逆符号× K × z动点对圆心Line -Step(deltaZ, deltaX), vbRedx动点对圆心= x动点对圆心+ deltaX: z动点对圆心= z动点对圆心+ deltaZ: x动点对原点= x动点对圆心+ x圆心对原点: y动点对原点= y动点对圆心+y圆心对原点: z动点对原点= z动点对圆心+ z圆心对原点:x = ((x动点对圆心- x终点对圆心) ^ 2 + (z动点对圆心- z终点对圆心) ^ 2) ^ 0.5:y = 3 ×步长×系数R动= Sqr(x动点对圆心^ 2 + z动点对圆心^ 2)LoopEnd Sub。
圆弧插补指令示例程序
DRVI指令的多次应用
示例程序1
1、使用DRVI指令以频率1运行 2、在收到传感器信号1时断开DRVI指 令前的 触点, 脉冲将 减速停 止 3、清除指令前触点断开停止错误标志 位,执 行用户 自定义 任务 4、改变下一次DRVI指令要运行的参 数(频 率2、脉 冲个数 等) 5、闭合DRVI指令前的触点,进行第 二次运 行
示例程序3
DRVI指令和DRVSTOP、DRVREAD 指令联 合应用
示例程序4
1、使用DRVI指令以较低频率运行 2、在收到传感器信号时运行DRVST OP指令 ,停止 脉冲输 出 3、读取此过程发出的脉冲总数(即所 经历的 路程) 4、清除DRVSTOP强行停止错误标志 位,断 开DRVI指令 前的触 点 5、将DRVREAD指令读取的脉冲数写 入寄存 器,方 向反转 (将脉 冲个数 前加负 号即可 ) 6、闭合DRVI指令前的触点,以更高 的速度 按原路 返回至 起始点
示例程序10
圆弧插补指令
圆弧从起点(500,500)以外围速度1000Hz顺 时针运 动到终 点(1000,1000)。 在编写 指令时 ,要虚 拟圆心 坐标为 (0,0),这 时起点 的相对 坐标位 置为(- 250,- 250) ,终点 的相对 圆心坐 标位置 为(250,250),设 定加减 速时间 为500mS。
增强型运动控制指令概览
示例程序目录
示例程序1--DRVI指令的多次应用 示例程序2--DRVI指令和DRVSTOP指令联合应用 示例程序3--DRVA指令和DRVPAUSE、DRVRSME指令联合应用 示例程序4--DRVI指令和DRVSTOP、DRVREAD指令联合应用 示例程序5--DVIT指令示例 示例程序6--CAMA示例 示例程序7--CAMI示例 示例程序8--脉冲同步指令 示例程序9--直线插补指令 示例程序10--圆弧出脉冲根据比例系数同步输入脉冲 。 输出脉冲数 = 输入脉冲数 * 同步比例系数。 输出频率 = 输入频率 * 同步比例系数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
xxxx 学院课程设计说明书设计题目:逐点比较法逆圆弧插补的程序设计系(部):机电工程系专业:自动化(数控技术)班级:08数控本(1)班姓名:学号:指导老师(签名):起止时间:20 11年12月5 日至20 11年12月9 日共 1 周20 11 年12 月11 日目录一.课程设计的目的 (1)二.课程设计的任务 (1)三.逐点比较法基本原理 (1)四.算法描述 (6)五.具体算法程序 (10)六.各象限选例展示 (17)七.心得体会 (19)八.参考文献 (19)正文:数控原理与系统课程设计说明书一、课程设计的目的1)了解连续轨迹控制数控系统的组成原理。
2) 掌握逐点比较法插补的基本原理。
3)握逐点比较法插补的软件实现方法。
二.课程设计的任务逐点比较法插补是最简单的脉冲增量式插补算法之一,其过程清晰,速度平稳,但一般只用于一个平面内两个坐标轴的插补运算。
其基本原理是在刀具按要求轨迹运动加工零件轮廓的过程中,不断比较刀具与被加工零件轮廓之间的相对位臵,并根据比较结果决定下一步的进给方向,使刀具向减小偏差的方向进给,且只有一个方向的进给。
也就是说,逐点比较法每一步均要比较加工点瞬时坐标与规定零件轮廓之间的距离,依此决定下一步的走向。
如果加工点走到轮廓外面去了,则下一步要朝着轮廓内部走;如果加工点处在轮廓的内部,则下一步要向轮廓外面走,以缩小偏差,这样周而复始,直至全部结束,从而获得一个非常接近于数控加工程序规定轮廓的轨迹。
逐点比较法插补过程中的每进给一步都要经过偏差判别、坐标进给、偏差计算和终点判别四个节拍的处理,其工作流程图如图所示。
三.逐点比较法基本原理逐点比较法I象限逆圆插补在加工圆弧过程中,人们很容易联想到使用动点到圆心的距离与该圆弧的名义半径进行比较来反映加工偏差。
假设被加工零件的轮廓为第Ⅰ象限逆走向圆弧SE,,圆心在O(0,0),半径为R ,起点为S (XS ,YS ),终点为E (Xe ,Ye ),圆弧上任意加工动点为N (Xi ,Yi )。
当比较该加工动点到圆心的距离ON 与圆弧半径R 的大小时,可获得刀具与圆弧轮廓之间的相对位臵关系。
当动点N (Xi ,Yi )正好落在圆弧上时,则有下式成立22222RY X Y X e e i i =+=+当动点N (Xi ,Yi )落在圆弧外侧时,则有下式成立22222RY X Y X e e i i =+>+当动点N (Xi ,Yi )落在圆弧内侧时,则有下式成立22222RY X Y X e e i i =+<+由此可见,取逐点比较法圆弧插补的偏差函数表达式为222RY X F i i -+=当动点落在圆外时,为了减小加工误差,应向圆内进给,即向(-X)轴方向走一步;当动点落在圆内时,应向圆外进给,即向(+Y)轴方向走一步。
当动点正好落在圆弧上且尚未到达终点时,为了使加工继续下去,理论上向(+Y)轴或(-X)轴方向进给均可以,但一般情况下约定向(-X)轴方向进给。
综上所述,现将逐点比较法第Ⅰ象限逆圆插补规则概括如下:当F >0时,即222RY X F i i-+=>0,动点落在圆外,则向(-X)轴方向进给一步;当F =0时,即222RY X F i i-+==0,动点正好落在圆上,约定向(-X)轴方向进给一步;当F <0时,即222RY X F i i-+=<0,动点落在圆内,则向(+Y)轴方向进给一步。
由偏差函数表达式可知,计算偏差F 值,就必须进行动点坐标、圆弧半径的平方运算。
显然,在用硬件或汇编语言实现时不太方便。
为了简化这些计算,按逐点比较法直线插补的思路,也可以推导出逐点比较法圆弧插补过程中偏差函数计算的递推公式。
假设第i 次插补后,动点坐标为N (Xi ,Yi ),其对应偏差函数为222RY X F i i i -+=当Fi ≥0,向(-X)轴方向进给一步,则新的动点坐标值为 Xi +1=Xi -1, Yi +1=Yi 因此,新的偏差函数为()2222212111RY X RY X F i i i i i -+-=-+=+++∴ Fi +1=Fi -2Xi +1同理,当Fi <0,则向(+Y)轴方向进给一步,则新的动点坐标值为 Xi +1=Xi , Yi +1=Yi +1 因此,可求得新的偏差函数为()2222212111RY X RY X F i i i i i -++=-+=+++∴ Fi +1=Fi +2Yi +1将上式进行比较,可以看出两点不同:第一,递推形式的偏差计算公式中仅有加/减法以及乘2运算,而乘2可等效成该二进制数左移一位,这显然比平方运算来得简单。
第二,进给后新的偏差函数值与前一点的偏差值以及动点坐标N (Xi ,Yi )均有关系。
由于动点坐标值随着插补过程的进行而不断变化,因此,每插补一次,动点坐标就必须修正一次,以便为下一步的偏差计算作好准备。
至此,将第Ⅰ象限逆圆弧插补的规则和计算公式汇总,见表(表2-1)第Ⅰ象限逆圆弧插补计算公式表2-1和直线插补一样,圆弧插补过程也有终点判别问题。
当圆弧轮廓仅在一个象限区域内,其终点判别仍可借用直线终点判别的三种方法进行,只是计算公式略不同。
Σ=|Xe-Xs|+|Ye-Ys|Σ=max{|Xe-Xs|,|Ye-Ys|}Σ1=|Xe-Xs| ,Σ2=|Ye-Ys|式中 XS、Ys ——被插补圆弧轮廓的起点坐标;Xe、Ye ——被插补圆弧轮廓的终点坐标。
b、插补象限和圆弧走向前面所讨论的逐点比较法直线和圆弧插补,均是针对第一象限直线和逆圆插补这种特定情况进行的。
然而,任何数控机床都应具备处理不同象限、不同走向曲线的能力。
四个象限中圆弧插补圆弧插补情况比直线插补复杂,不仅有象限问题,而且还有圆弧走向问题。
现以第Ⅰ象限顺圆SR1插补为例,介绍圆弧插补的特性。
假设圆弧SE起点为S(XS,YS),终点为E(Xe,Ye),圆心在坐标原点上。
与逆圆插补相似,当某一时刻动点N(Xi,Yi)在圆弧的外侧时,有F≥0成立,应向-Y)轴方向进给一步,以减小误差;若动点N(Xi,Yi)在圆弧内侧,则应向+X)轴方向进给一步。
由此可推导出第Ⅰ象限顺圆插补偏差函数的递推公式如下:当Fi≥0时,向-Y)轴方向进给一步,则新的动点坐标为Xi+1=Xi , Yi+1=Yi-1新动点的偏差函数为()2222212111RY X RY X F i i i i i --+=-+=+++∴ Fi +1=Fi -2Yi +1当Fi <0时,向+X)轴方向进给一步,则新的动点坐标为Xi +1=Xi +1, Yi +1=Yi 新动点的偏差函数为()2222212111RY X RY X F i i i i i -++=-+=+++∴ Fi +1=Fi +2Xi +1现将上式比较,可以看出它们有两点不同:1)当Fi ≥0或Fi <0时,对应的进给方向不同;2)插补计算公式中动点坐标的修正也不同,以至于偏差计算公式也不相同。
进一步还可根据上述方法推导出其他象限不同走向圆弧的插补公式。
现将各种相应偏差计算见表(表2-2)四个象限圆弧插补偏差计算与进给方向表2-2从表可以看出,当按第Ⅰ象限逆圆NR1进行插补运算时,现若有意将X轴进给反向,则可以走出第Ⅱ象限顺圆SR2来;或者若将Y轴进给反向,则可以走出SR4来;或者将X轴和Y轴的进给均反向,则可以走出NR3来;并且这四种线型(NR1、SR2、NR3、SR4)使用的偏差计算公式都相同,无须改变。
进一步还可以看出,当按第Ⅰ象限逆圆NR1线型插补时,现若将计算公式坐标X与Y对调,即把X当作Y,把Y当作X,那么就可得到SR1的走向。
类似地通过改变进给方向,利用SR1的公式就可获得其余三种线型(NR2、SR3、NR4)的走向。
下面,我们对圆弧逐点比较法作一个简要的介绍。
四.算法描述(逐点比较法在VB中的具体实现)根据上述基本原理,我们可以知道逐点比较法圆弧插补需要设臵两个终点计器J∑X=|Xe –Xs|和J∑Y=|Ye - Ys|,分别对X轴和Y轴进行终点监控。
每当X轴或Y轴产生一个溢出脉冲,相应的终点计数器就作减1修正,直到为零,表明该坐标已到终点,并停止其坐标的累加运算。
只有当两个坐标轴均到达终点时,圆弧插补才结束。
如下图所示,圆弧起点S(4,-1),终点(-1,4),且寄存器位数N=3,当插补开始时,被积函数寄存器初值分别为JVX=Ys=-1和JVY=Xs=4,终点判别寄存器J∑X=|Xe –Xs|=-1和J∑Y=|Ye - Ys|=5.该圆弧插补运算过程如下表所示,插补轨迹如下图折线所示。
根据上述基本原理以及对预VB软件编程的掌握,查阅参考相关文献资料,编制了本课程设计的程序。
程序充分采用了循环结构以及选择结构的基本编程方法,对于四个象限分别进行了编程,并应对各种可能出现的错误做了相应的处理,其中包括:1、输入错误导致象限选择与实际输入不一致;2、输入错误导致输入两点及角度为元素构成的圆弧不以原点为圆心;3、其他微小错误;程序编制思路基本参考文献资料《基于Visual Basic编程软件的数控插补计算与设计方法》一书,具体采用专攻一个象限以通晓其原理,从而推及其他象限的做法,剩下了大量的时间。
在编制程序的过程中,不断进行调试。
并不断纠正错误,其中主要的两种错误如下附两幅图片所示。
输入错误导致象限选择与实际输入不一致;输入错误导致输入两点及角度为元素构成的圆弧不以原点为圆心;这些恰恰都是不符合要求的输入,必须通过提示来提醒用户,以正确地输入,达到正确使用本软件的目的。
六、各象限选例展示第一象限第二象限第三象限第四象限九.心得体会十.参考文献【1】汪木兰主编.数控原理与系统.机械工业出版社,2004【2】李金泽主编.基于Visual Basic编程软件的数控插补计算与设计方法.机械工业出版社,2007年。