王榕生
(福州大學電氣工程與自動化學院,福建福州 350108)
“電氣控制與PLC”課程中梯形圖的編程形式具有形象直觀的特點,易于被學生接受[1-5]。然而,課程通篇貫穿邏輯思維與推理,又涉及大量指令內容,而使部分學生產生畏難情緒,學習信心不足。尤其是那些PLC特有的指令及控制環節方面會存在理解上的難度,如果講述不透,將影響學生對后續內容的學習。因此這部分內容事實上成了本門課程的教學難點。本文結合教學實踐,試圖解決PLC中的一些疑難指令的教學及一些容易忽視的問題。
TR不是編程指令,而是暫存繼電器[1-2]。盡管教材給出了明確說明,但對其在程序中所起作用,缺乏必要闡釋,導致概念不清。在歐姆龍CPM1A系列PLC中只提供編號TR0~TR7共8個暫存繼電器,數目雖少,卻構成了全部工作數據區中的一個分區,足見其地位之重要。暫存繼電器TR實質是“棧”,可形象比喻為裝東西的口袋,裝什么東西呢?弄清這點很重要,這是打開TR這把鎖的鑰匙。以下通過圖1所示的暫存繼電器TR的實例加以說明。

1 使用暫存繼電器TR實例
上圖的梯形圖支點意義是其左側繼電器00000參與(或控制)其后所有的邏輯運算。因此,程序從上到下先進行(00000)與(00001)之間的邏輯“與”運算,將結果輸出給(01000);再進行(00000)的復位操作,使其復0;然后進行(00000)與(00002)之間的邏輯“與”運算,其結果輸出給(01001)。
整個邏輯關系簡單明了,但里面隱藏著一個問題,即RESET指令有可能改變(00000)的邏輯值,影響到其后的邏輯運算。如果在程序開始運行時(00000)的邏輯值為1,在RESET指令執行后,又使(00000)由1復位為0,導致參與后續邏輯“與”運算的(00000)的值不再是原值,顯然違背了梯形圖原有的邏輯關系。
為避免這一情況發生,其解決辦法是在梯形圖的支點處擺放如圖1中的TR0。即如同設置一個“口袋”,將其左邊(00000)的值收入囊中,起到保存“原生態”的作用。欲達此目的,相關的兩個動作不可或缺,一是“裝入”,即OUT TR0指令;另一則是“取出”,即 LD TR0指令,否則“口袋”形同虛設。“裝入”指令OUT TR0必須緊跟在所要保存的繼電器(圖例為00000)的加載指令之后,“取出”指令LD TR0則應放在涉及“口袋”中的量的邏輯運算之前。有了暫存繼電器TR之后,就不用擔心程序中任何地方是否改變了支點左側的繼電器值了。問題的關鍵是能否正確使用OUT TR0與LD TR0這兩個指令。
當程序運行到 RESET 00000指令時,如果(00000)為1,則對(00000)作復位操作,其值變為0。雖然改變了(00000)的原值,但其后跟隨的指令LD TR0將TR0內的值即(00000)原值重新賦給了R,即所謂“取出”,使隨后參與邏輯運算的(00000)仍為原值,從而確保了梯形圖原有的邏輯關系。
那么是否凡遇有支點都要使用TR呢?未必盡然。如果梯形圖所有邏輯運算都不改變支點左側繼電器原值,例如在圖1梯形圖中如果沒有RESET 00000指令,可不使用TR。同理,雖然使用了TR,但邏輯運算未改變支點左側繼電器原值之前也可不使用LD TRx(x=0~7)指令。例如,上例中RESET 00000指令前的LD TR0指令可改用LD 00000,因為此時的(00000)值尚未變化。
PLC指令具有微分和非微分兩種形式,凡微分型指令均在助記符前加@符予以標識。大多數應用指令兼有微分型/非微分型。兩種指令形式的功能完全一樣,區別在于指令的執行條件。對于非微分型指令,當執行條件為ON時,則每個掃描周期都執行該指令;對于微分型指令僅在其執行條件由OFF跳變為ON時才執行一次,如果執行條件沒有OFF到ON的變化,則該指令不執行。然而教學中發現不少學生對此感到抽象。究其原因有兩個方面:①如何理解執行條件由OFF到ON的變化;②將指令設計為兩種形式的意義在哪里?
先談第一個問題。為厘清執行條件由OFF到ON的變化,關鍵要將PLC固有工作方式即所謂“循環掃描”結合起來講。“循環掃描”即為重復地執行程序。無論程序何種結構及其大小,一旦PLC開機,都對程序重復運行,循環不已。因此,程序中每條指令也將一遍遍地執行,然而事先須考察執行條件是否滿足,滿足則執行,否則不執行。考察按“循環掃描”運行節拍進行。如果指令為非微分型,當每個掃描周期的執行條件都為ON時,則重復執行該指令,直到條件變為OFF時停止執行;如果指令為微分型,則要考察前后兩次掃描周期執行條件的變化來決定當前是否執行指令。如果上次掃描周期的執行條件為OFF,當前掃描周期的執行條件變為ON,則PLC感知了條件的上跳變化,則執行指令,否則不執行。請看圖2所示的例子。

