林礪宗 宋啟盛 林 森 王啟春
(華東理工大學(xué)機(jī)械與動(dòng)力工程學(xué)院,上海200237)
宏程序是現(xiàn)代數(shù)控系統(tǒng)重要的標(biāo)志之一。宏的出現(xiàn)使數(shù)控系統(tǒng)的二次開發(fā)成為可能。只要通過對(duì)變量的修改,便能實(shí)現(xiàn)對(duì)同一類零件,不同規(guī)格尺寸的加工。大大提高了程序復(fù)用率,簡(jiǎn)化了實(shí)際加工操作。
因此能支持宏程序的編譯器,已成為任何數(shù)控系統(tǒng)的首要基礎(chǔ)。本文用的方法相對(duì)而言較直觀,比起專業(yè)的編譯器實(shí)現(xiàn)要更簡(jiǎn)單,并具有較高的效率。
一般制作編譯器有用 VC直接開發(fā)的,但是VC6.0本身不支持正則表達(dá)式,因而開發(fā)起來代碼量大,且編譯器運(yùn)行速度慢;有用VC和微軟開發(fā)正則表達(dá)式GRETA代碼編寫的[1],雖然有正則表達(dá)式能簡(jiǎn)化編程,但 GRETA功能有限;還有用專業(yè)編譯器LEX&YACC[2],老版本已經(jīng)很難找到,而新版本是付費(fèi)軟件,由于版權(quán)原因,投入商業(yè)開發(fā)會(huì)有版權(quán)問題。
本文選用開放式源代碼庫BOOST,除了版權(quán)免費(fèi)以外,其還包含了正則表達(dá)式及迭代等算法,方便快速編程,且效率高,能較好實(shí)現(xiàn)G代碼及宏代碼的編譯。
BOOST主要包含以下幾個(gè)大類:字符串及文本處理、容器、迭代子(Iterator)、算法、函數(shù)對(duì)象和高階編程、泛型編程、模板元編程、預(yù)處理元編程、并發(fā)編程、數(shù)學(xué)相關(guān)、糾錯(cuò)和測(cè)試、數(shù)據(jù)結(jié)構(gòu)、輸入/輸出、跨語言支持、內(nèi)存相關(guān)、語法分析、雜項(xiàng)。具有很強(qiáng)大的功能。
譯碼系統(tǒng)主要是識(shí)別G、M、T、S等代碼,并進(jìn)行詞義、語義的分析[3]。分析完之后把相關(guān)參數(shù)存入代碼數(shù)據(jù)庫中的NC代碼表,如表1所示,為以后運(yùn)行做準(zhǔn)備。通常的做法是在程序中開辟程序緩沖區(qū),定義一個(gè)結(jié)構(gòu)體,把代碼的相關(guān)信息存入結(jié)構(gòu)體中[1]。這樣可以加快編譯速度。但對(duì)于突然斷電等情況,內(nèi)存中的數(shù)據(jù)會(huì)突然丟失,且占用內(nèi)存較大。而現(xiàn)在的計(jì)算機(jī)的運(yùn)行速度,每年都能大幅度提高,因此決定放棄部分運(yùn)行速度來提高系統(tǒng)的可靠性,把代碼存入數(shù)據(jù)表中。這樣,即使未存盤,也不會(huì)丟失數(shù)據(jù)。并且所占用的內(nèi)存相對(duì)較少。其較系統(tǒng)自動(dòng)存盤功能的編寫更簡(jiǎn)單。
表1 代碼數(shù)據(jù)庫NC代碼表
代碼數(shù)據(jù)庫結(jié)構(gòu)的組成結(jié)構(gòu)圖,如圖1所示。
NC 代碼表存放功能字、X、Y、Z、U、V、W、S、T,平面信息,相對(duì)、絕對(duì)坐標(biāo),刀號(hào)及公英制信息。
宏代碼表存放宏變量。系統(tǒng)共建立了100個(gè)局部變量,其作用域只存在當(dāng)前的程序中,編號(hào)為#0-#99存儲(chǔ)在數(shù)組中。并有100個(gè)全局變量,其存儲(chǔ)一些相關(guān)的比較重要的系統(tǒng)參數(shù)及自定義函數(shù),其針對(duì)所有的宏程序,它存儲(chǔ)在宏代碼表中其編號(hào)為#100-#199。
(1)譯碼器所定義的關(guān)鍵字及符號(hào)
(2)G代碼數(shù)據(jù)結(jié)構(gòu)的定義
譯碼器首先讀入的代碼,根據(jù)判斷符串里是否包含#、IF、WHILE、SIN、GE 等一些代表變量,控制語句,三角函數(shù),邏輯判定函數(shù)等來區(qū)分是否是宏代碼。
若是宏代碼,則做一些相關(guān)的操作:
(1)變量的替換
在推進(jìn)地下水超采治理試點(diǎn)工作中,始終牢牢把握五條基本原則:一是政府引導(dǎo)、全民行動(dòng),發(fā)揮好政府和群眾兩個(gè)積極性;二是規(guī)劃統(tǒng)領(lǐng)、科學(xué)治理,年度實(shí)施方案與中長期規(guī)劃有機(jī)銜接,集中連片規(guī)模實(shí)施,務(wù)求治理一片、見效一片、鞏固一片;三是創(chuàng)新機(jī)制、示范帶動(dòng),探索建立地下水超采治理的有效途徑,力求取得可示范、可復(fù)制、可推廣的經(jīng)驗(yàn);四是因地制宜、積極穩(wěn)妥,根據(jù)實(shí)際情況,科學(xué)確定治理模式和工程規(guī)模;五是競(jìng)爭(zhēng)立項(xiàng)、績(jī)效考核,依據(jù)項(xiàng)目前期工作和壓采效果擇優(yōu)實(shí)施,嚴(yán)格把關(guān)、嚴(yán)格獎(jiǎng)懲。
當(dāng)碰到的是賦值語句時(shí),如#3=10,#100=25.6,首先讀取變量號(hào),當(dāng)變量號(hào)是0-99時(shí),此時(shí)代表局部變量,則把值存入內(nèi)存中開辟的數(shù)組中,供當(dāng)前程序調(diào)用;若變量號(hào)是100-199時(shí),則直接把數(shù)據(jù)存入宏變量數(shù)據(jù)庫中,供所有程序調(diào)用。
當(dāng)存在含變量的代碼時(shí),如G01 X#3 Y#100,則分別根據(jù)變量從內(nèi)存數(shù)組和宏變量數(shù)據(jù)庫中讀出變量值,并替換原來的變量名,即變?yōu)镚01 X10 Y25.6。
(2)數(shù)值的計(jì)算
當(dāng)遇到是變量的三角函數(shù)或變量的四則運(yùn)算時(shí),由于VC6.0本身不具備文本運(yùn)算功能,即輸入文本型的數(shù)字,并能計(jì)算這些“數(shù)字”之間的四則運(yùn)算,于是調(diào)用JAVA中的一個(gè)腳本控件msscript.ocx,這樣能方便的達(dá)到目的。
使用此控件時(shí),只要在expression中定義要計(jì)算的文本字符串,如“3+45.6*3+3/2”,就能很方便的得出結(jié)果。
由于此控件只能針對(duì)四則運(yùn)算,對(duì)于三角函數(shù)等一些函數(shù)的處理則不同。以“SIN[#2+1]”為例,首先判定字符串中有字串“SIN”,再提取“[]”中的內(nèi)容,如果有變量,則先進(jìn)行變量的替換,然后用控件msscript.ocx計(jì)算出“#2+1”的值,最后把文本值轉(zhuǎn)成浮點(diǎn)數(shù)值,用VC自帶的SIN函數(shù)運(yùn)算即可得出結(jié)果。
(3)語法分析和錯(cuò)誤處理
語法的正則表達(dá)式的定義如下所示,用正則表達(dá)式定義了G代碼能識(shí)別的所有關(guān)鍵字,及每個(gè)關(guān)鍵字后的數(shù)值的類型,一旦出現(xiàn)不能識(shí)別的關(guān)鍵字或數(shù)值類型與定義不符,如刀號(hào)T后跟帶有小數(shù)點(diǎn)的數(shù)值,則正則表達(dá)式判別不能通過,并報(bào)錯(cuò)。
“ *”表示X之前空格可以出現(xiàn)無數(shù)次,也可以不出現(xiàn),即忽略空格?!埃踃|x]”表示匹配大寫X或小寫x,即忽略大小寫;“?”表示關(guān)鍵字X可以不出現(xiàn),但最多出現(xiàn)1次,超過則不能通過正則判定報(bào)語法錯(cuò)誤。(( -{0,1}\d+)( \.\d+)?)?表示數(shù)值可以是一個(gè)帶有符號(hào)的浮點(diǎn)數(shù)或整數(shù)。
若能通過上述正則表達(dá)式,則提取相關(guān)的參數(shù)。以X為例:
除用正則表達(dá)式評(píng)定語法法則外,根據(jù)代碼分類,判定指令之間有沒有沖突:
在讀入G代碼時(shí),根據(jù)讀入的G代碼功能字(如表2),先分組然后根據(jù)同一行G代碼中出現(xiàn)的功能字,是不是在同一組來判定,代碼之間會(huì)不會(huì)有沖突。
表2 主要G代碼功能分類
運(yùn)行時(shí)首先確認(rèn)是否要調(diào)用子程序,若要調(diào)用子程序則需要先記下當(dāng)前執(zhí)行程序所在的位置及一些相關(guān)局部變量等一些斷點(diǎn)的信息,然后跳轉(zhuǎn)到子程序上;當(dāng)調(diào)用完畢后恢復(fù)所保存的相關(guān)信息,并回到調(diào)用子程序所在位置的下一條指令上(圖3)。
宏程序中支持的分支語句有 IF[條件為真]THEN,IF[條件為真]GOTOn(行號(hào))。循環(huán)主要有WHILE[條件]Don(循環(huán)體編號(hào))。條件的判斷,依然采用先前的JAVA的腳本控件msscript.ocx和正則表達(dá)式。操作時(shí)先用相應(yīng)的變量值把[]中的變量替換掉,使之成為只有數(shù)字和不等式符號(hào)的表達(dá)式,然后用正則表達(dá)式提?。郏葜械谋磉_(dá)式:
而后使用控件msscript.ocx,其支持不等式的判斷。使用方法與前面不等式計(jì)算的方法一樣,只是在expression中用不等式表達(dá)式即可。為真時(shí)返回-1,為假時(shí)返回0。流程如圖4所示。
運(yùn)用宏程序編寫了一個(gè)走橢圓軌跡的代碼:
并在數(shù)控平臺(tái)上運(yùn)行,運(yùn)行情況如圖5所示。
對(duì)于宏程序的編譯器而言,由于可以進(jìn)行二次開發(fā),具有很好的前景。本文采用了BOOST庫和JAVA腳本控件制作宏代碼編譯器,可以方便有效地做出帶有分支、循環(huán)語句的編譯器,具有較高的效率。
[1]任松濤,秦現(xiàn)生,白晶.NC代碼解釋器的開發(fā)[J].中國制造業(yè)信息化.2007(5):54-57.
[2]伍抗逆,李斌,陳吉宏.面向開放式數(shù)控系統(tǒng)平臺(tái)的NC代碼解釋器的開發(fā)[J].中國機(jī)械工程.2006(2):168-171.
[3]Andrew Watt.Beginning Regular Expressions.北京:清華大學(xué)出版社,2008.
[4]林峰.機(jī)床開放式數(shù)控系統(tǒng)的研究[D].杭州:浙江工業(yè)大學(xué),2004(5):1-3.
[4]易紅.數(shù)控技術(shù)[M].北京:機(jī)械工業(yè)出版社,2005.
[6]任玉田,包杰,等.新編機(jī)床數(shù)控技術(shù)[M].北京:北京理工大學(xué)出版社,2005.
[7]秦旭,盛亮,廖文和,等.基于組件NC代碼轉(zhuǎn)換關(guān)鍵技術(shù)的研究[J].電氣技術(shù)與自動(dòng)化,2004(33):60-64.