(許繼電氣股份有限公司,許昌 461000)
IEC61131-3國際標準為工業自動化控制系統的軟件設計提供了標準化的編程概念和編程方法。其為開發應用程序提供了指令表IL、結構化文本ST、順序功能圖(文本版本)3種文本化語言和梯形圖LD、功能圖FBD、順序功能圖(圖形版本)3種圖形化語言[1]。ST做為工業控制平臺的一種結構文本編程語言,有標準的關鍵字和語法結構,通過編程實現簡潔、快速、高效程序控制的目的[2]。IL是一種便于使用的類似匯編器的編程語言,同時又作為其它文本化語言和圖形化語言轉譯的公用中間語言。
編譯程序是現代計算機系統的基本組成部分之一,它是將一種語言書寫的程序(源程序)翻譯成另一種語言(目標語言)的等價程序,這是典型的處理模式,并非所有編譯器都必須如此劃分或者必須包含上述所有階段。不過,多數使用的編譯程序,包括本文的ST到IL語言的轉化,也是采用上述幾個階段的工作過程[3-4]。目前,許繼特高壓直流輸電系統控制保護平臺需要把編程語言轉化為IL公用中間語言供底層調用,本文針對ST到IL語言的轉化提出了設計方案并對實現方法進行描述。以此為基礎開發出的可視化的工業控制平臺,進行實例測試,效果良好。本文只針對ST語言到IL語言的轉化進行描述。
ST語言到IL語言的轉化主要分為語法檢查、結構分解、錯誤處理三方面的內容,圖1所示為轉化設計的總體方案流程。

圖1 總體方案流程Fig.1 Flow chart of overrall plan structure
語法檢查的過程是ST語言轉化為IL語言的必要過程,只有語法檢查沒有錯誤,才進行轉化過程[5]。ST語言需要進行語法檢查,確定程序是否符合ST語言的語法結構[6-7]。把程序通過正則表達式的匹配分解為符號、關鍵字等最小單元,分析其前后是否符合語法結構[8];如果符合語法結構,語法檢查成功,否則把錯誤的語法結構輸出,顯示在錯誤列表中,用戶可以直接看出自己的程序錯誤出現在哪里[9]。
語法檢查正確后,就可進行ST語言向IL語言的轉化算法。首先通過正則表達式把ST程序分解為符號、關鍵字等最小單元,然后順序地逐個讀取,不同的關鍵字采用不同的情況處理,和IL語言一一對應,最后輸出相同邏輯的IL程序文件[10]。
根據上文的設計思路,圖2所示為ST語言到IL語言轉化的詳細流程。

圖2 轉化流程Fig.2 Transformation design flow chart
首先得到ST程序的行數,然后逐行地讀取程序內容,并對讀取到的內容進行分析編譯。得到某一行的程序內容之后,通過正則表達式的匹配,把此行的內容分解為最小單元,然后逐個讀取每一個小單元。由于程序中包括了注釋和控制程序的部分,所以小單元的內容被分為了注釋、終結符、關鍵字、其它4種情況。
注釋部分是對程序的說明,不參加程序的運行;同時IL語言和ST語言的注釋格式相同,所以只需要把注釋部分保持不變寫到IL文件里。
終結符是指一個控制語句結束的標志,在ST語言中使用“;”做為終結符,以賦值語句“a:=2;”為例, 正則表達式把這個語句分解為了 “a”、“:=”、“2”、“;”4個小單元,當讀到前3個小單元的時候,會把內容保存到TempText這個變量里面,讀到最后一個終結符的時候,會處理TempText里面的內容,即把ST語句的“a:=2”轉化為相同邏輯的IL語句,處理結束把TempText變量清空,用來記錄后面的小單元的內容,并把生成的IL語句寫入到IL文件里。
關鍵字指ST語法結構的關鍵字母。ST語法包括了IF條件、Case條件、FOR循環、WHILE循環、REPEAT循環、EXIT退出、RETURN返回7種情況,每種情況都有自己獨特的結構。IF條件的情況可以是 IF…TEHN…ELSE..END_IF這種結構,“IF”、“THEN”、“ELSE”和“END_IF”4個小單元都是關鍵字。當讀到關鍵字的時候,會把當前這個關鍵字的相關信息壓入堆棧,然后再判斷是否需要處理此時TempText里面的內容,如果需要處理,把處理結果寫入IL文件,如果不需要處理,繼續讀取下面的單元。除了上面說明的3種情況,其它的文本內容都寫入TmepText里面,等待需要處理的時候再處理。
TempText的內容多是四則運算或者邏輯運算,運算過程中涉及運算優先級的問題,通過逆波蘭算法的應用,把運算表達式轉化為后綴表達式,成功地解決各個運算符的優先級問題,提高了處理TempText的效率和正確性[4]。
結合圖2,經過上述的幾個步驟,語法結構正確的ST程序轉化為相同邏輯的IL程序,實現ST語言到IL語言的轉化。
本節以一段ST語言的程序為例,將其轉化為IL語言。此段ST程序包括了賦值語句和條件語句,程序如下所示:

轉化為相同的邏輯的IL語言如下所示:


通過本文的設計方法,可以快速準確地把ST語言轉化為IL語言。
通過上述的設計方法,成功地把ST語言轉化為了相同邏輯的IL語言,解決了特高壓直流輸電系統控制保護平臺軟件中ST編輯器轉化為IL語言的問題,保證了平臺的高效性和完整性。基于此方法設計的工業控制平臺中的ST編輯器,在實際工程中得到了很好的應用,提高了工業控制平臺的整體性能。同時,此設計方法和傳統的編譯器思想一致,但此方法操作簡單、易讀性強,也同樣適用于別的文本語言之間的轉化,為文本編程語言的相互轉化提供了很好的思路。
[1]梁世武,李加恒,朱立國,等.基于IEC61131-3標準的ST語言文法分析器的實現與應用[J].儀器儀表標準化與計量,2015(5):26-29.
[2]王馨梅,王冬芳.編譯器前端自動構造的研究與實現[J].微機發展,2004,14(4):82-83.
[3]郭書杰,馬躍,王品.基于IEC61131-3的IL編譯器的設計與實現[J].計算機工程與設計,2010,31(10):2300-2302.
[4]王明武,張士勇,陳應舒.IEC61131-3編程語言的現狀與發展[J].制造業自動化,2010,32(10):102-104.
[5]徐穎,李春江,董鈺山,等.GCC編譯器中編譯指導的自動向量化實現[J].計算機科學,2014,41(S2):364-367.
[6]侯愷.工業組態軟件中CFC語言的設計實現及語言轉換的研究[D].西安:西安電子科技大學,2013.
[7]張媛.堆棧在語法分析中的應用[J].天津科技,2014(4):20-22.
[8]王雙慶,邢建春,王平,等.基于IEC61131-3的控制器組態軟件開發[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]戴桂蘭,張素琴.編譯系統中間代碼的一種抽象表示[J].電子學報,2002,30(12A);2134-2137.