数 控 技 术 课 程 设 计 说 明 书
设计题目:数字积分法圆弧插补计软件设计
指导老师:
专 业: 机械设计制造及其自动化
班 级: 机
姓 名:
学 号:
目录
一、课程设计题目 1
二、课程设计的目的 1
三、课程设计使用的主要仪器设备 1
四、课程设计的任务题目描述和要求 1
五、数字积分法插补原理 2
5.1从几何角度来看积分运算 2
5.2数字积分圆弧插补 3
5.3数字积分法圆弧插补程序流程图 5
5.4插补实例 6
六、程序清单 7
七、软件运行效果仿真 18
八、课程小节 21
九、参考文献 22
一、课程设计题目
数字积分法第一、二、三、四象限顺、逆圆插补计算
二、课程设计的目的
《数控原理与系统》是自动化(数控)专业的一门主要专业课程,安排课程设计的目的是通过课程设计方式使学生进一步掌握和消化数控原理基本内容,了解数控系统的组成,掌握系统控制原理和
,通过设计与调试,掌握各种功能实的现方法,为今后从事数控领域的工作打下扎实的基础。
1)了解连续轨迹控制数控系统的组成原理。
2) 掌握数字积分法(DDA)插补的基本原理。
3)掌握数字积分法(DDA)插补的软件实现方法。
三、课程设计使用的主要仪器设备
1、PC计算机一台
2、数控机床实验装置一台
3、支持软件若干(选用VB环境)
四、课程设计的任务题目描述和要求
数字积分法又称数字微分分析法DDA(Digital Differential Analyzer)。数字积分法具有运算速度快、脉冲分配均匀、易于实现多坐标联动及描绘平面各种函数曲线的特点,应用比较广泛。其缺点是速度调节不便,插补精度需要采取一定
才能满足要求。由于计算机有较强的计算功能和灵活性,采用软件插补时,上述缺点易于克服。
本次课程设计具体要求如下:
(1)掌握数字积分插补法基本原理
(2)设计出数字积分(DDA)插补法插补软件流程图
(3)编写出算法程序清单算法描述(数字积分法算法在VB中的具体实现)
(4)要求软件能够实现第一、二、三、四象限顺、逆圆插补计算
(5)软件运行仿真效果 插补结果要求能够以图形模式进行输出
五、数字积分法插补原理
数字积分法又称数字积分分析法DDA(Digital differential Analyzer),简称积分器,是在数字积分器的基础上建立起来的一种插补算法。具有逻辑能力强的特点,可实现一次、两次甚至高次曲线插补,易于实现多坐标联动。只需输入不多的几个数据,就能加工圆弧等形状较为复杂的轮廓曲线。直线插补时脉冲较均匀。并具有运算速度快,应用广泛等特点。
5.1从几何角度来看积分运算
如下图所示,从时刻到t求函数曲线所包围的面积时,可用积分公式
示,如果将0~t的时间划分成时间间隔为的有限区间,当足够小时,可得近似公式 :
若△t 取“1”,上式简化为:
这种累加求和运算,即积分运算可用数字积分器来实现,
若求曲线与坐标轴所包围的面积,求解过程如下:
被积函数寄存器用以存放Y值,每当Δt 出现一次,被积函数寄存器中的Y值就与累加器中的数值相加一次,并将累加结果存于累加器中,如果累加器的容量为一个单位面积,则在累加过程中,每超过一个单位面积,累加器就有溢出。当累加次数达到累加器的容量时,所产生的溢出总数就是要求的总面积,即积分值。
被积函数寄存器与累加器相加的计算方法:
例:被积函数寄存器与累加器均为3位寄存器,被积函数为5,求累加过程。
101 101 101 101
+)000 +)101 +)010 +)111
101 010 111 100
101 101 101 101
+) 100 +)001 +)110 +) 011
001 110 011 000
经过2 = 8次累加完成积分运算,因为有5次溢出,所以积分值等于5。
5.2数字积分圆弧插补
圆心为坐标原点的圆弧方程式为:
可得圆的参数方程为:
对t 微分得、方向上的速度分量为:
用累加器来近似积分为:
如图所示,设加工半径为R的第一象限逆时针圆弧AB,坐标原点定在圆心上,A(Xo,Yo)为圆弧起点,B(Xe,Ye)为圆弧终点,Pi(Xi,Yi)为加工动点。
如下图所示,可以得到:
V/R = Vx/Yi = Vy/Xi = K即Vx=K Yi,Vy=K Xi
因而可以得到坐标微小位移增量为:
ΔX=VxΔt = KYiΔt ΔY=VyΔt = KXiΔt
设Δt=1,K=1/2 则有:
可看出,用DDA法进行圆弧插补时,是对加工 动点的坐标Xi和Yi的值分别进行累加,若积分累加器有溢出,则相应坐标轴进给一步,则圆弧积分插补器如图所示:
5.3数字积分法圆弧插补程序流程图
DDA法插补不同象限圆弧时,算法也有所不同。当采用软件插补时,如果参与积分运算的寄存器均采用绝对值数据,则DDA法插补的积分累加过程完全相同,即JR+JV→JR,只是进给脉冲分配方向和圆弧插补动点坐标的修正有所不同。
5.5插补实例
设有第Ⅰ象限逆圆弧SE,起点为S(4,0),终点为E(0,4),且寄存器位数N=3。试用DDA法对该圆弧进行插补,并画出插补轨迹。
解:插补开始时,被积函数寄存器初值分别为 JVX=YS=0,JVY=XS=4,终点判别寄存器JSX=|Xe-XS|=4,JSY=|Ye-YS|=4。该圆弧插补运算过程见下表,插补轨迹如下图所示的折线。
六、程序清单
Private Sub 建立坐标系_Click()
Picture1.ForeColor = vbBlack
Picture1.DrawWidth = 2
Picture1.Line (500, 4500)-(8500, 4500) '画直线坐标轴
Picture1.Line (4500, 500)-(4500, 8500)
Picture1.CurrentX = 230 '当前位置
Picture1.CurrentY = 4400
Picture1.Print "-X" '坐标轴标注
Picture1.CurrentX = 4300
Picture1.CurrentY = 4300
Picture1.Print "(0,0)"
Picture1.CurrentX = 8650
Picture1.CurrentY = 4400
Picture1.Print "X"
Picture1.CurrentX = 4400
Picture1.CurrentY = 8600
Picture1.Print "-Y"
Picture1.CurrentX = 4500
Picture1.CurrentY = 400
Picture1.Print "Y"
End Sub
Private Sub 画圆弧_Click()
Dim a, b, c, d, n, m As Integer
Dim r As Single
a = Val(Text1.Text)
b = Val(Text2.Text)
c = Val(Text3.Text)
d = Val(Text4.Text)
n = a * a + b * b
m = c * c + d * d
r = Sqr(n)
If Option1.Value = True Then
If a < 0 Or b < 0 Or c < 0 Or d < 0 Then
ans = MsgBox("出错了,起点、终点坐标不在同一象限内,请重新输入", 48, "提示信息")
End If
End If
If Option2.Value = True Then
If a > 0 Or b < 0 Or c > 0 Or d < 0 Then
ans = MsgBox("出错了,起点、终点坐标不在同一象限内,请重新输入", 48, "提示信息")
End If
End If
If Option3.Value = True Then
If a > 0 Or b > 0 Or c > 0 Or d > 0 Then
ans = MsgBox("出错了,起点、终点坐标不在同一象限内,请重新输入", 48, "提示信息")
End If
End If
If Option4.Value = True Then
If a < 0 Or b > 0 Or c < 0 Or d > 0 Then
ans = MsgBox("出错了,起点、终点坐标不在同一象限内,请重新输入", 48, "提示信息")
End If
End If
Picture1.ForeColor = vbRed
Picture1.DrawWidth = 4
Const PI = 3.1415926535
If Option1.Value = True Then
If a > c And b < d Then
If Option1.Value = True Then
If b = 0 Then
If c = 0 Then
Picture1.Circle (4500, 4500), r * 300, , 0 * 3.14159, 3.14159 / 2
Else
Picture1.Circle (4500, 4500), r * 300, , 0 * 3.14159, 3.14159 / 2 - Atn(d / c)
End If
ElseIf c = 0 Then
Picture1.Circle (4500, 4500), r * 300, , Atn(b / a), 3.14159 / 2
Else
Picture1.Circle (4500, 4500), r * 300, , Atn(b / a), 3.14159 / 2 - Atn(d / c)
End If
End If
ElseIf a < c And b > d Then
If Option1.Value = True Then
If a = 0 Then
If d = 0 Then
Picture1.Circle (4500, 4500), r * 300, , 0 * 3.14159, 3.14159 / 2
Else
Picture1.Circle (4500, 4500), r * 300, , Atn(d / c), 3.14159 / 2
End If
ElseIf d = 0 Then
Picture1.Circle (4500, 4500), r * 300, , 0 * 3.14159, Atn(b / a)
Else
Picture1.Circle (4500, 4500), r * 300, , Atn(d / c), Atn(b / a)
End If
End If
Else
ans = MsgBox("出错了,起点或终点坐标位置错误,请重新输入", 48, "提示信息")
End If
End If
If Option2.Value = True Then
If a > c And b > d Then
If Option2.Value = True Then
If a = 0 Then
If d = 0 Then
Picture1.Circle (4500, 4500), r * 300, , 3.14159 / 2, 3.14159
Else
Picture1.Circle (4500, 4500), r * 300, , 3.14159 / 2, 3.14159 - Atn(-d / c)
End If
ElseIf d = 0 Then
Picture1.Circle (4500, 4500), r * 300, , 3.14159 / 2 + Atn(-a / b), 3.14159
Else
Picture1.Circle (4500, 4500), r * 300, , 3.14159 / 2 + Atn(-a / b), -Atn(-d / c) + 3.14159
End If
End If
ElseIf a < c And b < d Then
If Option2.Value = True Then
If b = 0 Then
If c = 0 Then
Picture1.Circle (4500, 4500), r * 300, , 3.14159 / 2, 3.14159
Else
Picture1.Circle (4500, 4500), r * 300, , Atn(-c / d), 3.14159
End If
ElseIf c = 0 Then
Picture1.Circle (4500, 4500), r * 300, , 3.14159 / 2, 3.14159 - Atn(-b / a)
Else
Picture1.Circle (4500, 4500), r * 300, , Atn(-c / d), 3.14159 - Atn(-b / a)
End If
End If
Else
ans = MsgBox("出错了,起点或终点坐标位置错误,请重新输入", 48, "提示信息")
End If
End If
If Option3.Value = True Then
If a < c And b > d Then
If Option3.Value = True Then
If b = 0 Then
If c = 0 Then
Picture1.Circle (4500, 4500), r * 300, , 3.14159, 3 * 3.14159 / 2
Else
Picture1.Circle (4500, 4500), r * 300, , 3.14159, Atn(d / c) + 3.14159
End If
ElseIf c = 0 Then
Picture1.Circle (4500, 4500), r * 300, , Atn(b / a) + 3.14159, 3 * 3.14159 / 2
Else
Picture1.Circle (4500, 4500), r * 300, , Atn(b / a) + 3.14159, Atn(d / c) + 3.14159
End If
End If
ElseIf a > c And b < d Then
If Option3.Value = True Then
If a = 0 Then
If d = 0 Then
Picture1.Circle (4500, 4500), r * 300, , 3.14159, 3 * 3.14159 / 2
Else
Picture1.Circle (4500, 4500), r * 300, , 3.14159 + Atn(d / c), 2 * 3.14159 / 2
End If
ElseIf d = 0 Then
Picture1.Circle (4500, 4500), r * 300, , 3.14159, 3 * 3.14159 / 2 - Atn(a / b)
Else
Picture1.Circle (4500, 4500), r * 300, , Atn(d / c) + 3.14159, 3 * 3.14159 / 2 - Atn(a / b)
End If
End If
Else
ans = MsgBox("出错了,起点或终点坐标位置错误,请重新输入", 48, "提示信息")
End If
End If
If Option4.Value = True Then
If a < c And b < d Then
If Option4.Value = True Then
If a = 0 Then
If d = 0 Then
Picture1.Circle (4500, 4500), r * 300, , 3 * 3.14159 / 2, 2 * 3.14159
Else
Picture1.Circle (4500, 4500), r * 300, , 3 * 3.14159 / 2, Atn(d / c) + 3.14159 * 2
End If
ElseIf d = 0 Then
Picture1.Circle (4500, 4500), r * 300, , Atn(b / a) + 3.14159 * 2, 2 * 3.14159
Else
Picture1.Circle (4500, 4500), r * 300, , Atn(b / a) + 3.14159 * 2, Atn(d / c) + 3.14159 * 2
End If
End If
ElseIf a > c And b > d Then
If Option4.Value = True Then
If b = 0 Then
If c = 0 Then
Picture1.Circle (4500, 4500), r * 300, , 3 * 3.14159 / 2, 2 * 3.14159
Else
Picture1.Circle (4500, 4500), r * 300, , 3 * 3.14159 / 2 + Atn(-c / d), 2 * 3.14159
End If
ElseIf c = 0 Then
Picture1.Circle (4500, 4500), r * 300, , 3 * 3.14159 / 2, -Atn(-b / a)
Else
Picture1.Circle (4500, 4500), r * 300, , 3 * 3.14159 / 2 + Atn(-c / d), -Atn(-b / a)
End If
End If
Else
ans = MsgBox("出错了,起点或终点坐标位置错误,请重新输入", 48, "提示信息")
End If
End If
End Sub
Private Sub 插补计算_Click()
Dim a, b, c, d, ni, mi, ai, bi, ci, k, f, g, m, n, l, i, xs, yx, xe, ye, jvx, jvy, xi, yi As Integer
Dim r As Single
a = Val(Text1.Text)
b = Val(Text2.Text)
c = Val(Text3.Text)
d = Val(Text4.Text)
ni = a * a + b * b
mi = c * c + d * d
r = Sqr(ni)
form2.Cls
If Option1.Value = True Then
If a < 0 Or b < 0 Or c < 0 Or d < 0 Then
ans = MsgBox("出错了,起点、终点坐标不在同一象限内,请重新输入", 48, "提示信息")
End If
End If
If Option2.Value = True Then
If a > 0 Or b < 0 Or c > 0 Or d < 0 Then
ans = MsgBox("出错了,起点、终点坐标不在同一象限内,请重新输入", 48, "提示信息")
End If
End If
If Option3.Value = True Then
If a > 0 Or b > 0 Or c > 0 Or d > 0 Then
ans = MsgBox("出错了,起点、终点坐标不在同一象限内,请重新输入", 48, "提示信息")
End If
End If
If Option4.Value = True Then
If a < 0 Or b > 0 Or c < 0 Or d > 0 Then
ans = MsgBox("出错了,起点、终点坐标不在同一象限内,请重新输入", 48, "提示信息")
End If
End If
ci = 2
f = 1
g = 1
k = 0 '正X进给标志 1 正向 -1负向
m = 0 '负Y进给标志 1 正向 -1负向
n = 0 '累加次数
i = CInt(Text5) '寄存器位数赋给i
l = 2 ^ i
xs = CInt(Text1)
ys = CInt(Text2)
xe = CInt(Text3)
ye = CInt(Text4)
jvx = Abs(CInt(Text2))
jvy = Abs(CInt(Text1))
jrx = 0
jry = 0
xi = Abs(CInt(Text3) - CInt(Text1)) 'X方向总步
yi = Abs(CInt(Text4) - CInt(Text2)) 'Y方向总步长
ai = xs
bi = ys
Picture1.ForeColor = vbGreen
Picture1.DrawWidth = 3
form1.CurrentX = 200
form1.CurrentY = 200
Print " " & " X积分器 " & " Y 积分器 "
form1.CurrentX = 100
form1.CurrentY = 400
Print "累加次数 n" & " jvx " & "Jrx=Jrx+Jvx" & " △X " & "J∑x" & " Jvy" & " Jry=Jry+Jvy" & " △Y " & " J∑y "
form1.CurrentX = 100
form1.CurrentY = 600
Print " 开始 " & " " & jvx & " " & jrx & " " & k & " " & xi & " " & jvy & " " & jry & " " & m & " " & yi
wz: k = 0 'X方向进给标志 1 X正向进给 -1负向进给
m = 0 'Y方向进给标志 1 Y正向进给 -1负向进给
If xi > 0 Then 'X方向判断
jrx = jrx + jvx
If jrx >= l Then '判断寄存器是否溢出
jrx = jrx - l '溢出修正
If jrx >= l Then '寄存器位数判断
GoTo ww5
End If
If Option1.Value = True Then
If a > c And b < d Then
k = -1
Else
k = 1
End If
End If
If Option2.Value = True Then
If a > c And b > d Then
k = -1
Else
k = 1
End If
End If
If Option3.Value = True Then
If a > c And b < d Then
k = -1
Else
k = 1
End If
End If
If Option4.Value = True Then
If a > c And b > d Then
k = -1
Else
k = 1
End If
End If
xi = xi - 1
End If
End If
If yi > 0 Then 'Y方向判断
jry = jry + jvy
If jry >= l Then '判断寄存器是否溢出
jry = jry - l '溢出修正
If jry >= l Then '寄存器位数判断
GoTo ww5
End If
If Option1.Value = True Then
If a > c And b < d Then
m = 1
Else
m = -1
End If
End If
If Option2.Value = True Then
If a < c And b < d Then
m = 1
Else
m = -1
End If
End If
If Option3.Value = True Then
If a > c And b < d Then
m = 1
Else
m = -1
End If
End If
If Option4.Value = True Then
If a < c And b < d Then
m = 1
Else
m = -1
End If
End If
yi = yi - 1 'Y方向总步长减1
End If
End If
n = n + 1 '累加次数加1
form1.CurrentX = 100
form1.CurrentY = 600 + n * 200
If xi = 0 Or yi = 0 Then
If xi = 0 And yi <> 0 And f = 0 Then
Print " " & n & " " & jvx & " " & "停止" & " " & "" & " " & "" & " " & jvy & " " & jry & " " & m & " " & yi
GoTo wz2
End If
If xi = 0 And yi <> 0 And f < 0 Then
Print " " & n & " " & jvx & " " & " " & " " & "" & " " & "" & " " & jvy & " " & jry & " " & m & " " & yi
GoTo wz2
End If
If xi <> 0 And yi = 0 And g = 0 Then
Print " " & n & " " & jvx & " " & jrx & " " & k & " " & xi & " " & jvy & " " & "停止"
GoTo wz2
End If
If xi <> 0 And yi = 0 And g < 0 Then
Print " " & n & " " & jvx & " " & jrx & " " & k & " " & xi & " " & jvy
GoTo wz2
End If
If xi = 0 And yi = 0 And f = 1 And g < 0 Then
Print " " & n & " " & jvx & " " & jry & " " & k & " " & xi & " " & jvy
GoTo wz2
End If
If xi = 0 And yi = 0 And f < 0 And g = 1 Then
Print " " & n & " " & jvx & " " & " " & " " & "" & " " & "" & " " & jvy & " " & jry & " " & m & " " & yi
GoTo wz2
End If
If xi = 0 And yi = 0 And f = 0 And g = 0 Then
Print " " & n & " " & jvx & " " & "停止" & " " & "" & " " & "" & " " & jvy & " " & "停止"
GoTo wz2
End If
If xi = 0 And yi = 0 And f = 0 And g < 0 Then
Print " " & n & " " & jvx & " " & "停止" & " " & k & " " & xi & " " & jvy & " "
GoTo wz2
End If
If xi = 0 And yi = 0 And f < 0 And g = 0 Then
Print " " & n & " " & jvx & " " & " " & " " & "" & " " & "" & " " & jvy & " " & "停止"
GoTo wz2
End If
End If
Print " " & n & " " & jvx & " " & jrx & " " & k & " " & xi & " " & jvy & " " & jry & " " & m & " " & yi
wz2: If xi = 0 Then
f = f - 1
End If
If yi = 0 Then
g = g - 1
End If
If xi = 0 And yi = 0 Then
ci = ci - 1
If ci = 0 Then
GoTo wz3
End If
End If
If Option1.Value = True Then
If a > c And b < d And k = -1 Then
jvy = jvy - 1
ElseIf a > c And b < d And m = 1 Then
jvx = jvx + 1
ElseIf a < c And b > d And k = 1 Then
jvy = jvy + 1
ElseIf a < c And b > d And m = -1 Then
jvx = jvx - 1
End If
End If
If Option2.Value = True Then
If a > c And b > d And k = -1 Then
jvy = jvy + 1
ElseIf a > c And b > d And m = -1 Then
jvx = jvx - 1
ElseIf a < c And b < d And k = 1 Then
jvy = jvy - 1
ElseIf a < c And b < d And m = 1 Then
jvx = jvx + 1
End If
End If
If Option3.Value = True Then
If a > c And b < d And k = -1 Then
jvy = jvy + 1
ElseIf a > c And b < d And m = 1 Then
jvx = jvx - 1
ElseIf a < c And b > d And k = 1 Then
jvy = jvy - 1
ElseIf a < c And b > d And m = -1 Then
jvx = jvx + 1
End If
End If
If Option4.Value = True Then
If a > c And b > d And k = -1 Then
jvy = jvy - 1
ElseIf a > c And b > d And m = -1 Then
jvx = jvx + 1
ElseIf a < c And b < d And k = 1 Then
jvy = jvy + 1
ElseIf a < c And b < d And m = 1 Then
jvx = jvx - 1
End If
End If
Picture1.Line (4500 + 300 * ai, 4500 - bi * 300)-(4500 + 300 * (ai + k), 4500 - (bi + m) * 300)
ai = ai + k
bi = bi + m
GoTo wz
ww3: Text1.Text = ""
Text2.Text = ""
Text3.Text = ""
Text4.Text = ""
Text5.Text = ""
Text1.SetFocus
ww5: form1.Cls
ans = MsgBox("出错了,寄存器位数偏小,请输入", 48, "提示信息")
Text5.Text = ""
Text5.SetFocus
ww4:
wz3:
End Sub
Private Sub 清除_Click()
Text1.Text = ""
Text2.Text = ""
Text3.Text = ""
Text4.Text = ""
Text5.Text = ""
Option1.Value = False
Option2.Value = False
Option3.Value = False
Option4.Value = False
Picture1.Cls
form2.Cls
End Sub
Private Sub 退出_Click()
End
End Sub
七、软件运行效果仿真
1 进入
2 第三象限
3第 二象限
4 第四象限
5 第一象限
及错误提示
八、课程小节
通过此次课程设计,使我更好的掌握了有关数字积分法一二三四象限顺、逆圆插补计算方面的知识,在设计过程中虽然遇到了一些问题,但经过一次又一次的思考和询问,终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和
不足。实践出真知,通过亲自动手制作,使我们掌握的知识不再是纸上谈兵。
过而能改,善莫大焉。在课程设计过程中,我们不断发现错误,不断改正,不断领悟,不断获取。最终的检测调试环节,本身就是在践行“过而能改,善莫大焉”的知行观。这次课程设计终于顺利完成了,在设计中遇到了很多问题,最后在同组的伙伴们的指导下,终于游逆而解。在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可!
课程设计诚然是一门专业课,给我很多专业知识以及专业技能上的提升,同时又是一门讲道课,一门辩思课,给了我许多道,给了我很多思,给了我莫大的空间。同时,设计让我感触很深。使我对抽象的理论有了具体的认识。通过这次课程设计,我掌握了数字积分法插补的基本原理,运算过程,特点及其应用,并了解改进数字积分插补质量的措施。
九、参考文献
[1] 《数控技术》 赵玉刚,宋现春 主编,北京,机械工业出版社,2010
[2] 《机床数控技术》 杜国臣,王士军 主编,北京,北京大学出版社,2010
[3] 《Visual Basic软件设计教程》 江志文 主编,广州,中山大学出版社,2003
[4] 《深入浅出Visual Basic 6软件设计》 松桥工作室,北京,中国铁道工业出版社,2004
[5] 《算法分析与设计技术》 马绍汉 主编,北京,科学出版社,2001
[6] 《数字控制机床》 廖效果,朱启逑 主编,湖北,华中理工大学出版社,2003