1、一、课程设计的内容对于给定的一段NC代码,用VB或其他高级语言编写程序解释、插补,在PC机上仿真数控装置,进行图形描绘、坐标值显示、步进电机控制模拟显示及信号输出、冷却液和主轴开关量控制模拟显示及信号输出。二、课程设计的要求与数据具体要求如下:(1) NC代码中包含的代码类型有: G90 G54(G92) G00 G01 G02 G03 M03 M05 M08 M09 M30例:下面给出一个具体的图形示意图,NC代码及其加工轨迹图: 图1 工件平面图%O0000N106G0G90G54X10.Y20.M03M08N108Z50.N110Z10.N112G1Z-1.N114Y15.0N118G2
2、X15.Y13.09J7.5N120X20.Y15.I-5.0J5.59N122G1Y20.0N126X10.N128G0Z50.N130M5M09N136M30% (2)、要求根据NC代码屏幕模拟加工过程,图形显示位置,坐标值显示,辅助功能状态显示(冷却液和主轴开关量控制模拟显示)。 图2 加工仿真示意图(3)、PC机模拟加工过程中,要求有实时的驱动三轴步进电机的控制信号、控制冷却液和主轴转动的开关量输出控制信号。假设信号从计算机并行打印口的数据信号线输出,端口地址为0x378。并行口数据线分配如下(低电平有效): 表一 并行口数据线信号定义数据线信号D0D1D2D3D4D5D6D7定义Pu
3、lseXDirXPulseYDirYPulseZDirZ主轴控制信号冷却液控制信号三、课程设计应完成的工作每个学生应在规定时间内,独立完成所选题目。运用VB编程语言,编写计算机软件在WINDOWS实现数控装置的计算机仿真。要求清楚地分析问题、提出算法、确定人机界面、列出流程图,最后用程序验证,完成软件测试,并且提交程序说明书。对选择典型零件编程题目的学生,要求用编写计算机软件的方法解决数控过程的一个问题。可以任选用本人熟悉的一种编程语言,要求清楚地分析问题、提出算法、列出流程图,最后用程序验证,并且提交程序说明书。1.摘要从工程的角度来看,仿真就是通过对系统模型的实验去研究一个已有的或设计中的
4、系统,分析复杂的动态对象,仿真是一种有效的方法,可以减少风险,缩短设计和制造的周期并节约投资。计算机仿真就是借助计算机,利用系统模型对实际系统进行实验研究的过程。它随着计算机技术的发展而迅速地发展,在仿真中它有越来越重要的地位。计算机仿真技术的发展趋势主要表现在两个方面:应用领域的扩大和仿真计算机的智能化。计算机仿真技术不仅在传统的工程技术领域(航空、航天、化工等方面)继续发展,而且扩大到社会经济、生物等许多非工程领域,此外,并行处理、人工智能、知识库和专家系统等技术的发展正影响着仿真计算机的发展。数控加工仿真利用计算机来模拟实际的加工过程,是验证数控加工程序的可靠性和预测切削过程的有力工具,
5、以减少工件的试切,提高生产效率。仿真软件界面友好,基本实现了设计任务的要求,通过本软件可以知道在仿真加工刀具的坐标、各轴的工作情况以及辅助电机(冷却液的控制情况)本仿真程序应用的是脉冲插补算法。在仿真过程中应用了两种插补方法:直线插补,圆弧插补(包括顺时方向插补和逆时方向插补)。本仿真程序可以实现如下指令的判别和执行:G01,G02, G03, G04,G05,M05,M08 ,M09,M03,M30.在应用时,编程者只要按照本应用程序的要求输入程序,即可以实现所要求的加工过程的仿真过程。本程序能够判断所输入的程序的正确性,可以对程序进行编辑。本软件可以从平面和轴测两个视图同时观察仿真过程。2
6、.算法及原理插补模块:CNC仿真系统的插补主要包括直线插补和圆弧插补。由于设计要求简易数控机床,因此采取脉冲增量插补(逐点比较法插补)。 逐点比较法是脉冲增量算法最典型的代表,是一种最早的插补算法,该法的原理:CNC细工在控制的过程中,能逐点地计算和判别运动轨迹与给定轨迹的偏差,并根据偏差控制进给轴向给定轮廓靠近,缩小偏差,使加工轮廓逼近给定轮廓。 逐点比较法使以折线来逼近直线或圆弧曲线的,它与规定的直线或圆弧之间的最大误差不超过一个脉冲当量Pulse,因此,只要将脉冲当量取得够小,就可达到加工精度的要求。2. 1直线插补模块:2.1.1直线插补偏差计算公式假设加工如图 所示直线OA,取直线起
7、点为坐标原点,直线终点坐标A(Xe,Ye)为已知,即直线OA为给定轨迹。M(Xm,Ym)点为加工点(动点),向右插补。 若M点在直线OA上,根据平 Y K1 面几何关系得: K1K如图所示即: O X 图 1 直线偏差符号和进给方向 当K1K时,应向+Y方向走一步。走后新坐标为: Xm+1= Xm Ym+1=Ym+1 按上述公式循环判断下去,直到 Xm=Xe, Ym= Ye到达终点,停止插补,程序结束。2.1.2、终点判断的方法设置变量CountN减法计数器,在加工之前存入终点坐标值Xe 、Ye,X或Y坐标每进给一步时,就在计数器中、减去1,直到为零,停止插补,到达终点。2.1.3其它象限的直
8、线插补计算 其它象限其实与第一象限或关于原心对称或关于X轴对称,所以,只要作符合上的化,程序实现非常方便。 OXYABBBBK1Ky=+1K1Ky=1K1Ky=+1K1Ky=1K10 Y NXbxfYbyf Y N Y N XbxfXbxf Y N Y N x+x+y-yK1kK1k Y N Y Nx-y+x+yK1kK1k Y N Y +y-y-y+x是否运行完 N YEND 图3 直线插补流程图 2.1.5直线插补源代码 (见附录)2. 2 圆弧插补模块2.2.1圆弧插补偏差计算公式以第一象限逆圆为例介绍插补公式如图7所示,要加工圆弧AB,设圆弧的圆心在原点,并已知圆弧的起点A(Xo,Yo
9、),终点B(Xe,Ye),圆弧半径为R。加工动点M(Xm,Ym),RmRXYB(Xe,Ye)A(Xo,Yo)图4 第一象限逆圆弧M(Xm,Ym)它到圆心的距离为Rm。则有三种情况:当动点M在圆上有:当动点M在圆内有:当动点M在圆外有:因此,可定义圆弧偏差判别公式如下:若,应沿-X轴方向进给一步,到M+1点,YF(xm)0y= +F(xm)0x= F(xm)0y= F(xm)0x= F(xm)0x= +F(xm)0y= F(xm)0y= +F(xm)0x= +XO逆圆图5 逆圆插补示意图其坐标值为: 若,沿+Y轴方向进一步,到M+1点, 其 坐标值为: 2.2.2终点判断的方法在绘图的过程中,不
10、断地比较动点与终点的距离,当其距离小于脉冲当量时,在误差允许的范围达到终点。2.2.3其它象限的圆弧插补计算如图5所示,其它象限的圆弧或关于X轴对称、或关于X轴对称、或关于原心对称,完全可以按第一象限逆圆偏差公式进行计算,所不同的是将进给方向改变。2.2.4、圆弧插补流程图:起始F0,X0,Y0X0,Y0结束X(Y)= X(Y)-1+Y进给F=F+2Ym+1F=F-2Xm+1 +X进给F0X(Y)=0=NYNNYY 图6 圆弧插补流程图 3.2.5圆弧插补源代码 (见附录) 2.3时钟控制插补流程图Timer1()读数 终点等于起点时调用MXX()判断G指令判断以执行相应的插补N单个插补完成?
11、YN一行指令结束?YN全部指令结束YTimer2()停止插补图7时钟控制插补流程图2. 4读指令模块在CNC数控仿真系统里面,对程序窗口中的NC代码逐个字符读入,并判断。设一指针对代码字符串进行移位操作。但此字符为”G” ”M”,则调用读数字子过程将数字读入并保存在定义的指令寄存器中。继续读取字符,当为”X” ”Y” “Z” ”I” “J”是同样操作,并作适当判断,根据指令寄存器中的指令调用相应的插补子过程。程序流程图如下:NC代码取字符“G” ?调读数字子过程“X”?指令寄存器指针取G01画直线指针结束?结束其他指令其他字符NY 图8 读指令模块程序流程图3、程序源代码附录4.设计小结数控课
12、程设计是机电专业的一个重要的实践性环节,是对所学数控技术课程和其它有关课程知识和技能的一次综合性练习,旨在使我们的知识得以巩固、充实、系统化,并进一步扩展。课程设计是培养我们理论联系实际、解决生产实际问题的良好机会。通过对数控铣床典型部件的设计和零件编程的具体问题的解决,不仅使我们对CAD/CAM仿真软件有了更深刻的了解,还是我们编程能力有了很大的提高。通过这次的设计,使我们更加明白知识的联贯性、融合性、全面性以及交错性的重要所在,这也是设计目的所在。我们应该持有自我增值、自我发展的人生观。要领悟“学海无边苦作舟”的真谛。力争上游。 参考文献1机床设计手册第三分册2廖效果.数字控制机床.武汉:
13、华中理工大学出版社.1992.93廖效果.数控技术. 武汉:湖北科学技术出版社.2000.74刘又午.数字控制机床.北京:机械工业出版社5龚浦泉.机床电气控制.重庆:重庆大学出版社6谭浩强.Basic语言结构化程序设计教程.北京:中国科学技术出版社.19907杨林,李继良. Visual Basic编程高手.北京:北京大学出版社.20008一组专用凸轮的计算机辅助设计.机械工程师1998,(4): p58-599凸轮曲线的快速画法.机械工程师1998,(6): p22-2310平面凸轮机构CAD系统的研究与开发.机械设计与制造2000,(5):p12-1311圆柱非圆曲线槽凸轮的数控加工.制造
14、技术与机床2000,(8):p3412圆柱凸轮的参数化设计及数控加工.精密制造及自动化2001,11: p2813参数化凸轮轮廓转换及NC代码自动生成.机床与液压2001,6, p2931程序代码:Dim X As Double, Y As Double, z As Double X,Y,Z起点坐标Dim x1 As Double, y1 As Double, z1 As Double X,Y,Z终点坐标Dim gorder As String, morder As String, ornumber As Integer GM指令Dim movorder As String, conorder
15、1 As String, conorder2 As String 移动,控制令Dim cbstype As Integer 移动指令类型Dim xpoint As Double, ypoint As Double 轴测图坐标Dim xpp As Double, ypp As Double, zpp As Double 平面图坐标Dim centi As Double, centj As Double 圆心相对起点坐标Public getx As Double, gety As Double, getz As Double get参数设置Public bei As Integer 图形放大倍数D
16、im str As String 读入NC代码Dim prgline As Integer 运行行数Dim readnum As IntegerDim mm As Double 积分插补累加数Dim fm As Double 比较插补FMDim pl As Double 脉冲当量Dim Stepdl As IntegerDim xm As Double, ym As Double, zm As Double 动点X,Y,ZDim mx As Double, my As Double, mz As Integer 积分插补数Dim pausecon As Integer 暂停控制Dim xx()
17、 As Double, yy() As Double, zz() As Double 保存XYZ值Dim xx0() As Double, yy0() As Double, zz0() As DoubleDim xf0() As Double, yf0() As Double, zf0() As DoubleDim xf1() As Double, yf1() As Double, zf1() As DoubleDim movrou As IntegerDim mousex As Double, mousey As SinglePrivate Declare Sub DIO_OutputByt
18、e Lib d:/dio.dll (ByVal Address As Integer, ByVal DataOut As Integer)Private Declare Function DIO_InputByte Lib dio.dll (ByVal Address As Integer) As Integer并行口输入输出函数Private Sub Command3_Click() If pausecon = 1 Then 当暂停时为继续 Timer1.Interval = 1 Timer2.Interval = 1 pausecon = 0 Else If Text1.Text = Th
19、en MsgBox 请加载 NC 程序, vbOKOnly, 加载失败 Exit Sub Else ReDim xx(0), yy(0), zz(0) As DoubleReDim xx0(0), yy0(0), zz0(0) As DoubleReDim xf0(0) As Double, yf0(0) As Double, zf0(0) As DoubleReDim xf1(0) As Double, yf1(0) As Double, zf1(0) As Doublestr = Text1.Text X = 0: Y = 0: z = 60 x1 = 0: y1 = 0: z1 = 60
20、 xpoint = 0: ypoint = 0 gorder = : morder = movorder = : conorder1 = : conorder2 = cbstype = 0 centi = 0: centj = 0 readnum = 0 prgline = 0 num = 0 linez.Visible = True linep.Visible = True Let bei = 2.5 Call drawxyz pl = plt.Text pl = pl * 2 For i = 0 To 4 Step 2 outdata(i).Text = 1 Next i For i =
21、1 To 7 Step 2 outdata(i).Text = 0 Next i outdata(6).Text = 0 zhuzt.Text = 关 lengzt.Text = 关 Timer1.Enabled = True End If End If End SubPrivate Sub Comnew_Click()Dim fso As New FileSystemObjectDim myfile As TextStreamSet myfile = fso.CreateTextFile(filetext.txt, True)myfile.Write (Text1.Text)myfile.C
22、loseMsgBox (创建成功!)End SubPrivate Sub Comdele_Click()fso.DeleteFile (filetext.txt)MsgBox (删除成功!)Text1.Text = End SubPrivate Sub Compau_Click()Timer2.Interval = 0Timer1.Interval = 0pausecon = 1End SubPrivate Sub Comshezhi_Click()Form2.ShowEnd SubPrivate Sub Comstop_Click()Timer1.Enabled = FalseTimer2.
23、Enabled = Falselinep.Clslinez.ClsText1.SelStart = 0End SubPrivate Sub Dir1_Change()File1.Path = Dir1.PathEnd SubPrivate Sub Drive1_Change()Dir1.Path = Drive1.DriveEnd SubPrivate Sub File1_Click()Label1.Caption = The NC list: & ( & File1.Path & & File1.FileName & )End SubPrivate Sub File1_DblClick()D
24、im strTmp As StringPath = File1.Path & & File1.FileNameOpen Path For Input As #1Text1.Text = Do While Not EOF(1)Input #1, strTmpstrTmp = strTmp & vbCrLfText1.Text = Text1.Text & strTmpLoopClose #1End Sub画坐标Sub drawxyz() 斜二轴测图坐标 linez.Scale (-700 / bei, 700 / bei)-(600 / bei, -600 / bei) linez.Line (
25、0, 0)-(0, 650 / bei), QBColor(5) linez.Line (0, 650 / bei)-(-10 / bei, 620 / bei), QBColor(13) linez.Line (0, 650 / bei)-(10 / bei, 620 / bei), QBColor(13) linez.Line (0, 0)-(-650 / bei, 0), QBColor(13) linez.Line (-650 / bei, 0)-(-620 / bei, 10 / bei), QBColor(13) linez.Line (-650 / bei, 0)-(-620 /
26、 bei, -10 / bei), QBColor(13) linez.Line (0, 0)-(650 / bei * 0.7071, -650 / bei * 0.7071), QBColor(13) linez.Line (650 / bei * 0.7071, -650 / bei * 0.7071)-(620 / bei * 0.7071, -640 / bei * 0.7071), QBColor(13) linez.Line (650 / bei * 0.7071, -650 / bei * 0.7071)-(640 / bei * 0.7071, -620 / bei * 0.
27、7071), QBColor(13) xLab.Caption = X: yLab.Caption = Y: zLab.Caption = Z: olab.Caption = 0 linez.PSet (0, 600) X-Y 平面图坐标 linep.Scale (-600 / bei, 600 / bei)-(600 / bei, -600 / bei) linep.Line (0, 550 / bei)-(0, -550 / bei), QBColor(13) linep.Line (10 / bei, 520 / bei)-(0, 550 / bei), QBColor(13) line
28、p.Line (-10 / bei, 520 / bei)-(0, 550 / bei), QBColor(13) linep.Line (-550 / bei, 0)-(550 / bei, 0), QBColor(13) linep.Line (550 / bei, 0)-(520 / bei, 10 / bei), QBColor(13) linep.Line (550 / bei, 0)-(520 / bei, -10 / bei), QBColor(13) pxLab.Caption = X: pyLab.Caption = Y: poLab.Caption = 0 linep.PS
29、et (0, 0) End Sub 读入NC代码Private Sub Timer1_Timer()On Error Resume NextDim s As String, ms As String, ero As StringIf Mid(str, 1, 1) % Then ero = 没有开始符,结束符 & %: GoTo errsy检查有无开始符% Do 循环读入一行 s = Mid(str, readnum + 1, 1) If (s = g Or s = G) Then gorder = Do gorder = gorder + s readnum = readnum + 1 s =
30、 Mid(str, readnum + 1, 1) Loop While (Asc(s) = 48) Select Case (gorder) Case g00, G00, g0, G0 movorder = G00 移动指令为G00 Case g01, G01, g1, G1 movorder = G01 Case g02, G02, g2, G2 movorder = G02 Case g03, G03, g3, G3 movorder = G03 Case g54, G54 Case g90, G90 Case Else ero = G.: GoTo errsy End Select E
31、xit Sub End If 读入M代码 If (s = m Or s = M) Then morder = Do morder = morder + s readnum = readnum + 1 s = Mid$(str, readnum + 1, 1) Loop While (Asc(s) = 48) Select Case (morder) Case m03, M03, m3, M3 conorder1 = M03 Case m05, M05, m5, M5 conorder1 = M05 Case m08, M08, m8, M8 conorder2 = M08 Case m09,
32、M09, m9, M9 conorder2 = M09 Case m30, M30 Case Else ero = M. GoTo errsy End Select Exit Sub End If 读入X If (s = x Or s = X) Then ms = Do ms = ms + s readnum = readnum + 1 s = Mid$(str, readnum + 1, 1) Loop While (Asc(s) = 48) _ Or Asc(s) = 46 Or Asc(s) = 45 Or Asc(s) = 43) If Mid$(ms, 2, 9) = Then er
33、o = X.: GoTo errsy x1 = Val(Mid$(ms, 2, 9) Exit Sub End If 读入Y If (s = y Or s = Y) Then ms = Do ms = ms + s readnum = readnum + 1 s = Mid$(str, readnum + 1, 1) Loop While (Asc(s) = 48) _ Or Asc(s) = 46 Or Asc(s) = 45 Or Asc(s) = 43) If Mid$(ms, 2, 9) = Then ero = Y.: GoTo errsy y1 = Val(Mid$(ms, 2,
34、9) Exit Sub End If 读入Z If (s = z Or s = Z) Then ms = Do ms = ms + s readnum = readnum + 1 s = Mid$(str, readnum + 1, 1) Loop While (Asc(s) = 48) _ Or Asc(s) = 46 Or Asc(s) = 45 Or Asc(s) = 43) If Mid$(ms, 2, 9) = Then ero = Z.: GoTo errsy z1 = Val(Mid$(ms, 2, 9) Exit Sub End If 读入I If (s = i Or s = I) Then ms = Do ms = ms + s readnum = readnum + 1 s = Mid$(str, readnum + 1, 1) Loop While (Asc(s) = 48) _ Or Asc(s) = 46 Or Asc(s) = 45 Or Asc(s) = 43) If Mid$(ms, 2, 9) = Then ero = I.: GoTo errsy centi = Val(Mid$(ms, 2, 9) Exit Sub End If 读入J If (s = j Or s = J) Then ms = Do ms = ms +