從CAD數(shù)據(jù)到CNC加工代碼數(shù)控課程設計說明書_第1頁
從CAD數(shù)據(jù)到CNC加工代碼數(shù)控課程設計說明書_第2頁
從CAD數(shù)據(jù)到CNC加工代碼數(shù)控課程設計說明書_第3頁
從CAD數(shù)據(jù)到CNC加工代碼數(shù)控課程設計說明書_第4頁
從CAD數(shù)據(jù)到CNC加工代碼數(shù)控課程設計說明書_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

目錄1內容提要…………22前期準備…………22.1編程軟件的選擇……………22.2DXF文件的結構……………23數(shù)控系統(tǒng)軟件設計過程…………43.1、讀入DXF文件…………………53.2提取相關圓弧和直線的坐標信息……………63.3排序……………83.4顯示圖形………………………93.5生成數(shù)控代碼…………………143.6輔助功能………………………164軟件使用說明…………………184.1歡迎界面……………………184.2程序主界面……………………184.3功能演示………………………195設計總結…………216參考文獻…………217附錄………………221內容提要據(jù)有關資料統(tǒng)計:用手工編程時,一個零件的編程時間與其實際加工時間的平均比例約為30:1。而數(shù)控機床無法啟動進行加工的原因中,有20%-30%是由于加工程序不能及時編制出來造成的。由此可見,編程的自動化是當今制造業(yè)的一個必然的發(fā)展趨勢。所謂的自動編程,就是利用計算機專用軟件來編制數(shù)控加工程序,編程人員只需根據(jù)零件圖樣的要求,使用數(shù)控語言,由計算機自動地進行數(shù)值計算及后置處理,編寫出零件加工程序單。在很多制造領域,尤其在軍事工業(yè),航空航天工業(yè),微觀制造業(yè)等尖端科技領域,由于其產品往往具有科技含量高、結構復雜、精度高等特點,給手工編程造成了很大難度,甚至無法完成。為了縮短編程時間,減少人為失誤,編程后方便加工前的加工模擬,越來越多的常規(guī)制造領域業(yè)逐漸采用自動編程。因此,制造業(yè)界投入了越來越多的資源來進行自動編程技術的研究開發(fā),使其迅速的發(fā)展成熟起來。本次課程設計的目的就是設計一個可以將AutoCAD等計算機輔助設計軟件畫出的DXF圖形文件中的相關信息提取出,通過編程轉換成我們所需要的加工圖形,并生成數(shù)控代碼,實現(xiàn)自動編程目的軟件。2前期準備2.1編程軟件的選擇VisualBasic(VB)和VisualC++(VC)雖然都是可視化的高級編程語言,但是編寫相同程序時,VC的工作量一般要比VB高上很多,而且VC適用于大型的,復雜的,商用的程序,其學習難度也遠高與VB。VB是一種可視化的、面向對象和采用事件驅動方式的結構化高級程序設計語言,可用于開發(fā)Windows環(huán)境下的各類應用程序。它簡單、效率高,且功能強大。故選用用VisualBasic作為本次課程設計的編程軟件。2.2DXF文件的結構1、DXF文件簡介DXF是DrawingExchangeFormat的縮寫,是Autodesk公司開發(fā)的用于AutoCAD與其它軟件之間進行CAD數(shù)據(jù)交換的CAD數(shù)據(jù)文件格式。其擴展名是“.dxf”,是一種基于矢量的ASCII格式,在表現(xiàn)圖形的大小方面十分精確,由于它結構簡單、可讀性好,易于被其他程序處理,因此已是事實上的工業(yè)標準。目前,絕大多數(shù)CAD系統(tǒng)都能讀入或輸出DXF文件。2、DXF文件的組成一個完整的DXF文件由六大段組成,分別是:標題段(HEADERSection)類段(CLASSEDSection)表段(TABLESSection)塊段(BLOCKSSection)實體段(ENTITLESSection)對象段(OBJECTSSection)還有起始段和段終止標記以及文件結束標記。一般情況下,段的前后順序不能改變。六大段中與幾何圖形有關的幾何信息均包含在實體段中,實體段中的實體有:點,直線,圓,圓弧,折線,B樣條曲線,文本等。而我們只需要用到直線和圓弧。不同實體在DXF文件中的記錄要素不同,例如一條直線的幾何信息是直線的起點和終點坐標。通過分析DXF的文件結構和自動編程所需的信息,只掌握ENTITLES段就基本可以滿足繪圖和提取幾何圖形基本信息的要求。3、實體段(ENTITLESSection)該段定義了每個實體的種類,所在的圖層名,顏色,線形,厚度,實體描述字及有關幾何數(shù)據(jù),如直線(起點、終點),圓(層、圓心、半徑),圓弧(圓心、角度、起始坐標、終點坐標)。無論DXF中的哪一個段均由若干個組(Group)組成,每個組單元占兩行,第一行為組碼(GroupCodes),為整形的代碼,代表著改組組值的性質,第二行為組值(GroupValue),為具體的數(shù)值和代碼,兩者相結合標識出具體組值代表的意義。表1至表3是DXF直線、圓、圓弧組碼的功能說明表一:DXF中直線組碼的說明組碼說明100子類標記(AcDbLine)6線形(可選)10起點(在OCS中)DXF:X的值20,30DXF中Y,Z起點(在OCS中)的值11端點(OWCS中)DXF:X的值21,31DXF中Y,Z端點(在OCS中)的值表二:DXF中圓的組碼的說明組碼說明100子類標記(AcDbCircle)6線形(可選)10中心點(在OCS中)DXF:X的值20,30DXF中Y,Z中心點(在OCS中)的值40半徑210拉伸方向。默認值(0,0,1),DXF:X值220,230Y,Z的拉伸方向表三:DXF中圓弧組碼的說明組碼說明100子類標記(AcDbCircle)6線形(可選)10中心點(在OCS中)DXF:X的值20,30DXF中Y,Z中心點(在OCS中)的值40半徑100子類標記(AcDbArc)50起始角度51終點角度210拉伸方向。默認值(0,0,1),DXF:X值220,230Y,Z的拉伸方向由表可知,AcDbArc嵌套在AcDbCircl中,并且圓心、半徑的組碼與圓的都相同。但是圓與圓弧的提取并不會混淆,因為在ENTITLES段中每個實體定義的入口處組碼0的組值標示著實體類型,圓在入口處組碼的組值是CIRCLE,而圓弧是ARC,由此可區(qū)分提取。DXF文件中的組碼50,51給出的是圓弧起點與終點角度,而對于運動控制信息而言,需要的是圓弧起點與終點的坐標值。根據(jù)下式,將得到的是圓弧的所在坐標系下的兩個端點的坐標值。設圓心坐標為(X,Y),半徑為R,起始角為a,終止角為b,則可得到圓弧在所在坐標系下的起點坐標(X1,X三、數(shù)控系統(tǒng)軟件設計過程數(shù)控系統(tǒng)軟件的設計是本次課程設計的主要內容與核心部件,通過VisualBasic的編程功能,我們從DXF文件中提取出所需的組碼,并利用這些組碼顯示圖形,生成數(shù)控代碼。我們還考慮了刀補,加工方向以及起刀點的選擇。為了方便使用者操作,我們把這些功能通過人性化的界面表達,用戶只用進行一些簡單的操作,便可實現(xiàn)自動編程的功能。為了能夠清晰顯示圖像,界面包含原始狀態(tài)、最大化兩種情況。圖1虛線框內是整個軟件的功能的設計流程。其中,我和另外兩名同學需要做的是從讀入DXF文件,提取圓弧和直線信息并排序,最后顯示圖形(1-4步)。而我又在其中負責顯示圖形(第4步)工作。圖1數(shù)控系統(tǒng)軟件設計的流程圖3.1讀入DXF文件使用VB中的通用對話框控件,可以打開所需的DXF源文件,并按行讀取文件中的數(shù)據(jù)內容,具體程序如下:PrivateSubopenfile_Click()CallopenDXFfile_ClickEndSubPrivateSubopenDXFfile_Click()'打開文件TDXF=""CommonDialog1.filename=""CommonDialog1.ShowOpen'打開文件filename=CommonDialog1.filenameOnErrorGoTocancleopenj=0OpenfilenameForInputAs#1'按行讀取打開的文件順序讀取數(shù)據(jù)的內容DoWhileNotEOF(1)LineInput#1,saveDXFIfsaveDXF="AcDbCircle"OrsaveDXF="AcDbLine"Thenj=j+1EndIfTDXF=TDXF&saveDXF&"~"'保存文件信息Loopk=jReDimDXFline(1Tok),DXFcircle(1Tok),TEMPline(1Tok),TEMPcircle(1Tok),Common(1Tok),D(1Tok),TempCommon(1Tok),Taxis(1Tok)Close#1此程序可由openDXFfile子程序打開DXF文件并找出實體段中圓弧與直線的組碼,并計數(shù)。3.2提取相關圓弧和直線的信息由于剛才程序中,在圓弧和直線組碼開始處追加了“~”,方便了下面提取每段圓弧與直線信息的程序查找所需內容。strStart1=InStr(1,TDXF,"AcDbLine"&"~")'提取直線標志所在行strStart2=InStr(1,TDXF,"AcDbCircle"&"~")'提取圓弧標志所在行IfstrStart1>strStart2AndstrStart2<>0ThenstrStart=strStart2ElseIfstrStart1<>0ThenstrStart=strStart1ElsestrStart=strStart2EndIfstrEnd=InStr(strStart,TDXF,"ENDSEC"&"~")'提取直線和圓弧終點的幾何信息temp=Mid(TDXF,strStart,strEnd-strStart)'提取直線和圓弧的幾何信息sourse=Split(temp,"~")startPos=-1j=0DoWhilestartPos<>-2'提取直線和圓弧的幾何信息startPos=getStart(startPos)IfstartPos=-2ThenExitDoIfsourse(startPos)="AcDbLine"Thenj=j+1DXFline(j).SX=0DXFline(j).SY=0DXFline(j).EX=0DXFline(j).EY=0DXFline(j).SX=sourse(startPos+2)'拾取起點的X坐標DXFline(j).SY=sourse(startPos+4)'拾取起點的Y坐標DXFline(j).EX=sourse(startPos+8)'拾取終點的X坐標DXFline(j).EY=sourse(startPos+10)'拾取終點的Y坐標DXFline(j).Flag=TrueCommon(j).SX=DXFline(j).SXCommon(j).SY=DXFline(j).SYCommon(j).EX=DXFline(j).EXCommon(j).EY=DXFline(j).EYCommon(j).R=0Common(j).Flag=True'直線的標記Elsej=j+1DXFcircle(j).R=0DXFcircle(j).OX=0DXFcircle(j).OY=0DXFcircle(j).Sangle=0DXFcircle(j).Eangle=0DXFcircle(j).OX=sourse(startPos+2)'拾取圓心的X坐標DXFcircle(j).OY=sourse(startPos+4)'拾取圓心的Y坐標DXFcircle(j).R=sourse(startPos+8)拾取圓弧半徑DXFcircle(j).Sangle=sourse(startPos+12)*PI/180'拾取圓弧起始角DXFcircle(j).Eangle=sourse(startPos+14)*PI/180'拾取圓弧終止角DXFline(j).Flag=FalseCommon(j).SX=DXFcircle(j).R*Cos(DXFcircle(j).Sangle)+DXFcircle(j).OX'計算圓弧的起始點X坐標Common(j).SY=DXFcircle(j).R*Sin(DXFcircle(j).Sangle)+DXFcircle(j).OY'計算圓弧的起始點Y坐標Common(j).EX=DXFcircle(j).R*Cos(DXFcircle(j).Eangle)+DXFcircle(j).OX'計算圓弧的終止點X坐標Common(j).EY=DXFcircle(j).R*Sin(DXFcircle(j).Eangle)+DXFcircle(j).OY'計算圓弧的終止點Y坐標Common(j).R=DXFcircle(j).RCommon(j).Flag=False'圓弧的標記Common(j).OX=DXFcircle(j).OXCommon(j).OY=DXFcircle(j).OYCommon(j).Sangle=DXFcircle(j).SangleCommon(j).Eangle=DXFcircle(j).EangleEndIfLoop通過上面的程序,我們首先把第一個出現(xiàn)的圓弧或直線組碼信息放入strStart中,再通過Instr()、Mid()函數(shù)找出此段信息的終點與長度。通過設置Startpos標志,我們逐步找到直線或圓弧組碼中相對于的起點坐標和終點坐標(圓弧的坐標需要根據(jù)之前給出的公式計算)。其中,我們還建立了一個模塊“Module1”,定義了以上程序中用到的函數(shù)和變量。PublicTypeA_type'用于保存圓弧元素OXAsDoubleOYAsDoubleSangleAsDoubleEangleAsDoubleRAsDoubleMarkAsBooleanEndTypePublicTypeB_type'用于保存直線元素SXAsDoubleSYAsDoubleEXAsDoubleEYAsDoubleFlagAsBooleanEndTypePublicTypeC_type'用于保存圓弧和直線元素,方便CNC代碼的生成SXAsDoubleSYAsDoubleEXAsDoubleEYAsDoubleRAsDoubleFlagAsBooleanMarkAsBooleanOXAsDoubleOYAsDoubleSangleAsDoubleEangleAsDoubleEndTypePublicDXFline()AsB_type,DXFcircle()AsA_type,Common()AsC_type,TempCommon()AsC_type,Taxis()AsC_typePublicTCNCAsString,TDXFAsStringPublicScaleMaxAsDouble,ScaleMinAsDouble,ScaleOAsDouble3.3排序通過上面的步驟,我們已經提取出了DXF文件中的直線與圓弧組碼,為了進一步的處理,需要對繪圖時的直線與圓弧信息按照加工順序重新排序。首先,對圓弧是逆時針加工(G03)順時針加工(G02)進行區(qū)分。AutoCAD中的圓弧都是由逆時針方向生成的,剛才我們已經得到了圓弧的起點,如果在圓弧之前的那個圖形的終點坐標與圓弧的起點坐標重合(差值<0.001),那么此圓弧是逆時針的,若之前圖形的終點與圓弧終點重合(差值<0.001),圓弧是順時針的。在判斷的過程中,設置了雙層循環(huán),不停的比較圖形之間的關系,尋找重合的終點和起點,把相鄰的圖形坐標按順序排好。最后Taxis(i)中就保存了整個圖形的起點終點坐標,完成了要求的排序,為生成數(shù)控代碼做準備。Fori=1Tok-1'預排序和初步判斷G02、G03Fors=i+1TokIfAbs(Common(i).EX-Common(s).SX)<0.001AndAbs(Common(i).EY-Common(s).SY)<0.001ThenCommon(s).Mark=False'G03的標記D(i)=Common(i+1)Common(i+1)=Common(s)Common(s)=D(i)ElseIfAbs(Common(i).EX-Common(s).EX)<0.001AndAbs(Common(i).EY-Common(s).EY<0.001)ThenCommon(s).Mark=True'G02的標記D(i).SX=Common(s).SXD(i).SY=Common(s).SYCommon(s).SX=Common(s).EXCommon(s).SY=Common(s).EYCommon(s).EX=D(i).SXCommon(s).EY=D(i).SYD(i)=Common(i+1)Common(i+1)=Common(s)Common(s)=D(i)EndIfNextsNextiIfAbs(Common(k).EX-Common(1).SX)>0.001AndAbs(Common(k).EY-Common(1).SY)>0.001ThenMsgBox"您提供的圖形不封閉,無法進行后續(xù)加工!",,"錯誤提示"GetNCcode.Enabled=FalseClearCode.Enabled=FalseSaveNCcode.Enabled=FalseExitSubEndIfFori=1Tok'把預排序的結果記錄下來,為NC代碼生成做準備Taxis(i)=Common(i)Next最后幾行程序用于檢查提供的圖形DXF文件是否封閉,若不封閉,提示錯誤,并關閉“生成代碼”、“清除文件”、“保存程序”幾個按鈕3.4顯示圖形因為畫圖時首先要確定畫圖的區(qū)域,因此首先找出所有圖形元素的起點和終點坐標中的最大值與最小值。Xmax=Max(Common(1).SX,Common(2).SX)Ymax=Max(Common(1).SY,Common(2).SY)Xmin=Min(Common(1).SX,Common(2).SX)Ymin=Min(Common(1).SY,Common(2).SY)Fori=3TojXmax=Max(Xmax,Common(i).SX)Ymax=Max(Ymax,Common(i).SY)Xmin=Min(Xmin,Common(i).SX)Ymin=Min(Ymin,Common(i).SY)Next在生成圖像時,需要分兩種情況,一個是原始狀態(tài)的窗口,還有一個是最大化的窗口,分別用WindowState=0和WindowState=2來標識。原始狀態(tài)在原來的基礎上加50,最大化加900。同時,畫圖函數(shù)也用redraw1與redraw(擴大1.5倍)分別繪制兩種情況下的圖形。Fori=1Tok'畫圖IfForm2.WindowState=0ThenScaleMax=Max(Abs(Max(Xmax,Ymax)),Abs(Min(Xmin,Ymin)))+50PicDXF.Scale(0,ScaleMax)-(ScaleMax,0)'調整圖形使得能在圖形框看到圖形全貌redraw1ElseIfForm2.WindowState=2ThenScaleMax=Max(Abs(Max(Xmax,Ymax)),Abs(Min(Xmin,Ymin)))+900PicDXF.Scale(0,ScaleMax)-(ScaleMax,0)'調整圖形使得能在圖形框看到圖形全貌redrawEndIfNext***************下面為畫圖所用的通用過程或者函數(shù)*****************Subredraw()Fori=1Tok'畫圖IfTaxis(i).Flag=TrueThenPicDXF.Line(CDbl(Taxis(i).SX*1.5),CDbl(Taxis(i).SY*1.5))-(CDbl(Taxis(i).EX*1.5),CDbl(Taxis(i).EY*1.5))ElsePicDXF.Circle(CDbl(Taxis(i).OX*1.5),CDbl(Taxis(i).OY*1.5)),CDbl(Taxis(i).R)*1.5,,CDbl(Taxis(i).Sangle),CDbl(Taxis(i).Eangle)EndIfNextEndSubSubredraw1()Fori=1Tok'畫圖IfTaxis(i).Flag=TrueThenPicDXF.Line(CDbl(Taxis(i).SX),CDbl(Taxis(i).SY))-(CDbl(Taxis(i).EX),CDbl(Taxis(i).EY))ElsePicDXF.Circle(CDbl(Taxis(i).OX),CDbl(Taxis(i).OY)),CDbl(Taxis(i).R),,CDbl(Taxis(i).Sangle),CDbl(Taxis(i).Eangle)EndIfNextEndSubFunctionMax(l,m)'調整圖形用Ifl>=mThenMax=lElseMax=mEndIfEndFunctionFunctionMin(l,m)'調整圖形用Ifl<=mThenMin=lElseMin=mEndIfEndFunctionPrivateSubPicDXF_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)IfButton=1Thenbx=Xby=YStartmove=TrueEndIfEndSubSubPicDXF_MouseMove(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)IfCommonDialog1.filename<>""ThenForm2.Caption="圖形轉CNC代碼數(shù)控系統(tǒng)--("&X&","&Y&")"EndIfIfStartmoveThenPicDXF.ScaleTop=PicDXF.ScaleTop+(by-Y)PicDXF.ScaleLeft=PicDXF.ScaleLeft+(bx-X)PicDXF.ClsEndIfIfForm2.WindowState=0AndText1.Text<>""Thenredraw1ElseIfForm2.WindowState=2AndText1.Text<>""ThenredrawEndIfEndSubPrivateSubPicDXF_MouseUp(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)IfButton=1ThenStartmove=FalseEndSub畫圖過程中用到的子程序與函數(shù)在程序的后部定義。需要特別說明的是調整圖形位置的幾段子程序。當對已生成的圖形執(zhí)行Mousedown事件,把此時的坐標值賦給變量bx、by,并把True賦給Startmove。在Mousemove事件中,通過移動后的坐標與bx,by相比較,再加上原有圖像位置的最大值,便可把圖像移到新的位置,并把鼠標的時事位置顯示在“即時坐標”中。在Mouseup事件中,把False賦給Startmove,完成移動。下圖是生成圖形和移動圖形的樣例。圖2WindowState=0時生成圖形與移動圖形圖3WindowState=2時生成圖形與移動圖形除了可以生成直線的圖形,還可生成圓弧、以及直線與圓弧的合成圖形。如圖4、圖5所示。圖4生成圓弧圖形圖5直線和圓弧合成圖形之所以要設置移動這個功能,是因為生成圖形的第一步確定畫圖區(qū)域時,有一個難題。因為判斷最大、最小范圍是通過圖像的起點和終點坐標來決定的,關于圓弧,我們并沒有考慮到半徑的問題。如果遇到類似與圖6中的情況,有可能會超出圖像顯示區(qū)域的范圍。雖然可以把圓弧改為一段一段的折線來逼近,再判斷折現(xiàn)的起終點,但是畢竟對此次課程設計來說,實現(xiàn)這項功能有些困難,為此相出了圖形可以移動的辦法,來彌補這一缺憾。不過這也是我們設計的一個亮點。圖6超出圖形顯示區(qū)域范圍舉例最后提取排好序的Common數(shù)組中已存的線的起點或終點信息,顯示于對刀點顯示區(qū)。同時,各種功能按鈕及參數(shù)選擇按鈕處于激活狀態(tài)。Fori=1Tok'顯示DXF文件的的起刀點List2.AddItem(i&":"&Format(Common(i).SX,"#0.00")&","&Format(Common(i).SY,"#0.00"))NextGetNCcode.Enabled=TrueOptionij.Enabled=TrueClearCode.Enabled=TrueOptionk.Enabled=TrueOptG41.Enabled=TrueOptG42.Enabled=TrueMaintaxisM03.Enabled=TrueMaintaxisM04.Enabled=TrueOptionij.Value=TrueOptG41.Value=TrueMaintaxisM03.Value=TrueText1.Text="1"ExitSubcancleopen:EndSub3.5生成數(shù)控代碼1、準備工作先在NC代碼顯示區(qū)處清零,重新載入預排序的元素信息。判斷各個參數(shù)是否已經設置,若存在未設置的參數(shù),提示出錯,若參數(shù)均已設置好,則相關功能按鈕激活。選擇起刀點后,軟件按選擇的起刀點及加工方向確定的直線段或圓弧信息出現(xiàn)的先后順序,選取兩者中首先出現(xiàn)的圖形的起點作為加工起點,并開始加工第一段和生成相應的NC代碼。2、判斷圖形是順時針還是逆時針預排序后,生成的圖形路徑,有可能是順時針的,也有可能是逆時針的,還要考慮G41、G42的選擇在這里引入countclock()函數(shù),用以判斷預排序是順時針的還是逆時針的。3、最終排序若為逆時針生成圖形的,先判斷選擇G42還是G41刀補。若為G42,走刀為逆時針方向,與預排序方向一致。再根據(jù)選擇的起刀點,對Common(k)數(shù)組再次排序,將以用戶選擇的直線或圓弧的起點作為第一條加工的線,以此類推。若為G41,則走刀與預排序方向相反。再根據(jù)選擇的起刀點,將各個直線和圓弧的起點和終點交換,對Common(k)數(shù)組再次排序,將以用戶選擇的對刀點作為起點的直線或圓弧作為第一條加工的線,以此類推,最終以順時針走刀。若為順時針生成圖形的,與上面所述的情形相反。4、生成連續(xù)的數(shù)控代碼將相關輸出信息存于textcode中。第一行為輸出G92指令,程序如下:textcode="G92X"&TxtX.Text&"Y"&TxtY.Text&"Z"&TxtZ.Text&"LF"&vbCrLf輸出一段G92指令后,判斷刀補選擇方式及主軸轉向等信息,針對不同的用戶選擇,輸出相應的加工代碼,以下是采用G42刀補及采用M03轉向的程序:textcode=textcode&"N01G90G17G00"&"G42D01"&"X"&Format(Common(1).SX,"#0.00")&"Y"&Format(Common(1).SY,"#0.00")&"S"&Text2.Text&"M03"&"LF"&vbCrLf其他情況類推。接下來判斷將要畫的第一條線是否直線,判斷為正時輸出G01加工指令,指令如下:IfCommon(1).Flag=TrueThentextcode=textcode&"N02G01X"&Format(Common(1).EX,"#0.00")&"Y"&Format(Common(1).EY,"#0.00")&"F"&TextF.Text&""&Text3.Text&"LF"&vbCrLf若為圓弧,則需繼續(xù)判斷G02或G03的標記、判斷圓弧表示方法,采用相應的加工代碼,指令如下:ElseIfCommon(1).Flag=FalseThen'判斷為圓弧的標記,使用G02/G03IfCommon(1).Mark=TrueThen'G02的標記IfOptionij=TrueThentextcode=textcode&"N02G02X"&Format(Common(1).EX,"#0.00")&"Y"&Format(Common(1).EY,"#0.00")&"I"&Format(Common(1).SX,"#0.00")&"J"&Format(Common(1).SY,"#0.00")&"F"&TextF.Text&""&Text3.Text&"LF"&vbCrLfElseIfOptionk=TrueThentextcode=textcode&"N02"&"G02X"&Format(Common(1).EX,"#0.00")&"Y"&Format(Common(1).EY,"#0.00")&"R"&Format(Common(1).R,"#0.00")&"F"&TextF.Text&""&Text3.Text&"LF"&vbCrLfEndIfElse'G02的標記IfOptionij=TrueThentextcode=textcode&"N02G03X"&Format(Common(1).EX,"#0.00")&"Y"&Format(Common(1).EY,"#0.00")&"I"&Format(Common(1).SX-Common(1).OX,"#0.00")&"J"&Format(Common(1).SY-Common(1).OY,"#0.00")&"F"&TextF.Text&""&Text3.Text&"LF"&vbCrLfElseIfOptionk=TrueThentextcode=textcode&"N02"&"G03X"&Format(Common(1).EX,"#0.00")&"Y"&Format(Common(1).EY,"#0.00")&"R"&Format(Common(1).R,"#0.00")&"F"&TextF.Text&Text3.Text&"LF"&vbCrLfEndIfEndIfEndIf用循環(huán)語句輸出指令。參照第一條線的輸出程序,從i=2開始用循環(huán)判斷方式輸出指令,程序如下:Fori=2TokIfCommon(i).Flag=TrueThen'判斷為直線的標記,使用G01textcode=textcode&"N"&Format(i+1,"00")&"G01X"&Format(Common(i).EX,"#0.00")&"Y"&Format(Common(i).EY,"#0.00")&"LF"&vbCrLfElseIfCommon(i).Flag=FalseThen'判斷為圓弧的標記,使用G02/G03IfCommon(i).Mark=TrueThen'G02的標記IfOptionk=TrueThentextcode=textcode&"N"&Format(i+1,"00")&"G02X"&Format(Common(i).EX,"#0.00")&"Y"&Format(Common(i).EY,"#0.00")&"R"&Format(Common(i).R,"#0.00")&"LF"&vbCrLfElseIfOptionij=TrueThentextcode=textcode&"N"&Format(i+1,"00")&"G02X"&Format(Common(i).EX,"#0.00")&"Y"&Format(Common(i).EY,"#0.00")&"I"&Format(Common(i).SX-Common(i).OX,"#0.00")&"J"&Format(Common(i).SY-Common(i).OY,"#0.00")&"LF"&vbCrLfEndIfElse'G03的標記IfOptionk=TrueThentextcode=textcode&"N"&Format(i+1,"00")&"G03X"&Format(Common(i).EX,"#0.00")&"Y"&Format(Common(i).EY,"#0.00")&"R"&Format(Common(i).R,"#0.00")&"LF"&vbCrLfElseIfOptionij=TrueThentextcode=textcode&"N"&Format(i+1,"00")&"G03X"&Format(Common(i).EX,"#0.00")&"Y"&Format(Common(i).EY,"#0.00")&"I"&Format(Common(i).SX-Common(i).OX,"#0.00")&"J"&Format(Common(i).SY-Common(i).OY,"#0.00")&"LF"&vbCrLfEndIfEndIfEndIfNexti最終將textcode中的內容加上最后一行結束代碼,顯示在CNC代碼顯示區(qū)中。3.6輔助功能在3.4中我們已經敘述了windowstate實現(xiàn)原始窗口與最大化窗口的轉化功能,以下是windowstate改變時控件跟隨改變的代碼:PublicSubResizeInit(FormNameAsForm)DimpCtlAsControl’設置窗體舊的高度與寬度Form2dWidth=FormName.ScaleWidthForm2dHeight=FormName.ScaleHeightOnErrorResumeNextForEachpCtlInFormName'設置窗體中控件的Tag值(根據(jù)空間的位置和大小來設置)'返回或設置一個表達式,它存儲程序需要的額外數(shù)據(jù)。'與其它屬性不同,VisualBasic不使用Tag屬性的'可用該屬性識別對象。pCtl.Tag=pCtl.left&""&pCtl.top&""&pCtl.Width&""&pCtl.Height&""NextpCtlOnErrorGoTo0EndSubPublicSubResizeForm(FormNameAsForm)DimPos(4)AsDoubleDimiAsLong,tmpPosAsLong,staPosAsLongDimpCtlAsControlDimScaleXAsDouble,ScaleYAsDouble'保存窗體的寬度與高度縮放比例ScaleX=FormName.ScaleWidth/Form2dWidthScaleY=FormName.ScaleHeight/Form2dHeightOnErrorResumeNext'變化窗體內的各控件ForEachpCtlInFormNamestaPos=1Fori=0To4'位置和大小'取得控件的原始位置和大小tmpPos=InStr(staPos,pCtl.Tag,"",vbTextCompare)IftmpPos>0ThenPos(i)=Mid(pCtl.Tag,staPos,tmpPos-staPos)staPos=tmpPos+1ElsePos(i)=0EndIf'根據(jù)控件的原始位置及窗體改變大小的'比例對控件重新定位與改變大小pCtl.MovePos(0)*ScaleX,Pos(1)*ScaleY,Pos(2)*ScaleX,Pos(3)*ScaleYNextiNextpCtlOnErrorGoTo0EndSub'在窗體啟動時,調用ResizeInit函數(shù)'以記錄窗體中各控件的大小和位置'窗體大小發(fā)生變化時,根據(jù)窗體改變大小的比例'對窗體中各控件重新定位和改變大小。PrivateSubForm_Resize()CallResizeForm(Me)IfForm2.WindowState=0ThenPicDXF.Height=4500PicDXF.Width=4500redraw1ElseIfForm2.WindowState=2ThenPicDXF.Height=6000PicDXF.Width=6000TextNC.Width=5700Frame10.Width=6050redrawEndIfEndSubPrivateSubtxtcls_Click()CallClearCode_ClickEndSub4軟件使用說明4.1歡迎界面單擊如圖7所示的程序圖標,圖7程序圖標將會得到如圖8所示的界面。因為人性化設計是我們考慮的一個重要因素,為了給用戶一個視覺上的親切感,我們設計了歡迎界面。在歡迎界面上有兩個按鈕,分別是“進入系統(tǒng)”和“退出”。單擊“退出”將會直接結束本程序,若單擊“進入系統(tǒng)”將會得到如圖9所示的程序主界面。圖8歡迎界面4.2程序主界面程序主界面主要由以下幾部分組成:按鍵:“打開文件”、“生成代碼”、“保存代碼”、“清除文件”“退出”“關于”。單選按鈕:可供用戶選擇“主軸轉向”、“圓弧表達方式”以及“刀補方式”。組合框供用戶選擇“對刀點”,(還可在“起點坐標”自定義)進給速度默認值是100mm/min.?!皥D形顯示區(qū)”用來顯示從DXF文件中讀取的組碼所描述的圖形。并且“即時坐標”隨鼠標在“圖形顯示區(qū)”移動而改變。而“CNC代碼顯示區(qū)”顯示的是最終的數(shù)控代碼。圖9程序主界面4.3功能演示1、單擊“打開文件”,可得到如圖10所示的對話框:圖10打開DXF文件2、選擇合適文件的文件后,單擊“打開”,便可在“DXF圖形顯示區(qū)”得到圖形,并在程序界面“參數(shù)設置”設置好適當?shù)膮?shù),再按“代碼生成”可以在“代碼窗口”得到NC程序代碼如圖11所示。圖11生成代碼3、點擊“保存代碼”按鈕,可以把剛才生成的數(shù)控代碼以txt文件的形式保存。如圖12、13所示。圖12保存代碼圖13生成.txt文件4、其它輔助功能如“關閉退出”,“圖片清除”,可以按相應的按鈕得到。圖14退出程序5設計總結三周的課程設計完成了,在這個過程中,我們又掌握了一種高級編程語言VisualBasic,加深了對AutoCAD中的DXF文件中組碼的了解,設計了從圖形到數(shù)控代碼的算法,并完成了軟件界面的設計。通過課程設計,我學到了如何用VB編寫我們需要的程序,也對數(shù)控技術這門課程學習的內容印象更深了。學了三年機械專業(yè)的理論知識,我總想知道我們學的理論在走入工作崗位上怎樣應用,其實課程設計就把理論和實際聯(lián)合在了一起。只有這樣親手設計、親自操作,才能把理論知識轉化為實際應用,服務機械行業(yè)。通過學習VB并和之前所學的C語言對比,明白了它們的區(qū)別和聯(lián)系。VB使用的編程方式是可視化的,也就是能通過對象窗口時事觀看編程所產生的影響。而VB中的指令和代碼相比C語言也更加靈活。但是C語言也有它的特點,比如更傾向與硬件,編程的邏輯性也更強。雖然學習使用AutoCAD是從大一開始的,但平時接觸的多是基本的二維繪圖功能。DXF更像是AutoCAD的后臺程序,通過最基本的組碼,標識各種圖形參數(shù)。這使我們了解了平常使用不到的功能。算法是編程的靈魂,其實在本次課程設計考察我們最多的還是算法的設計。不管是軟件界面的設計、提取代碼、排序、生成圖形、刀補選擇、加工起點選擇直到最后得出我們需要的數(shù)控代碼,這中間的每一個步驟都離不開高效,可行的算法。這里也凝聚了我們小組的最多心血。這個程序的算法也是我們課程設計的亮點所在,不管是最大化窗口還是移動圖形,以及G41、G42刀補的選擇、順逆時針的判定,都是我們做的比較優(yōu)秀的地方,也是花費努力最多的地方。但是能夠實現(xiàn)這些功能,我們也感到十分的欣慰。最后要感謝陪伴我們大三整個學年學習的劉建群老師,也是在您的悉心教導下,我們對控制論、數(shù)控技術、編程開發(fā)等方面的知識從不懂到熟悉,再到應用。謝謝老師!參考文獻[1]廖效果,劉又午,朱劍英.數(shù)控技術[M].武漢:湖北科學技術出版社,2000.[2]孟祥瑞.VisualBasic6.0程序設計[M].上海:華東理工大學出版社,2005.[3]匡松.VisualBasic程序設計24學時輕松掌握[M].北京:中國鐵道出版社,2007.7附錄以下是這次設計全部程序:Form1:PrivateSubForm_Load()Form1.Icon=LoadPicture(App.Path&"\素材圖片\grfwnd.ico")EndSubPrivateSubPicture1_Click()Form2.ShowUnloadMeEndSubPrivateSubPicture2_Click()OnErrorResumeNextIfMsgBox("確定要退出軟件嗎?",32OrvbYesNo,"退出確認")=vbYesThenUnloadMeUnloadForm1EndIfEndSubPrivateSubPicture1_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)DimaaAsIntegeraa=Picture1.leftIf(X>Picture1.left-800AndX<aa+Picture1.Width)ThenPicture1.Picture=LoadPicture(App.Path&"\素材圖片\進入系統(tǒng)2.jpg")EndIfEndSubPrivateSubPicture2_MouseDown(ButtonAsInteger,ShiftAsInteger,XAsSingle,YAsSingle)DimbbAsIntegerbb=Picture1.leftIf(X>Picture2.left-500AndX<bb+Picture2.Width-200)ThenPicture2.Picture=LoadPicture(App.Path&"\素材圖片\退出2.jpg")Timer1.Enabled=TrueEndIfEndSubPrivateSubTimer1_Timer()Picture2.Picture=LoadPicture(App.Path&"\素材圖片\退出1.jpg")EndSubForm2:OptionExplicitConstPIAsDouble=3.1415926'定義變量DimiAsInteger,jAsInteger,sAsIntegerDimXmaxAsDouble,XminAsDouble,YmaxAsDouble,YminAsDouble,D()AsC_typeDimFileNameAsString,saveDXFAsString,n()AsString,tempAsString,textcodeAsStringDimstrStart,strStart1,strStart2AsIntegerDimstrEndAsIntegerDimstartPosAsIntegerDimsourseAsVariant,sHeightAsDouble,kAsInteger,lAsInteger,mAsIntegerDimForm2dWidthAsLong'窗體舊的寬度值DimForm2dHeightAsLong'窗體舊的高度值Dimbx,byAsLong,X1AsSingle,Y1AsSingleDimStartmoveAsBoolean'定義各個全局變量DimoAsIntegerDimpAsIntegerDimyuanAsDoubleDimkmAsDoubleDimzsAsIntegerFunctioncountclock()AsBoolean'判斷DXF畫圖方向zs=0'判斷是否全部是圓弧,若是定義countclock=falseForp=1TokIfCommon(p).Flag=TrueThenzs=1EndIfNextpIfzs=0Thencountclock=FalseExitFunctionEndIf'下面判斷畫圖時封閉曲線的走向Forp=1TokIfCommon(p).SY=YminAndCommon(p).EY=YminAndCommon(p).Flag=TrueThenIfCommon(p).SX>=Common(p).EX=YminThencountclock=TrueElsecountclock=FalseEndIfExitFunctionElseIfCommon(p).EY=YminTheno=pEndIfNextyuan=Atn((Common(o).EY-Common(o).SY)/(Common(o).EX-Common(o).SX))Ifo<>kThenkm=Atn((Common(o+1).EY-Common(o+1).SY)/(Common(o+1).EX-Common(o+1).SX))Elsekm=Atn((Common(1).EY-Common(1).SY)/(Common(1).EX-Common(1).SX))EndIfIfyuan<0Thenyuan=yuan+PIEndIfIfkm<0Thenkm=yuan+PIEndIfIfkm<yuanThencountclock=FalseElsecountclock=TrueEndIfEndFunctionPrivateSubabout_Click()'點擊about調出form3Form3.ShowEndSubPrivateSubopenfile_Click()CallopenDXFfile_ClickEndSubPrivateSubout_Click()CallQuit_ClickEndSubPrivateSubpiccls_Click()PicDXF.ClsEndSubPrivateSubsavefile_Click()CallSaveNCcode_ClickEndSubPrivateSubQuit_Click()OnErrorResumeNextIfMsgBox("確定要退出軟件嗎?",32OrvbYesNo,"退出確認")=vbYesThenUnloadMeUnloadForm2EndIfEndSubPrivateSubcode_Click()CallGetNCcode_ClickEndSubPrivateSubForm_Load()Form2.Icon=LoadPicture(App.Path&"\素材圖片\grfwnd.ico")CallResizeInit(Me)openDXFfile.Enabled=TrueOptionij.Enabled=FalseOptionk.Enabled=FalseOptG41.Enabled=FalseOptG42.Enabled=FalseMaintaxisM03.Enabled=FalseMaintaxisM04.Enabled=FalseDimFileNameAsStringEndSubFunctiongetStart(mAsInteger)AsInteger'找出所需幾何信息的起始點DimnAsIntegerm=m+1Forn=mToUBound(sourse)Ifsourse(n)="AcDbLine"Orsourse(n)="AcDbCircle"ThengetStart=nExitFunctionEndIfNextgetStart=-32EndFunction'************************以下部分是打開DXF文件,并生成代碼程序******************PrivateSubopenDXFfile_Click()'打開文件TDXF=""CommonDialog1.Filter="AllFiles(*.dxf)|*.dxf"CommonDialog1.FileName=""CommonDialog1.ShowOpen'打開文件DimiAsIntegerDimtAsStringIfCommonDialog1.FileName<>""Theni=InStrRev(CommonDialog1.FileName,"\")t=right(CommonDialog1.FileName,Len(CommonDialog1.FileName)-i)Form2.Caption="圖形轉CNC代碼數(shù)控系統(tǒng)--("&t&")"EndIfFileName=CommonDialog1.FileNameOnErrorGoTocancleopenj=0OpenFileNameForInputAs#1'按行讀取打開的文件順序讀取數(shù)據(jù)的內容DoWhileNotEOF(1)LineInput#1,saveDXFIfsaveDXF="AcDbCircle"OrsaveDXF="AcDbLine"Thenj=j+1EndIfTDXF=TDXF&saveDXF&"~"'保存文件信息Loopk=jReDimDXFline(1Tok),DXFcircle(1Tok),Common(1Tok),D(1Tok),TempCommon(1Tok),Taxis(1Tok)Close#1strStart1=InStr(1,TDXF,"AcDbLine"&"~")'提取直線標志所在行strStart2=InStr(1,TDXF,"AcDbCircle"&"~")'提取圓弧標志所在行IfstrStart1>strStart2AndstrStart2<>0ThenstrStart=strStart2ElseIfstrStart1<>0ThenstrStart=strStart1ElsestrStart=strStart2EndIfstrEnd=InStr(strStart,TDXF,"ENDSEC"&"~")'提取直線和圓弧終點的幾何信息temp=Mid(TDXF,strStart,strEnd-strStart)'提取直線和圓弧的幾何信息sourse=Split(temp,"~")startPos=-1j=0DoWhilestartPos<>-32'提取直線和圓弧的幾何信息startPos=getStart(startPos)IfstartPos=-32ThenExitDoIfsourse(startPos)="AcDbLine"Thenj=j+1DXFline(j).SX=0DXFline(j).SY=0DXFline(j).EX=0DXFline(j).EY=0DXFline(j).SX=sourse(startPos+2)'拾取起點的X坐標DXFline(j).SY=sourse(startPos+4)'拾取起點的Y坐標DXFline(j).EX=sourse(startPos+8)'拾取終點的X坐標DXFline(j).EY=sourse(startPos+10)'拾取終點的Y坐標DXFline(j).Flag=TrueCommon(j).SX=DXFline(j).SXCommon(j).SY=DXFline(j).SYCommon(j).EX=DXFline(j).EXCommon(j).EY=DXFline(j).EYCommon(j).R=0Common(j).Flag=True'直線的標記Elsej=j+1DXFcircle(j).R=0DXFcircle(j).OX=0DXFcircle(j).OY=0DXFcircle(j).Sangle=0DXFcircle(j).Eangle=0DXFcircle(j).OX=sourse(startPos+2)'拾取圓心的X坐標DXFcircle(j).OY=sourse(startPos+4)'拾取圓心的Y坐標DXFcircle(j).R=sourse(startPos+8)'拾取圓弧半徑DXFcircle(j).Sangle=sourse(startPos+12)*PI/180'拾取圓弧起始角DXFcircle(j).Eangle=sourse(startPos+14)*PI/180'拾取圓弧終止角DXFline(j).Flag=FalseCommon(j).SX=DXFcircle(j).R*Cos(DXFcircle(j).Sangle)+DXFcircle(j).OX'計算圓弧的起始點X坐標Common(j).SY=DXFcircle(j).R*Sin(DXFcircle(j).Sangle)+DXFcircle(j).OY'計算圓弧的起始點Y坐標Common(j).EX=DXFcircle(j).R*Cos(DXFcircle(j).Eangle)+DXFcircle(j).OX'計算圓弧的終止點X坐標Common(j).EY=DXFcircle(j).R*Sin(DXFcircle(j).Eangle)+DXFcircle(j).OY'計算圓弧的終止點Y坐標Common(j).R=DXFcircle(j).RCommon(j).Flag=False'圓弧的標記Common(j).OX=DXFcircle(j).OXCommon(j).OY=DXFcircle(j).OYCommon(j).Sangle=DXFcircle(j).SangleCommon(j).Eangle=DXFcircle(j).EangleEndIfLoopFori=1Tok-1'預排序和初步判斷G02、G03Fors=i+1TokIfAbs(Common(i).EX-Common(s).SX)<0.001AndAbs(Common(i).EY-Common(s).SY)<0.001ThenCommon(s).Mark=False'G03的標記D(i)=Common(i+1)Common(i+1)=Common(s)Common(s)=D(i)ElseIfAbs(Common(i).EX-Common(s).EX)<0.001AndAbs(Common(i).EY-Common(s).EY)<0.001ThenCommon(s).Mark=True'G02的標記D(i).SX=Common(s).SXD(i).SY=Common(s).SYCommon(s).SX=Common(s).EXCommon(s).SY=Common(s).EYCommon(s).EX=D(i).SXCommon(s).EY=D(i).SYD(i)=Common(i+1)Common(i+1)=Common(s)Common(s)=D(i)EndIfNextsNextiIfAbs(Common(k).EX-Common(1).SX)>0.001AndAbs(Common(k).EY-Common(1).SY)>0.001Then

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論