王榕生
(福州大學(xué)電氣工程與自動化學(xué)院,福建福州 350108)
“電氣控制與PLC”課程中梯形圖的編程形式具有形象直觀的特點(diǎn),易于被學(xué)生接受[1-5]。然而,課程通篇貫穿邏輯思維與推理,又涉及大量指令內(nèi)容,而使部分學(xué)生產(chǎn)生畏難情緒,學(xué)習(xí)信心不足。尤其是那些PLC特有的指令及控制環(huán)節(jié)方面會存在理解上的難度,如果講述不透,將影響學(xué)生對后續(xù)內(nèi)容的學(xué)習(xí)。因此這部分內(nèi)容事實上成了本門課程的教學(xué)難點(diǎn)。本文結(jié)合教學(xué)實踐,試圖解決PLC中的一些疑難指令的教學(xué)及一些容易忽視的問題。
TR不是編程指令,而是暫存繼電器[1-2]。盡管教材給出了明確說明,但對其在程序中所起作用,缺乏必要闡釋,導(dǎo)致概念不清。在歐姆龍CPM1A系列PLC中只提供編號TR0~TR7共8個暫存繼電器,數(shù)目雖少,卻構(gòu)成了全部工作數(shù)據(jù)區(qū)中的一個分區(qū),足見其地位之重要。暫存繼電器TR實質(zhì)是“?!?,可形象比喻為裝東西的口袋,裝什么東西呢?弄清這點(diǎn)很重要,這是打開TR這把鎖的鑰匙。以下通過圖1所示的暫存繼電器TR的實例加以說明。
1 使用暫存繼電器TR實例
上圖的梯形圖支點(diǎn)意義是其左側(cè)繼電器00000參與(或控制)其后所有的邏輯運(yùn)算。因此,程序從上到下先進(jìn)行(00000)與(00001)之間的邏輯“與”運(yùn)算,將結(jié)果輸出給(01000);再進(jìn)行(00000)的復(fù)位操作,使其復(fù)0;然后進(jìn)行(00000)與(00002)之間的邏輯“與”運(yùn)算,其結(jié)果輸出給(01001)。
整個邏輯關(guān)系簡單明了,但里面隱藏著一個問題,即RESET指令有可能改變(00000)的邏輯值,影響到其后的邏輯運(yùn)算。如果在程序開始運(yùn)行時(00000)的邏輯值為1,在RESET指令執(zhí)行后,又使(00000)由1復(fù)位為0,導(dǎo)致參與后續(xù)邏輯“與”運(yùn)算的(00000)的值不再是原值,顯然違背了梯形圖原有的邏輯關(guān)系。
為避免這一情況發(fā)生,其解決辦法是在梯形圖的支點(diǎn)處擺放如圖1中的TR0。即如同設(shè)置一個“口袋”,將其左邊(00000)的值收入囊中,起到保存“原生態(tài)”的作用。欲達(dá)此目的,相關(guān)的兩個動作不可或缺,一是“裝入”,即OUT TR0指令;另一則是“取出”,即 LD TR0指令,否則“口袋”形同虛設(shè)?!把b入”指令OUT TR0必須緊跟在所要保存的繼電器(圖例為00000)的加載指令之后,“取出”指令LD TR0則應(yīng)放在涉及“口袋”中的量的邏輯運(yùn)算之前。有了暫存繼電器TR之后,就不用擔(dān)心程序中任何地方是否改變了支點(diǎn)左側(cè)的繼電器值了。問題的關(guān)鍵是能否正確使用OUT TR0與LD TR0這兩個指令。
當(dāng)程序運(yùn)行到 RESET 00000指令時,如果(00000)為1,則對(00000)作復(fù)位操作,其值變?yōu)?。雖然改變了(00000)的原值,但其后跟隨的指令LD TR0將TR0內(nèi)的值即(00000)原值重新賦給了R,即所謂“取出”,使隨后參與邏輯運(yùn)算的(00000)仍為原值,從而確保了梯形圖原有的邏輯關(guān)系。
那么是否凡遇有支點(diǎn)都要使用TR呢?未必盡然。如果梯形圖所有邏輯運(yùn)算都不改變支點(diǎn)左側(cè)繼電器原值,例如在圖1梯形圖中如果沒有RESET 00000指令,可不使用TR。同理,雖然使用了TR,但邏輯運(yùn)算未改變支點(diǎn)左側(cè)繼電器原值之前也可不使用LD TRx(x=0~7)指令。例如,上例中RESET 00000指令前的LD TR0指令可改用LD 00000,因為此時的(00000)值尚未變化。
PLC指令具有微分和非微分兩種形式,凡微分型指令均在助記符前加@符予以標(biāo)識。大多數(shù)應(yīng)用指令兼有微分型/非微分型。兩種指令形式的功能完全一樣,區(qū)別在于指令的執(zhí)行條件。對于非微分型指令,當(dāng)執(zhí)行條件為ON時,則每個掃描周期都執(zhí)行該指令;對于微分型指令僅在其執(zhí)行條件由OFF跳變?yōu)镺N時才執(zhí)行一次,如果執(zhí)行條件沒有OFF到ON的變化,則該指令不執(zhí)行。然而教學(xué)中發(fā)現(xiàn)不少學(xué)生對此感到抽象。究其原因有兩個方面:①如何理解執(zhí)行條件由OFF到ON的變化;②將指令設(shè)計為兩種形式的意義在哪里?
先談第一個問題。為厘清執(zhí)行條件由OFF到ON的變化,關(guān)鍵要將PLC固有工作方式即所謂“循環(huán)掃描”結(jié)合起來講?!把h(huán)掃描”即為重復(fù)地執(zhí)行程序。無論程序何種結(jié)構(gòu)及其大小,一旦PLC開機(jī),都對程序重復(fù)運(yùn)行,循環(huán)不已。因此,程序中每條指令也將一遍遍地執(zhí)行,然而事先須考察執(zhí)行條件是否滿足,滿足則執(zhí)行,否則不執(zhí)行??疾彀础把h(huán)掃描”運(yùn)行節(jié)拍進(jìn)行。如果指令為非微分型,當(dāng)每個掃描周期的執(zhí)行條件都為ON時,則重復(fù)執(zhí)行該指令,直到條件變?yōu)镺FF時停止執(zhí)行;如果指令為微分型,則要考察前后兩次掃描周期執(zhí)行條件的變化來決定當(dāng)前是否執(zhí)行指令。如果上次掃描周期的執(zhí)行條件為OFF,當(dāng)前掃描周期的執(zhí)行條件變?yōu)镺N,則PLC感知了條件的上跳變化,則執(zhí)行指令,否則不執(zhí)行。請看圖2所示的例子。
圖2 微分指令執(zhí)行原理示意圖
上圖的梯形圖示出了微分指令@INC(功能為加1運(yùn)算)執(zhí)行原理,該指令的執(zhí)行條件是(00000)繼電器。梯形圖右側(cè)箭頭線代表對程序一遍遍掃描,實線表示執(zhí)行@INC指令,虛線表示不執(zhí)行該指令。箭頭下方數(shù)字表示掃描序號,上方為每次掃描時@INC指令執(zhí)行條件(00000)的狀態(tài)。當(dāng)?shù)谝槐閽呙钑r,25315先對(000)通道清零,之后由于(00000)=OFF,則指令@INC不執(zhí)行,于是(000)=0;第二遍掃描時,(00000)=ON,PLC感知了(00000)邏輯量的上跳變化,因此執(zhí)行@INC,使(000)=1;第三遍掃描時,(00000)仍為ON,相對于上次掃描沒有發(fā)生上跳變化,則不執(zhí)行@INC,(000)值仍為1。后續(xù)掃描如保持(00000)ON不變,則都不執(zhí)行@INC。由此看出當(dāng)執(zhí)行條件變?yōu)镺N時,PLC對微分指令只執(zhí)行一次。所以從指令執(zhí)行次數(shù)方面考察,非微分型指令可簡單理解為執(zhí)行多次的指令,微分指令則為只執(zhí)行一次的指令。
由此引出了第二個問題,即為什么PLC將指令設(shè)計為兩種形式,其實際意義在哪里?前已提到PLC的固有工作方式是“循環(huán)掃描”,它是針對控制目標(biāo)的實現(xiàn)需要PLC重復(fù)執(zhí)行程序這一通常情況而設(shè)計的,但不排除實際應(yīng)用中存在只執(zhí)行一次指令的需要。試想如果拿掉圖2中INC指令前的@使之變?yōu)榉俏⒎种噶?,則一旦執(zhí)行條件(00000)為ON,經(jīng)一段時間運(yùn)行后,(000)值是多少就難以確知了,程序變得無甚意義。所以PLC的兩種指令形式,是針對不同控制需要而設(shè)計的,不可混用。
PLC中的控制問題只要屬于順序控制類型,無論大小,都能通過套用PLC提供的模板輕易得以解決,因此能在很大程度上減輕編程難度。順序控制編程涉及兩大步驟:畫功能表圖和畫梯形圖。功能表圖應(yīng)準(zhǔn)確表達(dá)每步所做的事項及步與步之間的轉(zhuǎn)換條件,畫梯形圖則是在此基礎(chǔ)上套用模板而已。然而必須指出步與步之間的轉(zhuǎn)換條件體現(xiàn)在梯形圖模板時卻發(fā)生了變形,即加入了上一步控制位這一條件,使步轉(zhuǎn)換條件變?yōu)槎呦唷芭c”的邏輯條件。那么我們不禁要問,所加入的條件是必要的嗎?教材或參考書對此缺乏必要闡釋,使不少學(xué)生產(chǎn)生困惑。為澄清這一問題,應(yīng)扣緊順序控制的實質(zhì)要求,即下一步活動必須在前一步活動結(jié)束之后才能展開,這就意味著整個控制過程不充許發(fā)生任何跳轉(zhuǎn)。試想如果在梯形圖的轉(zhuǎn)換條件中取消上一步控制位,僅留下步轉(zhuǎn)換條件,將會發(fā)生什么情況。我們現(xiàn)在結(jié)合圖3所示的實例進(jìn)行討論。
圖3 順序控制示例
在上圖所示的順序控制梯形圖中,每個梯級的步轉(zhuǎn)換邏輯條件為控制位 20000、20001、20002、20003 分別與 00000、00001、00002、00003 繼電器相“與”。假設(shè)將其中的控制位取消,留下 00000、00001、00002、00003位似乎也能實現(xiàn)步轉(zhuǎn)換。如果控制位20001為ON,即當(dāng)前活動步為“工進(jìn)”,當(dāng)該步結(jié)束時必使00001繼電器為ON,進(jìn)而使20002為ON,即活動步轉(zhuǎn)為“快進(jìn)”,并使上一步控制位20001變?yōu)镺FF,似乎也符合順序控制邏輯要求。但這樣一來埋下了一個隱患,即只要發(fā)生某種干擾使轉(zhuǎn)換條件00000、00001、00002、20003繼電器位中的任何一個為ON都可觸發(fā)相應(yīng)控制位為ON,使該步變?yōu)榛顒硬?,而不管其上一步是否結(jié)束了活動狀態(tài),這就導(dǎo)致了事實上的程序跳轉(zhuǎn),違背了順序控制的本意。由此可見在步轉(zhuǎn)換邏輯條件中加(串)入上一步控制位是完全必要的,它對步轉(zhuǎn)換起到了嚴(yán)格限制作用,使其僅在上一步活動結(jié)束后方可進(jìn)行,以防止干擾引起程序跳轉(zhuǎn),確保順序控制按正確邏輯步驟推進(jìn)。
PLC常用指令是關(guān)于“位”的邏輯運(yùn)算指令,其中的加載指令LD N應(yīng)予以特別重視,因為它包含兩種不同操作。然而教學(xué)中發(fā)現(xiàn)學(xué)生對該指令的認(rèn)知只停留在助記符所表達(dá)的操作功能層面上,卻忽視了隱藏在助記符后面的另一操作功能。恰恰這一忽視對后續(xù)“塊”邏輯運(yùn)算指令的教學(xué)影響很大,因此有必要對加載指令LD N功能作深入解讀。
圖4 塊邏輯運(yùn)算示例
LD N指令包含的兩種操作功能分別是,①將N繼電器狀態(tài)送入結(jié)果寄存器R;②結(jié)果寄存器R的原內(nèi)容存入堆棧。對這兩種操作應(yīng)理解為有先有后,第2種操作在先,第1種操作在后,否則R的原內(nèi)容將丟失(被覆蓋)。于是指令執(zhí)行時,先將R的內(nèi)容保存進(jìn)堆棧中,然后再接收N繼電器狀態(tài)。該指令對R內(nèi)容的保存功能對“塊”邏輯運(yùn)算指令功能的發(fā)揮至關(guān)重要,同時也是正確理解與運(yùn)用“塊”邏輯運(yùn)算指令的關(guān)鍵所在?,F(xiàn)在可通過圖4所示的實例進(jìn)行剖析。算,即(00000)·(00001)+(00002),結(jié)果存入 R中。接下來進(jìn)行第二“塊”邏輯運(yùn)算時務(wù)必先應(yīng)用指令LD 00003將R內(nèi)容即第一“塊”的邏輯運(yùn)算結(jié)果轉(zhuǎn)存堆棧S中。再加載(00003)至R,連同其后的AND NOT 00004和OR NOT 00005指令完成第二“塊”的邏輯運(yùn)算。至此,前兩“塊”邏輯運(yùn)算都告完成,結(jié)果分別存放在堆棧S與R中。接下來應(yīng)用AND LD指令進(jìn)行堆棧S與R內(nèi)容相“與”,即前兩
上圖中“塊”邏輯運(yùn)算梯形圖示例中共有3個邏輯塊。梯形圖先對上方2個邏輯塊進(jìn)行“與”運(yùn)算,然后再對下方的塊進(jìn)行“或”的運(yùn)算,所得結(jié)果傳送給01000,其邏輯關(guān)系直觀明了。但如何正確地應(yīng)用指令語句加以實現(xiàn),主要取決于對LD N指令的透徹理解與正確運(yùn)用。
在圖4梯形圖中,先對第一“塊”進(jìn)行邏輯運(yùn)“塊”邏輯值相“與”運(yùn)算,結(jié)果存放R中。其后進(jìn)行第三“塊”的邏輯運(yùn)算時,同樣先應(yīng)用LD NOT 00006指令將R內(nèi)容轉(zhuǎn)移到堆棧S中,再加載(00006),連同其后的AND 00007指令完成第三“塊”邏輯運(yùn)算,其值仍在R中,再應(yīng)用OR LD指令完成堆棧S與R內(nèi)容相“或”,也就是前兩“塊”相“與”的結(jié)果再與第三“塊”邏輯值相“或”的運(yùn)算,最后通過 OUT 01000指令輸出結(jié)果。
由以上分析可以看出,在對含有“塊”邏輯運(yùn)算的梯形圖寫語句表時,應(yīng)先弄清各“塊”之間的邏輯關(guān)系,明確各“塊”邏輯運(yùn)算順序,在此基礎(chǔ)上正確運(yùn)用LD N指令及“塊”邏輯指令(AND LD與OR LD)加以實現(xiàn)。LD N指令將前一“塊”邏輯值轉(zhuǎn)存堆棧S中,并開啟下一“塊”的邏輯運(yùn)算,而“塊”邏輯指令則對之前存放于堆棧中的“塊”邏輯值再取出進(jìn)而完成規(guī)定的“塊”間邏輯運(yùn)算,其執(zhí)行總是在相關(guān)的二“塊”邏輯值算完之后,與LD N指令形成交替疊進(jìn)關(guān)系。
[1] 劉涳,常用低壓電器與可編程序控制器[M],西安:西安電子科技大學(xué)出版社,2005
[2] 鄭寶林,圖解歐姆龍PLC入門[M],北京:機(jī)械工業(yè)出版社,2008
[3] 孫振強(qiáng),可編程序控制器原理及應(yīng)用教程[M],北京:清華大學(xué)出版社,2005
[4] 俞國亮,PLC原理與應(yīng)用[M],北京,清華大學(xué)出版社,2005
[5] 何衍慶等,可編程序控制器原理及應(yīng)用技巧[M],北京:化學(xué)工業(yè)出版社,2006