摘 要:針對PLC梯形圖利于編程,但不利于被執行的特點,利用二叉樹這個中間工具,提出了一種將梯形圖轉化為指令表的轉化算法,轉化以梯級為單位,采取“從左至右,從上至下”的掃描順序構造二叉樹結構,然后對樹進行后序遍歷得到指令表。并簡要介紹了梯形圖編輯軟件的各個組成部分,以及梯形圖的編輯環境;描述了算法的主要數據結構。
關鍵詞:梯形圖;指令表;二叉樹;后序遍歷
中圖分類號:TP311文獻標識碼:A
文章編號:1004-373X(2010)04-125-03
Algorithm from PLC Ladder Diagram to Instruction Table Based on Binary-Tree
HUANG Jingjing,CHEN Wenxiang,YE Junjun,LIN Zhimin
(School of Physics and Mechanical Electrical Engineering,Xiamen University,Xiamen,361005,China)
Abstract:Owing to PLC ladder diagram′s traits of being programmed easily and processed inconveniently,an algorithm of transformation from PLC ladder diagram to instruction table are presented using the tool of binary tree.Based on a single rung as a conversion unit,the binary-tree data structure are created following the scanning order of from left to right,from top to bottom through the conversion process.Then the instruction table are obtained through the post-order traversal of the binary-tree.In addition,various components of PLC ladder diagram software and the editing environment of PLC ladder diagram are introduced,and main data structure of the algorithm are described simply.
Keywords:ladder diagram;instruction table;binary-tree;post-order traversal
0 引 言
國際電工委員會制定的工業控制編程語言標準[1]規定了五種PLC的編程語言:梯形圖(LD),指令表(IL),功能模塊圖語言(FBD),順序功能流程圖語言(SFC)以及結構化文本語言(ST)。其中,以梯形圖最為常用[2],因為它與繼電器線路類似,與電氣操作原理圖相對應,而電氣設計人員對繼電器控制較為熟悉。即使是PLC編程的初學者,也因為PLC梯形圖的直觀和易于掌握而選擇用梯形圖來編程,但是梯形圖不能被PLC的CPU識別。指令表編程語言是與匯編語言類似的一種助記符編程語言,和匯編語言一樣有操作碼和操作數組成。匯編語言是與計算機硬件聯系非常緊密的低級語言,易于被通用PC的CPU執行,指令表也有類似特點,它也是比較接近機器碼的語言,但是使用者要學習和記憶PLC的編程指令。如果把梯形圖的邏輯通過人工翻譯的模式轉化成為指令表,這大大加大了開發人員的工作量(事實上這已經是用指令表編程了),而且較為復雜。基于此,為了方便PLC應用程序開發人員,研究PLC梯形圖轉化成為指令表的算法,開發出一種指令表自動生成模塊,也就是梯形圖轉換成指令表的編譯模塊,是非常有意義的。
1 梯形圖與指令表
1.1 梯形圖
梯形圖與繼電器控制線路圖非常類似,不過梯形圖本身也有自己的設計規則[3]:梯形圖程序應按自下而上,從左至右的方式進行編制;觸點一般不畫在垂直分支線上;合理的組織串聯電路塊的并聯和并聯電路塊的串聯,比如,在有幾個串聯回路相并聯時應將觸點最多的那個串聯回路放在該梯級的最上面,而在有幾個并聯回路相串聯時應將觸點最多的并聯回路放在梯形圖的最左面(靠近左母線的一端);輸入觸點只允許畫在輸出線圈的左邊等。
1.2 指令表
指令表其實就是有邏輯的指令序列,類似于匯編語言。各個大廠商的PLC有其自己的指令集,不過大同小異,只是命名方式和各廠提供的功能指令不同。梯形圖轉化成指令表后指令的排列順序都保持一致,正是基于此,梯形圖與指令表之間一一對應,可以相互轉化。
2 梯形圖的編輯環境
梯形圖的編輯要有一個平臺,采用VC++作為開發工具,搭建一個梯形圖的編輯環境[4],也就是開發出一個PLC編程軟件,這個軟件平臺的搭建必須界面友好,還要利于編譯。
整個軟件系統分為三個子窗口,有梯形圖編輯窗口,指令表生成窗口,編譯信息提示窗口;整個軟件分為四個模塊,分別是梯形圖編輯模塊,編譯模塊,文件管理模塊,仿真模塊,其中,文件管理模塊主要用于用戶編制的梯形圖的保存和讀取[5]。
為了方便繪制梯形圖,將梯形圖的繪制窗口設計成為一個網格區,每個網格可以畫一個元件,水平連接線是一個特殊元件,它也屬于元件的范疇,但是它不是圖符,也就是不屬于后面所說的節點類的對象。梯形圖的繪制主要是元件的選擇和連接。
梯形圖的編輯環境和梯形圖的編譯是聯系非常緊密的,好的編輯環境非常利于編譯和排查語法錯誤,將梯形圖的繪制窗口設計成網格區就是利于編譯的一種做法,因為在掃描過程中分成一個個單元進行掃描,這樣做利于設計掃描算法。
3 梯形圖的數據結構
3.1 二叉樹的構造
通過對PLC梯形圖程序設計規則的研究可知,用梯形圖編制程序的過程實際上就是用梯形圖圖符來表示操作指令,用圖符的串并聯關系以及位置順序來表示操作指令之間邏輯關系的過程[6]。
既然梯形圖與指令表之間是一一對應的,那么在將PLC梯形圖轉化為指令表的過程中勢必有規律可循。通過手工翻譯大量的梯形圖后(可以對照梯形圖1以及它的指令表1,指令表命名方式基于三菱PLC系統[7])發現,梯形圖中每個梯級的圖符的邏輯關系是一種層次結構,而這種層次結構容易用數據結構中的樹來表達,把每個梯級用二叉樹這種結構表達出來后,那么整個梯形圖就是多個二叉樹的集合,也就是森林。現在的問題是如何來構造這棵二叉樹。
利用面向對象的編程思想,由于圖符是梯形圖的基本構成元素,先把圖符抽象成一個類,也就是一個節點對象的類(這里的節點就是指圖符)。這個對象的類包含數據和一些函數,數據代表要存儲的節點的內容,下面是這個類的數據成員的描述:
class Node
{private:
int x,y;//節點所在窗格在繪圖區域的位置
bool BehindBranch;//節點后面是否有向下線
bool FrontBranch;//節點前面是否有向上線
char name[10];//與該圖符對應的指令
int index;//圖符的索引號
…
}
除了節點類以外,還需要一個表示梯級的類,由這個類實例化的對象含有一個梯級所有的節點,由于梯級是二叉樹結構,這個類取名BinaryTree類。這個類中提供了一些函數,它們用來掃描節點,合并樹和構造樹結構。
class BinaryTree
{
…
public:
int ScanNode();//從左至右,從上至下掃描圖符
bool IsBehindBranch();//判斷是否掃描到向下線
bool IsFrontBranch();//判斷是否找到節點向上線
…
}
圖1 復雜串并聯關系的梯形圖
表1 梯形圖1的指令表
地址指令操作數地址指令操作數
00LDX008ORX5
01ORX109ANB
02ANIX210LDIX8
03LDX611ANIX9
04ANIX712ORB
05ORB13OUTY1
06LDX314END
07ANDX4
構造二叉樹的主要步驟是:
(1) 從左至右,從上至下掃描梯級,若未發現節點后面有向下線就一直向右掃描,直到發現向下線時停止,記下向下線的位置和掃描過的節點,若掃描過的節點有多個,每掃描到兩個就新建一個AND節點,它是這兩個節點的父節點;新建的這個AND節點繼續參與構造二叉樹,作為后序AND節點(如果有的話)的子節點。比如有三個節點,解決方法是,前兩個節點新建一個AND節點,再建一個AND節點,它是剛才AND節點和第三個節點的父節點,如圖2所示。
圖2 構造二叉樹結構
(2) 從當前行的下一行,向下線的位置開始向左掃描,是否有節點存在,若有則新建一個OR節點,繼續向左掃描,直到發現節點之前有向上線存在,如果有,這一層掃描結束,掃描過的節點如果有兩個或是多于兩個,仍然按照第1步的方法建立AND節點,OR節點是上一行已構造好的子樹的根節點和新建立起來的AND節點的父節點。
(3) 若當前行的下一行還有向下線,以當前行的下一行作為當前行,遞歸進行第(2)步。
(4) 第(2)步中,從當前行的下一行,向下線的位置開始向左掃描時,若左邊沒有元件存在,說明向下線連接的是右邊的元件,此時也建立一個AND節點,它是右邊并聯塊和已掃描過的節點建立起來的子樹的跟節點的父節點,如圖3所示二叉樹中的第三層左邊的AND節點。
(5) 節點排列的順序需要注意,最先掃描到的節點作為新建的AND節點或是OR節點的左子節點。
這樣就建立起梯形圖的二叉樹結構,二叉樹只是表示了圖符間的邏輯關系,不表示具體的指令含義。
所有圖符節點都是所構成的二叉樹的葉子節點,而AND節點或OR節點都是非葉節點,AND節點和OR節點分別表示左右子樹的串聯和并聯關系[8]。
圖3 梯形圖1的二叉樹結構
3.2 二叉樹轉化為指令表
經過掃描和錯誤檢查后,建立起類似圖3所示的梯級的二叉樹結構后,對二叉樹的遍歷即可轉化為指令表。根據先前構造二叉樹時所建立起來的順序可知,樹的遍歷順序是后序遍歷[9],也就是先訪問左子節點,然后訪問右子節點,最后是根節點。對圖3的二叉樹結構進行遍歷所得到的原始指令表如表2所示,對比表1可知,它還有一些需要修改的地方。比如,由于二叉樹只是表示了圖符間的邏輯關系,不表示具體的指令含義[10],指令的含義存儲在指令所屬的Node對象中的name成員數據中,對于指令LD X1,若其后面的指令是AND或OR,將指令合并成一條指令AND X1或OR X1,表2中地址為01和02的指令就需要合并成一條OR X1的指令;對于兩個并聯塊的串聯或是兩個串聯塊的并聯需要將指令改為ORB或是ANB,如表2所示中地址為08,14,18的指令;對于最后一條指令,如表2中的AND節點,也就是二叉樹的根節點,它沒有實際意義,將其舍去。
表2 遍歷圖3所得的原始指令表
地址指令操作數地址指令操作數
00LDX011AND
01LDX112LDX5
02OR13OR
03LDIX214AND
04AND15LDIX8
05LDX616LDIX9
06LDIX717AND
07AND18OR
08OR19OUTY1
09LDX320AND
10LDX4
4 編譯模塊的流程圖
對于每一個梯級,首先經過掃描,在進行編譯,看其是否有語法錯誤;如果有,在編譯信息提示窗口輸出提示信息,如果沒有錯誤,說明通過了編譯,利用所設計的算法建立起用戶梯形圖的二叉樹森林并保存,然后對二叉樹森林進行遍歷,得出原始的指令表,最后對指令表做相應的修改及優化得出最終指令表,并在指令表生成窗口顯示出來。如圖4所示。
圖4 編譯算法的流程圖
5 結 語
這里主要探討梯形圖轉化為指令表的算法,借助二叉樹這個中間工具,從圖1,表1及表2給出的指令表實例可以看出,該算法能夠正確的將梯形圖轉化為指令表,方便了PLC編程人員的應用程序開發過程。但是編譯的效率方面有待提高,因為如果梯形圖串并聯關系復雜,二叉樹的層次將較多且不平衡(多為左子樹層次遠大于右子樹),遍歷花費的時間較多,現在的CPU運算能力強大,主頻一般都能達到1 GHz,所以編譯的時間不是問題。除了正確性,編譯模塊還給出了錯誤信息報告,而錯誤報告和調試等的可用性方面也是很重要的。
參考文獻
[1]Karl-Heinz J,Tiegelkamp M.IEC61131-3:Programming Industrial Automation Systems[M].Berlin:Springer-Verlag Company,2001.
[2]白艷艷,陳衛福,于春娜.開放式數控系統中軟PLC的研究開發[J].機械管理開發,2005(3):24-27.
[3]鐘肇新,范建東.可編程控制器原理及應用[M].廣州:華南理工大學出版社,2008.
[4]章德平.軟件PLC開發平臺的設計和實現[D].武漢:武漢理工大學,2007.
[5]潘勇.數控系統中梯形圖編程軟件的研究及實現[D].武漢:武漢理工大學,2005.
[6]莫易敏,章德平,周哲.PLC梯形圖轉化為指令表算法及實現[J].控制工程,2006,13(6):573-576.
[7]龔仲華,史建成,孫毅.三菱FX/Q系列PLC應用技術[M].北京:人民郵電出版社,2006.
[8]葛芬,吳寧.基于AOV圖及二叉樹的梯形圖與指令表互換算法[J].南京航空航天大學學報,2006,38(6):754-758.
[9]Robert Lafore.Java數據結構和算法[M].2版.北京:中國電力出版社,2004.
[10]Lee G B,Han Z D,Lee J S.Automatic Generation of Ladder Diagram with Control Petri Net[J].Journal of Intelligent Manufacturing,2004,15(2):245-252.