圖2 微分指令執行原理示意圖
上圖的梯形圖示出了微分指令@INC(功能為加1運算)執行原理,該指令的執行條件是(00000)繼電器。梯形圖右側箭頭線代表對程序一遍遍掃描,實線表示執行@INC指令,虛線表示不執行該指令。箭頭下方數字表示掃描序號,上方為每次掃描時@INC指令執行條件(00000)的狀態。當第一遍掃描時,25315先對(000)通道清零,之后由于(00000)=OFF,則指令@INC不執行,于是(000)=0;第二遍掃描時,(00000)=ON,PLC感知了(00000)邏輯量的上跳變化,因此執行@INC,使(000)=1;第三遍掃描時,(00000)仍為ON,相對于上次掃描沒有發生上跳變化,則不執行@INC,(000)值仍為1。后續掃描如保持(00000)ON不變,則都不執行@INC。由此看出當執行條件變為ON時,PLC對微分指令只執行一次。所以從指令執行次數方面考察,非微分型指令可簡單理解為執行多次的指令,微分指令則為只執行一次的指令。
由此引出了第二個問題,即為什么PLC將指令設計為兩種形式,其實際意義在哪里?前已提到PLC的固有工作方式是“循環掃描”,它是針對控制目標的實現需要PLC重復執行程序這一通常情況而設計的,但不排除實際應用中存在只執行一次指令的需要。試想如果拿掉圖2中INC指令前的@使之變為非微分指令,則一旦執行條件(00000)為ON,經一段時間運行后,(000)值是多少就難以確知了,程序變得無甚意義。所以PLC的兩種指令形式,是針對不同控制需要而設計的,不可混用。
PLC中的控制問題只要屬于順序控制類型,無論大小,都能通過套用PLC提供的模板輕易得以解決,因此能在很大程度上減輕編程難度。順序控制編程涉及兩大步驟:畫功能表圖和畫梯形圖。功能表圖應準確表達每步所做的事項及步與步之間的轉換條件,畫梯形圖則是在此基礎上套用模板而已。然而必須指出步與步之間的轉換條件體現在梯形圖模板時卻發生了變形,即加入了上一步控制位這一條件,使步轉換條件變為二者相“與”的邏輯條件。那么我們不禁要問,所加入的條件是必要的嗎?教材或參考書對此缺乏必要闡釋,使不少學生產生困惑。為澄清這一問題,應扣緊順序控制的實質要求,即下一步活動必須在前一步活動結束之后才能展開,這就意味著整個控制過程不充許發生任何跳轉。試想如果在梯形圖的轉換條件中取消上一步控制位,僅留下步轉換條件,將會發生什么情況。我們現在結合圖3所示的實例進行討論。

