(許繼電氣股份有限公司,許昌 461000)
IEC61131-3國際標(biāo)準(zhǔn)為工業(yè)自動化控制系統(tǒng)的軟件設(shè)計(jì)提供了標(biāo)準(zhǔn)化的編程概念和編程方法。其為開發(fā)應(yīng)用程序提供了指令表IL、結(jié)構(gòu)化文本ST、順序功能圖(文本版本)3種文本化語言和梯形圖LD、功能圖FBD、順序功能圖(圖形版本)3種圖形化語言[1]。ST做為工業(yè)控制平臺的一種結(jié)構(gòu)文本編程語言,有標(biāo)準(zhǔn)的關(guān)鍵字和語法結(jié)構(gòu),通過編程實(shí)現(xiàn)簡潔、快速、高效程序控制的目的[2]。IL是一種便于使用的類似匯編器的編程語言,同時(shí)又作為其它文本化語言和圖形化語言轉(zhuǎn)譯的公用中間語言。
編譯程序是現(xiàn)代計(jì)算機(jī)系統(tǒng)的基本組成部分之一,它是將一種語言書寫的程序(源程序)翻譯成另一種語言(目標(biāo)語言)的等價(jià)程序,這是典型的處理模式,并非所有編譯器都必須如此劃分或者必須包含上述所有階段。不過,多數(shù)使用的編譯程序,包括本文的ST到IL語言的轉(zhuǎn)化,也是采用上述幾個(gè)階段的工作過程[3-4]。目前,許繼特高壓直流輸電系統(tǒng)控制保護(hù)平臺需要把編程語言轉(zhuǎn)化為IL公用中間語言供底層調(diào)用,本文針對ST到IL語言的轉(zhuǎn)化提出了設(shè)計(jì)方案并對實(shí)現(xiàn)方法進(jìn)行描述。以此為基礎(chǔ)開發(fā)出的可視化的工業(yè)控制平臺,進(jìn)行實(shí)例測試,效果良好。本文只針對ST語言到IL語言的轉(zhuǎn)化進(jìn)行描述。
ST語言到IL語言的轉(zhuǎn)化主要分為語法檢查、結(jié)構(gòu)分解、錯(cuò)誤處理三方面的內(nèi)容,圖1所示為轉(zhuǎn)化設(shè)計(jì)的總體方案流程。
圖1 總體方案流程Fig.1 Flow chart of overrall plan structure
語法檢查的過程是ST語言轉(zhuǎn)化為IL語言的必要過程,只有語法檢查沒有錯(cuò)誤,才進(jìn)行轉(zhuǎn)化過程[5]。ST語言需要進(jìn)行語法檢查,確定程序是否符合ST語言的語法結(jié)構(gòu)[6-7]。把程序通過正則表達(dá)式的匹配分解為符號、關(guān)鍵字等最小單元,分析其前后是否符合語法結(jié)構(gòu)[8];如果符合語法結(jié)構(gòu),語法檢查成功,否則把錯(cuò)誤的語法結(jié)構(gòu)輸出,顯示在錯(cuò)誤列表中,用戶可以直接看出自己的程序錯(cuò)誤出現(xiàn)在哪里[9]。
語法檢查正確后,就可進(jìn)行ST語言向IL語言的轉(zhuǎn)化算法。首先通過正則表達(dá)式把ST程序分解為符號、關(guān)鍵字等最小單元,然后順序地逐個(gè)讀取,不同的關(guān)鍵字采用不同的情況處理,和IL語言一一對應(yīng),最后輸出相同邏輯的IL程序文件[10]。
根據(jù)上文的設(shè)計(jì)思路,圖2所示為ST語言到IL語言轉(zhuǎn)化的詳細(xì)流程。
圖2 轉(zhuǎn)化流程Fig.2 Transformation design flow chart
首先得到ST程序的行數(shù),然后逐行地讀取程序內(nèi)容,并對讀取到的內(nèi)容進(jìn)行分析編譯。得到某一行的程序內(nèi)容之后,通過正則表達(dá)式的匹配,把此行的內(nèi)容分解為最小單元,然后逐個(gè)讀取每一個(gè)小單元。由于程序中包括了注釋和控制程序的部分,所以小單元的內(nèi)容被分為了注釋、終結(jié)符、關(guān)鍵字、其它4種情況。
注釋部分是對程序的說明,不參加程序的運(yùn)行;同時(shí)IL語言和ST語言的注釋格式相同,所以只需要把注釋部分保持不變寫到IL文件里。
終結(jié)符是指一個(gè)控制語句結(jié)束的標(biāo)志,在ST語言中使用“;”做為終結(jié)符,以賦值語句“a:=2;”為例, 正則表達(dá)式把這個(gè)語句分解為了 “a”、“:=”、“2”、“;”4個(gè)小單元,當(dāng)讀到前3個(gè)小單元的時(shí)候,會把內(nèi)容保存到TempText這個(gè)變量里面,讀到最后一個(gè)終結(jié)符的時(shí)候,會處理TempText里面的內(nèi)容,即把ST語句的“a:=2”轉(zhuǎn)化為相同邏輯的IL語句,處理結(jié)束把TempText變量清空,用來記錄后面的小單元的內(nèi)容,并把生成的IL語句寫入到IL文件里。
關(guān)鍵字指ST語法結(jié)構(gòu)的關(guān)鍵字母。ST語法包括了IF條件、Case條件、FOR循環(huán)、WHILE循環(huán)、REPEAT循環(huán)、EXIT退出、RETURN返回7種情況,每種情況都有自己獨(dú)特的結(jié)構(gòu)。IF條件的情況可以是 IF…TEHN…ELSE..END_IF這種結(jié)構(gòu),“IF”、“THEN”、“ELSE”和“END_IF”4個(gè)小單元都是關(guān)鍵字。當(dāng)讀到關(guān)鍵字的時(shí)候,會把當(dāng)前這個(gè)關(guān)鍵字的相關(guān)信息壓入堆棧,然后再判斷是否需要處理此時(shí)TempText里面的內(nèi)容,如果需要處理,把處理結(jié)果寫入IL文件,如果不需要處理,繼續(xù)讀取下面的單元。除了上面說明的3種情況,其它的文本內(nèi)容都寫入TmepText里面,等待需要處理的時(shí)候再處理。
TempText的內(nèi)容多是四則運(yùn)算或者邏輯運(yùn)算,運(yùn)算過程中涉及運(yùn)算優(yōu)先級的問題,通過逆波蘭算法的應(yīng)用,把運(yùn)算表達(dá)式轉(zhuǎn)化為后綴表達(dá)式,成功地解決各個(gè)運(yùn)算符的優(yōu)先級問題,提高了處理TempText的效率和正確性[4]。
結(jié)合圖2,經(jīng)過上述的幾個(gè)步驟,語法結(jié)構(gòu)正確的ST程序轉(zhuǎn)化為相同邏輯的IL程序,實(shí)現(xiàn)ST語言到IL語言的轉(zhuǎn)化。
本節(jié)以一段ST語言的程序?yàn)槔?,將其轉(zhuǎn)化為IL語言。此段ST程序包括了賦值語句和條件語句,程序如下所示:
轉(zhuǎn)化為相同的邏輯的IL語言如下所示:
通過本文的設(shè)計(jì)方法,可以快速準(zhǔn)確地把ST語言轉(zhuǎn)化為IL語言。
通過上述的設(shè)計(jì)方法,成功地把ST語言轉(zhuǎn)化為了相同邏輯的IL語言,解決了特高壓直流輸電系統(tǒng)控制保護(hù)平臺軟件中ST編輯器轉(zhuǎn)化為IL語言的問題,保證了平臺的高效性和完整性?;诖朔椒ㄔO(shè)計(jì)的工業(yè)控制平臺中的ST編輯器,在實(shí)際工程中得到了很好的應(yīng)用,提高了工業(yè)控制平臺的整體性能。同時(shí),此設(shè)計(jì)方法和傳統(tǒng)的編譯器思想一致,但此方法操作簡單、易讀性強(qiáng),也同樣適用于別的文本語言之間的轉(zhuǎn)化,為文本編程語言的相互轉(zhuǎn)化提供了很好的思路。
[1]梁世武,李加恒,朱立國,等.基于IEC61131-3標(biāo)準(zhǔn)的ST語言文法分析器的實(shí)現(xiàn)與應(yīng)用[J].儀器儀表標(biāo)準(zhǔn)化與計(jì)量,2015(5):26-29.
[2]王馨梅,王冬芳.編譯器前端自動構(gòu)造的研究與實(shí)現(xiàn)[J].微機(jī)發(fā)展,2004,14(4):82-83.
[3]郭書杰,馬躍,王品.基于IEC61131-3的IL編譯器的設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)工程與設(shè)計(jì),2010,31(10):2300-2302.
[4]王明武,張士勇,陳應(yīng)舒.IEC61131-3編程語言的現(xiàn)狀與發(fā)展[J].制造業(yè)自動化,2010,32(10):102-104.
[5]徐穎,李春江,董鈺山,等.GCC編譯器中編譯指導(dǎo)的自動向量化實(shí)現(xiàn)[J].計(jì)算機(jī)科學(xué),2014,41(S2):364-367.
[6]侯愷.工業(yè)組態(tài)軟件中CFC語言的設(shè)計(jì)實(shí)現(xiàn)及語言轉(zhuǎn)換的研究[D].西安:西安電子科技大學(xué),2013.
[7]張媛.堆棧在語法分析中的應(yīng)用[J].天津科技,2014(4):20-22.
[8]王雙慶,邢建春,王平,等.基于IEC61131-3的控制器組態(tài)軟件開發(fā)[J].微計(jì)算機(jī)信息,2007,23(13):56-58.
[9]P Marwedel,R Leupers.Retargetable Compiler Technology for Embedded Systems:Tools and Applications[M].Kluwer Academic,2001.
[10]戴桂蘭,張素琴.編譯系統(tǒng)中間代碼的一種抽象表示[J].電子學(xué)報(bào),2002,30(12A);2134-2137.