,,,
(貴州大學 機械工程學院,貴州 貴陽 550025)
隨著數控車削加工技術的發展,數控自動編程技術初步解決了車削加工問題,為檢查數控程序的NC代碼正確性,傳統方法采用的試切法,這種方法費工費料,甚至由于程序的錯誤而導致機床的損壞。后來采用軌跡顯示方法,但這種方法僅限于平面,不能準確地仿真其實際情況[1]。為此,人們通過運用計算機仿真技術提前驗證NC代碼的準確性,從而提高了生產效率,節約成本,避免制造風險[2-3]。OpenGL是一個開放的三維圖形程序接口、調用方便的底層圖形庫,它獨立于窗口系統和操作系統,與硬件無關,以它為基礎開發的應用程序可以十分方便地在各種平臺間移植,或嵌入其他系統使用[4]。基于OpenGL的程序框架構造好后,用戶只需要在對應的函數中添加程序代碼即可,可擴展性好。針對上述問題,提出了OpenGL車削仿真運動系統,在Visual Studio 2015環境下實現車削加工去除材料的過程。
該系統以VS 2015為開發平臺,OpenGL為工具,根據數控車削加工的特點,可將軟件功能分為加工仿真準備模塊與加工仿真過程模塊;其中加工仿真準備模塊和加工仿真過程模塊都包含3個子模塊,如圖1。

