(完整版)vb圆弧插补程序
- 格式:doc
- 大小:28.01 KB
- 文档页数:4
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。
圆弧插补指令应用圆弧面零件编程圆弧面零件编程加工是学习数控车床编程技术的重要一环,也是学习其它回转体类零件加工的基础。
通过本项目的学习,要掌握如下知识,顺时针圆弧插补、逆时针圆弧插补方向的判断和G02、G03圆弧插补指令及终点坐标+半径格式的应用;仿形车削复合循环指令G73及其应用;刀尖半径补偿指令G40、G41、G42及应用;凸圆弧零件加工工艺制定及循环参数选择;完成成形面类零件编程加工及其尺寸控制。
一、零件图二、数控车床编程指令插补的概念根据给定的进给速度和给定轮廓线形的要求,在轮廓的已知点之间,确定一些中间点的方法,称为插补方法或插补原理。
编程指令(一)圆弧插补指令G02、G03G02——顺时针圆弧插补G03——逆时针圆弧插补1.指令功能:使刀具按给定进给速度沿圆弧方向进行切削加工。
2.圆弧的顺、逆方向的判断沿垂直于圆弧所在平面的坐标轴的正方向向负方向看去,刀具相对于工件的转动方向是顺时针方向为G02,逆时针方向为G03。
3.圆弧加工终点坐标+圆弧半径(或圆心坐标)指令格式G02(G03)X_Z_R_ F_G02(G03)X_ Z_ I_ K_ F_(二)径向(端面) 粗车复合循环指令G72该指令适用于圆柱棒料粗车阶梯轴(或法兰盘)的外圆或内孔,需切除较多余量时的情况。
与轴向粗车复合循环的区别仅在于切削方向平行于X轴。
[ FANUC 0i ] 系统径向(端面)粗车复合循环指令格式:G72 W(△d) R(e);G72 P(ns) Q(nf) U(△u) W(△w) F(△f) S(△s) T(t);N(ns)……;……;.N(nf) ……;(三)仿形粗车(闭环车削)复合循环指令G73该指令用于零件毛坯已基本成型的铸件或锻件的加工,铸件或锻件的形状与零件轮廓相接近。
该功能在切削工件时刀具轨迹为一闭合回路,刀具逐渐进给�使封闭的切削回路逐渐向零件最终形状靠近,完成工件的加工。
[ FANUC 0i ] 系统仿形粗车(闭环车削)复合循环指令格式:G73 U(△i) W(△k) R(d);G73 P(ns) Q(nf) U(△u) W(△w) F(△f) S(△s) T(t);N(ns)……;……;N(nf) ……;(四)刀具补偿指令1.刀具补偿的目的数控车床是按车刀刀尖对刀的,因车刀的刀尖不可能绝对尖,总有一个小圆弧,所以对刀刀尖的位置是一个假想的刀尖A。
主界面面板逐点比较圆弧插补程序如下: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 "请输入加工终点坐标值。
五、算法程序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。
圆弧插补是指在数控机床上,通过控制工具沿着圆弧路径进行加工的过程。
下面是圆弧插补的计算过程步骤:
1. 确定圆弧的起点和终点坐标:根据加工要求和图纸,确定圆弧的起点和终点的坐标。
2. 计算圆弧的半径:根据起点和终点的坐标,计算出圆弧的半径。
3. 计算圆心坐标:根据起点、终点和半径的关系,计算出圆心的坐标。
4. 计算圆弧的角度:根据起点、终点和圆心的坐标,计算出圆弧的角度。
5. 确定圆弧的方向:根据起点、终点和圆心的位置关系,确定圆弧的方向(顺时针或逆时针)。
6. 计算插补点的坐标:根据圆心、半径、角度和方向,计算出插补点的坐标。
7. 控制工具移动:根据插补点的坐标,通过数控系统控制工
具在圆弧路径上移动。
8. 重复计算和移动:根据设定的插补步长,重复计算和移动,直到达到终点。
以上是圆弧插补的计算过程步骤,通过这些步骤可以实现精确的圆弧加工。
圆弧插补指令格式
圆弧插补指令的格式如下:
1.G02为顺时针插补,G03为逆时针插补,在XY平面中,格式如下:G02/G03 X_ Y_ I_ K_ F_或G02/G03 X_ Y_ R_ F_,其中X、Y为圆弧终点坐标,I、J为圆弧起点到圆心在X、Y轴上的增量值,R为圆弧半径,F为进给量。
2.在圆弧切削时注意,q≤180°,R为正值;q>180°,R为负值;I、K的指定也可用R指定,当两者同时被指定时,R指令优先,I、K无效;R不能做整圆切削,整圆切削只能用I、J、K编程,因为经过同一点,半径相同的圆有无数个。
当有I、K为零时,就可以省略;无论G90还是G91方式,I、J、K都按相对坐标编程;圆弧插补时,不能用刀补指令G41/G42。
3.G54~G59是在加工前设定好的坐标系,而G92是在程序中设定的坐标系,用了G54~G59就没有必要再使用G92,否则G54~G59会被替换,应当避免。
四、调试分析1.缩短型2.伸长型3.插入型附录:程序如下:Option ExplicitDim X0 As Single '圆弧三点坐标Dim Y0 As SingleDim X1 As SingleDim Y1 As SingleDim X2 As SingleDim Y2 As SingleDim I1 As Single ' 两个圆心相对圆弧起点坐标Dim J1 As SingleDim I2 As SingleDim J2 As SingleDim R1 As Single '两个圆弧半径Dim R2 As SingleDim r As Single '刀具半径Dim OX1 As Single '两圆心实际坐标Dim OY1 As SingleDim OX2 As SingleDim OY2 As SingleDim Xx1 As SingleDim Yy1 As SingleDim Start1 As Single '第一段圆弧起始弧度Dim End1 As Single '第一段圆弧结束弧度Dim Start2 As Single '第二段圆弧起始弧度Dim End2 As Single '第二段圆弧结束弧度Const Pi = 3.1415926Private Sub Command1_Click()Picture1.Cls '清除picturebox控件中的内容Picture1.DrawWidth = 1X0 = Val(Split(Text1.Text, ",")(0)) '将文本框中的文本从逗号分离并转化成数值Y0 = Val(Split(Text1.Text, ",")(1))X1 = Val(Split(Text2.Text, ",")(0))Y1 = Val(Split(Text2.Text, ",")(1))X2 = Val(Split(Text3.Text, ",")(0))Y2 = Val(Split(Text3.Text, ",")(1))I1 = Val(Itext1.Text) '取圆心相对圆弧起点坐标J1 = Val(Jtext1.Text)I2 = Val(Itext2.Text)J2 = Val(Jtext2.Text)R1 = Sqr(I1 * I1 + J1 * J1) '计算第一段圆弧半径If Not Option1.Value Then R1 = -R1 '通过确定顺圆逆圆判断半径符号R2 = Sqr(I2 * I2 + J2 * J2) '计算第二段圆弧半径If Not Option3.Value Then R2 = -R2 '通过确定顺圆逆圆判断半径符号r = Val(rText.Text) '取刀具半径If Not Option5.Value Then r = -r '通过确定左刀补右刀补判断刀具半径符号'=======================画动态坐标系====================== Dim t1 As Single '取出X最大值Dim t2 As Single '取出X最小值Dim t3 As Single '取出Y最大值Dim t4 As Single '取出Y最小值t1 = X0t2 = X0t3 = Y0t4 = Y0If t1 < X1 Then t1 = X1 '求坐标中最大值与最小值If t1 < X2 Then t1 = X2If t2 > X1 Then t2 = X1If t2 > X2 Then t2 = X2If t3 < Y1 Then t3 = Y1If t3 < Y2 Then t3 = Y2If t4 > Y1 Then t4 = Y1If t4 > Y2 Then t4 = Y2If t1 < t3 Then t1 = t3If t2 > t4 Then t2 = t4Dim m As SingleIf Abs(R1) < Abs(R2) Thenm = Abs(R2)Elsem = Abs(R1)End Ift1 = t1 + Abs(r) + m '坐标轴对圆弧和刀补轨迹留有余量t2 = t2 - Abs(r) - mPicture1.Scale (t2, t1)-(t1, t2) '设定picturebox左上角右下角坐标值Picture1.Line (t2, 0)-(t1, 0), vbRed '画X轴Picture1.Line (0, t2)-(0, t1), vbRed '画Y轴Dim I As IntegerDim Ts1 As IntegerDim Ts2 As IntegerTs1 = Fix(t2)Ts2 = Fix(t1)For I = Ts1 To Ts2 Step 1Picture1.Line (I, -0.2)-(I, 0.2), vbRed '画X轴竖线Picture1.CurrentY = -0.2Picture1.Print I '打印刻度值Picture1.Line (-0.2, I)-(0.2, I), vbRed '画Y轴横线Picture1.CurrentX = -0.5Picture1.Print I '打印刻度值Next IPicture1.CurrentX = Ts2 - 1Picture1.CurrentY = -1Picture1.Print "X" '标上XPicture1.CurrentX = -1Picture1.CurrentY = Ts2 - 1Picture1.Print "Y" '标上YPicture1.Line (t1 - 0.3, -0.3)-(t1, 0), vbRed '画箭头Picture1.Line (t1 - 0.3, 0.3)-(t1, 0), vbRedPicture1.Line (-0.3, t1 - 0.3)-(0, t1), vbRedPicture1.Line (0.3, t1 - 0.3)-(0, t1), vbRed'================================================ End SubPrivate Sub Command2_Click()Picture1.DrawWidth = 2 '线宽OX1 = I1 + X0 '圆心实际坐标OY1 = J1 + Y0OX2 = I2 + X1OY2 = J2 + Y1Dim tt As SingleXx1 = -I1 '圆弧起点相对圆心坐标Yy1 = -J1Start1 = hudu(Xx1, Yy1) '第一段圆弧起点对应弧度Xx1 = X1 - OX1 '圆弧终点相对圆心坐标Yy1 = Y1 - OY1End1 = hudu(Xx1, Yy1) '第一段圆弧终点对应弧度If Option1.Value Then '画图时如果是顺圆,起点与终点弧度调换tt = Start1Start1 = End1End1 = ttEnd IfIf End1 < Start1 Then '圆弧经过X轴正方向Picture1.Circle (OX1, OY1), Abs(R1), , Start1, 2 * Pi, 624 / 697 Picture1.Circle (OX1, OY1), Abs(R1), , 0, End1, 624 / 697Else '圆弧不经过X轴正方向Picture1.Circle (OX1, OY1), Abs(R1), , Start1, End1, 624 / 697End IfXx1 = -I2 '圆弧起点相对圆心坐标Yy1 = -J2 '圆弧终点相对圆心坐标Start2 = hudu(Xx1, Yy1) '第二段圆弧起点对应弧度Xx1 = X2 - OX2Yy1 = Y2 - OY2End2 = hudu(Xx1, Yy1) '第二段圆弧终点对应弧度If Option3.Value Then '画图时如果是顺圆,起点与终点弧度调换tt = Start2Start2 = End2End2 = ttEnd IfIf End2 < Start2 Then '圆弧经过X轴正方向Picture1.Circle (OX2, OY2), Abs(R2), , Start2, 2 * Pi, 624 / 697Picture1.Circle (OX2, OY2), Abs(R2), , 0, End2, 624 / 697Else '圆弧不经过X轴正方向Picture1.Circle (OX2, OY2), Abs(R2), , Start2, End2, 624 / 697End If'Picture1.Circle (3, 4), 5End Sub'=======================弧度计算函数===================== Function hudu(ByVal m As Single, ByVal n As Single) As SingleDim k As SingleIf m <> 0 Then '斜率存在时k = n / mIf m >= 0 And n >= 0 Then hudu = Atn(k)If m >= 0 And n < 0 Then hudu = Atn(k) + 2 * PiIf m < 0 And n >= 0 Then hudu = Atn(k) + PiIf m < 0 And n < 0 Then hudu = Atn(k) + PiElse '斜率不存在时If n >= 0 Thenhudu = Pi / 2Elsehudu = Pi / 2 + PiEnd IfEnd IfEnd Function'=============刀补运算=======================Private Sub Command3_Click()Picture1.DrawWidth = 1Dim X01 As Single '圆心相对圆弧交接点坐标Dim Y01 As SingleDim X02 As SingleDim Y02 As SingleDim Xl1 As Single '圆弧在交接点处的方向矢量Dim Yl1 As SingleDim Xl2 As SingleDim Yl2 As SingleX01 = X0 + I1 - X1Y01 = Y0 + J1 - Y1X02 = I2Y02 = J2Xl1 = -Y01 / R1Yl1 = X01 / R1Xl2 = -Y02 / R2Yl2 = X02 / R2Dim Cases As SingleDim Xs1 As Single '转接点坐标Dim Ys1 As SingleDim Xs2 As SingleDim Ys2 As SingleDim Xs3 As SingleDim Ys3 As SingleDim Xs4 As SingleDim Ys4 As SingleDim Xl As Single '书上公式中的变量Dim Yl As SingleDim D1 As SingleDim D2 As SingleDim Fs As SingleDim k As Single '中间变量Dim s As SingleDim Ss As SingleDim Mmx As SingleDim Mmy As SingleDim Mma As SingleDim Flag1 As BooleanDim Flag2 As BooleanDim tt As Single '中间变量Cases = Sgn(r) * (Yl2 * Xl1 - Xl2 * Yl1)If Cases > 0 Then'======================================缩短型====================================== 'MATLAB中得到的两圆交点公式k = (R1 ^ 2 + 4 * R1 * r + 2 * R1 * R2 - OY2 ^ 2 - OX1 ^ 2 - OY1 ^ 2 - OX2 ^ 2 + 4 * R2 * r + 2 * OY1 * OY2 + R2 ^ 2 + 4 * r ^ 2 + 2 * OX2 * OX1)s = (-OY2 ^ 2 - OY1 ^ 2 + 2 * OY1 * OY2 + 2 * OX2 * OX1 - 2 * R1 * R2 + R1 ^ 2 + R2 ^ 2 - OX1 ^ 2 - OX2 ^ 2)Ss = -2 * OY2 * OY1 * OX2 ^ 2 + OX2 ^ 2 * OY2 ^ 2 + OY1 * (-(OX1 - OX2) ^ 2 * (-OY2 ^ 2 - OY1 ^ 2 + 2 * OY1 * OY2 + 2 * OX2 * OX1 - 2 * R1 * R2 + R1 ^ 2 + R2 ^ 2 - OX1 ^ 2 - OX2 ^ 2) * (R1 ^ 2 + 4 * R1 * r + 2 * R1 * R2 - OY2 ^ 2 - OX1 ^ 2 - OY1 ^ 2 - OX2 ^ 2 + 4 * R2 * r + 2 * OY1 * OY2 + R2 ^ 2 + 4 * r ^ 2 + 2 * OX2 * OX1)) ^ (1 / 2) + 2 * OY2 * OX1 ^ 2 * OY1 + 2 * OX2 * OX1 * R2 ^ 2 - 2 * OX2 * OX1 * R1 ^ 2 - 2 * OX2 ^ 2 * R2 * r + 2 * R1 * r * OX2 ^ 2 - 2 * OX1 ^ 2 * R2 * r + 2 * OX1 ^ 2 * R1 * r - 4 * OX2 * OX1 * R1 * r + 4 * OX2 * OX1 * R2 * r + R1 ^ 2 * OX1 ^ 2 + R1 ^ 2 * OX2 ^ 2 - OX1 ^ 2 * OY1 ^ 2 - OX1 ^ 2 * R2 ^ 2 - OX1 ^ 2 * OY2 ^ 2 + OY1 ^ 2 * OX2 ^ 2 - R2 ^ 2 * OX2 ^ 2 - OX1 ^ 4 + OX2 ^ 4 + 2 * OX2 * OX1 ^ 3 - 2 * OX2 ^ 3 * OX1 - OY2 * (-(OX1 - OX2) ^ 2 * s * k) ^ (1 / 2)Mmx = -1 / 2 * Ss / (-2 * OX2 * OX1 - 2 * OY1 * OY2 + OX1 ^ 2 + OY1 ^ 2 + OX2 ^ 2 + OY2 ^ 2) / (OX1 - OX2)Mmy = -1 / 2 * (-R1 ^ 2 * OY2 - OY1 ^ 3 - OX1 ^ 2 * OY2 + 2 * OY2 * R2 * r + 2 * OX2 * OX1 * OY1 + 2 * OX2 * OX1 * OY2 - 2 * OY2 * R1 * r - 2 * OY1 * R2 * r + 2 * OY1 * R1 * r + R1 ^ 2 * OY1 - OY1 * OX2 ^ 2 - OX1 ^ 2 * OY1 + OY1 ^ 2 * OY2 - OY1 * R2 ^ 2 - OY2 * OX2 ^ 2 + OY1 * OY2 ^ 2 + OY2 * R2 ^ 2 - OY2 ^ 3 - (-(OX1 - OX2) ^ 2 * (-OY2 ^ 2 - OY1 ^ 2 + 2 * OY1 * OY2 + 2 * OX2 * OX1 - 2 * R1 * R2 + R1 ^ 2 + R2 ^ 2 - OX1 ^ 2 - OX2 ^ 2) * (R1 ^ 2 + 4 * R1 * r + 2 * R1 * R2 - OY2 ^ 2 - OX1 ^ 2 - OY1 ^ 2 - OX2 ^ 2 + 4 * R2 * r + 2 * OY1 * OY2 + R2 ^ 2 + 4 * r ^ 2 + 2 * OX2 * OX1)) ^ (1 / 2)) / (-2 * OX2 * OX1 - 2 * OY1 * OY2 + OX1 ^ 2 + OY1 ^ 2 + OX2 ^ 2 + OY2 ^ 2)Xx1 = Mmx - OX1Yy1 = Mmy - OY1Mma = hudu(Xx1, Yy1)If End1 < Start1 Then '判断该点是否满足第一段圆弧If Mma < Start1 And Mma > End1 ThenFlag1 = FalseElseFlag1 = TrueEnd IfElseIf Mma > Start1 And Mma < End1 ThenFlag1 = TrueElseFlag1 = FalseEnd IfEnd IfXx1 = Mmx - OX2Yy1 = Mmy - OY2Mma = hudu(Xx1, Yy1)If End2 < Start2 Then '判断该点是否满足第二段圆弧If Mma < Start2 And Mma > End2 ThenFlag2 = FalseElseFlag2 = TrueEnd IfElseIf Mma > Start2 And Mma < End2 ThenFlag2 = TrueElseFlag2 = FalseEnd IfEnd IfIf Flag1 And Flag2 Then '判断得到的点是否满足条件Xs1 = MmxYs1 = MmyEnd Ifk = R1 ^ 2 + 4 * R1 * r + 2 * R1 * R2 - OY2 ^ 2 - OX1 ^ 2 - OY1 ^ 2 - OX2 ^ 2 + 4 * R2 * r + 2 * OY1 * OY2 + R2 ^ 2 + 4 * r ^ 2 + 2 * OX2 * OX1s = -(OX1 - OX2) ^ 2 * (-OY2 ^ 2 - OY1 ^ 2 + 2 * OY1 * OY2 + 2 * OX2 * OX1 - 2 * R1 * R2 + R1 ^ 2 + R2 ^ 2 - OX1 ^ 2 - OX2 ^ 2)Ss = (-2 * OY2 * OY1 * OX2 ^ 2 + OX2 ^ 2 * OY2 ^ 2 - OY1 * (-(OX1 - OX2) ^ 2 * (-OY2 ^ 2 - OY1 ^ 2 + 2 * OY1 * OY2 + 2 * OX2 * OX1 - 2 * R1 * R2 + R1 ^ 2 + R2 ^ 2 - OX1 ^ 2 - OX2 ^ 2) * (R1 ^ 2 + 4 * R1 * r + 2 * R1 * R2 - OY2 ^ 2 - OX1 ^ 2 - OY1 ^ 2 - OX2 ^ 2 + 4 * R2 * r + 2 * OY1 * OY2 + R2 ^ 2 + 4 * r ^ 2 + 2 * OX2 * OX1)) ^ (1 / 2) + 2 * OY2 * OX1 ^ 2 * OY1 + 2 * OX2 * OX1 * R2 ^ 2 - 2 * OX2 * OX1 * R1 ^ 2 - 2 * OX2 ^ 2 * R2 * r + 2 * R1 * r * OX2 ^ 2 - 2 * OX1 ^ 2 * R2 * r + 2 * OX1 ^ 2 * R1 * r - 4 * OX2 * OX1 * R1 * r + 4 * OX2 * OX1 * R2 * r + R1 ^ 2 * OX1 ^ 2 + R1 ^ 2 * OX2 ^ 2 - OX1 ^ 2 * OY1 ^ 2 - OX1 ^ 2 * R2 ^ 2 - OX1 ^ 2 * OY2 ^ 2 + OY1 ^ 2 * OX2 ^ 2 - R2 ^ 2 * OX2 ^ 2 - OX1 ^ 4 + OX2 ^ 4 + 2 * OX2 * OX1 ^ 3 - 2 * OX2 ^ 3 * OX1 + OY2 * (s * k) ^ (1 / 2))Mmx = -1 / 2 * Ss / (-2 * OX2 * OX1 - 2 * OY1 * OY2 + OX1 ^ 2 + OY1 ^ 2 + OX2 ^ 2 + OY2 ^ 2) / (OX1 - OX2)Mmy = -1 / 2 * (-R1 ^ 2 * OY2 - OY1 ^ 3 - OX1 ^ 2 * OY2 + 2 * OY2 * R2 * r + 2 * OX2 * OX1 * OY1 + 2 * OX2 * OX1 * OY2 - 2 * OY2 * R1 * r - 2 * OY1 * R2 * r + 2 * OY1 * R1 * r + R1 ^ 2 * OY1 - OY1 * OX2 ^ 2 - OX1 ^ 2 * OY1 + OY1 ^ 2 * OY2 - OY1 * R2 ^ 2 - OY2 * OX2 ^ 2 + OY1 * OY2 ^ 2 + OY2 * R2 ^ 2 - OY2 ^ 3 + (-(OX1 - OX2) ^ 2 * (-OY2 ^ 2 - OY1 ^ 2 + 2 * OY1 * OY2 + 2 * OX2 * OX1 - 2 * R1 * R2 + R1 ^ 2 + R2 ^ 2 - OX1 ^ 2 - OX2 ^ 2) * (R1 ^ 2 + 4 * R1 * r + 2 * R1 * R2 - OY2 ^ 2 - OX1 ^ 2 - OY1 ^ 2 - OX2 ^ 2 + 4 * R2 * r + 2 * OY1 * OY2 + R2 ^ 2 + 4 * r ^ 2 + 2 * OX2 * OX1)) ^ (1 / 2)) / (-2 * OX2 * OX1 - 2 * OY1 * OY2 + OX1 ^ 2 + OY1 ^ 2 + OX2 ^ 2 + OY2 ^ 2)Xx1 = Mmx - OX1Yy1 = Mmy - OY1Mma = hudu(Xx1, Yy1)If End1 < Start1 Then '判断该点是否满足第一段圆弧If Mma < Start1 And Mma > End1 ThenFlag1 = FalseElseFlag1 = TrueEnd IfElseIf Mma > Start1 And Mma < End1 ThenFlag1 = TrueElseFlag1 = FalseEnd IfEnd IfXx1 = Mmx - OX2Yy1 = Mmy - OY2Mma = hudu(Xx1, Yy1)If End2 < Start2 Then '判断该点是否满足第二段圆弧If Mma < Start2 And Mma > End2 ThenFlag2 = FalseElseFlag2 = TrueEnd IfElseIf Mma > Start2 And Mma < End2 ThenFlag2 = TrueElseFlag2 = FalseEnd IfEnd IfIf Flag1 And Flag2 Then '判断得到的点是否满足条件Xs1 = MmxYs1 = MmyEnd IfPicture1.DrawWidth = 3 '线宽Picture1.PSet (Xs1, Ys1) '画点Picture1.Print "(" & Xs1 & "," & Ys1 & ")" '打印坐标Picture1.DrawWidth = 1 '线宽' '---------------------------------画刀补轨迹--------------------------------- Xx1 = -I1Yy1 = -J1Start1 = hudu(Xx1, Yy1)Xx1 = Xs1 - OX1Yy1 = Ys1 - OY1End1 = hudu(Xx1, Yy1)If Option1.Value Thentt = Start1Start1 = End1End1 = ttEnd IfIf End1 < Start1 Then '画第一段圆弧Picture1.Circle (OX1, OY1), Abs(R1 + r), vbGreen, Start1, 2 * Pi, 624 / 697Picture1.Circle (OX1, OY1), Abs(R1 + r), vbGreen, 0, End1, 624 / 697 ElsePicture1.Circle (OX1, OY1), Abs(R1 + r), vbGreen, Start1, End1, 624 / 697 End IfXx1 = Xs1 - X1 - I2Yy1 = Ys1 - Y1 - J2Start2 = hudu(Xx1, Yy1)Xx1 = X2 - OX2Yy1 = Y2 - OY2End2 = hudu(Xx1, Yy1)If Option3.Value Thentt = Start2Start2 = End2End2 = ttEnd IfIf End2 < Start2 Then '画第二段圆弧Picture1.Circle (OX2, OY2), Abs(R2 + r), vbGreen, Start2, 2 * Pi, 624 / 697Picture1.Circle (OX2, OY2), Abs(R2 + r), vbGreen, 0, End2, 624 / 697ElsePicture1.Circle (OX2, OY2), Abs(R2 + r), vbGreen, Start2, End2, 624 / 697End IfElseIf Yl2 * Yl1 + Xl2 * Xl1 >= 0 Then'======================================伸长型====================================== Xs1 = X1 - r * Yl1Ys1 = Y1 + r * Xl1Xs2 = X1 + (Xl2 - Xl1) * r / (Xl1 * Yl2 - Xl2 * Yl1)Ys2 = Y1 + (Yl2 - Yl1) * r / (Xl1 * Yl2 - Xl2 * Yl1)Xs3 = X1 - r * Yl2Ys3 = Y1 + r * Xl2If End1 < Start1 Then '画第一段圆弧Picture1.Circle (OX1, OY1), Abs(R1 + r), vbGreen, Start1, 2 * Pi, 624 / 697Picture1.Circle (OX1, OY1), Abs(R1 + r), vbGreen, 0, End1, 624 / 697ElsePicture1.Circle (OX1, OY1), Abs(R1 + r), vbGreen, Start1, End1, 624 / 697End IfIf End2 < Start2 Then '画第二段圆弧Picture1.Circle (OX2, OY2), Abs(R2 + r), vbGreen, Start2, 2 * Pi, 624 / 697Picture1.Circle (OX2, OY2), Abs(R2 + r), vbGreen, 0, End2, 624 / 697ElsePicture1.Circle (OX2, OY2), Abs(R2 + r), vbGreen, Start2, End2, 624 / 697End IfPicture1.Line (Xs1, Ys1)-(Xs2, Ys2), vbGreen '画两段直线Picture1.Line (Xs2, Ys2)-(Xs3, Ys3), vbGreenPicture1.DrawWidth = 3 '线宽Picture1.PSet (Xs1, Ys1) '画点Picture1.Print "(" & Xs1 & "," & Ys1 & ")" '打印坐标值Picture1.PSet (Xs2, Ys2)Picture1.Print "(" & Xs2 & "," & Ys2 & ")"Picture1.PSet (Xs3, Ys3)Picture1.Print "(" & Xs3 & "," & Ys3 & ")"Else'======================================插入型====================================== Xs1 = X1 - r * Yl1Ys1 = Y1 + r * Xl1Xs2 = Xs1 + Abs(r) * Xl1Ys2 = Ys1 + Abs(r) * Yl1Xs3 = X1 - r * Yl2 - Abs(r) * Xl2Ys3 = Y1 + r * Xl2 - Abs(r) * Yl2Xs4 = X1 - r * Yl2Ys4 = Y1 + r * Xl2If End1 < Start1 Then '画第一段圆弧Picture1.Circle (OX1, OY1), Abs(R1 + r), vbGreen, Start1, 2 * Pi, 624 / 697Picture1.Circle (OX1, OY1), Abs(R1 + r), vbGreen, 0, End1, 624 / 697ElsePicture1.Circle (OX1, OY1), Abs(R1 + r), vbGreen, Start1, End1, 624 / 697End IfIf End2 < Start2 Then '画第二段圆弧Picture1.Circle (OX2, OY2), Abs(R2 + r), vbGreen, Start2, 2 * Pi, 624 / 697Picture1.Circle (OX2, OY2), Abs(R2 + r), vbGreen, 0, End2, 624 / 697ElsePicture1.Circle (OX2, OY2), Abs(R2 + r), vbGreen, Start2, End2, 624 / 697End IfPicture1.Line (Xs1, Ys1)-(Xs2, Ys2), vbGreen '画三段直线Picture1.Line (Xs2, Ys2)-(Xs3, Ys3), vbGreenPicture1.Line (Xs3, Ys3)-(Xs4, Ys4), vbGreenPicture1.DrawWidth = 3Picture1.PSet (Xs1, Ys1)Picture1.Print "(" & Xs1 & "," & Ys1 & ")"Picture1.PSet (Xs2, Ys2)Picture1.Print "(" & Xs2 & "," & Ys2 & ")"Picture1.PSet (Xs3, Ys3)Picture1.Print "(" & Xs3 & "," & Ys3 & ")"Picture1.PSet (Xs4, Ys4)Picture1.Print "(" & Xs4 & "," & Ys4 & ")"End IfEnd IfEnd SubPrivate Sub Form_Load()Command1.Enabled = TrueCommand2.Enabled = TrueCommand3.Enabled = TrueEnd Sub。
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 )。
VB界面:直线插补和圆弧插补的程序代码:Dim x1%, y1%, x2%, y2%, p!Dim Di As IntegerConst PI = 3.14159Private Sub cmdShow_Click()x1 = V al(Text1(0)): y1 = V al(Text1(1)) x2 = V al(Text1(2)): y2 = V al(Text1(3)) pic.Clsaxis picp = V al(Combo1.Text)cmdShow.Enabled = FalseIf Option1.V alue Thenpic.Circle (x1, y1), 0.1, vbBlackpic.Circle (x2, y2), 0.1, vbBlackzhixian pic, x1, y1, x2, y2ElseIf Option2.V alue Thenpic.Circle (x1, y1), 0.1, vbBlackpic.Circle (x2, y2), 0.1, vbBlackIf x1 ^ 2 + y1 ^ 2 = x2 ^ 2 + y2 ^ 2 Thenyuanhu pic, x1, y1, x2, y2ElseMsgBox "ERROR!请重新输入!", vbCritical End IfEnd IfcmdShow.Enabled = TrueEnd SubPrivate Sub zhixian(obj As Object, xi%, yi%, xj%, yj%) Dim x!, y!f = 0x = xi: y = yiobj.Line (xi, yi)-(xj, yj), vbBlackobj.CurrentX = xobj.CurrentY = yn = (Abs(xj - xi) + Abs(yj - yi)) / pWhile n <> 0If f >= 0 ThenIf xj <> xi Thenx = x + (xj - xi) / Abs(xj - xi) * pElsey = y + (yj - yi) / Abs(yj - yi) * pEnd Iff = f - Abs(yj - yi)ElseIf yj <> yi Theny = y + (yj - yi) / Abs(yj - yi) * pEnd Iff = f + Abs(xj - xi)End Ifobj.Line -(x, y), vbRedn = n - 1DoEventsFor i = 1 To 2000000 * pNext iWendEnd SubPrivate Sub Form_Load()If App.PrevInstance Then EndCombo1.Text = Combo1.List(6)pic.Height = 460pic.Width = 460pic.Scale (-12, 12)-(12, -12)axis picEnd SubPrivate Sub axis(obj As Object)obj.Line (-obj.ScaleWidth / 2 + 0.5, 0)-(obj.ScaleWidth / 2 - 0.5, 0) obj.Line -(obj.ScaleWidth / 2 - 1, 0.2)obj.Line (obj.ScaleWidth / 2 - 0.5, 0)-(obj.ScaleWidth / 2 - 1, -0.2) obj.Line (0, obj.ScaleHeight / 2 + 0.5)-(0, -obj.ScaleHeight / 2 - 0.5) obj.Line -(-0.2, -obj.ScaleHeight / 2 - 1)obj.Line (0, -obj.ScaleHeight / 2 - 0.5)-(0.2, -obj.ScaleHeight / 2 - 1) obj.Font.Size = 9For cx = -10 To 10 Step 1obj.Line (cx, 0)-(cx, 0.2)If cx <> 0 Thenobj.CurrentX = cx - 0.3obj.CurrentY = -0.2obj.Print cxEnd IfNextFor cy = -10 To 10 Step 1obj.Line (0, cy)-(0.2, cy)If cy <> 0 Thenobj.CurrentX = -0.8obj.CurrentY = cy + 0.2obj.Print cyEnd IfNextobj.CurrentX = -0.5obj.CurrentY = -0.2obj.Font.Size = 9obj.Print "O"End SubPrivate Sub yuanhu(obj As Object, xi%, yi%, xj%, yj%)n = Abs(xj - xi) + Abs(yj - yi): n = n / pf = 0r = Sqr(xi ^ 2 + yi ^ 2)If xi <> 0 ThenstartP = Atn(yi / xi)ElsestartP = PI / 2End IfIf xj <> 0 ThenendP = Atn(yj / xj)ElseendP = PI / 2End IfIf xi <= xj ThenDi = -1obj.Circle (0, 0), r, vbBlack, endP, startPElseDi = 1obj.Circle (0, 0), r, vbBlack, startP, endPEnd Ifobj.CurrentX = xiobj.CurrentY = yix = xi: y = yiWhile n <> 0If f * Di > 0 Thenf = f - 2 * x * Di + px = x - p * DiElseIf f * Di < 0 Thenf = f + 2 * y * Di + py = y + p * DiElseIf f * Di = 0 ThenIf Di = 1 Thenf = f + 2 * y * Di + py = y + pElsef = f - 2 * x * Di + px = x - p * DiEnd IfEnd Ifn = n - 1obj.Line -(x, y), vbRedDoEventsFor i = 1 To 2000000 * pNext iWendEnd SubPrivate Sub Text1_Change(Index As Integer)If Abs(V al(Text1(Index).Text)) > 10 ThenMsgBox "输入数值过大,屏幕内不能完全显示!"Text1(Index).Text = ""End IfIf Left(Text1(Index), 1) = "0" And Len(Text1(Index)) = 2 ThenText1(Index) = Right(Text1(Index), 1)End IfIf Right(Text1(Index), 1) = "-" And Len(Text1(Index)) = 2 Then Text1(Index) = Left(Text1(Index), 1)End IfEnd SubPrivate Sub Text1_KeyPress(Index As Integer, KeyAscii As Integer) If (KeyAscii < 48 Or KeyAscii > 57) And KeyAscii <> 45 _ And KeyAscii <> 8 ThenKeyAscii = 0End IfEnd Sub演示效果:。
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 & " " & 1 & " " & j - 1ElseIf F >= m And G < m Thenl = l + 1F = F - mPrint " "; n & " " & F & " " & 1 & " " & G & " " & 0 & " " & j - 1Picture1.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。