1、1.引言零件加工时,刀具切削运动轨迹直接影响零件的加工质量及加工成本。零件数控(NC)加工刀具运动轨迹的计算机仿真设计,对于保证零件的加工质量,减少机床误操作,无疑具有十分重要的意义。本文介绍了一种基于PC机和Windows操作系统开发的数控加工仿真软件的方案和实现方法。操作人员在利用数控机床实际加工零件之前,先用该系统进行模拟操作,通过计算机屏幕可清晰地看到所编辑的加工程序的加工过程和刀具的运动轨迹,并可方便地修改加工程序。对新产品的开发、安全生产提高生产效率及降低废品率都具有十分重要的现实意义。 CNC装置的优点: 1.具有灵活性和通用性 CNC装置的功能大多由软件实现,且软硬件采用模块化
2、的结构,对设计和开发者而言, 系统功能的修改、扩充变得较为灵活。 CNC装置其基本配置部分是通用的,不同的数控机床仅配置相应的特定的功能模块,以实现特定的控制功能。2. 数控功能丰富 插补功能:二次曲线、样条、空间曲面等插补 补偿功能:运动精度、随机误差补偿、非线性误 差补偿等 人机对话功能:加工的动、静态跟踪显示,高级人机对话窗口 编程功能:G代码、蓝图编程、部分自动编程功能。3. 使用维护方便 操作使用方便:用户只需根据菜单的提示,便可进行正确操作。 编程方便:具有多种编程的功能、程序自动校验和模拟仿真功能。 维护维修方便:部分日常维护工作自动进行(润滑,关键部件的定期检查等),数控机床的
3、自诊断功能,可迅速实现故障准确定位。2.算法及原理插补模块:CNC仿真系统的插补主要包括直线插补和圆弧插补。由于设计要求简易数控机床,因此采取脉冲增量插补(逐点比较法插补)。 逐点比较法是脉冲增量算法最典型的代表,是一种最早的插补算法,该法的原理:CNC细工在控制的过程中,能逐点地计算和判别运动轨迹与给定轨迹的偏差,并根据偏差控制进给轴向给定轮廓靠近,缩小偏差,使加工轮廓逼近给定轮廓。 逐点比较法使以折线来逼近直线或圆弧曲线的,它与规定的直线或圆弧之间的最大误差不超过一个脉冲当量Pulse,因此,只要将脉冲当量取得够小,就可达到加工精度的要求。2. 1直线插补模块:2.1.1直线插补偏差计算公
4、式假设加工如图 所示直线OA,取直线起点为坐标原点,直线终点坐标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,直到为零,停止
5、插补,到达终点。2.1.3其它象限的直线插补计算 其它象限其实与第一象限或关于原心对称或关于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,设圆弧的圆心
6、在原点,并已知圆弧的起点A(Xo,Yo),终点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.
7、2.2终点判断的方法在绘图的过程中,不断地比较动点与终点的距离,当其距离小于脉冲当量时,在误差允许的范围达到终点。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指
8、令判断以执行相应的插补N单个插补完成?YN一行指令结束?YN全部指令结束YTimer2()停止插补图7时钟控制插补流程图2. 4读指令模块在CNC数控仿真系统里面,对程序窗口中的NC代码逐个字符读入,并判断。设一指针对代码字符串进行移位操作。但此字符为”G” ”M”,则调用读数字子过程将数字读入并保存在定义的指令寄存器中。继续读取字符,当为”X” ”Y” “Z” ”I” “J”是同样操作,并作适当判断,根据指令寄存器中的指令调用相应的插补子过程。程序流程图如下:NC代码取字符“G” ?调读数字子过程“X”?指令寄存器指针取G01画直线指针结束?结束其他指令其他字符NY 图8 读指令模块程序流程
9、图3.程序设计过程3.1 软件简介3.1.1 开发工具的选择以Visual Basic6.0 (VB6.0)作为开发平台。VB具有友好的用户界面,容易上手,类似傻瓜式,简单易用,是面向对象的可视化设计工具,在解决加工仿真方面VB提供了直接有效的可视化途径,因此选用VB为开发工具。3.12 软件设计原则及进度规划1. 软件要求使用方便,操作灵活,界面友好,美观,清晰。另外要求接口明确,可拓展性强.,兼容性好。2. 划分模块并行进行,分阶段串行实施计划。尽量把软件做完善,减少软件运行的各种问题及隐藏的漏洞。31.3 数控仿真系统主要特点 CNC1.0脉冲仿真系统的工作原理:以脉冲增量插补为核心,对
10、零件NC加工代码进行模拟加工,进行实时控制。CNC1.0可实现简单的零件平面轮廓加工还可以打印程序或图形,便于工作人员的交流。CNC1.0界面清晰友好,操作简易。3.2.主界面简介图9 运行界面如图所示,程序主界面由如下几个部分组成:菜单工具栏、快捷键、NC代码输入框、坐标值实时显示框、工作状态框、冷却状态框、NC模拟框等等。其中,工具栏菜单依次为:文件、编辑、运行、关于,工作状态框显示了主轴的转速及转向、脉冲响应状态框显示了步进电机X电机、Y电机的转向。NC代码在NC代码输入框输入,根据NC代码在NC模拟框进行模拟加工。该系统人机界面友好,动态模拟刀具轨迹,材料去除过程的同时,还可逐条显示当
11、前正在仿真的数控程序代码,这样当出现问题时,用户可以一目了然地发现到底是哪一行代码出现了错误,可以及时作出修改。3.3.NC代码格式在NC代码输入框(如下图),开头必须要有程序开始符“%”、,结尾同样以结束符“%”结束。指令符(G、M)可以是大写也可以是小写,指令间允许有空格。 输入圆心时只能用IJ指令, R指令不能识别, 另外, 在同一行中不可输入两条M指令。输入代码的时候可以直接输入代码,如图所显示,也可以从电脑里调用NC代码程序,方法是点击上方菜单栏中的文件按钮,然后点击打开,找到自己所需要运行的NC程序,输入点击运行即可,如图b所显示。 图10 代码窗口 3.4.参数设定界面图 如图3
12、3所示,在此界面,根据需要可以选择脉冲当量(单位为毫米mm)以及图形的放大倍数,以便显示。 图11 参数设置窗口3.5.状态显示窗口 状态显示窗口可以根据NC程序实时显示坐标值,主轴状态和各轴的脉冲响应状态,和NC模拟诓一起显示仿真状态.通过状态显示窗口实时了解系统的运行情况。 如图34所示 图12 状态显示窗口4、应用实例(1) 、NC程序,由于本程序支持的NC指令有限,未能支持圆弧差补中辨认半径R,故相关NC程序都转换为I,J%N00 G90 G54 M08 M03 N02 G00 X0 Y0N03 G00 X62 Y-30N04 G01 X62 Y6N05 G03 X0 Y68 I-62
13、 J0N06 G03 X-80 Y-12 I0 J-80N07 G03 X-50 Y-42 I30 J0N08 G03 X-38 Y-30 I0 J12N09 G01 X-38 Y-22N10 G02 X-28 Y-12 I10 J0N11 G01 X28 Y-12N12 G02 X38 Y-22 I0 J-10N13 G01 X38 Y-30N14 G03 X62 Y-30 I12 J0N15 M05 M09N16 M30%输入到NC代码框,运行后得下图: 图13 X-Y平面图图14 斜二轴测图(2)、设定工作坐标原点为(0,0,0),脉冲当量为2毫米,放大系数为0.7倍。输入一个简单的数控
14、代码如: 程序不变按快捷工具栏菜单中的“运行”选项。这时开始仿真,当所有程序后,仿真完成,结果如下:如图53所示图15 运行界面 5.设计小结技术领悟: 了解了数控技术的初步知识、数控编程、插补原理、计算机图形学的简单知识、VB编程等。心得体会: 首先得承认的是这个程序代码大部分是抄来的.其中有两个原因.一个是时间太紧.由于以前轻视了它,以至拖到考完试才去做.做了才知道这个设计不是一般的简单.另一个是能力问题.以前的VB知识早已忘得差不多了,以至要花几天时间去复习,但收效是甚微的.所以到做起来的时候就麻烦了,一边翻书一边想,头都转晕了. 但是我并不是简单的抄袭,我觉得自己还是有努力过的,也学到
15、了不少东西.我复习了VB的知识,还是学到东西的.其实以前学的时候实现的都是相对比较简单的功能,现在要用来实现数控仿真这个功能时,要运用的知识更多,把这些知识联系起来的时候,会发现自己更了解那些语法代码的用法.反过来巩固了自己对这些知识的掌握.当然,毫无疑问,对数控技术这个科目的知识来说,我得到的更多.那些直线,顺圆,逆圆的插补运算有了更深入的了解. 参考文献1数控技术 廖效果主编, 湖北科学技术出版社;221天学通Visual Basic 胡小江编,电子工业出版社;3Visual Basic程序设计教程 江志文,中山大学大学出版社;4Visual Basic6编程及实例分析教程 郑海春著,清华
16、大学出版社;5画法几何与机械制图 冯开平 左宗义于宁编,华南理工大学出版社。6机床设计手册第三分册程序附录: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 GM指令Dim movorder As String, conorder1 As String, conorder2 As String 移动,控制指令Dim cbstype As Integer 移动指
17、令类型Dim xpoint As Double, ypoint As Double 斜二轴测图坐标Dim xpp As Double, ypp As Double, zpp As Double X-Y平面图坐标Dim centi As Double, centj As Double 起点相对圆心坐标Public g54x As Double, g54y As Double, g54z As Double G54参数设置Public bei As Single 图形放大倍数Dim str As String 读入NC代码Dim prgline As Integer 运行行数Dim readnum
18、 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 start As Date, ending As Date 开始时间,结束时间Private Declare Sub DIO_Ou
19、tputByte 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 Toolbar1_ButtonClick(ByVal Button As MSComCtlLib.Button) On Error Resume Next Select Case Button.Key Case 新建 mn
20、uFileNew_Click Case 打开 mnuFileOpen_Click Case 保存 mnuFileSave_Click Case 剪切 mnuEditCut_Click Case 复制 mnuEditCopy_Click Case 粘贴 mnuEditPaste_Click Case 运行 mnurunrun_Click Case 暂停 mnurunpause_Click Case 停止 mnurunstop_Click End SelectEnd Sub新建Private Sub mnuFileNew_Click() fileframe.Caption = newnc.nc f
21、iletxt.Text = End Sub打开Private Sub mnuFileOpen_Click() Dim sfile As String On Error GoTo errhandler With dlgCommonDialog .DialogTitle = Open .CancelError = False .Filter = NC代码 (*.nc)|*.nc|所有文件 (*.*)|*.* .ShowOpen If Len(.FileName) = 0 Then Exit Sub End If sfile = .FileName End With openfile (sfile)
22、 fileframe.Caption = sfile Exit Suberrhandler: Exit SubEnd Sub打开文件Private Sub openfile(sfile As String)On Error Resume NextDim fso As New FileSystemObject, fill As File, ts As TextStreamDim s As StringSet fill = fso.GetFile(sfile)Set ts = fill.OpenAsTextStream(ForReading)s = ts.ReadAllfiletxt.Text =
23、 sts.CloseEnd Sub保存Private Sub mnuFileSave_Click()If filetxt.Text = Then Exit Sub 当文件框空时退出 Dim sfile As String If fileframe.Caption = 新文件 Then With dlgCommonDialog .DialogTitle = Save .CancelError = False .Filter = textfile (*.nc)|*.nc .ShowSave If Len(.FileName) = 0 Then Exit Sub End If sfile = .Fi
24、leName End With savefile (sfile) Else sfile = fileframe.Caption savefile (sfile) End IfEnd Sub保存文件Private Sub savefile(sfile As String)On Error Resume NextDim fso As New FileSystemObjectDim txtfileSet txtfile = fso.CreateTextFile(sfile, True)txtfile.Write (filetxt.Text)txtfile.CloseEnd Sub另存为Private
25、 Sub mnuFileSaveAs_Click()If filetxt.Text = Then Exit Sub 当文件框空时退出 Dim sfile As String With dlgCommonDialog .DialogTitle = Save As .CancelError = False .Filter = textfile (*.nc)|*.nc .ShowSave If Len(.FileName) = 0 Then Exit Sub End If sfile = .FileName End With savefile (sfile)End Sub退出Private Sub
26、mnuFileExit_Click() a = MsgBox(真的退出吗?, vbOKCancel, 退出) If a = vbOK Then EndEnd Sub清除Private Sub mnueditclear_Click()filetxt.Text = 清除文件框End Sub粘贴Private Sub mnuEditPaste_Click() On Error Resume Next filetxt.SelText = Clipboard.GetText Exit SubEnd Sub复制Private Sub mnuEditCopy_Click() On Error Resume
27、Next Clipboard.SetText filetxt.SelText Exit SubEnd Sub剪切Private Sub mnuEditCut_Click() On Error Resume Next Clipboard.SetText filetxt.SelText filetxt.SelText = vbNullString Exit SubEnd Sub参数设置Private Sub mnurunsetting_Click()Settings.ShowEnd Sub运行Private Sub mnurunrun_Click()start = Format(Now, hh:m
28、m:ss)Label22 = startIf pausecon = 1 Then 当暂停时为继续Timer1.Interval = 1Timer2.Interval = 1pausecon = 0ElseIf filetxt.Text = ThenMsgBox 请加载NC程序, vbOKOnly, 加载失败Exit SubElseEnd Ifstr = filetxt.TextX = 0: Y = 0: z = 60x1 = 0: y1 = 0: z1 = 60xpoint = 0: ypoint = 0gorder = : morder = movorder = : conorder1 =
29、: conorder2 = cbstype = 0centi = 0: centj = 0readnum = 0prgline = 0num = 0linez.Visible = Falselinep.Visible = TrueCall drawxyzxjText.Text = g54xyjText.Text = g54yzjText.Text = g54zbei = Settings.beit.Textpl = Settings.plt.Text * 10For i = 0 To 4 Step 2outdata(i).Text = 1Next iFor i = 1 To 7 Step 2o
30、utdata(i).Text = 0Next ioutdata(6).Text = 0zhuzt.Text = 关lengzt.Text = 关arimage.Top = 240Timer1.Enabled = TrueEnd IfEnd Sub暂停Private Sub mnurunpause_Click()Timer2.Interval = 0Timer1.Interval = 0pausecon = 1End Sub停止Private Sub mnurunstop_Click()Timer1.Enabled = FalseTimer2.Enabled = Falsearimage.Top
31、 = 280filetxt.SelStart = 0ending = Format(Now, hh:mm:ss)Label23 = endingDim time As Integertime = DateDiff(s, start, ending)End Sub画坐标Sub drawxyz()linez.Cls 斜二轴测图坐标linez.Scale (-700 / bei, 700 / bei)-(600 / bei, -600 / bei)linez.Line (0, 0)-(0, 650 / bei), QBColor(5)linez.Line (0, 650 / bei)-(-10 /
32、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 / bei, -10 / bei), QBColor(13)linez.Line (0, 0)-(650 / bei * 0.7071, -6
33、50 / 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.7071), QBColor(13)xlab.Caption = X: ylab.Caption = Y: zlab.Caption = Z: o
34、lab.Caption = 0linez.PSet (0, 600)linep.Cls 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)linep.Line (-10 / bei, 520 / bei)-(0, 550 / bei), QBColor(13)linep.Line (-5
35、50 / 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 = 0linep.PSet (0, 0)End Sub斜二轴测图,X-Y平面图转换Private Sub Option1_Click(Index As Integer)If
36、Index = 0 Thenlinez.Visible = Truelinep.Visible = FalseElselinez.Visible = Falselinep.Visible = TrueEnd IfEnd SubPrivate Sub Form_Load() 初始化Timer3.Interval = 1000 Me.Left = GetSetting(App.Title, Settings, MainLeft, 1000) Me.Top = GetSetting(App.Title, Settings, MainTop, 1000) Me.Width = GetSetting(A
37、pp.Title, Settings, MainWidth, 6500) Me.Height = GetSetting(App.Title, Settings, MainHeight, 6500) 读入设置 fileframe.Caption = newfile g54x = Settings.g54xt.Text 读入G54参数设置 g54y = Settings.g54yt.Text g54z = Settings.g54zt.Text bei = Settings.beit.Text pl = Settings.plt.Text * 10End SubPrivate Sub Form_Unload(Cancel As Integer) If Me.WindowState vbMinimized Then SaveSetting App.Title, Settings, MainLeft, Me.Left SaveSettin