李善鋒,劉敬猛,陳柏成,徐 東
(北京航空航天大學自動化科學與電氣工程學院,北京 100191)
一種嵌入式NC代碼編譯器的設計*
李善鋒,劉敬猛,陳柏成,徐 東
(北京航空航天大學自動化科學與電氣工程學院,北京 100191)
針對嵌入式數控系統運行過程中對NC代碼解釋的高準確率與高效率的要求,基于自頂向下的遞歸下降分析法,提出一種應用于嵌入式數控系統NC代碼編譯器的設計方法。文章主要分別從詞法分析、語法分析和解釋執行等方面進行編譯器的設計與實現。實際運行結果表明:該方法能夠高效地構建編譯器,可快速、準確地對NC代碼進行編譯,具有良好的可移植性;為嵌入式數控系統的NC代碼編譯提供了一種簡單有效的解決方案。
NC編譯器;嵌入式數控;指令特征分類;遞歸下降分析
隨著嵌入式技術和數控技術的日益發展,各種架構互異的嵌入式數控系統設計方案被提出,嵌入式數控硬件資源的限制,要求NC編譯器應具有良好的編譯效率。由于在嵌入式數控系統中采用的運動控制模塊不盡相同,幾乎每種嵌入式數控系統都必須開發自身專用的NC代碼編譯器。雖然這是嵌入式技術本身專用性的體現,但是也因此給數控開發人員帶來了繁重的開發工作,易出現重復開發,編譯器難以維護等問題[1]。
因此,本文主要從提高嵌入式NC編譯器通用性和改善編譯效率方面闡述NC編譯器設計。通過分析加工指令與形狀之間的關系,基于指令特征的數據集合輸出方法提高詞法掃描效率,基于自頂向下特征預測的語法分析加快匹配速度。將運動控制相關硬件驅動封裝成函數庫,NC編譯器主體與具體運控硬件模塊相對獨立,僅在解釋執行時通過輸出的八元式信息調用運控函數庫中相應的運動執行函數。在移植到具體嵌入式數控系統中時,NC編譯器主體完全不用改動,只需根據具體運控模塊編寫一個運控函數庫,提高NC編譯器的可移植性。
NC代碼編譯器是數控系統的三個核心組成部分之一,其主要功能就是將用戶程序,包括其中的軌跡信息、速度大小和輔助功能等信息,翻譯為運動控制模塊能夠處理的格式[2]。編譯過程通常要經過詞法分析、語法分析、錯誤處理和解釋執行,各個步驟中的程序實現既相互獨立,又形成串聯過程。
NC編譯器所完成的任務就是將加工代碼轉換成底層運動控制模塊所能識別的代碼,其主要的功能如圖1所示。目前數控系統中對NC代碼的處理方法主要有兩種,分別是逐行解釋實現方法和編譯實現方法。前者是在逐行對代碼進行解釋的同時,根據對上一行代碼的解釋所得信息進行加工處理,這種方法實現較簡單,但順序的控制方式會導致系統加工效率低下,程序間的轉接不易處理等問題。后者在應用編譯程序對加工程序進行整體編譯后,進行解釋執行,這種方法對程序處理整體性強、效率高,本系統中NC代碼編譯器就是采用此法來實現。此外,還有時間重疊流水處理的解釋控制方式等一些處理方法[3]。

