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