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