轉(zhuǎn)換思路:
將梯形圖以網(wǎng)絡(luò)為單位進行遍歷,選擇一個網(wǎng)絡(luò)進行分析,梯形圖本質(zhì)是塊和塊之間的串聯(lián),串聯(lián)的塊中又可能包含了并聯(lián)關(guān)系,但是并聯(lián)關(guān)系中,其實也是串聯(lián)塊的并聯(lián)。如圖1:
在整個梯形圖編譯的過程中,主要使用2個步驟(或者叫函數(shù)),一個步驟分析塊之間的串聯(lián)關(guān)系,一個步驟分析塊之間的并聯(lián)關(guān)系。
步驟0:先初始化開始行為網(wǎng)絡(luò)的第一行,開始列為第一列,結(jié)束列為最后一列。然后進去步驟1。
步驟1、
(1)建立一個塊堆棧BlockStack,輸出堆棧OutputStack。
(2)首先將圖進行串聯(lián)塊的分析。將分析到的塊壓入BlockStack,輸出塊壓入OutputStack.
(3)遍歷BlockStack,對每一個塊進行分析,
1)如果塊的行數(shù)大于1,表示塊中有并聯(lián)關(guān)系,到步驟2分析該塊。
如果塊不是第一個塊,則要在并聯(lián)關(guān)系解釋完后,加入ANB指令。
2)如果塊的行數(shù)等于1,表示塊已經(jīng)是最簡串聯(lián)塊,直接輸出塊的語句。
如果塊是第一個塊,使用LD加載第一個元素,依次往后使用AND。(至于使用LDI,還是ANI,請判斷元素的類型。)
如果塊不是第一個塊,使用AND加載第一個元素,依次往后使用AND。
(4)遍歷輸出塊。
如果輸出塊是多行,使用步驟2分析輸出塊。
如果輸出塊是單行,則直接輸出塊中元素:OUT、SET、RST。
步驟2、
(1)首先判斷傳入的塊是輸出塊還是普通塊。如果是輸出塊,建立一個記錄標志。
(2) 建立一個或堆棧.OrBlockStack.
(3) 分析塊Blcok中由哪幾個串聯(lián)塊并聯(lián)而成,將塊壓入OrBlockStack中.
(4) A、遍歷OrBlockStack,每一個串聯(lián)塊進行步驟1串聯(lián)分析。
B、為每一個串聯(lián)塊加上并聯(lián)關(guān)系。
1)如果是輸出:如果一共有2個分支,則第一個分支加入MPS,第二個分支加入MPP。
如果分支大于2個,則第一個分支加入MPS,最后一個分支加入MPP,其他分支加入MPR。
2)如果不是輸出:如果串聯(lián)塊中橫線方向元素個數(shù)大于1個,加入ORB,如果只有一個元素,加入OR,進入步驟3檢查代碼。如果沒有元素,就是短路。報錯。
步驟3:全部完成后,對指令進行分析,如果有
LD Xn
OR
這樣的指令,要合并為:
OR Xn.
舉例說明:
梯形圖程序如圖1,可以劃分為3個塊:塊1,塊2,輸出塊。3個之間是串聯(lián)的關(guān)系。
圖1
(現(xiàn)在是在步驟1中)依次將塊1,塊2,輸出塊傳入步驟2,根據(jù)步驟1可知,塊2后面需要加入ANB指令。
塊1傳入步驟2后,可以分析到塊1是由2個串聯(lián)塊A、B并聯(lián)組成的。如圖2:
圖2
(現(xiàn)在是在步驟2中)依次將A、B傳入步驟1,根據(jù)步驟2可知,B傳入步驟1后,要加上ORB指令。
塊A傳入步驟1后,可以分析到塊A是由3個塊a,b,c串聯(lián)組成的,如圖3:
(現(xiàn)在是在步驟1中)然后依次將a,b,c傳入到步驟2中進行分析,根據(jù)步驟1可知,b進入步驟2后,要加入ANB指令,C進入步驟2后,也要加入ANB指令。
塊a可以分析得到是由3個單行的串聯(lián)a1,a2,a3塊并聯(lián)組成的。
(現(xiàn)在是在步驟2中)再依次把a1,a2,a3傳入步驟1進行串聯(lián)分析,根據(jù)步驟2可知,X2傳入步驟1后,要加入OR指令,X3傳入步驟1后,也要加入OR指令。
a1進入步驟1,可以得到a1只有一行,所以直接輸出a1為
LD X1
a2傳入步驟1,可以得到
LD X2
OR
a3傳入步驟1可以得到
LD X3
OR
最后對指令進行分析,只要有
LD Xn
Or
這樣的,都合并為OR Xn.
整理后得到指令為:
LD X1
OR X2
OR X3
。
依次往后遍歷,最后能得到所有的指令為:
LD X1
OR X2
OR X3
LD X4
OR X5
ANB
LD X6
OR X7
ANB
LD X9
OR X10
LD X11
LD X12
ANB
ORB
LD X13
OR X14
LD X15
OR X16
ANB
OR X17
ANB
OUT Y1
在這個算法中,將梯形圖元素分塊,是最關(guān)鍵的,所以要處理好梯形圖元素的分塊,至于怎么分塊,就需要自己想了喲~