国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

軟PLC梯形圖編輯與指令表生成方法研究

2015-03-11 03:49吳亞山
關(guān)鍵詞:二叉樹鏈表梯形圖

吳亞山, 陸 陽(yáng), 徐 謙

(1.合肥工業(yè)大學(xué) 計(jì)算機(jī)與信息學(xué)院,安徽 合肥 230009;2.潞安新疆煤化工(集團(tuán))有限公司,新疆 哈密 839003)

傳統(tǒng)可編程邏輯控制器(programmable logic controller,PLC)是20世紀(jì)發(fā)展起來(lái)并被廣泛采用的一種自動(dòng)化控制裝置,具有良好的功能性、高可靠性和強(qiáng)大的工業(yè)環(huán)境適應(yīng)能力。實(shí)際應(yīng)用中,不同廠家的PLC硬件結(jié)構(gòu)、編程方法均有差異,PLC體系不具備很好的開放性和兼容性[1],大大限制了傳統(tǒng)PLC的發(fā)展。國(guó)際電工委員會(huì)(International Electrotechnical Commission,IEC)頒布的IEC 61131標(biāo)準(zhǔn)[2-3],對(duì) PLC軟硬件平臺(tái)作了統(tǒng)一規(guī)范,符合此標(biāo)準(zhǔn)的軟PLC技術(shù)應(yīng)運(yùn)而生。

軟PLC不但具備傳統(tǒng)PLC的各方面優(yōu)點(diǎn),而且克服了兼容性缺陷,程序僅需作少量修改即可在其他符合IEC 61131-3語(yǔ)言標(biāo)準(zhǔn)的硬件平臺(tái)上運(yùn)行,同時(shí)成本低廉。

IEC 61131-3部分共定義了5種編程語(yǔ)言,包括指令表、結(jié)構(gòu)化文本、梯形圖、功能塊圖和順序功能圖[4],其中指令表和梯形圖使用頻率最高。梯形圖與電氣邏輯控制圖相似,形象直觀,對(duì)編程人員友好;指令表則類似匯編語(yǔ)言,可作為軟PLC解釋執(zhí)行的目標(biāo)語(yǔ)言,對(duì)硬件平臺(tái)友好。2種語(yǔ)言元素間存在一一對(duì)應(yīng)的關(guān)系。因此實(shí)現(xiàn)梯形圖編輯和將梯形圖轉(zhuǎn)換為指令表,對(duì)于推動(dòng)PLC標(biāo)準(zhǔn)化、通用化,提高控制系統(tǒng)編程效率尤為重要。

本文提出一種基于雙向循環(huán)鏈表和十字鏈表的梯形圖編輯和指令表生成算法,實(shí)現(xiàn)了一個(gè)軟PLC開發(fā)系統(tǒng),并分析了軟PLC運(yùn)行系統(tǒng)實(shí)現(xiàn)思想。

1 梯形圖與指令表簡(jiǎn)介

梯形圖(ladder diagram,LD)是一種圖形化編程語(yǔ)言,引入了電氣系統(tǒng)中電源軌線、繼電器、觸點(diǎn)、線圈等概念,以“能量流動(dòng)”描述數(shù)據(jù)傳遞過(guò)程,直觀性強(qiáng),易于學(xué)習(xí)。一個(gè)電動(dòng)機(jī)啟保??刂七壿嬏菪螆D示例如圖1所示。

按動(dòng)START觸點(diǎn)對(duì)應(yīng)的按鈕,線圈 MOTOR對(duì)應(yīng)的電動(dòng)機(jī)將持續(xù)運(yùn)轉(zhuǎn),直到按動(dòng)STOP觸點(diǎn)對(duì)應(yīng)的按鈕,電動(dòng)機(jī)停止運(yùn)轉(zhuǎn)。

由圖1梯形圖生成的指令表如圖2所示。

圖1 梯形圖

圖2 指令表

指令表(IL,instruction list)以一系列指令作為編程語(yǔ)言,由操作符、修正符和操作數(shù)等組成。LD指令讀取相應(yīng)觸點(diǎn)狀態(tài),ST指令將運(yùn)算后的結(jié)果輸出到線圈MOTOR對(duì)應(yīng)的輸出點(diǎn),從而控制電動(dòng)機(jī)啟停。

