薄敬東,楊志剛,崔傳金
(華北理工大學電氣工程學院,河北 唐山 063210)
常用的可編程控制器的編程方法有經(jīng)驗設計法和順序設計法,經(jīng)驗設計法來源于傳統(tǒng)繼電器控制邏輯,基本單元電路是“啟—?!!彪娐罚豁樞蛟O計法是分析被控對象的運行過程,將過程分解為單元動作,進而形成工步的概念。在應用這2個方法設計程序時,開發(fā)者往往傾向于單個邏輯判斷,將所有滿足條件一一列出,建立邏輯關系,得到最后結果,缺少對結果的歸納與總結提升,導致程序不具備通用性。
程序設計本質(zhì)上是邏輯代數(shù)。在控制系統(tǒng)案例[1]的設計開發(fā)中,常用枚舉法列寫所有可能條件,來判斷最終結果。這種分析方法簡單,但是隨著條件的增多,導致程序繁雜。如何從具體、個別的前提上升到一般、概括性的結論呢?就是歸納邏輯研究內(nèi)容[2-3]。歸納邏輯中的枚舉歸納推理是控制系統(tǒng)案例分析的常用工具。本文以6層電梯系統(tǒng)設計為案例,在經(jīng)驗法和順序設計法基礎上,探討枚舉歸納推理在程序設計中的應用,實現(xiàn)程序設計的精煉。
以6層電梯平層上呼信號開門和上行信號判讀為例,比較枚舉法編程和枚舉歸納法編程的優(yōu)缺點,給出相應的分析過程。
以電梯停止在本層樓層,判斷是否存在上呼信號去開門程序為例,常見的繼電邏輯程序如圖1所示。在電梯停止的前提下,1層上呼按鈕有效并且當前層在1層,產(chǎn)生開門有效信號;2層上呼按鈕有效,并且當前層在2層,產(chǎn)生開門有效信號。以此類推,層數(shù)越多,并聯(lián)的邏輯指令越多。其邏輯關系如公式(1)所示。令X1表示1層上召喚按鈕是否按下,如果按鈕按下,則X1=1,否則X1=0;X2表示2層上召喚按鈕是否按下;以此類推,X6表示6層上召喚按鈕是否按下;Y1表示轎廂是否停在1層位置,變量名為樓層位置信號通道1,如果檢測電梯在1層,則Y1=1,否則Y1=0;Y2表示轎廂是否停在2層位置;以此類推,Y6表示轎廂是否停在6層位置;Z表示電梯運行狀態(tài);W表示本層開門信號是否有效。因而,可得計算本層開門中間信號的表達式為:
圖1 枚舉法計算上召喚開門
按照公式(1)的表達式,書寫梯形圖指令可得圖1所示程序。所得程序易于理解,但是對于層數(shù)較多時,需要增加變量,比較煩瑣。
以上為分析法,將所有情況列舉。能否將以上列舉情況歸納總結,通過設計通用性算法實現(xiàn)開門條件的計算呢?綜上可知,電梯無方向停止前提下,所在當前層有上呼使能開門中間信號。如果能依據(jù)當前層數(shù)值(可通過平層開關與運行方向計算當前樓層數(shù)值),自動提取出當前層的上呼信號(將上召喚改名為上呼)是否存在,即可判斷是否開門。
令W表示本層開門中間信號是否有效,Z表示電梯運行狀態(tài),X表示上呼記錄字節(jié)變量,Y表示當前樓層對應位是否為1的變量??蓪⑦壿嫳磉_式歸納為:
只需要計算出電梯當前層是否存在上呼按鈕信號即可。為此,將外呼信號和內(nèi)選信號進行指令登記后[4],按照表1規(guī)則排列。
表1 記錄輸入信號變量各位含義
外部輸入信號分為3類,為內(nèi)選信號、上呼信號、下呼信號。用一個字節(jié)有8位二進制數(shù)表述6層樓層呼叫記錄信號,便于方便描述,將最低位0設為0層外界記錄信號,1位為1層信號,以此類推,到6層的信號,其中第7位為7層信號,全是0。其中0層和7層全為0,未使用。具體方法通過解碼指令來實現(xiàn)當前樓層的解碼,將輸入值指定的輸出值中的某個位置位。以西門子S7-1200西門子控制器為例,如果輸入當前樓層數(shù)值為3,使用“解碼”指令可輸出一個2進制數(shù)為2#00001000,也就是說第3位為1,其余位全是0。表1所列數(shù)據(jù)格式的第3位,恰好是電梯3層的3類外部輸入信號。用3層的解碼值與上呼記錄變量進行邏輯與操作,如果結果不為0,則說明存在3層上呼信號,得到當前層的上呼信號。再與電梯運行狀態(tài)信號進行邏輯與操作,即可實現(xiàn)中間開門信號的計算,如圖2所示。與常用繼電邏輯編程方式相比,該程序指令少,書寫簡單,便于電梯程序的修改與升級。
圖2 枚舉歸納法計算上呼開門
如果電梯沒有運行方向,判斷當前電梯是否上行為例,探討2種方法的優(yōu)缺點。
常用處理方法如圖3所示,在判斷電梯上行信號時,采用枚舉法。在電梯沒有下行信號條件下,若2層登記(2層呼叫記錄信號)有效,電梯若在2層以下,則置位上行信號;若3層登記有效,電梯若在3層以下,則置位上行信號;以此類推,將所有情況并聯(lián)在一起,實現(xiàn)電梯上行方向置位。該方法簡單有效,但是需要將所有樓層登記均列寫出來。
圖3 枚舉法計算電梯上行程序
令Mup表示上行信號是否有效;Mdown表示下行信號是否有效;X1表示1層登記信號是否有效,包括上呼、下呼和內(nèi)選3類信號是否登記;X2表示2層登記信號是否有效,包括上呼、下呼和內(nèi)選3類信號是否登記;以此類推,X6表示6層登記信號是否有效,包括下呼和內(nèi)選2類信號是否登記;Y2表示電梯所在樓層是否小于2層,Y3表示電梯所在樓層是否小于3層,同樣,Y6表示電梯所在樓層是否小于6層。得到邏輯表達式為:
采用枚舉歸納法,可通過計算實現(xiàn)該功能??偨Y歸納如下,在沒有下行方向前提下,電梯當前層及當前層以上的上呼信號和高于當前層的下呼信號、內(nèi)選信號都能產(chǎn)生電梯上行的信號。因而,只需要判斷當前樓層以上是否有這些信號,就能判斷電梯是否上行。令Mup表示上行信號是否有效,Mdown表示下行信號是否有效,X表示當前層和大于當前層的上呼信號是否存在,Y表示大于當前層的下呼信號是否存在,Z表示大于當前層的內(nèi)選登記信號是否存在??傻茫?/p>
其中,各樓層的信號記錄參見表1,對于X、Y、Z的獲取可通過對表1變量進行移位獲得。如當前樓層是3層,則將上呼記錄字節(jié)變量向右移位3次,再向左移位3次,3層以下的上呼信號就消失,得到X。將下呼記錄字節(jié)變量向右移動4次,再向左移位4次,則3層和3層以下的下呼信號消失,得到Y。同樣處理內(nèi)選信號的Z。
具體程序如圖4和圖5所示。
圖4 歸納法計算X、Y、Z
圖5 枚舉歸納法計算上行信號
由圖4、5可看出,枚舉歸納法得到的表達式簡單明了,且具備一定通用性,便于電梯程序的升級。
在電梯上下行過程中,需要判斷是否平層停梯。此時如使用枚舉法計算停梯條件的話,需要列舉所有的條件。
為描述方便,以當前電梯在1層,只有4層下呼叫信號為例進行說明。前一小節(jié)已經(jīng)詳述運行方向的判斷方法和程序,本例應該計算出向上運行。在向上運行的過程中,4層的上呼叫信號有效應該可以直接將電梯停止在4層,而4層下呼叫信號停止電梯就需要5層、6層沒有呼叫信號,包括內(nèi)選與上下呼叫信號,才能將電梯停止在4層。
令Mstopup表示上行停止變量;Mup表示上行是否有效信號;X1表示1層信號是否登記,包括上呼、下呼和內(nèi)選登記;X2表示2層信號是否登記,包括上呼、下呼和內(nèi)選登記;以此類推,X6表示6層信號是否登記,包括下呼和內(nèi)選登記;Xup1代表1層上呼信號是否有效,Xsel1代表1層內(nèi)選信號是否有效,Xdown1代表1層下呼信號是否有效(此處只是定義變量),以此類推,可定義其他5層的內(nèi)選信號、上呼信號和下呼信號。Y1表示電梯所在樓層是否為1層,Y2表示電梯所在樓層是否為2層,同樣,Y6=電梯所在樓層是否為6層。得到上行停梯邏輯表達式為:
由此可見,樓層越多,所需要羅列的條件也就越多,雖然概念明確,邏輯簡單,但是程序書寫與后期調(diào)試都是很大的工作量。依據(jù)前述的枚舉歸納法,對上行停梯問題進行分析,看是否能簡化問題表述。這里提出當前樓層和上行目標樓層2個概念。當前樓層是依據(jù)平層傳感器自動計算出當前電梯所處的樓層,而上行目標樓層是依據(jù)不低于當前樓層的內(nèi)選信號、上呼信號、下呼信號計算出來的上行目標樓層。在分析上行停梯過程,優(yōu)先分析不低于當前樓層的內(nèi)選信號和上呼信號,選擇內(nèi)選與上呼信號中,距離當前樓層最近的樓層當作目標樓層。這可以通過類似圖4所示的移位指令,將低于當前層的內(nèi)選和上呼信號消除,然后再將剩余樓層通過移位指令恢復到相應樓層位置。將二者進行或運算,得到總的上行信號組合。再通過PLC指令提供的編碼指令(具體指令功能,可參閱相關文獻),可將運算結果數(shù)值按照二進制表示,依據(jù)表1的定義方法,用編碼指令取出右側第一個不為0的位轉(zhuǎn)換對應數(shù)值,該數(shù)值即為目標樓層的樓層數(shù)。依據(jù)表1的定義方法,該數(shù)字即為目標樓層的樓層數(shù)。在上行的條件下,比較當前樓層與目標樓層是否一致,如果一致,則停止上行運行。
剛才討論只討論內(nèi)選與上呼信號,沒有涉及下呼信號,這是因為如果有內(nèi)選和上呼,在上行過程,優(yōu)先響應內(nèi)選與上呼。如果沒有內(nèi)選和上呼信號,則響應下呼信號。此時,如果當前電梯在1層上行,按文中假設,只有4層有下呼,則移位處理低于當前層信號后,保留4層信號信息,信號排列如表1所示,只在4層下呼位置有數(shù)值。通過譯碼指令,可將處理后下呼記錄變量編碼為數(shù)值4,即為目標樓層數(shù)值4,可與當前層數(shù)值進行比較,相同則滿足停止電梯上行的條件。令Mstopup表示上行停止變量,Mup表示上行是否有效信號,Num_C表示平層開關計數(shù)的當前樓層數(shù),Num_Tag_up表示內(nèi)選、外呼計算出的上行目標樓層數(shù),則邏輯關系為Mstopup=Mup×(Num_Tag_up==Num_C)。
簡單描述為上行前提下,如果當前樓層等于上行目標樓層,則停梯信號有效。
這時有的讀者會提出問題,如果沒有內(nèi)選和上呼信號,但4層和5層都有下呼信號,電梯在1層上行,應該去哪層呢?按照運行高效原則應該先去5層,然后運行方向向下,再去4層。細心的讀者會發(fā)現(xiàn),編碼指令會把帶有4、5層下呼標記的變量編碼為4,因為編碼指令的功能是從最低位開始編碼的,這時需要將下呼變量的排列變成逆序,這樣層數(shù)高的信號,就會排列到低位,通過編碼指令,才能優(yōu)先計算層數(shù)高的信號。具體過程,這里不贅述了,希望感興趣的讀者親自嘗試,體會下編程思考的樂趣。
依照此計算方法,隨著樓層的增加,只需要將存儲樓層的字節(jié),擴大為字、雙字即可解決樓層增加的問題,算法和程序不用改動,而上面的簡單枚舉法需要增加極大的書寫代碼的工作量,因而應用枚舉歸納法,可將解決問題的方法通用化。
通過對程序設計中的枚舉法和枚舉歸納法比較,可以看出,枚舉法簡單實用,便于理解,但書寫繁多;枚舉歸納法表達簡單,通用性高,需要經(jīng)過總結抽象分析,有一定難度。經(jīng)過一定的總結分析與有一定枚舉歸納意識的實戰(zhàn),能掌握程序設計中的歸納法,實現(xiàn)程序算法的通用性與代碼的簡化升級。通過2種方法比較,使學生掌握案例中程序的設計方法,引發(fā)學生主動思考,提升案例教學效果。