圖3 順序控制示例
在上圖所示的順序控制梯形圖中,每個梯級的步轉換邏輯條件為控制位 20000、20001、20002、20003 分別與 00000、00001、00002、00003 繼電器相“與”。假設將其中的控制位取消,留下 00000、00001、00002、00003位似乎也能實現步轉換。如果控制位20001為ON,即當前活動步為“工進”,當該步結束時必使00001繼電器為ON,進而使20002為ON,即活動步轉為“快進”,并使上一步控制位20001變為OFF,似乎也符合順序控制邏輯要求。但這樣一來埋下了一個隱患,即只要發生某種干擾使轉換條件00000、00001、00002、20003繼電器位中的任何一個為ON都可觸發相應控制位為ON,使該步變為活動步,而不管其上一步是否結束了活動狀態,這就導致了事實上的程序跳轉,違背了順序控制的本意。由此可見在步轉換邏輯條件中加(串)入上一步控制位是完全必要的,它對步轉換起到了嚴格限制作用,使其僅在上一步活動結束后方可進行,以防止干擾引起程序跳轉,確保順序控制按正確邏輯步驟推進。
PLC常用指令是關于“位”的邏輯運算指令,其中的加載指令LD N應予以特別重視,因為它包含兩種不同操作。然而教學中發現學生對該指令的認知只停留在助記符所表達的操作功能層面上,卻忽視了隱藏在助記符后面的另一操作功能。恰恰這一忽視對后續“塊”邏輯運算指令的教學影響很大,因此有必要對加載指令LD N功能作深入解讀。

圖4 塊邏輯運算示例
LD N指令包含的兩種操作功能分別是,①將N繼電器狀態送入結果寄存器R;②結果寄存器R的原內容存入堆棧。對這兩種操作應理解為有先有后,第2種操作在先,第1種操作在后,否則R的原內容將丟失(被覆蓋)。于是指令執行時,先將R的內容保存進堆棧中,然后再接收N繼電器狀態。該指令對R內容的保存功能對“塊”邏輯運算指令功能的發揮至關重要,同時也是正確理解與運用“塊”邏輯運算指令的關鍵所在。現在可通過圖4所示的實例進行剖析。算,即(00000)·(00001)+(00002),結果存入 R中。接下來進行第二“塊”邏輯運算時務必先應用指令LD 00003將R內容即第一“塊”的邏輯運算結果轉存堆棧S中。再加載(00003)至R,連同其后的AND NOT 00004和OR NOT 00005指令完成第二“塊”的邏輯運算。至此,前兩“塊”邏輯運算都告完成,結果分別存放在堆棧S與R中。接下來應用AND LD指令進行堆棧S與R內容相“與”,即前兩
上圖中“塊”邏輯運算梯形圖示例中共有3個邏輯塊。梯形圖先對上方2個邏輯塊進行“與”運算,然后再對下方的塊進行“或”的運算,所得結果傳送給01000,其邏輯關系直觀明了。但如何正確地應用指令語句加以實現,主要取決于對LD N指令的透徹理解與正確運用。
在圖4梯形圖中,先對第一“塊”進行邏輯運“塊”邏輯值相“與”運算,結果存放R中。其后進行第三“塊”的邏輯運算時,同樣先應用LD NOT 00006指令將R內容轉移到堆棧S中,再加載(00006),連同其后的AND 00007指令完成第三“塊”邏輯運算,其值仍在R中,再應用OR LD指令完成堆棧S與R內容相“或”,也就是前兩“塊”相“與”的結果再與第三“塊”邏輯值相“或”的運算,最后通過 OUT 01000指令輸出結果。
由以上分析可以看出,在對含有“塊”邏輯運算的梯形圖寫語句表時,應先弄清各“塊”之間的邏輯關系,明確各“塊”邏輯運算順序,在此基礎上正確運用LD N指令及“塊”邏輯指令(AND LD與OR LD)加以實現。LD N指令將前一“塊”邏輯值轉存堆棧S中,并開啟下一“塊”的邏輯運算,而“塊”邏輯指令則對之前存放于堆棧中的“塊”邏輯值再取出進而完成規定的“塊”間邏輯運算,其執行總是在相關的二“塊”邏輯值算完之后,與LD N指令形成交替疊進關系。
[1] 劉涳,常用低壓電器與可編程序控制器[M],西安:西安電子科技大學出版社,2005
[2] 鄭寶林,圖解歐姆龍PLC入門[M],北京:機械工業出版社,2008
[3] 孫振強,可編程序控制器原理及應用教程[M],北京:清華大學出版社,2005
[4] 俞國亮,PLC原理與應用[M],北京,清華大學出版社,2005
[5] 何衍慶等,可編程序控制器原理及應用技巧[M],北京:化學工業出版社,2006