2 雙向循環(huán)鏈表與十字鏈表

雙向循環(huán)鏈表每個(gè)節(jié)點(diǎn)中有2個(gè)指針,*next指向后繼節(jié)點(diǎn),*previous指向前驅(qū)節(jié)點(diǎn),因此在查找前驅(qū)節(jié)點(diǎn)和后繼節(jié)點(diǎn)時(shí)非常高效,如圖3所示。

圖3 雙向循環(huán)鏈表

十字鏈表是表示正交關(guān)系的一種鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu),可用于存儲(chǔ)有向圖和稀疏矩陣等,如圖4所示。

圖4 十字鏈表

3 梯形圖的數(shù)據(jù)結(jié)構(gòu)

3.1 梯形圖基本元素定義

梯形圖的基本元素包括電源軌線、連接線、觸點(diǎn)、線圈等,具體分類見(jiàn)表1所列。

表1 梯形圖基本元素及圖例

為便于擴(kuò)展梯形圖基本元素,提高程序模塊化程度,降低不同基本元素處理復(fù)雜度,可將所有梯形圖基本元素的共同特征抽象為一個(gè)公共基類[5]。LD-BaseElem基類的定義描述如下:

class LD-BaseElem

{CString Caption;//標(biāo)簽名、變量名,如I0.0,X0,Y1

CString s[4];//參數(shù)名

CString v[4];//參數(shù)值

int LD-Type;//元素類型

int mRow,mCol;//行列坐標(biāo)

LD-BaseElem*next;//指向后繼梯形圖元素

LD-BaseElem*previous;//指向前驅(qū)梯形圖元素

LD-BaseElem*up;//指向上方梯形圖元素

LD-BaseElem*down;//指向下方梯形圖元素

BOOL visited;//元素是否被遍歷

BOOL outputed;//元素IL是否已輸出

LD-BaseElem(int LD-Type,int tRow,int tCol){}

virtual void setValue(){}//賦值函數(shù)

virtual void Draw(CDC*pDC){}//繪圖函數(shù)

virtual CString toIL(){}//IL指令轉(zhuǎn)換函數(shù)

};

基類中定義了基本元素的類型、輸入輸出參數(shù)、對(duì)應(yīng)的變量名、在梯形圖中的坐標(biāo)等信息。同時(shí)以虛函數(shù)的方式定義了賦值函數(shù)、繪圖函數(shù)和IL指令轉(zhuǎn)換函數(shù)。每個(gè)基本元素繼承自基類,并按照各自特點(diǎn)重新實(shí)現(xiàn)虛函數(shù)。如豎直連接線元素,不需要賦值,也不用輸出IL指令,只需重寫Draw()函數(shù),在指定行列坐標(biāo)畫出該連接線即可。

3.2 梯形圖的存儲(chǔ)方式

梯形圖的存儲(chǔ),可采用數(shù)組、鏈表、二叉樹以及AOV網(wǎng)等方式實(shí)現(xiàn)[6-8]。一些研究中,基于二叉樹、有向圖等存儲(chǔ)方式,需要二次構(gòu)造數(shù)據(jù)結(jié)構(gòu),建立過(guò)程復(fù)雜。

求解梯形圖的輸出值時(shí),應(yīng)遵從PLC“循環(huán)掃描,順序執(zhí)行”的工作方式,從左電源軌線開始,各基本元素依次按照從左向右、從上到下的順序求值,遇到并聯(lián)塊時(shí),優(yōu)先求解并聯(lián)塊,最后通過(guò)線圈輸出求值結(jié)果;一輪求值結(jié)束后,又從左電源軌線開始新一輪求值。

根據(jù)梯形圖求值特點(diǎn),可將梯形圖中的基本元素作為鏈表節(jié)點(diǎn),按行建立雙向循環(huán)鏈表,在此基礎(chǔ)上,為行之間的連接線元素建立十字鏈接。這種雙向循環(huán)十字鏈表數(shù)據(jù)結(jié)構(gòu),前后查找效率高,增刪、遍歷節(jié)點(diǎn)方便,同時(shí)鏈?zhǔn)街羔樳壿嫿Y(jié)構(gòu)符合梯形圖求值規(guī)則,便于繪制梯形圖和生成指令表。圖1對(duì)應(yīng)的雙向循環(huán)十字鏈表如圖5所示。