圖1 加工仿真系統架構圖
在加工仿真準備模塊中包含:圖形顯示模塊,以OpenGL為工具搭建仿真圖形顯示環境;NC代碼模塊,對NC代碼進行解碼;STL模型模塊,將繪制的刀具以及機床模型的stl文件進行解碼并顯示。
在加工仿真過程模塊中包含:工件運動模塊,使工件自轉,并使刀具和工件擁有獨立的運動;刀具加工運動模塊,刀具軌跡會依據NC代碼進行刀具的運動;毛坯設計模塊,基于幾何仿真原理,隨著刀具車削,毛坯逐漸成形。
要使仿真系統進行車削仿真需要前期準備,包含OpenGL環境搭建,NC代碼解釋,與stl模型的導入。
OpenGL被定義為圖形硬件的一種軟件接口,是一個3D圖形和模型庫,具有高度的可移植性,并且具有非常快速度,獨立于窗口系統和操作系統,與硬件無關,OpenGL是個狀態機的概念,通過創建OpenGL的渲染設備rc,使得OpenGL具有這些狀態功能,然而此時所有的狀態仍是未知的,就需要依次進行設置[5]。
本文采用OpenGL固定管線技術完成模型的繪制,在固定管線中包含兩個矩陣:projection和model view,其中包含三個坐標系:世界坐標系、視口坐標系、屏幕坐標系,要使圖形顯示,就需要對坐標系進行一系列的矩陣變化。首先在世界坐標系下繪制模型,通過模型視口矩陣(model view)對模型進行作用,從而轉換到視口camera坐標系下,然后將模型再投影到視口camera的范圍內,進而圖形才會顯示到屏幕上,投影視口的操作如同攝像機的原理,需要在攝像機拍攝范圍內,鏡頭畫面才有模型的顯示。由于計算機屏幕上只能表現二維平面,要使得車削仿真系統顯示三維圖形,還需投影矩陣(projection)從三維物體轉到二維平面圖像間的變換,投影矩陣會把所有的3D信息投影到2D屏幕上,這樣車削仿真系統中的車刀與毛坯等三維圖形便可在屏幕中顯示。
NC代碼是從零件圖紙到制成控制介質的過程,NC代碼的格式以首字母代表特定功能,N代表的是第幾工步,G代碼是在NC裝置內部用來處理軸的移動、坐標系的設定等的功能,代碼用G字母和2位數字表示;M代碼的機床運行是由各開關的動作來控制的,控制主軸的旋轉、停止、刀具的更換等,用M字母和2位數字來表示等。
本文采用NC代碼實例:
N0010 G94 G90 G20
N0020 G50 X0.0 Z0.0
N0030 T00 H00 M06
N0040 G97 S443 M03
N0050 G94 G00 X30.Z10.
N0060 X28.
N0070 Z5.5
…
由于NC代碼值是數控車削加工過程的驅動指示,在VS2015平臺不能直接識別,因此需要將NC代碼翻譯成仿真系統所能識別的代碼,先將NC代碼全部存儲到m_resource緩沖區中,針對NC代碼的特點,仿真系統只需從中提取有關運動與狀態信息作為刀具運動軌跡依據,而對于與運動軸相關代碼等信息用詞法檢驗即可,不需進行解讀,然后將存儲所需的NC代碼按照首字母的特性進行匹配,以X字母為開頭代碼為例,通過if語句從m_resource緩沖區找到X首字母并開始讀入后續數字,讀到空格(‘/0’)的位置,將從X到’/0’之間所需的仿真信息按順序封裝到新的m_compete緩沖區。另外還需把所解碼的仿真信息賦值給刀具移動變量,使得刀具運動依據NC代碼的內容進行運動仿真。
實例代碼:
for (it = m_resource.begin(); it { //X部分的信息提取 int n=(*it).Find(L"X"); if(n>=0)//找到‘X’的字母 { int m=(*it).Find(L"",n); if (m<0) { m=(*it).Find(L'/0',n);//讀到這一橫行代碼的結尾 } n=n+1; CStringCoordinateX; CoordinateX=(*it).Mid(n,m-n);//用來提取G的信息 rX=_ttof(CoordinateG); coor.m_g=rG; flag++;//標記 } … } stl模型文件是計算機圖形學處理CG,數字幾何處理的最常見文件格式,其文件格式簡單,是由一系列三角面片構成,僅有頂點信息,并沒有光照材質等渲染信息,所以在此系統中只需讀取stl模型只需讀取頂點數據等幾何信息,不必考慮渲染等解碼部分。 解碼stl文件,需要了解stl文件的格式信息,其中stl文件包含兩種格式:一種是ASCII格式,另一種是二進制格式。兩者的區別在于存儲方式的不同。根據不同的stl文件格式,相應解碼也有所不同。本文采用ASCII格式,在ASCII格式下,文件每行都以關鍵字為開頭,模型中每個三角面片的信息是以facet開頭,進而逐行顯示三角面片的幾何信息,其中依次包含:facet normal,從三角面片指向模型外部的法矢量,outer loop以及隨后的 vertex和endloop,集合表達了三角面片的頂點信息。其中vertex的三行數據是三角面片的3個頂點坐標信息,三個頂點跟該三角面片的法向量符合右手螺旋定則,outer loop和endloop僅是頂點數據開始與結束的標記,最后文件以endfacet結尾,完成一個三角面片定義[6]。 根據stl文件的ASCII格式特點,可有兩種讀取方法,一種是逐行進行讀取,另一種是按三角面片個數逐個進行讀取。由于前者逐行讀取中,所讀每一行都需要檢查是否到了文件的endface結束語,影響效率,所以本文系統采用第二種方法:首先求出三角面片個數的總數,其中ASCII格式中每個三角面片所占的行數為七行,因此把行數讀出來除以7所得的商就是三角面片的個數,然后通過for循環操作解析每個三角面片,并且OpenGL的接口實際上是一串float的數組,與stl文件相一致,所以這里面保存了verts頂點坐標信息,以及norms即法向量信息直接進行導入不需做數據結構調整,便可以解出模型。 參考代碼: for (int i=0;i { … vnorms[count1]=vnorms[count1+3]=vnorms[count1+6]=atof(x); count1++; vnorms[count1]=vnorms[count1+3]=vnorms[count1+6]=atof(y); count1++; vnorms[count1]=vnorms[count1+3]=vnorms[count1+6]=atof(z); count1+=7; … } 通過仿真系統的前期準備,就可以實現車削加工仿真,由于數控加工的過程是數控機床在NC代碼的驅動下帶動刀具對使用夾具固定在工作臺上的工件,進行切削加工的過程,針對其特點,在仿真系統中需要包含刀具運動,工件以及夾具自轉,毛坯切除的功能[7]。 圖2 車刀運動判別 車削的毛坯多為回轉體棒料零件,并且刀具通常只是X、Z方向上的二維移動,因此仿真可根據存儲到m_compete緩沖區中的關鍵運動代碼,將刀具的起始點坐標設為原點坐標,并進行X方向和Z方向起始點和終點的距離的判斷,如圖2。以車刀從第n的位置車削第n-1的位置為例,如果起始點X的值大于終點X的值,則車刀先徑向進給運動。然后通過Z值判別,起始點Z的值大于終點Y的值,則車刀再完成徑向進給運動,通過刀具X和Z方向的運動,從而完成進刀運動;退刀反之。 具體的實現命令如: //車刀徑向進給運動 if(X { m_X=m_X-V;//車刀徑向進給 m_Z=m_Z;//車刀軸向不變 velocityflag=1;//進給標記 } 在仿真系統中,刀具運動的同時,工件與夾具也要進行自轉運動,因為OpenGL是個狀態機,旋轉、移動、平移其運動操作都會影響視全局所有元素的狀態,所以需要通過OpenGL中矩陣的壓棧出棧的功能來實現刀具與工件之間的獨立運動。 在OpenGL中所有的運動操作都是通過矩陣棧的棧頂來影響圖形的狀態。如圖3,將開始狀態定為狀態1,在變換之前調用giPushMatrix()壓棧,就會把當前狀態1壓入第二層,并且棧頂會有狀態2,并且棧頂的矩陣狀態2是第二層狀態1的一份拷貝,所有的內容是相同的,此時所有的矩陣操作都是在狀態2中完成,通過一系列的矩陣對所操作的圖形有所改變,而且并不會影響全局元素的狀態,變換之后,使用glPopMatrix出棧,將上面操作過的狀態2去掉,之前的狀態1又放到棧頂,恢復原來的狀態。在本文中,通過壓棧出棧操作進行刀具運動,從而在刀具的運動同時,不影響工件與夾具的自轉運動狀態。 工件以及夾具的運動主要用glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)函數進行自轉,x、y、z表示旋轉軸,angle代表旋轉角度,在本文中旋轉軸為z軸,旋轉角度隨時間而曾大,然后通過if判斷要是轉過一周,角度則從0°再開始繼續增加,如此,工件與夾具便在加工仿真中一直自轉而不受刀具移動的干擾。 圖3 壓棧出棧圖 由于OpenGL中沒有實體建模的功能,所以本文毛坯的實體建模通過曲面繪制進行組合,gluCylinder圓柱面,和gluDisk圓盤面來實現毛坯的加工仿真。 圖4 毛坯設計 為實現毛坯形狀隨切削加工的進行而發生形狀實時改變,本文采用幾何仿真,將毛坯形狀根據離散法來滿足仿真要求,即把毛坯的圓柱離散成同心、同底、同高但半徑不同的圓柱體,車削毛坯時,圓柱的地面半徑與最外側的底面半徑遞增關系如圖4所示。在加工部分,大圓柱以車刀加工終點位置作為起始點,隨著車刀的軸向進給運動,大圓柱的高隨之減小,小圓柱以車刀加工起始點位置作為起始點,并隨著車刀軸向進給運動,小圓柱體高隨之增大,效果可看成是從大圓柱剝離出小圓柱體,隨著刀具的運動,大圓柱和小圓柱的半徑發生實時改變,以第n次車刀車削為例,在第n次車刀進行車削時,大圓半徑為第n-1次車削加工后小圓柱體半徑;小圓半徑為第n次車削加工時的小圓柱體半徑,同時兩圓柱面交際面用圓盤作底面,形成封閉圖形,兩個圓柱的高通過刀具的位置改變而發生變化,底面圓盤根據刀具的軸向進給運動而移動,便可實現其毛坯的加工仿真效果。 代碼所示: gluCylinder(quadratic,(*it_chip).RadiuolnStart,(*it_chip).RadiuolnStart,ld-jd,32,1);//大圓柱 gluCylinder(quadratic,(*it_chip).RadiuoOutStart,(*it_chip).RadiuoOutStart,jd,32,1);//小圓柱 glTranslatef(0,0,jd=pDoc->m_piseljd);//移動刀具加工的兩圓柱底面 gluDisk(quadratic,(*it_chip).RadiuolnStart,(*it_chip).RadiuoOutStart,32,1);//形成加工時兩圓柱底面 … 在菜單項點擊NC代碼導入,選擇所需的NC代碼導入到系統中,再單擊stl模型,分別將夾具模型與車刀模型添加到系統,最后選擇仿真開始,便可實現車削運動仿真模擬,軟件實現效果如圖5。 圖5 系統運行效果 針對數控車削的形狀特點及傳統落后的加工工藝,以Visual Studio 2015為開發平臺,使用OpenGL 三維圖形標準庫,采用離散法實現毛坯切除,開發數控車削動態運動仿真系統,實現了虛擬車削加工過程的可視化,直觀地顯示了刀具路徑、工件的轉動、材料去除等過程。實驗表明,仿真效果達到了預期要求,具有良好的實時性; 為車削加工提供了保障和可行性;以新的角度詮釋了OpenGL環境的搭建,同時讀取stl方法以及離散法毛坯去除對于同類虛擬仿真加工的擴展,具有一定的借鑒意義。 [1] 周靜.數控仿真三維建模及實現[D].南京:南京理工大學,2005. [2] TANG T D,BOHEZ E L J,KOOMSAP P.The sweep plane algorithm for global collision detection with workpiece geometry update for five-axis NC machining[J].Computer-Aided Design,2007,39(11):1012-1024. [3] 李春雷.虛擬數控車削加工誤差建模技術研究[J].機械工程與自動化,2011(4):35-36. [4] CHEN M,GONG Y,ZHAN L,et al.Research on technology of three-dimension Roam based on OpenGL[C]// International Conference on Computer Application and System Modeling,2010,14:562-564. [5] WANG Y,SUN L X,FAN J C.Application of OpenGL in NC turning simulation[J].Advanced Materials Research,2012,505:282-286. [6] 嚴梽銘,鐘艷如.基于VC++和OpenGL的STL文件讀取顯示[J].計算機系統應用,2009(3):172-175 [7] 董大勇.虛擬制造中的數控銑削仿真加工技術[J].金屬加工(冷加工),2015(15):58-59. [8] 牛書濤,庫祥臣.基于Visual C++與OpenGL的數控車削加工仿真系統研究[J].機電一體化,2012,18(3):35-39.2.3 stl模型模塊
3 加工仿真過程
3.1 刀具運動模塊

3.2 工件運動模塊

3.3 毛坯設計模塊

4 軟件實現

5 結束語