圖1 NC代碼編譯器功能示意圖
編譯器一般由以下模塊組成:詞法分析、語法分析、語義分析、中間代碼生成、代碼優化、目標代碼生成及錯誤處理等。這些模塊的工作基本上是呈串聯式的:首先,詞法分析程序將高級語言程序轉化成符號表示的代碼;接著,語法分析程序對這些符號進行語法檢查和歸類;然后,進行語義檢查,并生成中間代碼;中間代碼經過優化,最后被轉化成目標代碼。這些步驟對NC編譯器而言同樣適用,但是NC代碼結構簡單,基本上是順序執行,關鍵字也較少,是典型的上下文無關的正則文法,因此,NC編譯器的結構相對復雜高級語言編譯器而言簡單很多。
NC編譯器設計的主要部分有:詞法分析、語法分析、錯誤檢測處理和解釋執行。
基于嵌入式數控的應用背景,NC編譯器應具有很好的執行效率,在詞法分析時,通過分析加工指令與形狀之間的關系,將面、型腔、側面、槽孔等特征分解成若干加工指令的集合。根據指令的特點進行分類,使數據以集合的形式輸出。這種基于特征的數據集合輸出方法可以在詞法掃描時提高分析效率。在語法分析時,采用自頂向下分析法,從開始符號出發遞歸下降推導,試圖盡早自上而下地為輸入串建立一個語法樹,盡快地從頂層預測分析輸出匹配式,提高語法分析效率。
為提高通用性,設計時盡量把與硬件直接相關的部分獨立出來。將運動相關硬件操作模塊獨立封裝在一個函數庫中。在解釋執行時,根據輸出的八元式數據集合在運動函數庫中查找執行。若移植到其它嵌入式數控系統,只需添加相應運動控制函數庫即可,大大提高了NC編譯器的通用性,降低了開發難度。其運行的基本流程結構如圖2所示。

圖2 NC代碼編譯器工作流程圖
如圖2所示,NC編譯器首先對NC源文件按字符流掃描,根據詞法規則產生中間符號文件;若沒有詞法錯誤便可進行語法分析,根據相應語法規則產生出運動控制模塊可識別的加工信息就可以進行解釋執行。在詞法分析和語法分析過程中如有錯誤,則將錯誤類型和錯誤定位信息反饋給用戶更正NC源程序。圖中除虛線連接的運控函數庫是與硬件直接相關外,其余部分均具有較高的通用性。這種將運控相關驅動函數編譯成庫,相對獨立于NC編譯器的思想,提高了其可移植性。
考慮到嵌入式的應用范圍,通用性和編譯效率的折衷,具體代碼實現時NC編譯器完全用C語言實現。嵌入式系統內存都不是很大,宜采用執行效率高的C語言開發。
NC代碼的結構是由功能字母加上數據形成功能指令,在指令后添加加工參數,則形成一段加工指令,一段加工指令控制機床完成一個動作,而每一個程序則由若干段加工指令組成,比如G碼、M碼,以及其他一些功能字組成的指令[4]。數控加工主要用到的是準備功能G碼和輔助功能M碼。準備功能字是使數控機床建立起某種加工方式的指令,如插補、刀具補償、固定循環等,G功能字由地址符G和其后的兩位數字組成,從G00~G99共100種功能,目前采用的是JB3208-83標準;輔助功能字是用于指定主軸的旋轉方向、啟動、停止、冷卻液的開關,工件或刀具的夾緊和松開,刀具的更換等功能,輔助功能字由地址符M和其后的兩位數字組成。
NC程序一般是針對某一個或某一些特征進行的加工,為了更好的與NC編程思想一致,使詞法分析結果與加工過程更加接近,就對NC指令進行了分類,得到了基于特征的數據集合輸出方法。通過分析加工指令與形狀之間的關系,將面、型腔、側面、槽孔等特征分解成以下4種加工指令的集合,如表1所示。

表1 NC指令功能特征分類
對于由以上功能指令組成的數控程序,將它翻譯為運動控制模塊可識別語言的第一步是進行程序的詞法分析。詞法分析的主要功能是:對源程序按字符流進行掃描,按設定的詞法規則識別出各類符號,產生中間符號系列,這些符號系列將用于語法分析,對源程序的詞法分析采用正則表達式。
本系統詞法分析的流程是:每次從源文件中讀一行放入緩沖區,去掉源程序中的空白和注釋,再從緩沖區中每次讀取一個字符進行判斷,根據字符類別的不同進行相應的處理,識別出的每一個字符都填入符號表中。符號表的定義如下結構體所示:

通過申明全局符號表,用于存儲詞法分析的字符信息,并返回符號表的入口,作為token表的第二個元素。這樣構成的token表的第一個元素是種別碼,而對于第二個元素,如果該符號是關鍵字,則第二個元素為-1,否則token表的第二元素為該單詞在符號表中的入口地址。
詞法分析過程中會進行錯誤檢查,主要是檢查程序中是否出現非法字符。經過循環解析,詞法分析模塊會產生符號系列文件,該文件后續用作為語法分析的源文件。詞法分析流程如圖3所示。

圖3 詞法分析結構流程圖
現輸入一段NC代碼,該代碼的加工意義是快速移動到指定位置,代碼如下所示:

以上程序經過詞法分析的結果為:

NC代碼編譯器的語法分析模塊的功能是按照NC代碼的語言規則,將由詞法分析得出的符號串進行識別,識別出其中的功能字的語法成分。其工作原理是:讀取詞法分析結果的符號串,判別是否為NC代碼的句子,如果是,就輸出句子;否則,說明源程序有語法錯誤,記錄錯誤。
本設計中采用的是自頂向下分析法中的遞歸下降分析法[5],它的基本思路是:從文法的開始符號出發,按最左推導方式向下推導,試圖推導出分析的輸入串,盡早從頂層進行預測指令匹配分析。設計時具體實現方法是:為每個非終結符構造一個子程序,如果這個非終結符右部只有一個候選式,則由從左至右的順序構造其識別過程;如果其右部是終結符,則判斷其能否與輸入相等,相等則讀下一個符號,否則,說明出錯;如果右部是非終結符,則調用該符號的子程序進行識別;如果右部有多個候選式,則按分支識別。如圖4所示為NC語法分析過程。

圖4 語法分析流程圖
NC代碼的優點是順序執行,其執行過程沒有循環和選擇結構,語言規則簡單,因此,一段NC代碼的執行首先讀取其程序段號,然后辨識其操作功能字以及功能字后的參數,如下程序段所示:

該段程序語法分析的結果為:

在這段程序的語法分析過程中,其操作碼、參數等將保存在一個8成員的結構體中,該結構體以八元式的形式輸出至語法分析結果文件,即解釋執行的流程文件。八元式結構體定義如下所示:

經過詞法分析和語法分析后,如果沒有錯誤記錄,則說明所輸入的NC源碼是符合NC語法規則的正確代碼。編譯器輸出的八元式文件中的每一句都是操作運動控制模塊動作的命令和參數,這些命令要通過查找操作表,找到其相應的運動控制函數庫并且傳遞參數,解釋執行程序完成的就是相應的查找和傳遞過程。
設計時將與硬件密切相關的運動控制模塊驅動封裝成一個函數庫,使之與編譯器主體相對獨立,提高編譯器的通用性。運動控制函數庫一般要實現基本運控函數如:機械原點運動、外部開關運動、手輪控制運動、直線插補、圓弧插補等。本系統中運控模塊采用的是PCL6045專用運動控制芯片,系統要作相應的運動,只需通過八元式數據集合輸出相應的運控參數如:距離、速度、加速度、目標位置和中心位置等,傳遞給相應的運動控制函數。
整個編譯器將和刀補模塊一起成為數控應用的一個用戶任務[6],在系統運行過程中要調用編譯器時,向消息郵箱發送調用消息,當任務被激活時,如果查詢郵箱有調用消息,則進行解釋執行,流程如圖5所示。