圖5 梯形圖的雙向循環(huán)十字鏈表示例

雙向循環(huán)十字鏈表定義描述如下:

typedef LD-BaseElem Node;

class LinkList

{Node*header;//頭節(jié)點(diǎn)

int maxRow;//繪圖網(wǎng)格行數(shù)

int maxCol;//繪圖網(wǎng)格列數(shù)

LinkList(){}//構(gòu)造函數(shù)

//指定位置插入新節(jié)點(diǎn)

void addNode(int LD-Type,int tRow,int tCol)

{//建立左右指針關(guān)聯(lián)

//建立上指針關(guān)聯(lián)

//建立下指針關(guān)聯(lián)}

Node* getNode(int tRow,int tCol){}//查找節(jié)點(diǎn)

void removeNode(int tRow,int tCol){}//刪除節(jié)點(diǎn)

void Draw(CDC*pDC){}//遍歷繪制整個(gè)梯形圖

CString outPutIL(){}//整個(gè)梯形圖生成指令表

};

定義中,addNode()方法最為重要,其根據(jù)不同基本元素類型,動(dòng)態(tài)創(chuàng)建新元素節(jié)點(diǎn),并建立*next、*previous、*up、*down雙向十字指針。需要注意的是,觸點(diǎn)和線圈節(jié)點(diǎn)與不在同一行的其他節(jié)點(diǎn)沒(méi)有直接關(guān)系,故其*up和*down指針均保持為NULL;而具有豎直導(dǎo)向作用的連接線(包括左電源軌線、豎電源軌線、右電源軌線、豎直連接線、中層右接線、中層左接線、向下連接線、左下承接線和右下承接線),起到行間連接和控制程序走向的作用,在梯形圖編輯過(guò)程中其*up和*down指針需按實(shí)際情況指向?qū)?yīng)的節(jié)點(diǎn)。

3.3 梯形圖編輯

筆者自主開發(fā)了軟PLC編程環(huán)境,梯形圖編輯器如圖6所示。

圖6 梯形圖編輯界面

該編輯器采用多文檔窗口開發(fā),可同時(shí)編輯多個(gè)梯形圖程序。主界面分為3部分,左側(cè)用樹狀結(jié)構(gòu)顯示了梯形圖基本元素,中間部分為梯形圖編輯區(qū),右側(cè)輸出梯形圖生成的指令表程序。梯形圖編輯過(guò)程中,調(diào)用addNode()函數(shù)不斷維護(hù)節(jié)點(diǎn)和指針,Draw()函數(shù)可動(dòng)態(tài)更新編輯區(qū)的梯形圖,outPutIL()函數(shù)則實(shí)時(shí)將當(dāng)前梯形圖轉(zhuǎn)換為指令表。

梯形圖的編輯,也就是插入和刪除基本元素節(jié)點(diǎn)的過(guò)程。如圖7所示,以刪除常閉觸點(diǎn)為例,斷開其與前驅(qū)和后繼之間的指針,并且在前驅(qū)和后繼之間建立鏈接,再將常閉觸點(diǎn)釋放即可;插入節(jié)點(diǎn)亦然??梢?jiàn)雙向循環(huán)十字鏈表在梯形圖編輯中的便捷性。

圖7 刪除梯形圖元素

4 梯形圖生成指令表

4.1 梯形圖元素與指令的關(guān)系

梯形圖按照從左向右、從上到下的順序求解輸出值。從左向右,各元素執(zhí)行“AND”運(yùn)算指令;遇到并聯(lián)塊時(shí),從上到下,并聯(lián)的部分之間執(zhí)行“OR”運(yùn)算指令;連接線控制程序走向;觸點(diǎn)用于讀取數(shù)據(jù),對(duì)應(yīng)“LD”運(yùn)算指令;線圈用于輸出數(shù)據(jù),對(duì)應(yīng)“ST”運(yùn)算指令。

