魏勝利,徐書(shū)蕾
(安陽(yáng)工學(xué)院計(jì)算機(jī)科學(xué)與信息工程學(xué)院,安陽(yáng)455000)
BMP格式文件轉(zhuǎn)換NC代碼的研究
魏勝利,徐書(shū)蕾
(安陽(yáng)工學(xué)院計(jì)算機(jī)科學(xué)與信息工程學(xué)院,安陽(yáng)455000)
在數(shù)控系統(tǒng)和3D打印系統(tǒng)中,需要將圖形文件轉(zhuǎn)換為NC代碼。提出一種將BMP(Bitmap)格式的圖形文件轉(zhuǎn)換為NC代碼的方法。圖形文件以BMP格式保存,在操作時(shí)創(chuàng)建一個(gè)臨時(shí)文件,對(duì)繪畫(huà)的圖形實(shí)時(shí)保存,再利用功能函數(shù)讀取圖形文件的信息,生成一個(gè)NC代碼。以VC6.0為開(kāi)發(fā)平臺(tái),以C、C++語(yǔ)言為主要編程語(yǔ)言,實(shí)現(xiàn)該轉(zhuǎn)換系統(tǒng)。
BMP格式文件;位圖;NC代碼;NC系統(tǒng);3D打印
多數(shù)情況下,數(shù)控機(jī)床以及3D打印機(jī)的運(yùn)行離不開(kāi)命令的控制,NC代碼作為其中的一種命令廣泛應(yīng)用于這些平臺(tái)上。在數(shù)字化制造的今天,數(shù)控機(jī)床和3D打印機(jī)都需要根據(jù)三維造型數(shù)據(jù)進(jìn)行路徑規(guī)劃獲取打印路徑。然后根據(jù)這些路徑使用NC代碼編程以驅(qū)動(dòng)機(jī)床和3D打印機(jī)。然而直接使用NC代碼對(duì)圖形圖像直接編程不僅代碼量大而且編程較為繁雜,效率達(dá)不到我們所預(yù)期的效果?;诖?,提出了一種將圖形文件直接轉(zhuǎn)換為NC代碼的方法并實(shí)現(xiàn)了它。首先將圖形文件以BMP格式進(jìn)行存儲(chǔ),然后通過(guò)算法將圖形文件轉(zhuǎn)換成NC代碼,這樣在很大程度上提高了數(shù)控的編程效率。
要想實(shí)現(xiàn)利用BMP格式文件轉(zhuǎn)換NC代碼,首先要充分了解BMP格式,理解BMP格式中的數(shù)據(jù)結(jié)構(gòu)。BMP格式圖像文件是基于DIB(設(shè)備無(wú)關(guān)位圖文件)文件,代碼實(shí)現(xiàn)過(guò)程中需要對(duì)其格式進(jìn)行解析,以便于圖像文件的生成、打開(kāi)及保存。由于MFC未提供現(xiàn)成的類(lèi)來(lái)封裝DIB,因此需要自己進(jìn)行類(lèi)的設(shè)計(jì)。BMP文件分為4部分:有關(guān)位圖文件屬性的文件頭(BITMAPFILEHEADER)、有關(guān)位圖信息頭的(BIT?MAPINFOHEADER)、調(diào)色板以及位圖的圖像數(shù)據(jù)[1]。BMP文件結(jié)構(gòu)如圖1所示:
圖1 BMP文件結(jié)構(gòu)
在位圖文件結(jié)構(gòu)中,位圖文件頭(BITMAPFILE?HEADER)數(shù)據(jù)結(jié)構(gòu)定義了位圖的圖像類(lèi)型、圖像大小、圖像數(shù)據(jù)存放地址和兩個(gè)保留未使用的字段,它們的字段大小分別為2、4、2、2、2字節(jié),其主要是標(biāo)注位圖的屬性。位圖信息頭(BITMAPINFOHEADER)數(shù)據(jù)結(jié)構(gòu)主要定義了位圖信息頭的大小、圖像的寬高、圖像的色深、壓縮說(shuō)明圖像數(shù)據(jù)的大小等信息。其中位圖信息頭的字段大小為4字節(jié),根據(jù)不同的操作系統(tǒng)而不同。在Windows中,此字段的值總為40字節(jié),位圖寬度和高度的字段大小都為4字節(jié)。在位圖圖像的單位中,寬度的單位為像素,而高度則為0,圖像數(shù)據(jù)大小字段的大小為4字節(jié),而圖像數(shù)據(jù)大小必須為4的倍數(shù)。圖像數(shù)據(jù)大小不是4的倍數(shù)時(shí)用0填充補(bǔ)足。顏色表(color table)是單色、16色和256色圖像文件所特有的,相對(duì)應(yīng)的調(diào)色板大小是2、16和256。調(diào)色板以4字節(jié)為單位,每4個(gè)字節(jié)存放一個(gè)顏色值,圖像的數(shù)據(jù)是指向調(diào)色板的索引,例如圖像數(shù)據(jù)03 00 11 FF表示調(diào)用調(diào)色板[3]、調(diào)色板[0]、調(diào)色板[17]和調(diào)色板[255]中的數(shù)據(jù)來(lái)顯示圖像顏色。
NC代碼是數(shù)字控制器所能識(shí)別并運(yùn)行的代碼總稱(chēng),使用的平臺(tái)不同,代碼也就不同。我們所研究的是G代碼,其分為“模態(tài)代碼”和“一般代碼”?!澳B(tài)代碼”的功能在它被執(zhí)行后會(huì)繼續(xù)維持,“一般代碼”則僅僅在收到該命令時(shí)起作用,像直線、圓弧之類(lèi)的代碼稱(chēng)為“模態(tài)代碼”,原點(diǎn)返回等代碼稱(chēng)為“一般代碼”[2]。
本文中所論述的NC代碼中所包含的命令有M代碼、G代碼。我們所研究的是基于直線插補(bǔ)的NC代碼段的研究,所涉及的命令及解釋如下所示:
(1)M代碼用于數(shù)控設(shè)備的輔助裝置的開(kāi)關(guān)及動(dòng)作。如
M02:程序停止
M03:主軸順時(shí)針旋轉(zhuǎn)
(2)G代碼用于建立數(shù)控系統(tǒng)工作的一種指令。如:
G00:快速移動(dòng)點(diǎn)定位
G01:直線插補(bǔ)
G90:絕對(duì)值編程
G92:螺紋切削循環(huán)
(3)F代碼用于主軸刀具的進(jìn)給速度,通常以每分鐘進(jìn)給量設(shè)置數(shù)據(jù)。
(4)S代碼用于指定主軸轉(zhuǎn)速。
(5)T代碼用于指定刀具編號(hào)。
(6)N代碼表示程序段序號(hào),當(dāng)以一段程序用N1標(biāo)識(shí)時(shí),往后依次間隔1的方法設(shè)置程序段號(hào)。
目前,NC代碼可以采用手動(dòng)編寫(xiě),也可以用CAM軟件自動(dòng)生成[3]。本系統(tǒng)本質(zhì)上是基于圖形NC代碼自動(dòng)轉(zhuǎn)換和生成。我們開(kāi)發(fā)完成了將基于BMP格式的圖形文件轉(zhuǎn)換為NC代碼的系統(tǒng)。系統(tǒng)采用VC++ 6.0為開(kāi)發(fā)平臺(tái),采用C、C++語(yǔ)言相結(jié)合的方式對(duì)系統(tǒng)進(jìn)行開(kāi)發(fā)。NC代碼轉(zhuǎn)換的流程圖2所示:
圖2 NC代碼轉(zhuǎn)換的流程圖
在這一過(guò)程中,最為關(guān)鍵的是實(shí)現(xiàn)對(duì)位圖圖像文件信息的讀取以及生成所需要的NC代碼。了解位圖圖像文件的數(shù)據(jù)構(gòu)造,怎么索引關(guān)鍵數(shù)據(jù)信息是最重要的。在初始化變量時(shí),根據(jù)NC代碼數(shù)據(jù)結(jié)構(gòu)只需要X、Y坐標(biāo)的實(shí)際大?。ū壤枰獧C(jī)器下刀數(shù)據(jù)大小值以及位圖的頭信息。位圖頭信息的作用是建立索引,讀取位圖信息。具體實(shí)施步驟如下:
(1)定義一個(gè)CSize類(lèi)型的函數(shù)來(lái)獲取位圖的寬和高的數(shù)據(jù)大小,以像素為單位。通過(guò)LPtoDP()和DP?toLP()兩個(gè)函數(shù)實(shí)現(xiàn)將設(shè)備坐標(biāo)轉(zhuǎn)換為邏輯坐標(biāo),同時(shí)設(shè)置實(shí)際的長(zhǎng)度和顯示的長(zhǎng)度的比值。
(2)利用DIBWidth()、DIBHeight()、BytesPerLine()分別獲取圖像寬度字節(jié)數(shù)、高度字節(jié)數(shù)以及圖像每行字節(jié)數(shù),以便于用循環(huán)實(shí)現(xiàn)信息讀取及代碼轉(zhuǎn)功能的實(shí)現(xiàn)。
(3)通過(guò)FindDIBBits()函數(shù)實(shí)現(xiàn)BMP圖像像素起始位置并返回指向BMP像素指針。通過(guò)像素指針、像素高度、寬度及每行的字節(jié)數(shù)實(shí)現(xiàn)逐行對(duì)圖像信息的讀取。在以起始點(diǎn)為搜索端的基礎(chǔ)上,判斷這個(gè)像素點(diǎn)周?chē)欠翊嬖谄渌南袼攸c(diǎn)。存在或不存在都以一個(gè)像素為單位進(jìn)行步進(jìn),將像素點(diǎn)的坐標(biāo)值賦值給X、Y。通過(guò)設(shè)定的實(shí)際長(zhǎng)度和顯示比例的比值關(guān)系將X、Y的坐標(biāo)值以NC代碼格式存儲(chǔ)在字符串中,依次循環(huán)。當(dāng)讀取到孤立點(diǎn)時(shí),將孤立點(diǎn)的坐標(biāo)值以G00的格式存儲(chǔ),實(shí)現(xiàn)快速移動(dòng)到下一個(gè)坐標(biāo)點(diǎn)。
(4)最后是對(duì)NC代碼的完善,設(shè)定刀具的轉(zhuǎn)速值、代碼開(kāi)始標(biāo)識(shí)以及代碼終止標(biāo)識(shí),實(shí)現(xiàn)NC代碼規(guī)范化。
為測(cè)試方法和轉(zhuǎn)換系統(tǒng)的有效性,設(shè)計(jì)一個(gè)矩形的圖形。通過(guò)轉(zhuǎn)換,將其轉(zhuǎn)換成NC代碼。在雕刻機(jī)平臺(tái)上的運(yùn)行NC代碼,得出了比較滿(mǎn)意的結(jié)果。設(shè)計(jì)的圖形和轉(zhuǎn)換的NC代碼如圖3和圖4所示。
圖3 待轉(zhuǎn)換的矩形圖形
圖4 提取的NC代碼
一般情況下,NC代碼是相對(duì)獨(dú)立的,讀取NC代碼時(shí)逐行讀取,所以?xún)?chǔ)存時(shí)也是采取逐行存儲(chǔ)的模式[4]。為了驗(yàn)證NC代碼的準(zhǔn)確性,采用了固高科技的三軸雕刻機(jī)來(lái)進(jìn)行測(cè)試。測(cè)試的結(jié)果如圖5所示。從圖中可以看出,所獲取的NC代碼有效的復(fù)原了設(shè)計(jì)的圖形。
在系統(tǒng)運(yùn)行時(shí),通過(guò)專(zhuān)用的電纜連接輸入、輸出接口、步進(jìn)電機(jī)驅(qū)動(dòng)、實(shí)時(shí)狀態(tài)顯示、系統(tǒng)操作與各伺服單元和I/O單元的連接,在X、Y軸方向上采用直線電機(jī)直接驅(qū)動(dòng),Z軸方向采用伺服電機(jī)加滾珠絲杠的方式驅(qū)動(dòng)[2]。而在數(shù)據(jù)信息進(jìn)行傳輸前需要對(duì)NC代碼進(jìn)行信息檢錯(cuò),NC源代碼將信息傳遞給NC代碼解釋器,如果遇到錯(cuò)誤代碼則出現(xiàn)反饋信息,如果沒(méi)有代碼錯(cuò)誤,則將NC代碼轉(zhuǎn)換為雕刻機(jī)控制參數(shù)[5]。從對(duì)刀原點(diǎn)到矩形的左下角用G00代碼實(shí)現(xiàn)快速移動(dòng)定位,將刀具移動(dòng)到轉(zhuǎn)換NC代碼時(shí)存儲(chǔ)的第一個(gè)BMP圖像像素點(diǎn),即X:7.906/Y:25.037(通過(guò)比例對(duì)換過(guò)的數(shù)據(jù)),而此過(guò)程中始終是沒(méi)有下刀的,到達(dá)矩形左下角的定位點(diǎn),刀具下刀,實(shí)現(xiàn)順時(shí)針移動(dòng),最后移動(dòng)到原來(lái)的定位點(diǎn)。刀具的移動(dòng)順序跟NC代碼生成過(guò)程遍歷圖像像素點(diǎn)的順序一樣,這就是刀具順時(shí)針移動(dòng)的原因。
圖5 測(cè)試結(jié)果圖
在3D打印系統(tǒng)中,通常需要根據(jù)層面的信息規(guī)劃打印的路徑,而層面信息通常以圖形的形式存在,研究設(shè)計(jì)能夠根據(jù)圖形信息提取NC代碼的系統(tǒng)很有意義。本文主要論述了基于BMP格式的NC代碼轉(zhuǎn)換,通過(guò)在實(shí)驗(yàn)機(jī)器上的測(cè)試結(jié)果分析得知,系統(tǒng)對(duì)BMP格式圖像的信息處理符合要求。
在未來(lái),數(shù)控技術(shù)會(huì)有廣泛的應(yīng)用,3D打印技術(shù)、雕刻機(jī)等慢慢如融到我們的生活中。能夠?qū)D形轉(zhuǎn)換為NC代碼有著廣闊的應(yīng)用前景。只需一張BMP格式的文件,就可以把圖像刻在木制家具上或者打印出來(lái)。通過(guò)技術(shù)的不斷更新,未來(lái)實(shí)現(xiàn)在三維圖形中提取NC代碼將會(huì)是突破性的發(fā)展。
參考考獻(xiàn):
[1]宋葉未,葉建芳.BMP格式位圖文件的分析及顯示算法[J].現(xiàn)代電子技術(shù),2011(20):5-7.
[2]張學(xué)飛,李健.開(kāi)放式數(shù)控系統(tǒng)G代碼的編譯模塊設(shè)計(jì)[J].機(jī)械設(shè)計(jì)與制造,2010(10):14-17.
[3]張宗,健張吉,堂張鵬.數(shù)控機(jī)床超聲檢測(cè)附件NC代碼提取技術(shù)[J].機(jī)械設(shè)計(jì)與制造,2015(11):152-155.
[4]高靜,遠(yuǎn)張鵬,周金瑞.基于VC的開(kāi)放式數(shù)控系統(tǒng)NC代碼解釋器及擴(kuò)展功能的設(shè)計(jì)及實(shí)現(xiàn)[J].機(jī)床與液壓,2012(13):118-120.
[5]張慶,姚錫凡.一種開(kāi)放式數(shù)控系統(tǒng)NC代碼編譯器設(shè)計(jì)與實(shí)現(xiàn)[J].組合機(jī)床與自動(dòng)化加工技術(shù),2010(2):59-61.
Research on the Conversion from BMP Image to NC Code
WEISheng-li,XUShu-lei
(CollegeofComputer Scienceand Information Engineering,Anyang Instituteof Technology,Anyang 455000)
In NC and 3D printing system,conversion from graphic files to NC codemay be needed.Presentsamethod to transform BMP(Bitmap)files to NC code.A graphic file is saved with BMP format.When the file needs to bemodified,a temporary file will be created to save the changed file timely.When necessary,performance function is used to read the information of the graphic files to generate NC code.Then developsa transform system with VC6.0 platform and Cand C++language.
魏勝利(1974-),男,河南滑縣人,講師,碩士研究生,研究方向?yàn)橛?jì)算機(jī)控制、計(jì)算機(jī)圖形
2017-07-25
2016年河南省科技攻關(guān)計(jì)劃項(xiàng)目(No.162102210130)
1007-1423(2017)22-0053-04
10.3969/j.issn.1007-1423.2017.22.014
BMPFormat;NCCode;Temporary File;NCSystem;3DPrinting