陶桂寶 梁 濤 安祥波 楊 琳
(①重慶大學機械工程學院,重慶 400044;②重慶大學機械傳動國家重點實驗室,重慶 400044)
車銑復(fù)合加工是指在一臺設(shè)備上完成車、銑、鉆、鏜、攻絲、鉸孔、擴孔等功能的一項技術(shù)[1]。具有效率高、精度高、速度高等優(yōu)點。車銑復(fù)合數(shù)控機床結(jié)構(gòu)復(fù)雜,使得工件與刀具、刀具與夾具以及刀具與工作臺間發(fā)生干涉碰撞的概率增大。因此,開發(fā)一個具有驗證NC代碼正確性功能的加工仿真軟件十分必要,而NC代碼編譯模塊作為仿真軟件的核心部分之一,成為國內(nèi)外專家研究的熱點。
目前,國內(nèi)外對于三軸數(shù)控加工機床的編譯器技術(shù)研究已經(jīng)相當成熟,而對于三軸以上復(fù)雜的數(shù)控加工機床編譯器的研究報道相對較少[2-5]。編譯器的程序開發(fā)方法主要有兩種[6]:一種是直接用高級語言開發(fā),如C++、VB、C等,其中包括加載正則表達式類[7]來作詞法與語法分析的判別工具和自行創(chuàng)建規(guī)則庫代碼與判別代碼編寫[8];另一種是用詞法分析程序的自動構(gòu)造工具(LEX、YACC 及 ANTLR[9-10]等)生成詞法分析程序。
本文采用Visual C++為NC代碼編譯器的開發(fā)平臺,并以微軟公司研發(fā)的GRETA正則表達式類庫作為詞法、語法和語義匹配和分析的工具,開發(fā)一種適合車銑復(fù)合數(shù)控加工的NC代碼編譯器。
NC代碼編譯器主要功能是對NC
代碼進行校驗和譯碼。代碼校驗的主要功能是檢查代碼在詞法、語法和語義上的格式錯誤和邏輯錯誤。代碼譯碼則是從數(shù)控程序中提取與控制基礎(chǔ)運動部件運動有關(guān)的命令,計算出刀具在基礎(chǔ)坐標系的位移量,從而得到機床的刀具運動軌跡,實現(xiàn)數(shù)控程序驅(qū)動的加工過程仿真。譯碼主要分為對程序的預(yù)處理、翻譯處理、補償處理等3個過程。
NC代碼編譯器首先讀取NC文件并存儲到相應(yīng)的鏈表中,然后對鏈表中NC代碼逐行進行詞法、語法和語義的分析,即為第一次歷遍。如果檢查出程序的錯誤,編譯器則把錯誤信息進行存儲,并顯示到特定位置,以便NC程序的修改。在校驗結(jié)束后,對沒有出現(xiàn)錯誤的NC代碼進行譯碼,最終提取出刀位信息,并保存信息到鏈表中,這個過程成為第二次歷遍。NC代碼編譯的總體流程見圖1。
語法分析是指先將NC程序從NC數(shù)據(jù)鏈表中按程序字依次讀出,然后查找NC代碼是否存在規(guī)定以外的字符及不能識別的指令,包括不屬于數(shù)控系統(tǒng)的G代碼和M代碼,最后檢查字符后面數(shù)字格式及極限錯誤的過程。具體實現(xiàn)方法為:首先將檢查字符程序、詞法分析程序、語法和語義分析程序設(shè)計為單個的子程序模塊,然后在第一次鏈表歷遍時,將這幾個子程序同時進行檢查。在語法分析程序需要一個字(字符)時,調(diào)用詞法分析程序;字符檢查程序則在詞法分析程序運行時調(diào)用。采用這種方法,避免了代碼的多次調(diào)用,減少了檢查和搜索時間,提高了編譯效率。
詞法檢查的主要任務(wù)包括:
①檢查出數(shù)控系統(tǒng)不能識別的字符,即數(shù)控系統(tǒng)規(guī)定外的字符;
②根據(jù)建立的G代碼和M代碼規(guī)則庫,識別出不屬于系統(tǒng)的G代碼和M代碼;
③檢查程序號的首字符是否與數(shù)控系統(tǒng)的要求相符;數(shù)值位數(shù)是否符合系統(tǒng)規(guī)定;
④檢查程序段的數(shù)值(行號)是否在數(shù)控系統(tǒng)規(guī)定的數(shù)值范圍內(nèi);
⑤檢查坐標值代碼后的數(shù)值是否在機床的行程范圍內(nèi);
⑥檢查S代碼格式是否正確,設(shè)定的主軸轉(zhuǎn)速值是否在主軸轉(zhuǎn)速范圍內(nèi);
⑦檢查F代碼格式是否正確,設(shè)定的主軸進量給是否在主軸進給范圍內(nèi);
⑧檢查T代碼格式是否正確,其后面數(shù)值是否大于刀庫的最大容量值。
語法分析是指以一個程序段為檢查單位,根據(jù)程序指令查找相關(guān)的語法規(guī)則,然后調(diào)用相關(guān)的語法檢查單元,再按語法規(guī)則要求繼續(xù)讀入字段,判斷當前讀入的字段是否與程序指令相匹配的一個過程。如果在程序段中出現(xiàn)了規(guī)則庫中沒有列出的字段或缺少了相應(yīng)的字段,則會顯示NC程序出現(xiàn)語法錯誤。語法分析的方法分為兩種:即自頂向下分析和自底向上分析[8]。本文采用自頂向下分析方法,根據(jù)給定的代碼為起始符,按照其語法規(guī)則,試圖向下推導(dǎo)出下個字符段。如果分析字符與規(guī)定的字符段一致,則語法正確,反之,則語法錯誤。語法檢查實現(xiàn)方法為:先建立相應(yīng)的詞法規(guī)則庫,然后使用語法檢查函數(shù)檢查程序段內(nèi)指令是否存在語法錯誤。
語義分析是指按照NC代碼的語義規(guī)則,查詢程序段間指令的邏輯關(guān)系是否正確的過程。其目的為檢查程序中的語義錯誤。語義檢查實現(xiàn)方法為:首先建立一個語義檢查函數(shù),檢查整個程序的上下程序段之間是否存在語義錯誤。
語法和語義檢查的主要任務(wù)列于表1。
NC代碼編譯是指提取NC代碼中有關(guān)控制機床部件運動的命令、動作指令和狀態(tài)信息,并將其轉(zhuǎn)換成仿真所需要的數(shù)據(jù)格式,存入相應(yīng)的數(shù)據(jù)結(jié)構(gòu)鏈表中的過程。
表1 語法與語義檢查任務(wù)表
編譯過程的第一步是預(yù)處理環(huán)節(jié),即代碼的標準化,其過程為:以每一行為單位作為字符流,濾去空格、拼數(shù)字、拼復(fù)合詞,轉(zhuǎn)化成“字地址符+數(shù)字”形式的指令單詞序列,然后把單詞序列進行劃分和添加指定空格,最后將程序段重新寫入鏈表文件。
編譯過程的第二步是程序翻譯,即將標準化后的程序代碼逐行讀入,提取其中的G、M、S、T、F等關(guān)鍵代碼,分別調(diào)用相關(guān)函數(shù)進行刀位信息處理,然后將編譯好的刀位信息以規(guī)定的格式存儲到數(shù)據(jù)鏈表中。例如直線插補指令,需要提供插補起點和終點坐標值;圓弧插補指令,則需要提供圓心、圓弧半徑和圓弧起點終點坐標值;固定循環(huán)指令,則要提供固定循環(huán)加工軌跡所要的點的坐標值和加工次數(shù)。
編譯過程的第三步是補償處理,即對刀具半徑、長度及位置補償指令建立相應(yīng)的補償模塊,為刀具位置信息增加補償值。
車銑復(fù)合數(shù)控加工是一種高效的數(shù)控加工形式。車銑復(fù)合加工機床通常采用雙刀或多刀同時車削、銑削加工工件,以達到縮短加工時間的目的,從而提高生產(chǎn)效率。在加工過程中,刀架的動作采用等待協(xié)調(diào)機制來控制,即在同一個同步時段中,如果其中一個刀架先完成加工任務(wù),如主刀架先完成,則不需要等其余刀架是否完成而直接進入下一時段加工,否則需要等主刀架任務(wù)完成后才進行下一時段的加工。多通道分別控制機床刀架滑板,數(shù)控系統(tǒng)的等待協(xié)調(diào)指令則用于實現(xiàn)刀架的工作進程,其中通道1設(shè)為主通道。等待指令格式為 WAITM(n,1,2)或者 WAITE(m)。WAITM(n,1,2)中的n表示等待的工步匹配號(同步號),為任意正整數(shù)值,后邊的1,2分別表示通道1和通道2;WAITE(m)中的m值取1或2,表示通道m(xù)的程序結(jié)束[11]。此外,車銑復(fù)合數(shù)控代碼具有如下特點:
①以工步為基本單位,工步內(nèi)包含有子程序調(diào)用;
②NC代碼可以像高級語言具有分支和循環(huán)功能;
③工步內(nèi)部和工步之間存在跳轉(zhuǎn)指令;
④使用R參數(shù)和算術(shù)表達式;
⑤左右刀架NC代碼中間存在信息通訊和協(xié)調(diào),由等待協(xié)調(diào)指令控制。
由于車銑復(fù)合數(shù)控以工步為單位,編譯程序首先要判斷程序為加工工步還是等待工步,然后讀取一個完整的工步信息代碼,最后對代碼進行數(shù)據(jù)處理、代碼分析和代碼編譯。
另外,在規(guī)則庫定義中,需要定義跳轉(zhuǎn)、循環(huán)和等待指令標識;對R表達式、賦值表達式及算術(shù)表達式需建立相應(yīng)的數(shù)據(jù)處理模塊。
本文以Visual C++6.0為程序開發(fā)平臺,首先建立NC代碼的程序基類CNCCode,用于處理NC程序的數(shù)據(jù)處理、詞法分析、語法和語義分析、錯誤信息處理及NC程序編譯過程。由于現(xiàn)存的數(shù)控系統(tǒng)(如FANUC、SIEMENS等)指定的NC代碼標準與國際標準并不完全相同,使得代碼編譯器通用性不強。利用C++具有面向?qū)ο蟮奶匦约捶庋b性和繼承性,不同數(shù)控系統(tǒng)NC代碼子類可繼承CNCCode基類,子類則通過對規(guī)則庫函數(shù)進行重載來定義各自系統(tǒng)中的不統(tǒng)一指令。從而使得編譯器可以處理不同數(shù)控系統(tǒng)的NC代碼,這樣使得編譯器具有可對更多的數(shù)控系統(tǒng)進行擴展和兼容。CNCCode類定義如下:
正則表達式(Regular Expression)是一種字符串匹配模式,即描述或者匹配一系列符合某個句法規(guī)則的字符串,常用于檢索或者替換某個模式的文本內(nèi)容。GRETA是微軟研究院推出的一個正則表達式模板類庫,包含了C++的對象和函數(shù),使字符串的模式匹配和替換變得很容易。它們是rpattern:搜索的模式;match results/subst results:放置匹配、替換結(jié)果的容器[12]。GRETA執(zhí)行搜索和替換的操作過程:首先需要定義描述匹配規(guī)則的字符串,用來初始化rpattern類的對象。然后把需要匹配的字符串作為傳遞參數(shù),調(diào)用 rpattern類的函數(shù)(如 match()或者 substitute())。如果調(diào)用失敗,函數(shù)返回false,否則,函數(shù)返回true,match_results類的對象就可以得到匹配后的結(jié)果。編譯程序加載GRETA正則表達式類庫作為NC代碼查找的工具,方便地定義NC代碼規(guī)則和檢查代碼的錯誤。GRETA匹配速度快,提高了編譯器的編譯速度。
首先應(yīng)用正則表達式的語法規(guī)則,對關(guān)鍵字符和指令進行定義,再將它們添加到規(guī)則庫定義函數(shù),即完成了NC代碼規(guī)則庫的建立。部分關(guān)鍵字符的定義如下:
編譯程序首先打開NC程序,并把NC程序以行為單位地讀入并儲存到NC代碼數(shù)據(jù)鏈表中。在第一次歷遍NC代碼數(shù)據(jù)鏈表時,調(diào)用語法檢查函數(shù),并運用GRETA正則表達式中的Match()函數(shù),查找字符串是否能夠與相應(yīng)指令代碼的規(guī)則相匹配,如果匹配,則語法正確,否則,語法中是否存在錯誤。在歷遍過程同時,同樣的調(diào)用字符檢查函數(shù)和詞法檢查函數(shù),檢查是否存在錯誤。在語義檢查函數(shù)中,則重點檢查程序段間的邏輯錯誤。整個過程中,多次調(diào)用GRETA正則表達式Match()函數(shù),檢查所傳遞的字符串是否符合規(guī)則庫中的子串。
其中語法檢查函數(shù)中查找G00指令后面是否有任意一個坐標值的模塊定義如下:
NC代碼編譯器中的一個重要部分就是錯誤信息處理部分。主要功能是存儲和顯示錯誤的代碼信息。這樣便于用戶修改錯誤的NC代碼。本文先把詞法、語法和語義檢查出的錯誤NC代碼添加到錯誤信息鏈表(m_ErrorInformationList)之中,同時記錄出現(xiàn)錯誤的NC代碼行數(shù)及總錯誤數(shù)量,最后把錯誤內(nèi)容顯示到信息視圖之中。其中的G代碼語法錯誤信息設(shè)置函數(shù)代碼如下:
影響機床運動的主要 G代碼分別為G00、G01、G02、G03。因此,NC代碼的譯碼對象即為這幾個G代碼。在此之前,須對影響刀位坐標信息的G代碼進行譯碼,這樣才能準確地把代碼譯成相應(yīng)的刀位信息。如:編程規(guī)則(絕對值編程G90和相當值編程G91)、加工平面選擇(G17、G18和G19)及工件坐標系定義(G92)等。
通過設(shè)置bool類型變量IsAbCdnate來判斷NC程序是否是絕對值編程,當G90指令時IsAbCdnate設(shè)為true,而當G91指令時IsAbCdnate設(shè)為false。應(yīng)用此法,即可處理那些影響刀位坐標信息的G代碼。譯好影響刀位坐標信息的G代碼之后,就可對G00~G03代碼編譯。編譯直線插補指令G01譯碼過程為:首先查詢刀補指令G41/G42是否已經(jīng)定義,如果定義則補償?shù)毒甙霃?,如果沒有定義,則坐標值不變;其次檢查加工平面,確定坐標軸,根據(jù)編程規(guī)則,確定當前代碼是絕對坐標還是相對坐標,最后進行坐標轉(zhuǎn)化,即可得到刀位坐標信息。
編譯好的刀位坐標信息還需轉(zhuǎn)換成刀位起點和終點的坐標值,如果是圓弧插補則還要把NC代碼轉(zhuǎn)換為圓心坐標值和圓弧半徑值。刀位坐標信息及加工工藝參數(shù)信息都需要做存儲處理。本文就建立一個刀位信息基類CPosition和定于一個刀位信息鏈表m_PositionList。將刀位信息儲存到CPosition類中的一個對象內(nèi),而將CPosition類的對象存儲到鏈表m_Position-List之中。這樣存放很方便,程序調(diào)用CPosition類數(shù)據(jù)也變得簡單,同時更利于加工過程仿真時的數(shù)據(jù)提取。CPosition類的定義如下:
本文以Visual C++作為程序開發(fā)平臺,總體設(shè)計了NC代碼的編譯程序,并根據(jù)車銑復(fù)合數(shù)控代碼的特點,分析了代碼的詞法、語法、語義,并檢查了代碼中存在的詞法、語法、語義錯誤,最終將編譯代碼轉(zhuǎn)化為刀位信息。本編譯器具有良好的快速性、精度高、通用性和兼容性。編譯器生成的刀位信息為車銑復(fù)合數(shù)控加工仿真系統(tǒng)提供了驅(qū)動數(shù)據(jù),是數(shù)控加工仿真系統(tǒng)不可缺少的一個部分。
[1]復(fù)合加工誰執(zhí)牛耳[J].現(xiàn)代制造,2004(21):20-24.
[2]Liu Y,Guo X,Li W,et al.An intelligent NC program processor for CNC system of machine tool[J].Robotics and Computer- Integrated Manufacturing,2007,23(2):160-169.
[3]LEEW B,GAO D,LI JG.An NC toolpath translator for virtual machining of precision optical products[J].Journal of Materials Processing Technology,2003,140:211-216.
[4]樂廣軍,周宏甫.數(shù)控代碼語法檢查及圖形仿真系統(tǒng)的研究[J].計算機應(yīng)用與軟件,2005,22(4):56 -57,87.
[5]田超,郭斌.數(shù)控仿真中NC程序的通用轉(zhuǎn)換技術(shù)[J].組合機床與自動化加工技術(shù),2008(2):55 -56,59.
[6]陳輝,郭艷玲.用LEX構(gòu)造數(shù)控編譯器詞法分析程序的研究[J].機電工程技術(shù),2006,35(2):28 -30.
[7]任松濤,秦現(xiàn)生,白晶.NC代碼解釋器的開發(fā)[J].中國制造業(yè)信息化,2007,36(5):54 -57.
[8]游華云,葉佩青,楊開明.多數(shù)控代碼解釋器共存的設(shè)計與應(yīng)用[J].計算機工程與應(yīng)用,2007,43(12):1 -2,111.
[9]禹丹,嚴宏志,王繼娜.基于ANTLR的NC代碼編譯器的設(shè)計與實現(xiàn)[J].計算機應(yīng)用,2008,28(2):522 -524,527.
[10]伍抗逆,李斌,陳吉紅.面向開放式數(shù)控系統(tǒng)平臺的NC代碼解釋器開發(fā)[J].中國機械工程,2006,17(2):168-171.
[11]李曉磊,吳勇中,桂貴生.雙刀車削數(shù)控加工仿真技術(shù)研究[J].制造技術(shù)與機床,2009(6):74-78.
[12]王心光,傅建中.虛擬數(shù)控加工中G代碼編譯器的研究[J].組合機床與自動化加工技術(shù),2005(6):80-81,84.