4.2 梯形圖生成指令表實(shí)例

為便于描述,將圖5梯形圖雙向循環(huán)十字鏈表各節(jié)點(diǎn)命名如下:v[i]表示電源軌線和連接線,X[i],Y0表示觸點(diǎn)和線圈,如圖8所示。

圖8 梯形圖生成指令表過(guò)程

借助棧記錄遍歷過(guò)的電源軌線和連接線節(jié)點(diǎn),編寫梯形圖outPutIL()遍歷算法,按圖8所示中箭頭及標(biāo)號(hào)順序表示的路徑依次訪問(wèn)節(jié)點(diǎn)。分別調(diào)用各基本元素節(jié)點(diǎn)的toIL()方法輸出該元素代表的具體IL指令,最終組成完整的指令表語(yǔ)言程序。

5 相關(guān)算法對(duì)比

梯形圖的編輯和指令表轉(zhuǎn)換,已有算法主要采用鏈表、二叉樹、AOV網(wǎng)相結(jié)合的方式實(shí)現(xiàn)。

5.1 鏈表與二叉樹結(jié)合算法

文獻(xiàn)[9]以AOV網(wǎng)的節(jié)點(diǎn)表示梯形圖元素,AOV網(wǎng)的弧表示梯形圖元素間的連接關(guān)系,對(duì)梯形圖進(jìn)行存儲(chǔ);再將AOV網(wǎng)轉(zhuǎn)換為二叉樹,以二叉樹的非葉節(jié)點(diǎn)表示梯形圖串聯(lián)、并聯(lián)邏輯關(guān)系,對(duì)轉(zhuǎn)換后的二叉樹進(jìn)行一定的裁剪,通過(guò)中序遍歷輸出指令表語(yǔ)句。以圖1所示梯形圖為例,該算法對(duì)應(yīng)的存儲(chǔ)結(jié)構(gòu)和轉(zhuǎn)換示意如9所示。

圖9 AOV網(wǎng)及二叉樹示例

此算法的AOV網(wǎng)將連接線元素統(tǒng)一作為虛節(jié)點(diǎn),梯形圖元素間的串聯(lián)、并聯(lián)邏輯關(guān)系隱含在節(jié)點(diǎn)的出度、入度信息中,需要對(duì)AOV網(wǎng)進(jìn)行一次遍歷,構(gòu)建出二叉樹,裁剪虛節(jié)點(diǎn),才能進(jìn)行指令表的轉(zhuǎn)換。AOV網(wǎng)發(fā)生變化后,二叉樹需要重建。

5.2 雙向鏈表與AOV網(wǎng)結(jié)合算法

文獻(xiàn)[10]以行雙向鏈表作為梯形圖數(shù)據(jù)結(jié)構(gòu),用于存儲(chǔ)和顯示數(shù)據(jù);根據(jù)行雙向鏈表生成AOV網(wǎng),對(duì)梯形圖節(jié)點(diǎn)進(jìn)行拓?fù)渑判颍俎D(zhuǎn)換為指令表語(yǔ)句。以圖1所示梯形圖為例,該算法對(duì)應(yīng)的存儲(chǔ)結(jié)構(gòu)和轉(zhuǎn)換示意如圖10所示。

此算法的行雙向鏈表僅保留了行內(nèi)元素之間和行與行之間的邏輯關(guān)系,卻丟失了處于不同行的元素之間的邏輯關(guān)系。因此在將梯形圖轉(zhuǎn)換為指令表前,需要對(duì)整個(gè)鏈表進(jìn)行一次掃描,在適當(dāng)位置添加虛節(jié)點(diǎn)(圖10中的vp1節(jié)點(diǎn)),構(gòu)建AOV網(wǎng),再進(jìn)行拓?fù)渑判蚝洼敵觥R坏?duì)梯形圖進(jìn)行編輯,建立AOV網(wǎng)的過(guò)程需要重新進(jìn)行。

5.3 本文算法優(yōu)勢(shì)

