il語言非常接近,編碼后,處理器能很容易識別,但是梯形圖是圖形元素,cpu不容易識別,所以要將梯形圖先編譯為il語言。本文提供了一種遞歸編譯的方式,不完善的地方,還請見諒。
轉換思路:
將梯形圖以網絡為單位進行遍歷,選擇一個網絡進行分析,梯形圖本質是塊和塊之間的串聯,串聯的塊中又可能包含了并聯關系,但是并聯關系中,其實也是串聯塊的并聯。如圖1:
在整個梯形圖編譯的過程中,主要使用2個步驟(或者叫函數),一個步驟分析塊之間的串聯關系,一個步驟分析塊之間的并聯關系。
步驟0:先初始化開始行為網絡的第一行,開始列為第一列,結束列為最后一列。然后進去步驟1。
步驟1、
(1)建立一個塊堆棧blockstack,輸出堆棧outputstack。
(2)首先將圖進行串聯塊的分析。將分析到的塊壓入blockstack,輸出塊壓入outputstack.
(3)遍歷blockstack,對每一個塊進行分析,
1)如果塊的行數大于1,表示塊中有并聯關系,到步驟2分析該塊。
如果塊不是第一個塊,則要在并聯關系解釋完后,加入anb指令。
2)如果塊的行數等于1,表示塊已經是最簡串聯塊,直接輸出塊的語句。
如果塊是第一個塊,使用ld加載第一個元素,依次往后使用and。(至于使用ldi,還是ani,請判斷元素的類型。)
如果塊不是第一個塊,使用and加載第一個元素,依次往后使用and。
(4)遍歷輸出塊。
如果輸出塊是多行,使用步驟2分析輸出塊。
如果輸出塊是單行,則直接輸出塊中元素:out、set、rst。
步驟2、
(1)首先判斷傳入的塊是輸出塊還是普通塊。如果是輸出塊,建立一個記錄標志。
(2) 建立一個或堆棧.orblockstack.
(3) 分析塊blcok中由哪幾個串聯塊并聯而成,將塊壓入orblockstack中.
(4) a、遍歷orblockstack,每一個串聯塊進行步驟1串聯分析。
b、為每一個串聯塊加上并聯關系。
1)如果是輸出:如果一共有2個分支,則第一個分支加入mps,第二個分支加入mpp。
如果分支大于2個,則第一個分支加入mps,最后一個分支加入mpp,其他分支加入mpr。
2)如果不是輸出:如果串聯塊中橫線方向元素個數大于1個,加入orb,如果只有一個元素,加入or,進入步驟3檢查代碼。如果沒有元素,就是短路。報錯。
步驟3:全部完成后,對指令進行分析,如果有
ld xn
or
這樣的指令,要合并為:
or xn.
舉例說明:
梯形圖程序如圖1,可以劃分為3個塊:塊1,塊2,輸出塊。3個之間是串聯的關系。
圖1
(現在是在步驟1中)依次將塊1,塊2,輸出塊傳入步驟2,根據步驟1可知,塊2后面需要加入anb指令。
塊1傳入步驟2后,可以分析到塊1是由2個串聯塊a、b并聯組成的。如圖2:
圖2
(現在是在步驟2中)依次將a、b傳入步驟1,根據步驟2可知,b傳入步驟1后,要加上orb指令。
塊a傳入步驟1后,可以分析到塊a是由3個塊a,b,c串聯組成的,如圖3:
(現在是在步驟1中)然后依次將a,b,c傳入到步驟2中進行分析,根據步驟1可知,b進入步驟2后,要加入anb指令,c進入步驟2后,也要加入anb指令。
塊a可以分析得到是由3個單行的串聯a1,a2,a3塊并聯組成的。
(現在是在步驟2中)再依次把a1,a2,a3傳入步驟1進行串聯分析,根據步驟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
在這個算法中,將梯形圖元素分塊,是最關鍵的,所以要處理好梯形圖元素的分塊,至于怎么分塊,就需要自己想了喲~