,,,
(貴州大學(xué) 機(jī)械工程學(xué)院,貴州 貴陽(yáng) 550025)
隨著數(shù)控車削加工技術(shù)的發(fā)展,數(shù)控自動(dòng)編程技術(shù)初步解決了車削加工問(wèn)題,為檢查數(shù)控程序的NC代碼正確性,傳統(tǒng)方法采用的試切法,這種方法費(fèi)工費(fèi)料,甚至由于程序的錯(cuò)誤而導(dǎo)致機(jī)床的損壞。后來(lái)采用軌跡顯示方法,但這種方法僅限于平面,不能準(zhǔn)確地仿真其實(shí)際情況[1]。為此,人們通過(guò)運(yùn)用計(jì)算機(jī)仿真技術(shù)提前驗(yàn)證NC代碼的準(zhǔn)確性,從而提高了生產(chǎn)效率,節(jié)約成本,避免制造風(fēng)險(xiǎn)[2-3]。OpenGL是一個(gè)開(kāi)放的三維圖形程序接口、調(diào)用方便的底層圖形庫(kù),它獨(dú)立于窗口系統(tǒng)和操作系統(tǒng),與硬件無(wú)關(guān),以它為基礎(chǔ)開(kāi)發(fā)的應(yīng)用程序可以十分方便地在各種平臺(tái)間移植,或嵌入其他系統(tǒng)使用[4]?;贠penGL的程序框架構(gòu)造好后,用戶只需要在對(duì)應(yīng)的函數(shù)中添加程序代碼即可,可擴(kuò)展性好。針對(duì)上述問(wèn)題,提出了OpenGL車削仿真運(yùn)動(dòng)系統(tǒng),在Visual Studio 2015環(huán)境下實(shí)現(xiàn)車削加工去除材料的過(guò)程。
該系統(tǒng)以VS 2015為開(kāi)發(fā)平臺(tái),OpenGL為工具,根據(jù)數(shù)控車削加工的特點(diǎn),可將軟件功能分為加工仿真準(zhǔn)備模塊與加工仿真過(guò)程模塊;其中加工仿真準(zhǔn)備模塊和加工仿真過(guò)程模塊都包含3個(gè)子模塊,如圖1。
圖1 加工仿真系統(tǒng)架構(gòu)圖
在加工仿真準(zhǔn)備模塊中包含:圖形顯示模塊,以O(shè)penGL為工具搭建仿真圖形顯示環(huán)境;NC代碼模塊,對(duì)NC代碼進(jìn)行解碼;STL模型模塊,將繪制的刀具以及機(jī)床模型的stl文件進(jìn)行解碼并顯示。
在加工仿真過(guò)程模塊中包含:工件運(yùn)動(dòng)模塊,使工件自轉(zhuǎn),并使刀具和工件擁有獨(dú)立的運(yùn)動(dòng);刀具加工運(yùn)動(dòng)模塊,刀具軌跡會(huì)依據(jù)NC代碼進(jìn)行刀具的運(yùn)動(dòng);毛坯設(shè)計(jì)模塊,基于幾何仿真原理,隨著刀具車削,毛坯逐漸成形。
要使仿真系統(tǒng)進(jìn)行車削仿真需要前期準(zhǔn)備,包含OpenGL環(huán)境搭建,NC代碼解釋,與stl模型的導(dǎo)入。
OpenGL被定義為圖形硬件的一種軟件接口,是一個(gè)3D圖形和模型庫(kù),具有高度的可移植性,并且具有非??焖俣?,獨(dú)立于窗口系統(tǒng)和操作系統(tǒng),與硬件無(wú)關(guān),OpenGL是個(gè)狀態(tài)機(jī)的概念,通過(guò)創(chuàng)建OpenGL的渲染設(shè)備rc,使得OpenGL具有這些狀態(tài)功能,然而此時(shí)所有的狀態(tài)仍是未知的,就需要依次進(jìn)行設(shè)置[5]。
本文采用OpenGL固定管線技術(shù)完成模型的繪制,在固定管線中包含兩個(gè)矩陣:projection和model view,其中包含三個(gè)坐標(biāo)系:世界坐標(biāo)系、視口坐標(biāo)系、屏幕坐標(biāo)系,要使圖形顯示,就需要對(duì)坐標(biāo)系進(jìn)行一系列的矩陣變化。首先在世界坐標(biāo)系下繪制模型,通過(guò)模型視口矩陣(model view)對(duì)模型進(jìn)行作用,從而轉(zhuǎn)換到視口camera坐標(biāo)系下,然后將模型再投影到視口camera的范圍內(nèi),進(jìn)而圖形才會(huì)顯示到屏幕上,投影視口的操作如同攝像機(jī)的原理,需要在攝像機(jī)拍攝范圍內(nèi),鏡頭畫(huà)面才有模型的顯示。由于計(jì)算機(jī)屏幕上只能表現(xiàn)二維平面,要使得車削仿真系統(tǒng)顯示三維圖形,還需投影矩陣(projection)從三維物體轉(zhuǎn)到二維平面圖像間的變換,投影矩陣會(huì)把所有的3D信息投影到2D屏幕上,這樣車削仿真系統(tǒng)中的車刀與毛坯等三維圖形便可在屏幕中顯示。
NC代碼是從零件圖紙到制成控制介質(zhì)的過(guò)程,NC代碼的格式以首字母代表特定功能,N代表的是第幾工步,G代碼是在NC裝置內(nèi)部用來(lái)處理軸的移動(dòng)、坐標(biāo)系的設(shè)定等的功能,代碼用G字母和2位數(shù)字表示;M代碼的機(jī)床運(yùn)行是由各開(kāi)關(guān)的動(dòng)作來(lái)控制的,控制主軸的旋轉(zhuǎn)、停止、刀具的更換等,用M字母和2位數(shù)字來(lái)表示等。
本文采用NC代碼實(shí)例:
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代碼值是數(shù)控車削加工過(guò)程的驅(qū)動(dòng)指示,在VS2015平臺(tái)不能直接識(shí)別,因此需要將NC代碼翻譯成仿真系統(tǒng)所能識(shí)別的代碼,先將NC代碼全部存儲(chǔ)到m_resource緩沖區(qū)中,針對(duì)NC代碼的特點(diǎn),仿真系統(tǒng)只需從中提取有關(guān)運(yùn)動(dòng)與狀態(tài)信息作為刀具運(yùn)動(dòng)軌跡依據(jù),而對(duì)于與運(yùn)動(dòng)軸相關(guān)代碼等信息用詞法檢驗(yàn)即可,不需進(jìn)行解讀,然后將存儲(chǔ)所需的NC代碼按照首字母的特性進(jìn)行匹配,以X字母為開(kāi)頭代碼為例,通過(guò)if語(yǔ)句從m_resource緩沖區(qū)找到X首字母并開(kāi)始讀入后續(xù)數(shù)字,讀到空格(‘/0’)的位置,將從X到’/0’之間所需的仿真信息按順序封裝到新的m_compete緩沖區(qū)。另外還需把所解碼的仿真信息賦值給刀具移動(dòng)變量,使得刀具運(yùn)動(dòng)依據(jù)NC代碼的內(nèi)容進(jìn)行運(yùn)動(dòng)仿真。
實(shí)例代碼:
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);//讀到這一橫行代碼的結(jié)尾 } n=n+1; CStringCoordinateX; CoordinateX=(*it).Mid(n,m-n);//用來(lái)提取G的信息 rX=_ttof(CoordinateG); coor.m_g=rG; flag++;//標(biāo)記 } … } stl模型文件是計(jì)算機(jī)圖形學(xué)處理CG,數(shù)字幾何處理的最常見(jiàn)文件格式,其文件格式簡(jiǎn)單,是由一系列三角面片構(gòu)成,僅有頂點(diǎn)信息,并沒(méi)有光照材質(zhì)等渲染信息,所以在此系統(tǒng)中只需讀取stl模型只需讀取頂點(diǎn)數(shù)據(jù)等幾何信息,不必考慮渲染等解碼部分。 解碼stl文件,需要了解stl文件的格式信息,其中stl文件包含兩種格式:一種是ASCII格式,另一種是二進(jìn)制格式。兩者的區(qū)別在于存儲(chǔ)方式的不同。根據(jù)不同的stl文件格式,相應(yīng)解碼也有所不同。本文采用ASCII格式,在ASCII格式下,文件每行都以關(guān)鍵字為開(kāi)頭,模型中每個(gè)三角面片的信息是以facet開(kāi)頭,進(jìn)而逐行顯示三角面片的幾何信息,其中依次包含:facet normal,從三角面片指向模型外部的法矢量,outer loop以及隨后的 vertex和endloop,集合表達(dá)了三角面片的頂點(diǎn)信息。其中vertex的三行數(shù)據(jù)是三角面片的3個(gè)頂點(diǎn)坐標(biāo)信息,三個(gè)頂點(diǎn)跟該三角面片的法向量符合右手螺旋定則,outer loop和endloop僅是頂點(diǎn)數(shù)據(jù)開(kāi)始與結(jié)束的標(biāo)記,最后文件以endfacet結(jié)尾,完成一個(gè)三角面片定義[6]。 根據(jù)stl文件的ASCII格式特點(diǎn),可有兩種讀取方法,一種是逐行進(jìn)行讀取,另一種是按三角面片個(gè)數(shù)逐個(gè)進(jìn)行讀取。由于前者逐行讀取中,所讀每一行都需要檢查是否到了文件的endface結(jié)束語(yǔ),影響效率,所以本文系統(tǒng)采用第二種方法:首先求出三角面片個(gè)數(shù)的總數(shù),其中ASCII格式中每個(gè)三角面片所占的行數(shù)為七行,因此把行數(shù)讀出來(lái)除以7所得的商就是三角面片的個(gè)數(shù),然后通過(guò)for循環(huán)操作解析每個(gè)三角面片,并且OpenGL的接口實(shí)際上是一串float的數(shù)組,與stl文件相一致,所以這里面保存了verts頂點(diǎn)坐標(biāo)信息,以及norms即法向量信息直接進(jìn)行導(dǎo)入不需做數(shù)據(jù)結(jié)構(gòu)調(diào)整,便可以解出模型。 參考代碼: 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; … } 通過(guò)仿真系統(tǒng)的前期準(zhǔn)備,就可以實(shí)現(xiàn)車削加工仿真,由于數(shù)控加工的過(guò)程是數(shù)控機(jī)床在NC代碼的驅(qū)動(dòng)下帶動(dòng)刀具對(duì)使用夾具固定在工作臺(tái)上的工件,進(jìn)行切削加工的過(guò)程,針對(duì)其特點(diǎn),在仿真系統(tǒng)中需要包含刀具運(yùn)動(dòng),工件以及夾具自轉(zhuǎn),毛坯切除的功能[7]。 圖2 車刀運(yùn)動(dòng)判別 車削的毛坯多為回轉(zhuǎn)體棒料零件,并且刀具通常只是X、Z方向上的二維移動(dòng),因此仿真可根據(jù)存儲(chǔ)到m_compete緩沖區(qū)中的關(guān)鍵運(yùn)動(dòng)代碼,將刀具的起始點(diǎn)坐標(biāo)設(shè)為原點(diǎn)坐標(biāo),并進(jìn)行X方向和Z方向起始點(diǎn)和終點(diǎn)的距離的判斷,如圖2。以車刀從第n的位置車削第n-1的位置為例,如果起始點(diǎn)X的值大于終點(diǎn)X的值,則車刀先徑向進(jìn)給運(yùn)動(dòng)。然后通過(guò)Z值判別,起始點(diǎn)Z的值大于終點(diǎn)Y的值,則車刀再完成徑向進(jìn)給運(yùn)動(dòng),通過(guò)刀具X和Z方向的運(yùn)動(dòng),從而完成進(jìn)刀運(yùn)動(dòng);退刀反之。 具體的實(shí)現(xiàn)命令如: //車刀徑向進(jìn)給運(yùn)動(dòng) if(X { m_X=m_X-V;//車刀徑向進(jìn)給 m_Z=m_Z;//車刀軸向不變 velocityflag=1;//進(jìn)給標(biāo)記 } 在仿真系統(tǒng)中,刀具運(yùn)動(dòng)的同時(shí),工件與夾具也要進(jìn)行自轉(zhuǎn)運(yùn)動(dòng),因?yàn)镺penGL是個(gè)狀態(tài)機(jī),旋轉(zhuǎn)、移動(dòng)、平移其運(yùn)動(dòng)操作都會(huì)影響視全局所有元素的狀態(tài),所以需要通過(guò)OpenGL中矩陣的壓棧出棧的功能來(lái)實(shí)現(xiàn)刀具與工件之間的獨(dú)立運(yùn)動(dòng)。 在OpenGL中所有的運(yùn)動(dòng)操作都是通過(guò)矩陣棧的棧頂來(lái)影響圖形的狀態(tài)。如圖3,將開(kāi)始狀態(tài)定為狀態(tài)1,在變換之前調(diào)用giPushMatrix()壓棧,就會(huì)把當(dāng)前狀態(tài)1壓入第二層,并且棧頂會(huì)有狀態(tài)2,并且棧頂?shù)木仃嚑顟B(tài)2是第二層狀態(tài)1的一份拷貝,所有的內(nèi)容是相同的,此時(shí)所有的矩陣操作都是在狀態(tài)2中完成,通過(guò)一系列的矩陣對(duì)所操作的圖形有所改變,而且并不會(huì)影響全局元素的狀態(tài),變換之后,使用glPopMatrix出棧,將上面操作過(guò)的狀態(tài)2去掉,之前的狀態(tài)1又放到棧頂,恢復(fù)原來(lái)的狀態(tài)。在本文中,通過(guò)壓棧出棧操作進(jìn)行刀具運(yùn)動(dòng),從而在刀具的運(yùn)動(dòng)同時(shí),不影響工件與夾具的自轉(zhuǎn)運(yùn)動(dòng)狀態(tài)。 工件以及夾具的運(yùn)動(dòng)主要用glRotatef(GLfloat angle, GLfloat x, GLfloat y, GLfloat z)函數(shù)進(jìn)行自轉(zhuǎn),x、y、z表示旋轉(zhuǎn)軸,angle代表旋轉(zhuǎn)角度,在本文中旋轉(zhuǎn)軸為z軸,旋轉(zhuǎn)角度隨時(shí)間而曾大,然后通過(guò)if判斷要是轉(zhuǎn)過(guò)一周,角度則從0°再開(kāi)始繼續(xù)增加,如此,工件與夾具便在加工仿真中一直自轉(zhuǎn)而不受刀具移動(dòng)的干擾。 圖3 壓棧出棧圖 由于OpenGL中沒(méi)有實(shí)體建模的功能,所以本文毛坯的實(shí)體建模通過(guò)曲面繪制進(jìn)行組合,gluCylinder圓柱面,和gluDisk圓盤(pán)面來(lái)實(shí)現(xiàn)毛坯的加工仿真。 圖4 毛坯設(shè)計(jì) 為實(shí)現(xiàn)毛坯形狀隨切削加工的進(jìn)行而發(fā)生形狀實(shí)時(shí)改變,本文采用幾何仿真,將毛坯形狀根據(jù)離散法來(lái)滿足仿真要求,即把毛坯的圓柱離散成同心、同底、同高但半徑不同的圓柱體,車削毛坯時(shí),圓柱的地面半徑與最外側(cè)的底面半徑遞增關(guān)系如圖4所示。在加工部分,大圓柱以車刀加工終點(diǎn)位置作為起始點(diǎn),隨著車刀的軸向進(jìn)給運(yùn)動(dòng),大圓柱的高隨之減小,小圓柱以車刀加工起始點(diǎn)位置作為起始點(diǎn),并隨著車刀軸向進(jìn)給運(yùn)動(dòng),小圓柱體高隨之增大,效果可看成是從大圓柱剝離出小圓柱體,隨著刀具的運(yùn)動(dòng),大圓柱和小圓柱的半徑發(fā)生實(shí)時(shí)改變,以第n次車刀車削為例,在第n次車刀進(jìn)行車削時(shí),大圓半徑為第n-1次車削加工后小圓柱體半徑;小圓半徑為第n次車削加工時(shí)的小圓柱體半徑,同時(shí)兩圓柱面交際面用圓盤(pán)作底面,形成封閉圖形,兩個(gè)圓柱的高通過(guò)刀具的位置改變而發(fā)生變化,底面圓盤(pán)根據(jù)刀具的軸向進(jìn)給運(yùn)動(dòng)而移動(dòng),便可實(shí)現(xià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);//移動(dòng)刀具加工的兩圓柱底面 gluDisk(quadratic,(*it_chip).RadiuolnStart,(*it_chip).RadiuoOutStart,32,1);//形成加工時(shí)兩圓柱底面 … 在菜單項(xiàng)點(diǎn)擊NC代碼導(dǎo)入,選擇所需的NC代碼導(dǎo)入到系統(tǒng)中,再單擊stl模型,分別將夾具模型與車刀模型添加到系統(tǒng),最后選擇仿真開(kāi)始,便可實(shí)現(xiàn)車削運(yùn)動(dòng)仿真模擬,軟件實(shí)現(xiàn)效果如圖5。 圖5 系統(tǒng)運(yùn)行效果 針對(duì)數(shù)控車削的形狀特點(diǎn)及傳統(tǒng)落后的加工工藝,以Visual Studio 2015為開(kāi)發(fā)平臺(tái),使用OpenGL 三維圖形標(biāo)準(zhǔn)庫(kù),采用離散法實(shí)現(xiàn)毛坯切除,開(kāi)發(fā)數(shù)控車削動(dòng)態(tài)運(yùn)動(dòng)仿真系統(tǒng),實(shí)現(xiàn)了虛擬車削加工過(guò)程的可視化,直觀地顯示了刀具路徑、工件的轉(zhuǎn)動(dòng)、材料去除等過(guò)程。實(shí)驗(yàn)表明,仿真效果達(dá)到了預(yù)期要求,具有良好的實(shí)時(shí)性; 為車削加工提供了保障和可行性;以新的角度詮釋了OpenGL環(huán)境的搭建,同時(shí)讀取stl方法以及離散法毛坯去除對(duì)于同類虛擬仿真加工的擴(kuò)展,具有一定的借鑒意義。 [1] 周靜.數(shù)控仿真三維建模及實(shí)現(xiàn)[D].南京:南京理工大學(xué),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] 李春雷.虛擬數(shù)控車削加工誤差建模技術(shù)研究[J].機(jī)械工程與自動(dòng)化,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,F(xiàn)AN J C.Application of OpenGL in NC turning simulation[J].Advanced Materials Research,2012,505:282-286. [6] 嚴(yán)梽銘,鐘艷如.基于VC++和OpenGL的STL文件讀取顯示[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2009(3):172-175 [7] 董大勇.虛擬制造中的數(shù)控銑削仿真加工技術(shù)[J].金屬加工(冷加工),2015(15):58-59. [8] 牛書(shū)濤,庫(kù)祥臣.基于Visual C++與OpenGL的數(shù)控車削加工仿真系統(tǒng)研究[J].機(jī)電一體化,2012,18(3):35-39.2.3 stl模型模塊
3 加工仿真過(guò)程
3.1 刀具運(yùn)動(dòng)模塊
3.2 工件運(yùn)動(dòng)模塊
3.3 毛坯設(shè)計(jì)模塊
4 軟件實(shí)現(xiàn)
5 結(jié)束語(yǔ)