本文提出的雙向循環(huán)十字鏈表有以下優(yōu)勢(shì):(1)動(dòng)態(tài)存儲(chǔ)。編輯過(guò)程中,動(dòng)態(tài)將梯形圖按雙向循環(huán)十字鏈表存儲(chǔ)。梯形圖編輯只需針對(duì)鏈表中的部分節(jié)點(diǎn)(4個(gè)以內(nèi))進(jìn)行增刪和指針重定向操作,而不需要二次構(gòu)造數(shù)據(jù)結(jié)構(gòu)。

(2)繪圖簡(jiǎn)單。繪制梯形圖元素時(shí),無(wú)需考慮各元素間的邏輯關(guān)系,只需按照網(wǎng)格坐標(biāo)將各節(jié)點(diǎn)繪制在編輯區(qū)。忽略行間十字鏈接的情況下,雙向循環(huán)十字鏈表就是一個(gè)簡(jiǎn)單的雙向循環(huán)鏈表,通過(guò)調(diào)用Draw()函數(shù)對(duì)其進(jìn)行一次單向順序遍歷即可完成梯形圖繪制刷新。

(3)實(shí)時(shí)轉(zhuǎn)換。雙向循環(huán)十字鏈表數(shù)據(jù)結(jié)構(gòu)保留了梯形圖元素間的邏輯關(guān)系和層次關(guān)系,按outPutIL()指定的遍歷算法直接遍歷雙向循環(huán)十字鏈表,即可按路徑順序輸出對(duì)應(yīng)的指令表。

圖10 行雙向鏈表及AOV網(wǎng)示例

由于繪圖和生成指令表時(shí)無(wú)需將雙向循環(huán)十字鏈表數(shù)據(jù)結(jié)構(gòu)轉(zhuǎn)換為另一種數(shù)據(jù)結(jié)構(gòu),在處理復(fù)雜梯形圖時(shí),能有效節(jié)約系統(tǒng)資源,提高處理效率。

6 軟PLC運(yùn)行系統(tǒng)實(shí)現(xiàn)思想

6.1 PLC執(zhí)行方式

傳統(tǒng)PLC按周期運(yùn)行,每周期分為輸入采樣、執(zhí)行程序、輸出刷新3個(gè)階段,遵循“循環(huán)掃描,順序執(zhí)行”的工作方式。① 輸入采樣,從I/O口讀取輸入信號(hào),并在整個(gè)周期內(nèi)保持讀取的數(shù)據(jù)不變,直至下次采樣;②執(zhí)行程序,根據(jù)輸入采樣得到的數(shù)據(jù),執(zhí)行控制程序,并將執(zhí)行結(jié)果寫到輸出映像區(qū);③輸出刷新,第2階段執(zhí)行結(jié)束后,將輸出映像區(qū)的執(zhí)行結(jié)果反饋到I/O口,實(shí)現(xiàn)目標(biāo)控制。

6.2 軟PLC運(yùn)行系統(tǒng)實(shí)現(xiàn)方式

PLC執(zhí)行程序階段的實(shí)現(xiàn),有編譯執(zhí)行和解釋執(zhí)行2種方式[11-12]。編譯執(zhí)行需將PLC程序轉(zhuǎn)換為具體硬件平臺(tái)可直接識(shí)別的二進(jìn)制指令??紤]到PLC程序的兼容性和可移植性,可采用解釋執(zhí)行方式,為硬件平臺(tái)編寫以IEC 61131-3標(biāo)準(zhǔn)規(guī)定的指令表語(yǔ)言為目標(biāo)語(yǔ)言的虛擬機(jī)程序。該虛擬機(jī)模擬一臺(tái)PLC設(shè)備,從硬件I/O口讀取輸入信號(hào),并分步解釋執(zhí)行用戶指令表程序,執(zhí)行完成后,將結(jié)果輸出到硬件I/O口,從而實(shí)現(xiàn)指令表語(yǔ)言的“順序執(zhí)行”;虛擬機(jī)不斷重復(fù)讀取數(shù)據(jù)、解釋指令、輸出數(shù)據(jù)的過(guò)程,即可模擬傳統(tǒng)PLC“循環(huán)掃描”工作方式。這種解釋執(zhí)行的方案,僅需對(duì)虛擬機(jī)程序進(jìn)行少量修改,就可使已編寫的PLC代碼在不同硬件平臺(tái)上運(yùn)行,且擴(kuò)展方便。