圖5 解釋執行流程圖
一個高性能嵌入式數控系統要實現高速、高精控制,對編譯器的一個技術指標要求是每秒編譯1000程序段以上。實驗測試平臺是一個三軸聯動雕刻床,每個軸由步進電機驅動,經過絲杠將旋轉運動轉換為直線運動。實驗測試系統采用的ARM10處理器PXA270主頻為520M Hz,內存64MB。為了驗證編譯器解析功能和性能,選擇盡可能包含較全面功能NC程序段的源程序。編譯實驗結果如表2所示。

表2 NC程序編譯效率實驗
由于零件2的NC程序中包含宏計算指令,平均每段指令編譯耗時比零件1、3多。一般說來宏計算指令和固定循環指令等復雜功能指令都會比普通指令編譯耗時長一些。通過對不同零件的NC程序進行編譯實驗可以看到編譯器編譯效率可以很好的滿足數控系統的要求。
編譯一個長735段NC代碼的小狗復雜輪廓程序,需耗時330ms,平均編譯一個程序段所需時間為0.45ms,并進行加工測試。圖6所示為測試平臺樣機及小狗輪廓程序加工結果,顯示編譯器解析準確。

圖6 測試平臺與實驗結果
NC編譯器作為數控系統的一個核心軟件模塊,承擔了將用戶輸入的NC代碼編譯為運動控制模塊所能識別機器碼的任務。NC編譯器主要由詞法分析、語法分析、錯誤檢查和解釋執行四個模塊組成,本文重點對詞法分析,語法分析和解釋執行的實現原理及提高編譯效率的措施作了論述。采用指令特征的數據集合輸出方法提高了詞法掃描效率,基于自頂向下的預測語法分析加快匹配速度。通過移植到具體的嵌入式數控中進行編譯效率測試與實際加工實驗,驗證了編譯器對加工程序解析的完整性和準確性,編譯速度完全滿足數控系統要求。
[1]徐小明,王碩桂.基于PC的開放式數控系統代碼編譯器的開發[J]. 機床與液壓,2009,37(11):4244.
[2]沙智華,張恒芳,等.通用數控代碼編譯系統研究與實現[J]. 中國機械工程,2003,14(9):1011-1014.
[3]任松濤,秦現生,白晶.NC代碼解釋器的開發[J].中國制造業信息,2007,36(5):54-57.
[4]徐星月,葉佩青.基于Lex和Yacc的開放式數控代碼解釋器的開發[J].現代制造工程,2007(6):23-25.
[5]姚道敏,俞立鈞,等.數控系統譯碼模塊程序設計[J].組合機床與自動化加工技術,2007(7):78-81.
[6]談峰.主流開放式數控系統體系結構比較分析[J].機械設計與制造,2008(3):169-170.
A Design of Compiler for NC Code in Embedded NC System
LI Shan-feng,LIU Jing-meng,CHEN Bai-cheng,XU Dong
(School of Automation Science and Electrical Engineering,Beihang University,Beijing 100191,China)
In allusion to the demand for high precision and high efficiency of the NC code compiler from the NC system,based on the top-down analysis method of recursive descent grammar,a novel design of general NC code complier in embedded NC system is presented.The design and implementation of compiler are described from different aspects:lexical analysis,syntax analysis,interpreted executing and so on.The practical results show that the method can construct the compiler efficiently,compile the NC code faster and more correctly,owned fine portability;which provides a simple and effective solution for NC code compiler in embedded NC system.
NC code compiler;embedded NC system;NC code classification;recursive descent analysis
TP273
B
1001-2265(2012)02-0045-04
2011-06-28;
2011-07-25
國家科技重大專項“高檔數控機床與基礎制造裝備”的子課題“全數字高檔數控裝置”(2009ZX04009-014)
李善鋒(1985—),男臨沂人,北京航空航天大學自動化學院碩士研究生,研究方向為檢測技術與自動化裝置;通訊作者:劉敬猛(1967—),男,安徽霍邱縣人,北京航空航天大學自動化學院副教授,研究方向為檢測技術與自動化裝置,(E-mail)ljm@buaa.edu.cn。
(編輯 李秀敏)