專利名稱::按照iec61131-3標準的將梯形圖語言編譯成指令表語言的方法
技術(shù)領(lǐng)域:
:本發(fā)明涉及工業(yè)控制語言的編譯方法,特別地,涉及一種按照IEC61131-3國際標準的將梯形圖語言編譯成指令表語言的方法。
背景技術(shù):
:可編程邏輯控制器在當今的各行各業(yè)中具有廣泛的應(yīng)用。IEC61131-3是可編程控制器編程語言的國際標準,該標準定義了四種編程語言,分別為梯形圖(LD)、指令表(IL)、結(jié)構(gòu)化文本(ST)及功能塊圖(FBD)。其中,梯形圖語言是目前工業(yè)控制領(lǐng)域最為流行的編程語言。由于梯形圖語言是一種圖形化的高級語言,因此用梯形圖語言編寫的控制邏輯不能被可編程邏輯控制器的處理器直接執(zhí)行。目前商用的可編程控制器編程平臺都先將梯形圖語言轉(zhuǎn)換成指令表語言,再對指令表語言解釋執(zhí)行或?qū)⒅噶畋碚Z言編譯成匯編語言后執(zhí)行。盡管IEC61131-3已經(jīng)被可編程控制器廠商普遍接受,但出于各種原因,目前商用可編程控制器梯形圖到指令表編譯軟件還未能完全符合IEC61131-3標準。同時,這些平臺對梯形圖的功能、拓撲的連接方式等方面的支持也不一致。這造成已經(jīng)存在的梯形圖語言代碼在更換可編程控制器平臺后,移植困難,需要迸行大量的修改或重寫,效率低下。
發(fā)明內(nèi)容本發(fā)明的目的是針對現(xiàn)有技術(shù)的不足,提供一種按照IEC61131-3標準的將梯形圖語自'編譯成指令表語言的方法,使得梯形圖的控制邏輯最終可以被可編程邏輯控制器的處理器正確執(zhí)行。本發(fā)明的目的是通過以下技術(shù)方案來實現(xiàn)的一種將符合IEC61131-3標準的梯形圖語言編譯成指令表語言的方法,包括如下步驟-(1)利用有向圖來表達梯形圖中每個梯級的拓撲結(jié)構(gòu),形成一個有向圖的集(2)若某個有向圖具有n個輸出線圈節(jié)點,則將該有向圖進行拆分為n個子有向圖,其中,n大于l;(3)根據(jù)有向圖中節(jié)點之間的串并聯(lián)關(guān)系,將每個有向圖轉(zhuǎn)化為二叉分解樹。對該二叉分解樹進行后序遍歷,得到遍歷結(jié)果符合"從上到下,從左到右"的梯形圖到指令表翻譯原則;(4)依后序遍歷的順序,計算二叉分解樹中規(guī)約節(jié)點的指令表,根節(jié)點的指令表就是其有向圖的指令表。本發(fā)明的有益效果是通過按照IEC61131-3標準的將梯形圖語言編譯成指令表語言的方法,使得任何符合標準規(guī)定的梯形圖語言都可以轉(zhuǎn)換成標準的指令表語言,方便實現(xiàn)梯形圖程序在不同可編程控制器平臺之間的移植,提高開發(fā)的效率及產(chǎn)品的可靠性。圖l是數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換的流程圖2是梯形圖中復雜連接關(guān)系抽象為有向圖邊的示意圖;圖3具有多個輸出線圈的梯形圖示意圖;圖4為圖2經(jīng)轉(zhuǎn)換后生成的有向圖示意圖5為將具有多個線圈節(jié)點的有向圖分解為若干子圖的流程圖;圖6為利用圖4中的算法分解圖3所示有向圖的示意圖;圖7為建立二叉分解樹的流程圖8為利用圖6中的算法建立圖5中Gl,的二叉分解樹的示意圖;圖9為利用圖6中的算法建立圖5中G4的二叉分解樹的示意圖;圖10為從二叉分解樹得到指令表的流程具體實施例方式在提供可編程邏輯控制器編程環(huán)境的軟件系統(tǒng)中,實現(xiàn)按照IEC61131-3標準的將梯形圖語言編程成指令表語言的方法的實質(zhì),就是將梯形圖語言的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換到指令表語言的數(shù)據(jù)結(jié)構(gòu)。因此在編譯過程中存在的問題,一是確定表示梯形圖語言和指令表語言的合理數(shù)據(jù)結(jié)構(gòu),且該結(jié)構(gòu)必須充分支持IEC61131-3對梯形圖及指令表的語法定義。二是要建立一種將表示梯形圖的數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換為表示指令表的數(shù)據(jù)結(jié)構(gòu)的方法,并確保兩種結(jié)構(gòu)所表達的控制邏輯完全一致。本發(fā)明定義了6種數(shù)據(jù)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)LDGraphStruct用來表示梯形圖中每個梯級內(nèi)部元素之間的連接關(guān)系。由于標準支持在一個梯級中可具有多個輸出線圈,因此本發(fā)明將具有多個輸出線圈的梯級劃分為若干個子梯級,這些子梯級內(nèi)部元素的連接關(guān)系用數(shù)據(jù)結(jié)構(gòu)LDSubGraphStruct來表示。ILStruct用來表示指令表語言的數(shù)據(jù)結(jié)構(gòu)。為了完成LDGraphStruct和ILStruct兩種數(shù)據(jù)結(jié)構(gòu)之間的轉(zhuǎn)換,引入一種稱為二叉分解樹的中間數(shù)據(jù)結(jié)構(gòu)BinaryDecompositionTree,該結(jié)構(gòu)易于表示梯級內(nèi)部組成元素之間的拓撲關(guān)系,又易于轉(zhuǎn)換為ILStruct數(shù)據(jù)結(jié)構(gòu)。其次,為了對編譯過程中的輔助變量進行正確管理,引入了兩個輔助數(shù)據(jù)結(jié)構(gòu),分別為變量賦值鏈表VariableAssignList和變量引用鏈表VariableReferList。下面詳細說明每種數(shù)據(jù)結(jié)構(gòu)的內(nèi)容和數(shù)據(jù)結(jié)構(gòu)之間的轉(zhuǎn)換方法。1.數(shù)據(jù)結(jié)構(gòu)(i)梯形圖梯級的數(shù)據(jù)結(jié)構(gòu)一LDGraphStruct根據(jù)ffiC61131-3標準,.梯形圖的梯級是由母線、輸入觸點、輸出線圈、函數(shù)、功能塊以及這些元件之間的連線組成。本發(fā)明用有向圖來表達梯級內(nèi)元素之間的相互關(guān)系,有向圖的節(jié)點由這些元素組成,有向圖的邊由元素之間的連線組成。根據(jù)上述描述,梯形圖梯級的數(shù)據(jù)結(jié)構(gòu)如下所示structLDGraphStructintnID;〃元件唯一編號,整數(shù)型。charstrName[50];〃元件的變量名,如X0,Y0,字符串型。intnType;//元件的類型(母線節(jié)點=0、觸點節(jié)點=1,〃線圈節(jié)點=2、虛擬節(jié)點=3,功能節(jié)點=4),整〃型。LDGraphStruct**pSuccessorList;//存儲本節(jié)點所有的后繼節(jié)點,指針鏈表型。■,(ii)梯形圖子梯級的數(shù)據(jù)結(jié)構(gòu)一LDSubGraphStructIEC61131-3支持在一個梯級中具有多個輸出線圈,在本發(fā)明中將一個梯級分解為若干個子梯級,每個子梯級對應(yīng)一個輸出線圈。子梯級的數(shù)據(jù)結(jié)構(gòu)與梯級的數(shù)據(jù)結(jié)構(gòu)基本相同,唯一區(qū)別在于數(shù)據(jù)結(jié)構(gòu)中多了一個用于標識輔助變]的元素。梯形圖子梯級的數(shù)據(jù)結(jié)構(gòu)如下StructLDSubGraphStruct//元件唯一編號,整數(shù)型?!ㄔ淖兞棵?,如X0,Y0,字符串型?!ㄔ念愋?母線節(jié)點=0、觸點節(jié)點=1,//線圈節(jié)點=2、虛擬節(jié)點=3,功能節(jié)點-4),整數(shù)〃型?!ㄝo助變量的名字,字符串型。若字符串為空,則表示〃沒有輔助變量標識在該元素后面,否則代表當該元〃素的值執(zhí)行完后,需要將可編程控制器當前累加器〃的值存到strHdp。LDGraphStmct"pSuccessorList;//存儲本節(jié)點所有的后繼節(jié)點,指針鏈表〃型。intnID;charstrName[50];intnType;charstrHelp[50];(iii)指令表語言的數(shù)據(jù)結(jié)構(gòu)一ILStruct指令表語言是一種純文本語言,用指令表編寫的程序使用字符串就可以實現(xiàn)表示和保存,因此IL語言的數(shù)據(jù)結(jié)構(gòu)中僅包含一個字符串數(shù)組。指令表語言的數(shù)據(jù)結(jié)構(gòu)如下StructILStruct、charstrlL[100][50];//指令表語言程序文本,二維字符數(shù)組類型。'1(iv)二叉分解樹的數(shù)據(jù)結(jié)構(gòu)一BinaryDecompositionTree由于梯形圖和指令表分別屬于圖形語言和文本語言,兩者之間的語法規(guī)則相差太大,難以直接從LDGraphStruct轉(zhuǎn)換到ILStruct。為了完成轉(zhuǎn)換,引入一科'中間數(shù)據(jù)結(jié)構(gòu)BinaryDecompositionTree作為中介。BinaryDecompositionTree是一種二叉樹結(jié)構(gòu),其葉節(jié)點用于表示梯級內(nèi)部的元素,中間節(jié)點用于表示元素之間的連接關(guān)系。通過對BinaryDecompositionTree進行后序遍歷,可以得到200810062554.9說明書第5/15頁一個由中間節(jié)點組成的轉(zhuǎn)換序列,然后沿該序列對中間節(jié)點進行翻譯,就可以得到整個梯級的ILStruct結(jié)構(gòu)。二叉分解樹的數(shù)據(jù)結(jié)構(gòu)如下structBinaryDecompositionTreeintnID〃元件唯一編號,整數(shù)型。charstrName[50];〃元件的變量名,如X0,Y0,字符串型。intnType;//元件的類型(母線節(jié)點=0、觸點節(jié)點=1,〃線圈節(jié)點=2、虛擬節(jié)點=3,功能節(jié)點=4),整〃數(shù)型。intnConnection;〃左右子樹的連接類型(串聯(lián)連接=0,并聯(lián)連接=1)。BinaryDecompositionTree*pLeftNode,pRightNode;〃左右子樹的指針。(v)變量賦值鏈表的數(shù)據(jù)結(jié)構(gòu)一VariableAssignList當--個梯級具有多個輸出線圈,或梯級中具有函數(shù)或功能塊時,需要將程序執(zhí)行的中間結(jié)果保存到某個中間變量中。在本發(fā)明中,用一個全局鏈表來記錄賦值信息,該鏈表的數(shù)據(jù)結(jié)構(gòu)如下structVariableAssignListi、intn[D;//元素在鏈表中的唯一編號,整數(shù)型。charstrName[50];//梯級中某個元素的名稱。當該元素執(zhí)行完后,需要將當//前可編程控制器累加器上的值保存到該結(jié)構(gòu)strHelp〃量中,字符串型。charstrHelp[50];〃輔助變量的名稱,字符串型。VariableAssignList*pNext;〃下一個鏈表元素的指針。(vi)變量引用鏈表的數(shù)據(jù)結(jié)構(gòu)一VariableReferList當判定一個函數(shù)或功能塊是否可以被調(diào)用時,往往需要引用到前面已經(jīng)執(zhí)行過的子網(wǎng)絡(luò)的邏輯值。在本發(fā)明中,用一個全局鏈表VariableReferList來記錄該引用信息,該鏈表的數(shù)據(jù)結(jié)構(gòu)如下structVariableReferListintnID;〃元素在鏈表中的唯一編號,整型。charstrName[50];〃梯級中某個元素的名稱。若當前翻譯的梯形圖元素在〃元素后面,則需要引用strHdp的值,字符串型。charstrHelp[50];〃輔助變量的名稱,字符串型。VariableReferList*pNext;〃下一個元素的指針。2.數(shù)據(jù)結(jié)構(gòu)的轉(zhuǎn)換步驟本發(fā)明的整個數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換過程分為五步,如圖1所示。首先是將梯形圖的每個梯級用數(shù)據(jù)結(jié)構(gòu)LDGraphStruct來表示;其次將LDGraphStruct轉(zhuǎn)換為若干個LDSubGraphStruct;接著將每個LDSubGraphStruct轉(zhuǎn)變?yōu)锽inaryDecompositionTree結(jié)構(gòu);然后將每個BinaryDecompositionTree結(jié)構(gòu)轉(zhuǎn)換為ILStruct結(jié)構(gòu);最后,將所有ILStruct結(jié)構(gòu)的內(nèi)容合并,就可以得到整個梯級的指令表語言。(l)將梯形圖的梯級轉(zhuǎn)換為LDGraphStruct。該轉(zhuǎn)換主要通過將梯形圖的組成元素(母線、觸點、線圈、函數(shù)及功能塊)抽象為有向圖的節(jié)點,它們彼此之間的連接抽象為有向圖的邊來實現(xiàn)數(shù)據(jù)結(jié)構(gòu)LDGraphStruct的構(gòu)造。其具體的構(gòu)造步驟如下(i)將母線抽象為母線節(jié)點。(ii)將觸點抽象為觸點節(jié)點。(iii)將函數(shù)及功能塊節(jié)點抽象為功能節(jié)點。(iv)兩個元素之間的連線抽象為連接兩個節(jié)點之間的邊。(v)'工字型'及'n字型'的復雜連接抽象為兩個虛擬節(jié)點及它們之間的條邊,圖2表示了這種抽象。利用該轉(zhuǎn)換方法,可以將圖3所示的梯級轉(zhuǎn)換為圖4所示的有向圖,該圖用LDGraphStruct的數(shù)據(jù)結(jié)構(gòu)表示如下圖4所示有向圖G的數(shù)據(jù)成員值<table>tableseeoriginaldocumentpage15</column></row><table>(2)將LDGraphStruct轉(zhuǎn)換為一個或多個LDSubGraphStruct。該轉(zhuǎn)換過程的目的是將具有多個輸出線圈的梯級拆分為多個子梯級,使得每個子梯級代表一個線圈的輸出邏輯,并用LDSubGraphStruct來表示每個子梯級的結(jié)構(gòu),具體的算法如圖5。利用該算法,對如圖4所示的有向圖進行拆分,具體步驟如下所示(i)利用深度優(yōu)先遍歷的路徑產(chǎn)生子圖,并從G中刪除該子圖所具有的邊,并將G中出、入度為0的節(jié)點刪除,重復該過程知道G為空為止,可以得到如圖6(a)所示的子圖G1、G2、G3、G4。(U)由于G2的起始點和終點(s,vl)都包括在Gl當中,所以Gl和G2可以在節(jié)點s和vl出合并成一個圖;同理,G3也可以和Gl合并為同一個圖。因此,最終整個G分解為G1'和G4兩個如圖6(b)所示的子圖。.(iii)由于G4的起點X6在Gl'中,因此一個輔助變量help被開辟,并標識在圖G1'的元件X6后面。同時,將G4中的起點X6刪除,并在G4起始處加入母線節(jié)點s及標識有變量helpl的新觸點節(jié)點,最終結(jié)果如圖6(c)所示。利用該方法得到Gl'、G4的LDSubGraphStruct的值如下表2:Gl'的數(shù)據(jù)成員值<table>tableseeoriginaldocumentpage16</column></row><table>(3)將LDSubGraphStruct轉(zhuǎn)換為BinaryDecompositionTree。該轉(zhuǎn)換過程是將數(shù)據(jù)結(jié)構(gòu)LDSubGraphStruct轉(zhuǎn)變?yōu)閿?shù)據(jù)結(jié)構(gòu)BinaryDecompositionTree,這種結(jié)構(gòu)更適宜表達節(jié)點之間的連接關(guān)系,具體的轉(zhuǎn)換算法如閣7A和7B所示。利用該算法對圖Gl'和G4進行轉(zhuǎn)換,詳細步驟分別如下對GI'的轉(zhuǎn)換(i)初始時,全局鏈表VariableAssignList中擁有的節(jié)點為XI,F(xiàn)UN1,X2,X3,X4,X5。由于X1和FUN1在G4中連接在一起,并且XI的前驅(qū)s其出度大于1,所以XI和FUN1規(guī)約為一個節(jié)點vl,并且構(gòu)建以vl為根,XI和FUN1為左右子樹的二叉分解樹;同理,X2和X3可以規(guī)約為節(jié)點v2。此時VariableAssignList包含的節(jié)點有vl,v2,X4,X5。(ii)由于vl和v2在G4中并聯(lián)連接,并且vl是其前驅(qū)s的第一個出度節(jié)點,因此vl和v2被并聯(lián)規(guī)約為節(jié)點v3,并構(gòu)建以v3為根,vl和v2為左右子樹的二叉分解樹;同理,X4和X5被規(guī)約為節(jié)點v4。此時VariableAssignList為空。(iii)從新將G4中入度和出度的節(jié)點放入VariableAssignList中,得到VariableAssignList為v3,xl,x2,v4,X6。由于這當中任何一個節(jié)點其前驅(qū)節(jié)點的出度都為1,所以不滿足串聯(lián)規(guī)約的要求;同時,也不滿足并聯(lián)規(guī)約的要求。因此,將所有節(jié)點都放入VariableAssignList中,得到VariableAssignList為s,v3,xl,x2,v4,X6,Y0。(iv)首先將s和v3規(guī)約為一個節(jié)點v5;其次規(guī)約v5和xl,得到v6;其次規(guī)約v6和x2,得到v7;規(guī)約v7和和v4,得到v8;規(guī)約v8和X6,得到v9;規(guī)約v9和Y0得到v10,由于有一個輔助變量help標識在v9后面,所以需要將元組(v9,help)存儲到列表VariableAssignList當中。表4:Tl的數(shù)據(jù)成員值<table>tableseeoriginaldocumentpage17</column></row><table><table>tableseeoriginaldocumentpage18</column></row><table>表5:VariableAssignList的數(shù)據(jù)成員值<table>tableseeoriginaldocumentpage18</column></row><table>對G5的轉(zhuǎn)換(i)初始時,LS中擁有的節(jié)點為helpl,X6,X7。由于這當中任何一個節(jié)點其前驅(qū)節(jié)點的出度都為1,所以不滿足串聯(lián)規(guī)約的要求;同時,也不滿足并聯(lián)規(guī)約的要求。因此,將所有節(jié)點都放入LS中,得到LS為s,helpl,X6,X7,Yl。(ii)首先將s和helpl規(guī)約為節(jié)點vll;其次規(guī)約vll和X6得到vl2;其次規(guī)約vl2和X7得到vl3;最后規(guī)約vl3和Yl得到v14。表6:T2的數(shù)據(jù)成員值<table>tableseeoriginaldocumentpage18</column></row><table>(4)將Bi露yDecompositionTree轉(zhuǎn)換為ILStruct該轉(zhuǎn)換過程是將數(shù)據(jù)結(jié)構(gòu)BinaryDecompositionTree轉(zhuǎn)換為指令表語言的數(shù)據(jù)結(jié)構(gòu)lLStmct,其轉(zhuǎn)換步驟如圖IO所示。在圖IO所示的步驟中,利用了表7、8所示的轉(zhuǎn)換規(guī)則。表7和8的使用方法為,給定一個規(guī)約節(jié)點v,假設(shè)其左節(jié)點為vl,右節(jié)點為v2。若節(jié)點v標識為串連連接,那么v的指令表可以通過査表7得到;若節(jié)點V為并聯(lián)連接,那么V的指令表可以通過查表8得到。為了描述方便,在表中任何一個節(jié)點V的指令表語句用符號丄(V)來表示。表7:串聯(lián)規(guī)約節(jié)點的指令表產(chǎn)生規(guī)則<table>tableseeoriginaldocumentpage19</column></row><table><table>tableseeoriginaldocumentpage20</column></row><table>表8:并聯(lián)規(guī)約節(jié)點的指令表產(chǎn)生規(guī)則<table>complextableseeoriginaldocumentpage21</column></row><table>利用圖10所示方法對二叉分解樹Tl、T2進行轉(zhuǎn)換,可分別得到ILStruct如下Tl根節(jié)點vlO的ILStruct數(shù)據(jù)結(jié)構(gòu)內(nèi)容TRUESThelp2AND(help2ANDXSTENCA[丄F畫ANDENOOR(X2ANDX3))AND(X4ANDX5)ANDX6SThelplSTY0T2根節(jié)點v13的ILStruct數(shù)據(jù)結(jié)構(gòu)內(nèi)容LDhelplANDX7OUTYl(5)將所有子梯級的ILStruct結(jié)構(gòu)合并成一個ILStruct該轉(zhuǎn)換過程實際上是將每個子梯級的指令表語言連接在一起,構(gòu)成整個梯級完整的指令表語言。如,將過程(4)的兩個ILStruct結(jié)構(gòu)連接在一起,最終可得到完整的指令表語言如下LDTRUESThelp2AND(help2ANDXISTENCALLFUN1ANDENOOR(X2ANDX3))AND(X4ANDX5ANDX6SThelplSTY0LDhelplANDX7OUTYl權(quán)利要求1.一種將符合IEC61131-3標準的梯形圖語言編譯成指令表語言的方法,其特征在于,包括如下步驟(1)利用有向圖來表達梯形圖中每個梯級的拓撲結(jié)構(gòu),形成一個有向圖的集合。(2)若某個有向圖具有n個輸出線圈節(jié)點,則將該有向圖進行拆分為n個子有向圖,其中,n大于1。(3)根據(jù)有向圖中節(jié)點之間的串并聯(lián)關(guān)系,將每個有向圖轉(zhuǎn)化為二叉分解樹。對該二叉分解樹進行后序遍歷,得到遍歷結(jié)果符合“從上到下,從左到右”的梯形圖到指令表翻譯原則。(4)依后序遍歷的順序,計算二叉分解樹中規(guī)約節(jié)點的指令表,根節(jié)點的指令表就是其有向圖的指令表。2.如權(quán)利要求1所述的方法,其特征在于,所述步驟(1)中,將梯形圖中的母線,觸點,線圈,功能塊及函數(shù)等分別抽象為了有向圖中的母線節(jié)點、觸點節(jié)點、線圈節(jié)點、功能塊節(jié)點,并將它們之間的連接抽象為了有向圖中的邊。3.如權(quán)利要求l所述的方法,其特征在于,所述步驟(1)中,將梯形圖中<工字型'及'n字型'連接抽象為兩個虛擬節(jié)點之間的連接。4.如權(quán)利要求l所述的方法,其特征在于,所述步驟(2)中中包括步驟(i)從有向圖G的某一起點開始,利用深度優(yōu)先遍歷算法遍歷到某一終點,將遍歷經(jīng)過的節(jié)點及邊組成一個圖Gi,放入列表Lg當中。(ii)將遍歷經(jīng)過的邊從G中刪除。(iii)將G中出入度為零的節(jié)點刪除。(iv)重復以上過程,直到G變?yōu)榭铡?v)若在LG當中存在兩個圖Gi及Gj,且Gi的起始節(jié)點與終止節(jié)點都存在Gj當中,則執(zhí)行步驟(VI)、(W)、(Vffl);否則跳到步驟(IX)。(vi)將Gi與Gj在Gi的起始節(jié)點及終止節(jié)點處并聯(lián)連接,產(chǎn)生新圖G。(vii)將Gi、Gj從LG當中刪除,并將G放入到LG當中。(viii)返回步驟(V)。(ix)若LG中有一個圖Gi其起始節(jié)點的類型不是母線節(jié)點,我們設(shè)該起始節(jié)點為v,則執(zhí)行如下步驟;否則結(jié)束。(x)在LG中找到另一個包含v節(jié)點的圖Gj,開辟一個輔助變量,并將該輔助變量標識在Gj的這個v節(jié)點的后面。(xi)用一個觸點節(jié)點代替Gi中的起始節(jié)點,且該觸點節(jié)點的名稱為步驟(x)中開辟的輔助變量。5.如權(quán)利要求1所述的方法,其特征在于,由所述步驟(3)中得到的二叉分解樹,其具有以下的特征(i)二叉樹葉子節(jié)點都是有向圖中的節(jié)點,中間節(jié)點都是規(guī)約節(jié)點,用來表示左右節(jié)點之間的連接關(guān)系。(ii)規(guī)約節(jié)點的種類分為邏輯規(guī)約節(jié)點及功能塊規(guī)約節(jié)點,它們的定義分別如下(a)若某個規(guī)約節(jié)點v是邏輯規(guī)約節(jié)點,則在以v為根節(jié)點的子樹中,沒有一個葉子節(jié)點是功能塊節(jié)點。(b)若某個規(guī)約節(jié)點v是功能塊規(guī)約節(jié)點,則在以v為根節(jié)點的子樹中,至少有一個葉子節(jié)點是功能塊節(jié)點。6.如權(quán)利要求1所述的方法,其特征在于,所述步驟(3)包括以下步驟(i)清空列表LS,并將有向圖G中所有入度和出度為1的節(jié)點放入LS當中。(ii)若在LS中存在著兩個在G中連接在一起的節(jié)點vl和v2,且vl在G中的前驅(qū)節(jié)點其當前出度大于1,則執(zhí)行步驟(iii)、(iv)、(v),否則跳到步驟(vi)。(iii)若在G中,有一個輔助變量標識在vl的后面,則將vl與輔助變量組成的元組放入到LS當中。(iv)將vl及v2規(guī)約為一個節(jié)點,并創(chuàng)建以該規(guī)約節(jié)點為根的二叉分解樹,該樹的左右子樹分別為vl及v2。(v)將vl及v2從LS中刪除,并將規(guī)約節(jié)點v放入LS當中,并返回到步驟(ii)。(vi)若在LS中存在著兩個具有相同前驅(qū)及后繼的節(jié)點vl及v2,并且vl是其前驅(qū)的第一個后繼節(jié)點,則執(zhí)行步驟,否則跳到步驟。(vii)若己有一個輔助變量標識在了它們的前驅(qū)后面,則執(zhí)行步驟(viii),否則執(zhí)行步驟(ix)、(x)、(xi)。(viii)若v2是一個功能塊節(jié)點,則將v2及輔助變量組成的元組放入到LR當中。(ix)若vl或v2是一個功能塊節(jié)點,則開辟一個輔助變量并將該變量標識到它們的前驅(qū)后面。(X)若Vl是一個功能塊節(jié)點,則將Vl及新開辟的輔助變量組成的元組放入到LR當中。(xi)若v2是一個功能塊節(jié)點,則將v2及新開辟的輔助變量組成的元組放入到LR當中。(xii)將vl及v2規(guī)約為一個節(jié)點,并創(chuàng)建以該規(guī)約節(jié)點為根的二叉分解樹,該樹的左右子樹分別為vl及v2.(xiii)將vl及v2從LS中刪除,并將v放入到LS中。(xiv)重復(i)到(xiii)的所有操作,直到LS中任何節(jié)點都不滿足串聯(lián)及并聯(lián)規(guī)約的要求。(xv)將LS中所有的節(jié)點都刪除,并將G中剩余的節(jié)點都放入LS中。(xvi)若剩下的有向圖G的節(jié)點數(shù)還多1,則執(zhí)行以下步驟直到G僅剩下一個節(jié)點。(xvii)得到G的開始節(jié)點及該開始節(jié)點的后繼節(jié)點,若在該起始節(jié)點的后面標識著一個輔助變量,則將起始節(jié)點及輔助變量組成的元組放入到LA當中。'(xviii)將起始節(jié)點及其后繼節(jié)點規(guī)約為一個節(jié)點,并構(gòu)建該節(jié)點的二叉分解7.如權(quán)利要求1所述的方法,其特征在于,所述步驟(4)中中計算規(guī)約節(jié)點的指令表,其遵守如下的規(guī)則1)串聯(lián)規(guī)約節(jié)點指令表產(chǎn)生規(guī)則設(shè)有一串連規(guī)約節(jié)點V,其左節(jié)點為V1,右節(jié)點為v2,函數(shù)L(v)代表節(jié)點v的指令表,則串連規(guī)約節(jié)點的指令表計算如下(i)若vl屬于觸點節(jié)點、功能節(jié)點、邏輯規(guī)約節(jié)點、或功能塊規(guī)約節(jié)點,且v2屬于觸點節(jié)點,則規(guī)約節(jié)點v的指令表為L(vl)ANDv2(ii)若W屬于觸點節(jié)點、功能節(jié)點、邏輯規(guī)約節(jié)點、或功能塊規(guī)約節(jié)點,且vl包含于LA中,且v2屬于觸點節(jié)點,則規(guī)約節(jié)點v的指令表為L(vl)SThelpANDv2(m)若vl屬于母線節(jié)點,v2屬于觸點節(jié)點,則規(guī)約節(jié)點v的指令表IX)v2(iv)若vl屬于觸點節(jié)點、功能節(jié)點、邏輯規(guī)約節(jié)點、或功能塊規(guī)約節(jié)點,v2屬于功能節(jié)點,則規(guī)約節(jié)點v的指令表為L(vl)L(v2)(v)若vl屬于觸點節(jié)點、功能節(jié)點、邏輯規(guī)約節(jié)點、或功能塊規(guī)約節(jié)點,且vl包含于LA中,v2屬于功能節(jié)點,則規(guī)約節(jié)點v的指令表為L(vl)SThelpL(v2)(vi)若vl母線節(jié)點,v2屬于功能節(jié)點,則規(guī)約節(jié)點v的指令表為LDTRUEL(v2)(vii)若vl屬于觸點節(jié)點、功能節(jié)點、邏輯規(guī)約節(jié)點、或功能塊規(guī)約節(jié)點,v2屬于線圈節(jié)點,則規(guī)約節(jié)點v的指令表為L(vl)STv2(viii)若vl屬于觸點節(jié)點、功能節(jié)點、邏輯規(guī)約節(jié)點、或功能塊規(guī)約節(jié)點,且vl包含于LA中,v2屬于線圈節(jié)點,則規(guī)約節(jié)點v的指令表為L(vl)SThelpSTv2(ix)若vl屬于觸點節(jié)點、功能節(jié)點、邏輯規(guī)約節(jié)點、或功能塊規(guī)約節(jié)點,v2屬于母線節(jié)點,則規(guī)約節(jié)點v的指令表為LDTRUESTv2(x)若vl屬于邏輯規(guī)約節(jié)點或功能塊規(guī)約節(jié)點,v2屬于虛擬節(jié)點,則規(guī)約節(jié)點v的指令表為L(vl)(xi)若vl屬于觸點節(jié)點、功能節(jié)點、邏輯規(guī)約節(jié)點、或功能塊規(guī)約節(jié)點,v2屬于邏輯規(guī)約節(jié)點,則規(guī)約節(jié)點v的指令表為L(vl)<formula>formulaseeoriginaldocumentpage6</formula>(xii)若vl屬于觸點節(jié)點、功能節(jié)點、邏輯規(guī)約節(jié)點、或功能塊規(guī)約節(jié)點,且vl包含于LA中,v2屬于邏輯規(guī)約節(jié)點,則規(guī)約節(jié)點v的指令表為<formula>formulaseeoriginaldocumentpage6</formula>(xiii)若vl屬于母線節(jié)點,則規(guī)約節(jié)點v的指令表為LDL(v2)(xiv)若vl屬于觸點節(jié)點、功能節(jié)點、邏輯規(guī)約節(jié)點、或功能塊規(guī)約節(jié)點,v2屬于功能塊規(guī)約節(jié)點且以v2為根的子樹其最左葉節(jié)點是功能節(jié)點,則規(guī)約節(jié)點v的指令表為<formula>formulaseeoriginaldocumentpage6</formula>(xv)若vl屬于母線節(jié)點,v2屬于功能塊規(guī)約節(jié)點且以v2為根的子樹其最左葉節(jié)點是功能節(jié)點,則規(guī)約節(jié)點v的指令表為TRUESThelpANDChelpL(v2)(xvi)若vl屬于觸點節(jié)點、功能節(jié)點、邏輯規(guī)約節(jié)點、或功能塊規(guī)約節(jié)點,v2屬于功能塊規(guī)約節(jié)點且以v2為根的子樹其最左葉節(jié)點不是功能節(jié)點,則規(guī)約節(jié)點v的指令表為<formula>formulaseeoriginaldocumentpage6</formula>SThelpAND(helpANDL(v2))(xvii)若vl屬于母線節(jié)點,v2屬于功能塊規(guī)約節(jié)點且以v2為根的子樹其最左葉節(jié)點不是功能節(jié)點,則規(guī)約節(jié)點v的指令表為LDTRUESThelpAND(helpANDL(v2)2)并聯(lián)規(guī)約節(jié)點指令表產(chǎn)生規(guī)則設(shè)有一并聯(lián)規(guī)約節(jié)點V,其左節(jié)點為VI,右節(jié)點為v2,函數(shù)L(v)代表節(jié)點v的指令表,則并聯(lián)規(guī)約節(jié)點的指令表計算如下(xviii)若V1屬于觸點節(jié)點、功能節(jié)點、邏輯規(guī)約節(jié)點、或功能塊規(guī)約節(jié)點,且v2屬于觸點節(jié)點,則規(guī)約節(jié)點v的指令表為L(vl)ORv2(xk)若vl屬于觸點節(jié)點、功能節(jié)點、邏輯規(guī)約節(jié)點、或功能塊規(guī)約節(jié)點,且v2屬于功能節(jié)點,則規(guī)約節(jié)點v的指令表為L(vl)OR(helpL(v2)(XX)若vl屬于觸點節(jié)點、功能節(jié)點、邏輯規(guī)約節(jié)點、或功能塊規(guī)約節(jié)點,且v2屬于邏輯規(guī)約節(jié)點,則規(guī)約節(jié)點v的指令表為L(vl)OR(L(v2))(xxi)若vl屬于觸點節(jié)點、功能節(jié)點、邏輯規(guī)約節(jié)點、或功能塊規(guī)約節(jié)點,v2屬于邏輯規(guī)約節(jié)點且以v2為根的子樹其最左葉節(jié)點是功能節(jié)點,則規(guī)約節(jié)點V的指令表為L(vl)OR(helpL(v2))(xxii)若vl屬于觸點節(jié)點、功能節(jié)點、邏輯規(guī)約節(jié)點、或功能塊規(guī)約節(jié)點,v2屬于邏輯規(guī)約節(jié)點且以v2為根的子樹其最左葉節(jié)點不是功能節(jié)點,則規(guī)約節(jié)點v的指令表為L(vl)ORChelpANDL(v2)》全文摘要本發(fā)明公開了一種按照IEC61131-3標準的將梯形圖語言編譯成指令表語言的方法。該方法適用的梯形圖可以處理邏輯量與非邏輯量,且得到的指令表語言完全符合IEC61131-3的指令集。該方法具體為將梯形圖抽象為有向圖,并根據(jù)梯形圖中元素的種類定義有向圖中節(jié)點的種類;若該梯形圖有多個輸出,則將該有向圖分解為若干個子圖;利用節(jié)點規(guī)約的方法,判定該有向圖是否是串并圖,本方法目前僅支持對串并結(jié)構(gòu)的梯形圖進行編譯;利用節(jié)點規(guī)約方法,夠造二叉分解樹,對該二叉分解樹進行后序便利的結(jié)果,符合對梯形圖從上到下,從左到右的分析方法;對二叉分解樹的規(guī)約節(jié)點按照后序遍歷的順序計算其指令,知道計算到根節(jié)點為止。所得的根節(jié)點的指令表就是最終的指令表語言。文檔編號G06F9/45GK101369234SQ20081006255公開日2009年2月18日申請日期2008年6月24日優(yōu)先權(quán)日2008年6月24日發(fā)明者義嚴,章航平申請人:杭州電子科技大學