7 結(jié)束語(yǔ)

本文提出一種基于雙向循環(huán)鏈表和十字鏈表的梯形圖數(shù)據(jù)結(jié)構(gòu),正確實(shí)現(xiàn)了梯形圖編輯和梯形圖生成指令表算法。該數(shù)據(jù)結(jié)構(gòu)能直觀地表現(xiàn)梯形圖各元素間邏輯關(guān)系,對(duì)實(shí)現(xiàn)完整的軟PLC控制系統(tǒng)具有一定意義。

[1] 任繼鋒.基于IEC61131標(biāo)準(zhǔn)的PLC設(shè)計(jì)與實(shí)現(xiàn)[D].沈陽(yáng):沈陽(yáng)理工大學(xué),2012.

[2] 杉布,王蔚庭.IEC 61131-3國(guó)際標(biāo)準(zhǔn)簡(jiǎn)介[J].國(guó)內(nèi)外機(jī)電一體化技術(shù),2001(1):54-57.

[3] IEC 61131-3,Programmable controllers,part 3:programming language[S].

[4] 彭 瑜,何衍慶.IEC 61131-3編程語(yǔ)言及應(yīng)用基礎(chǔ)[M].北京:機(jī)械工業(yè)出版社,2009:6-10.

[5] 郭書杰.軟件PLC梯形圖編程系統(tǒng)的研究與實(shí)現(xiàn)[D].沈陽(yáng):中國(guó)科學(xué)院研究生院沈陽(yáng)計(jì)算技術(shù)研究所,2010.

[6] 雷云飛,童 懷,伍世元.基于“邏輯二叉樹”的PLC梯形圖與指令表互換算法[J].數(shù)字技術(shù)與應(yīng)用,2011(4):9-10.

[7] 潘庭龍,沈?qū)W芹,紀(jì)志成.基于AOV圖及因果圖的梯形圖與語(yǔ)句表互換算法[J].測(cè)控技術(shù),2008(11):64-66.

[8] 畢 翔,韓江洪,王躍飛,等.面向PLC的離散事件控制系統(tǒng)設(shè)計(jì)方法研究[J].合肥工業(yè)大學(xué)學(xué)報(bào):自然科學(xué)版,2010,33(9):1333-1337.

[9] 葛 芬,吳 寧.基于AOV圖及二叉樹的梯形圖與指令表互換算法[J].南京航空航天大學(xué)學(xué)報(bào),2006,38(6):754-758.

[10] 畢 輝,程良鴻.關(guān)于軟PLC梯形圖向語(yǔ)句表轉(zhuǎn)換方法的研究[J].微計(jì)算機(jī)信息,2007(25):63-65.

[11] 卓保特,欒 勇,劉 偉,等.PLC源程序編碼方法與解釋執(zhí)行算法設(shè)計(jì)[J].計(jì)算機(jī)工程與應(yīng)用,2012(14):68-73.

[12] 李慧強(qiáng).編譯型PLC編譯系統(tǒng)的研究與實(shí)現(xiàn)[D].山東:山東輕工業(yè)學(xué)院,2010.

猜你喜歡
二叉樹鏈表梯形圖
二叉樹創(chuàng)建方法
基于二進(jìn)制鏈表的粗糙集屬性約簡(jiǎn)
數(shù)據(jù)結(jié)構(gòu)與虛擬儀器結(jié)合教學(xué)案例
——基于二叉樹的圖像加密
跟麥咭學(xué)編程
一種由層次遍歷和其它遍歷構(gòu)造二叉樹的新算法
一種由遍歷序列構(gòu)造二叉樹的改進(jìn)算法
PLC編譯功能的實(shí)現(xiàn)
數(shù)控機(jī)床梯形圖故障設(shè)置方法研究
一種可編程邏輯控制程序的競(jìng)態(tài)檢測(cè)方法
一種基于有序雙端鏈表的高效排序算法