數(shù)控系統(tǒng)中PLC梯形圖與指令表的轉(zhuǎn)換算法
點(diǎn)擊:2440
A+ A-
所屬頻道:新聞中心
在中高檔的數(shù)控機(jī)床系統(tǒng)或者數(shù)控加工中心里,可編程邏輯控制器(PLC) 是一個(gè)不可缺少的配置。梯形圖和指令表是PLC的常用編程語言。將控制系統(tǒng)的開關(guān)量邏輯與狀態(tài)表示成梯形圖,采用梯形圖語言設(shè)計(jì)順序控制邏輯,具有方便直觀的優(yōu)點(diǎn),有利于系統(tǒng)維護(hù)與故障快速診斷。
梯形圖不能直接被計(jì)算機(jī)識(shí)別和執(zhí)行,需要先將它轉(zhuǎn)換成指令表才能夠執(zhí)行。目前梯形圖轉(zhuǎn)換為指令表的算法主要有兩種:其一是基于二叉樹的PLC梯形圖轉(zhuǎn)化為指令表的算法,該方法借助二叉樹進(jìn)行翻譯,但存在編譯效率不高的問題;其二是將梯形圖映射到AOV圖,該方法需要搜索鏈表,能夠翻譯復(fù)雜的梯形圖,需要經(jīng)過多次的掃描,實(shí)現(xiàn)起來比較復(fù)雜。
一些商用PLC的梯形圖結(jié)構(gòu)比較復(fù)雜,如西門子S7-200、三菱等品牌的PLC功能強(qiáng)大,一般在個(gè)人計(jì)算機(jī)或?qū)S玫木幊淘O(shè)備完成對(duì)梯形圖的編輯和修改等操作。但對(duì)于數(shù)控機(jī)床系統(tǒng)而言,梯形圖的編輯和修改一般在工廠車間的機(jī)床上完成,用戶在現(xiàn)場(chǎng)直接修改調(diào)試,而且梯形圖運(yùn)行環(huán)境和數(shù)控系統(tǒng)內(nèi)部關(guān)聯(lián)比較大。另外在零件加工時(shí),修改和編輯梯形圖不能對(duì)數(shù)控系統(tǒng)其他模塊造成影響,如譯碼、插補(bǔ)等實(shí)時(shí)性要求很高的模塊,對(duì)梯形圖的合法性檢測(cè)和將梯形圖轉(zhuǎn)換成指令表的算法效率顯得相當(dāng)重要。因此,數(shù)控機(jī)床系統(tǒng)的PLC模塊,要能夠在屏幕上顯示和修改梯形圖,對(duì)梯形圖的互換算法要求比較快。本文作者將梯形圖的構(gòu)成形式分成母線、環(huán)、半環(huán)、環(huán)母線等結(jié)構(gòu)元素,利用這些結(jié)構(gòu)元素檢驗(yàn)梯形圖的合法性,分析梯形圖和指令之間的關(guān)系,并以此設(shè)計(jì)梯形圖向指令表轉(zhuǎn)換的算法。
1 梯形圖的構(gòu)成分析
一個(gè)完整的數(shù)控系統(tǒng)的PLC梯形圖由若干個(gè)獨(dú)立功能的塊組成,不僅包括了基本的輸入觸點(diǎn)和輸出線圈,還包括了針對(duì)數(shù)控應(yīng)用的特殊功能指令。PLC的梯形圖由觸點(diǎn)、輸出線圈、功能指令、橫線、豎線、點(diǎn)等基本元素構(gòu)成。梯形圖中觸點(diǎn)之間的豎線占一個(gè)顯示位置,那么觸點(diǎn)之間非豎線的顯示用點(diǎn)連接,這個(gè)點(diǎn)不影響梯形圖的邏輯,但在用二維數(shù)組表示的梯形圖形式時(shí),它確實(shí)存在并且占用一個(gè)數(shù)據(jù)內(nèi)存。因篇幅所限,文中只對(duì)不包含功能指令構(gòu)成的梯形圖進(jìn)行討論,如圖1所示。
圖1 CNC用PLC基本梯形圖
梯形圖元素的位置用梯形圖的行列位置坐標(biāo)來表示,依次從左到右,從上到下遍歷,并且認(rèn)為豎線的位置是從第二行起,第一行是點(diǎn)元素。令最左邊的豎線的列號(hào)是0,最上一行的行號(hào)是0,那么圖1中左上角的觸點(diǎn)X0000.0的坐標(biāo)就是P(0,1)。因此,有如下定義:
定義1:梯形圖里由行的下標(biāo)為0的所有的元素組成的集合稱為梯形圖母線,也就是梯形圖的第0行。很明顯,除第0行之外的觸點(diǎn)都要直接或間接通過豎線連在母線上。
定義2:從某一個(gè)觸點(diǎn)起,按逆時(shí)針遍歷梯形圖回到當(dāng)前觸點(diǎn),其中遍歷元素個(gè)數(shù)最小,遍歷路徑的元素構(gòu)成一個(gè)四邊形,將所有這些遍歷過的元素組成的集合稱作環(huán)。在圖1 里, 集合{豎線(1,2 ),X0001.0(1,3),點(diǎn)(1,4),X0001.1 (1,5),豎線(1,6),點(diǎn)(0,6),X00002(0,5),點(diǎn)(0,4),X00001(0,3 ), 點(diǎn)(0,2 )}構(gòu)成一個(gè)環(huán), {豎線(2,4 ),X00020(2,5),豎線(2,6),點(diǎn)(1,6),X00011(1,5),點(diǎn)(1,4)}組成一個(gè)環(huán)。
定義3:在一個(gè)環(huán)里,行號(hào)最大、列號(hào)最小的觸點(diǎn)稱為環(huán)的起始觸點(diǎn),如上面兩個(gè)環(huán)中,X00010、X000020 是起始觸點(diǎn)。
定義4:跟環(huán)的起始觸點(diǎn)行號(hào)相同的所有元素組成的集合稱為半環(huán)。如集合{豎線(1,2),X00010(1,3),點(diǎn)(1,4),X0001.1(1,5),豎線(1,6)}構(gòu)成一個(gè)半環(huán),{豎線(2,4),X00020(2,5),豎線(2,6)}組成一個(gè)半環(huán)。很明顯,環(huán)的起始觸點(diǎn)也是半環(huán)的起始觸點(diǎn)。
定義5:在某一個(gè)環(huán)里,除去半環(huán)的元素剩下的元素的集合稱環(huán)母線。如{點(diǎn)(0,6),X00002(0,5),點(diǎn)(0,4),X00001 (0,3),點(diǎn)(0,2)},{點(diǎn)(1,6),X0001.1(1,5),點(diǎn)(1,4)}是環(huán)母線。很明顯,一些元素屬于某一個(gè)環(huán)母線,也屬于某一半環(huán)。
綜上所述,梯形圖塊就是由母線和若干個(gè)半環(huán)構(gòu)成的簡(jiǎn)單圖形。為了保證梯形圖邏輯的準(zhǔn)確性和方便轉(zhuǎn)換,作如下的約束:
?。?)一個(gè)梯形圖塊只能有一條母線;
?。?)一個(gè)半環(huán)內(nèi)至少包含一個(gè)觸點(diǎn);
?。?)一條環(huán)母線內(nèi)至少包含一個(gè)觸點(diǎn);
?。?)一個(gè)觸點(diǎn)的左邊不能是橫線,實(shí)際上觸點(diǎn)是可以和它左右兩邊的橫線互換位置而不影響其邏輯的;
(5)一個(gè)梯形圖塊里只有一個(gè)輸出線圈串聯(lián)在母線上,其他輸出線圈只能并聯(lián)到該線圈上;
?。?)如果某環(huán)的半環(huán)屬于另外某環(huán),但環(huán)母線不屬于其他環(huán),可以將環(huán)母線移動(dòng)到半環(huán)下面,變成標(biāo)準(zhǔn)型。如圖2 所示可以將X0001.0 移動(dòng)到X00021的下方,轉(zhuǎn)化為圖3 的形狀而不影響梯形圖的邏輯;
?。?)如果環(huán)與環(huán)之間存在交集,那么交集元素所屬的半環(huán)或環(huán)母線的所有元素的行號(hào)只能是包含關(guān)系。如圖4 所示,起始元素是X0002.0 和起始元素是X00011 的環(huán)存在歧義的,可以在梯形圖轉(zhuǎn)換的時(shí)候直接報(bào)錯(cuò)提示用戶修改。
圖 4有歧義的梯形圖
2 梯形圖與指令表關(guān)系的分析
按照梯形圖的邏輯運(yùn)算過程,當(dāng)遇到環(huán)時(shí)先將之前的結(jié)果壓棧,然后掃描環(huán)母線的觸點(diǎn)。如果環(huán)母線的結(jié)果需要壓棧就將環(huán)母線的掃描結(jié)果壓棧,再掃描半環(huán)的結(jié)果,之后依次將之前的結(jié)果出棧,進(jìn)行相對(duì)應(yīng)的“與”、“或” 邏輯運(yùn)算。這種執(zhí)行方式也就是先進(jìn)后出(FILO) 的堆棧處理方式。按照FILO 的堆棧處理方式,對(duì)應(yīng)圖1 的邏輯關(guān)系的指令表如表1 所示。
在表1 的指令里,RDSTK 或RDNOTSTK 表示將之前的運(yùn)算狀態(tài)壓棧并讀入一個(gè)觸點(diǎn)狀態(tài),RDSTK 或RDNOTSTK表示將上一個(gè)壓棧彈出來,并和當(dāng)前的結(jié)果進(jìn)行“與” 或“或” 操作??疾熘噶畋砗吞菪螆D的關(guān)系,用X 表示行號(hào),Y 表示列號(hào)可以得出下面的結(jié)論:
(1)左邊靠最左豎線的觸點(diǎn)并且在第一行的第一個(gè)觸點(diǎn),即坐標(biāo)為(0,1 ) 的觸點(diǎn),是這個(gè)梯形圖的第一個(gè)指令,應(yīng)先讀入該觸點(diǎn),對(duì)應(yīng)指令RD,如RD X00000。
(2)對(duì)于某一觸點(diǎn)P(X,Y),如果坐標(biāo)Q(X +1,Y -1)和Q(X -1,Y -1) 的元素不是豎線,表明該觸點(diǎn)與之前的運(yùn)算結(jié)果是“與” 關(guān)系;對(duì)應(yīng)的指令為AND,如AND X00002。
?。?)對(duì)于某一觸點(diǎn)P(X,Y),如果該觸點(diǎn)所在的半環(huán)只有該觸點(diǎn),那說明該觸點(diǎn)并聯(lián)在環(huán)母線上,即Q(X,Y -1)是豎線,Q(X,Y +1) 是豎線但不是最右邊的豎線,或者Q(X,Y +1 ) 不是豎線而Q(X,Y +2)是橫線的圖形。該觸點(diǎn)與前面的運(yùn)算結(jié)果之間的邏輯運(yùn)算是“或” 關(guān)系,用OR表示,如OR X00020。
?。?)對(duì)于某一個(gè)觸點(diǎn)P(X,Y),如果該觸點(diǎn)是所在半環(huán)的起始觸點(diǎn),并且該半環(huán)的觸點(diǎn)個(gè)數(shù)大于1,那么表示該半環(huán)并聯(lián)在該環(huán)的環(huán)母線上,即Q(X,Y -1)是豎線, Q(X, Y +1 ) 不是豎線且Q(X,Y +2)是觸點(diǎn)的圖形。需要將前面的運(yùn)算結(jié)果壓棧,然后讀入該觸點(diǎn),再執(zhí)行該半環(huán)的后續(xù)邏輯運(yùn)算,然后將前面的結(jié)果出棧,并進(jìn)行“或” 運(yùn)算。分別用如RDSTK 或RDNOTSTK表示,如RDSTKX00010 …OR STK,這里NOT表示取反。
?。?)對(duì)于某一個(gè)觸點(diǎn)P(X,Y),只屬于某一環(huán)的環(huán)母線的元素,并且是該環(huán)的環(huán)母線的第一個(gè)元素,坐標(biāo)Y 大于1,那么計(jì)算機(jī)在執(zhí)行完之前的操作后需要將結(jié)果壓棧,然后讀入該觸點(diǎn)。在完成后續(xù)運(yùn)算后將之前的結(jié)果出棧,和當(dāng)前結(jié)果進(jìn)行“與” 運(yùn)算,分別用RDSTK和AND STK 表示。如RDSTKX00001…RDSTK;即Y >1,且Q(X+1,Y-1)是豎線的情形。
?。?)對(duì)于某一個(gè)觸點(diǎn)P(X,Y),Q(X,Y+1)是最右的豎線,則是輸出線圈,用WRT 表示,如WRT Y00000。
當(dāng)獲得了觸點(diǎn)的指令形式后,如何把這些指令正確地進(jìn)行排序呢?將梯形圖轉(zhuǎn)換成指令表的過程中關(guān)鍵的地方是:
?。?) 將半環(huán)的指令表插入到環(huán)母線指令后面,最終將所有半環(huán)的指令插入到母線指令列表之間;
(2)將OR STK或RDSTK這兩個(gè)出棧指令正確地放在所在環(huán)的指令后面。所以在轉(zhuǎn)換過程中首先要找到起始觸點(diǎn)行號(hào)最大的半環(huán)。由于梯形圖的半環(huán)是嵌套在另一個(gè)半環(huán)上,如果從上往下遍歷某一半環(huán)就要遍歷所有嵌套該半環(huán)的半環(huán),但是從下往上掃描,就可以避免這個(gè)問題。
3 數(shù)據(jù)結(jié)構(gòu)和轉(zhuǎn)換算法
3.1 數(shù)據(jù)結(jié)構(gòu)
對(duì)于梯形圖的顯示信息,設(shè)計(jì)了一種數(shù)據(jù)結(jié)構(gòu)ARRAYCELL。ARRAYCELL 的成員inttye,分別用來標(biāo)識(shí)當(dāng)前元素的類型:橫線、豎線、常開、常閉、輸出、點(diǎn),或表示當(dāng)前位置沒有元素。成員intaddr表示梯形圖的地址空間(X,Y)等觸點(diǎn)地址。
用數(shù)據(jù)ARRAYCELL arrayCell [MAX_ROW][MAX_COL]表示梯形圖數(shù)據(jù),數(shù)組的行列下標(biāo)剛好用來表示梯形圖元素的坐標(biāo),對(duì)梯形圖某一個(gè)元素(X,Y)的編輯和修改就變成了對(duì)變量arrayCell[X][Y]的type和addr的修改。成員pStr指向PMCCMDSTR 類型的數(shù)據(jù),用pStr在這里存放轉(zhuǎn)換信息。數(shù)據(jù)結(jié)構(gòu)PMCCMDSTR 包括了成員cmd[],該成員用來存放轉(zhuǎn)換過程中的指令, 如RD STKX00001 整個(gè)字符串。成員stack TYpe用來存放堆棧信息,如果當(dāng)前觸點(diǎn)沒有堆棧信息就為空。成員pBefore 和pNext用來保存鏈表的前趨和后繼。
3.2 轉(zhuǎn)換算法的實(shí)現(xiàn)
梯形圖的轉(zhuǎn)換過程分兩步完成:第一步:先從下往上,再從左到右遍歷梯形圖的元素,按照上面的約束條件掃描梯形圖的準(zhǔn)確性。如果遍歷到豎線,接下來的觸點(diǎn)便是起始觸點(diǎn),按照上面提及6 種類型判斷便可得到相應(yīng)的指令和壓棧關(guān)系,申請(qǐng)PMCCMDSTR 變量pStr,將對(duì)應(yīng)指令寫入指向pStr 變量的成員cmd和stack TYpe之中。
第二步:采用同第一步的掃描方法,梯形圖轉(zhuǎn)換的流程圖如圖5 所示。
圖5 轉(zhuǎn)換流程圖
3.3 轉(zhuǎn)換算法的特點(diǎn)
與二叉樹和AOV圖的轉(zhuǎn)換算法相比,文中研究的數(shù)據(jù)結(jié)構(gòu)和算法具有如下特點(diǎn):
(1)該算法自下至上掃描梯形圖,將半環(huán)的指令鏈接到環(huán)母線的指令后面,并利用數(shù)據(jù)結(jié)構(gòu)中的pStr成員保存,符合梯形圖的執(zhí)行順序。與從上到下的掃描方式相比,減少重復(fù)掃描梯形圖的次數(shù)和指令列表的頻繁搜索、插入過程;
?。?)該算法主動(dòng)改變X,Y 掃描某個(gè)觸點(diǎn)的周圍連接情況,與二叉樹相比更容易得到單個(gè)觸點(diǎn)的指令,算法實(shí)現(xiàn)過程簡(jiǎn)單;
(3)如果每個(gè)元素的pStr 不是NULL,需要進(jìn)行MAX_ROW MAX_COL 的指針鏈表的添加操作,存在浪費(fèi)時(shí)間的缺點(diǎn)。但是在編輯梯形圖時(shí)可以用變量保存梯形圖的最大行號(hào)和列號(hào)從而極大減少遍歷時(shí)間,在一定程度避免了這一個(gè)缺點(diǎn)。
(4) 用數(shù)組arrayCell儲(chǔ)存梯形圖的元素,如果是空元素則存在浪費(fèi)內(nèi)存的情況,如果將arrayCell[MAX_ROW][MAX_COL]改為存放指針arrayCell[MAX_ROW][MAX_COL]的變量則會(huì)改善內(nèi)存浪費(fèi)的情況。
綜合看來,該算法增加了系統(tǒng)的內(nèi)存消耗,但避免了AOV和二叉樹算法復(fù)雜度高、轉(zhuǎn)換時(shí)間長(zhǎng)的缺點(diǎn),同時(shí)采用自下往上掃描梯形圖的方法,算法實(shí)現(xiàn)簡(jiǎn)單,適合用于機(jī)床或?qū)崟r(shí)要求比較高的設(shè)備。
4 結(jié)束語
研究探討了梯形圖的結(jié)構(gòu),用環(huán)、半環(huán)、環(huán)母線、母線等概念對(duì)梯形圖進(jìn)行析構(gòu),對(duì)梯形圖的形狀作出了約束,分析梯形圖和指令之間的關(guān)系,并設(shè)計(jì)出轉(zhuǎn)換算法。該算法已運(yùn)用在中高檔的數(shù)控系統(tǒng)上,體現(xiàn)了該算法的方便快捷的特點(diǎn),對(duì)于工作人員在現(xiàn)場(chǎng)調(diào)試機(jī)床功能起了一定作用,受到用戶的認(rèn)可。
(審核編輯: 滄海一土)
分享