工控網首頁
>

應用設計

>

解析用S7-200編寫的幾個程序的構思與技巧

解析用S7-200編寫的幾個程序的構思與技巧

2012/7/24 17:49:39

           解析用S7-200編寫的幾個程序的構思與技巧  

    本文展示的幾個編程實例,都是從網上看到的求助帖,按其命題要求編程都有一定難度和可探討性。實為是提高我們編程構思與鍛煉編程能力的好命題。本人對此作了編程,經上機運行,程序運行正確符合命題要求。本文對編寫的程序作以解析,將其編程構思與技巧作以介紹,現展示給大家,起個拋磚引玉的作用。清大家進一步深入探討,廣開思路,巧妙的使用編程指令,編出更加精煉短小的程序,共同鍛煉與提高我們的編程水平和能力。

一、          請教:“PLC輸入點任意一點變化均觸發一次,用什么指令比較精簡  

當輸入點 有信號輸入時,是否能做到依次輸出且依次關閉已動作了輸出點。如:I0.001,其輸出狀態為輸出Q0.0=1。接著使I1.201,其輸出狀態為輸出Q1.2=1Q0.0=0,再使I0.401,其輸出狀態為Q0.4=1Q1.2=0 ……

       編程構思:對此命題要求有二種編程方案:

1)、如果PLC16個輸入點的輸入信號皆為單脈沖,或外接不自鎖式的點動按鈕時,在未有輸入信號或未按按鈕時,PLC16個輸入點皆=0。在這種條件下,最精簡的編程為:用比較與傳遞指令就可完成。見下梯形圖:

    

編程說明:以PLC16輸入點皆外接不自鎖式的點動按鈕為例:當為未按鈕時,PLC16個輸入點皆=0,即:IW0=0,故網絡1不執行MOV_W指令動作。當PLC輸入點有任意一點按下按鈕,都會使IW0<>0,使網絡1執行MOV_W指令動作:將IW0的狀態傳送給QW0

     如:按下I0.0的按鈕,使I0.00變為1,即 IW00,使MOV_W指令使能,將IW0傳送給QW0,使對應輸出Q0.0=1I0.0復位(即I0.0=0)由于IW0=0,不滿足IW0<>0比較條件,MOV_W不使能,故輸出仍保持Q0.0=1的輸出狀態。如按下I0.7的按鈕,使I0.7=1,執行MOV_W傳送,使對應輸出Q0.7=1Q0.0=0I0.7復位(I0.7=0)仍保持Q0.7=1不變。再輸入I1.1=1,對應Q1.1=1,而Q0.7=0。。。。

2)、如果PLC16輸入點的輸入信號為既有單脈沖又有電平信號,或外接按鈕為自鎖式或不自鎖式按鈕都可用時的編程:

 編程思考:這種要求編程顯然比(1)要難的多,我們可以這樣處理,以按鈕輸入為例:將未按按鈕前的PLC的輸出狀態先存入一字存儲器MW10里,但某一按鈕按下,其輸入點由01時,立刻用此時的輸入端的各點狀態與存儲器MW10對應的各點進行比較判斷:如果二者的狀態相同(或皆為0或皆為1),說明此點不是本次的信號輸入點,可令其對應輸出=0。只有二者不同(輸入=1,而輸出=0)時才是本次的信號輸入點,令其輸出=1。按這種思路編程,即可實現本命題的控制要求。請見梯形圖:

       圖一、用求反、與、或指令編寫的梯形圖

 

編程說明:圖一中的MW2IW0的反碼,MW4MW10的反碼,當IW0<> MW10時,說明此時輸入端按鈕有變化:如果IW0<MW10,說明輸入按鈕有由按下變抬起的,故不執行“與”“或”等運算,即輸出狀態保持不變,僅將IW0傳送給MW10。如果IW0> MW10,說明此時輸入側有信號輸入(既有按鈕按下),此時的IW0各位的值應≥MW10對應的各位的值,即:如IW0某一位的值=0時,MW10對應的位的值一定=0 而不可能=1,如IW0某一位的值=1時,MW10對應的位的值可能=0也可能=1

MW2MW10進行“與”運算,“與”的結果送入MW6。二者狀態不等其“與”的結果=0,二者相等則“與”的結果=1。由于MW2IW0的反碼,故MW2的某位=1時(即未按鈕的輸入點),其MW10對應位的值一定=0,這樣“與“的結果,使MW6對應位的值=0,而MW2的某位=0時,其“與“的結果使MW6對應位的值=0.

MW4IW0進行“與”運算,“與”的結果送入MW8。如輸入=0,“與”的結果=0。如輸入=1時,其對應的輸出=1(即MW4對應點=0)與的結果=0,如其對應的輸出=0(即MW4對應點=1)與的結果=1

再將MW6MW8相“或”運算,其結果送入QW0,即為最后輸出狀態。

對上面的運算處理仔細分析整理,就會發現實際上是執行這樣的運算:

           

     顯然這是異或的運算形式,而S7-200有現成的異或指令,故上面的程序可以用異或指令來完成,從而可大大的精簡程序。見下梯形圖:

   

     圖二、用異或指令編寫的梯形圖   

 

舉例說明:

IW0狀態=0000_0000_0110_0011,現按下一按鈕,使I0.3=1,此時IW0=0000_0000_0110_1011MW10=0000_0000_0110_0011,由于IW0MW10IW0>MW10,故IW0MW10進行異或運算,由于此時IW0MW10只有第3位的內容不等(I0.3=0M10.3=1),其他各個對應位相同,故異或的結果使QW0=8,即 Q0.3=1。隨后將現在的IW0=0000_0000_0110_1011的值 送入給MW10

如該按鈕又抬起,使IW0=0000_0000_0110_0011,此時IW0MW10的值又不相等(I0.3=0MW10.3=1),但IW0<MW10,故Q0.3=1QW0輸出不變。但IW0值送入MW10(0000_0000_0110_0011)

如此時將I0.0的按鈕抬起(I0.0=0),IW0=0000_0000_0110_0010,此時IW0MW10,且IW0<MW10,故QW0輸出不變。但IW0值送入MW10(0000_0000_0110_0010)

當輸入按鈕有幾個以處于按下(即接通狀態),時,如要抬起任一按下的按鈕,其輸出都不會發生變化,如現輸入狀態為:IW0=0000_0000_0110_1011 MW10= 0000_0000_0110_1011。如抬起I1.5,使IW0=0000_0000_010 0_1011,此時IW0 < MW10,故不會進行異或運算,即輸出保持不變,只是IW0 送入 MW10,使MW10=0000_0000_010 0_1011

可見,圖二的編程由于巧妙地運用異或指令和比較指令,不僅簡化編程(見圖一),而且對輸入口狀態無條件限制,使之可適用與各類按鈕。從中可以看出,對同一命題,只要開闊思路,深入分析探討,就會靈活巧妙的使用編程指令,使編程更加精煉短小。

     二、編程要求:5個按鈕和5個信號燈,編號1#5#,每次只按下一個按鈕,按的次序是隨意的且沒有時間限制,每按下一個按鈕輸出就亮一個對應的信號燈,持續10秒后自動熄滅,但是同一時刻只允許亮一個燈,即前燈不滅后燈不亮,并且亮燈的次序嚴格按照按鈕按下的次序,例如按鈕是2#——1#——5#——3#——4#,則亮燈也按照2#——1#——5#——3#——4#,不能亂。
      
 編程構思:這個編程命題還是頗有難度的,我共編寫了2個程序,第一個程序為完成此功能編寫了二個功能塊子程序,調用二個指針指令,且多次調用子程序,多次 選用各種比較指令。雖然上機運行好使,但程序編的很長,不易被人看懂。第二個程序,由于選用填表指令與先入先出指令及比較指令進行巧妙地配合,使編寫的程序長度大為縮短,經上機運行,效果很好,現展示出來與大家共享:

三、求助帖原文:有一自動老化線,線長三百米,線速18/,線進口有一個產品進入老化線檢測開關,出口有一個阻擋器和一個產品出檢測開關.老化線體上可容納920臺產品,產品在進入老化線上的時間間隔不等,當產品老化時間等于四小時就可出產品,產品是一邊進一邊出,流水作業.但要求每一臺產品在老化線上老化的時間都必須是四個小時或大于四小時.望高手們給指點一下怎么編這個程序?

我的編程思維與編程方案:

1、對題目的分析:老化線的線長三百米,線速18/=0.3/秒,產品從進口到出口運行時間=300÷0.3=1000=16.7<<4小時,故需在出口處安放一阻擋器。老化線體上可容納920臺產品,則知產品寬度為300÷920=0.326。如產品彼此以X秒的間隔進入老化線,進入920個產品的時間=4小時,則X=4×3600÷920=15.56秒。顯然如果產品傳送時彼此相互間隔時間<15秒,產品進入老化線運行中的個數=920個時所用時間<4小時,為保證老化時間,顯然需要停車等待。

2、編程的設計構思:

如果以第一個產品進入老化線的時刻起使一計時器從0開始計時,第二個產品進入老化線立即讀取計時器的計時值且存入數據區的首址,第三個產品進入老化線立即讀取計時器的計時值且存入數據區的首址下面的第二個地址……,以此規律不斷的將進入老化線產品的時間存入數據區。

當老化時間≥4小時時阻擋器移開,第一個產品走出老化線,同時將數據區首址數據取出,再用計時器的計時值減去這取出的數據,其差值即為第二個產品的老花時間,將其送回計時器,繼續計時,第一產品走出老化線阻擋器回原位。當計時器的計時值又等于4小時時,再移開阻擋器,使第二個產品走出老化線,同時將數據區第二個數據取出,再用計時器的計時值減去這取出的數據,其差值即為第三個產品的老花時間,將其送回計時器,繼續計時……,不斷的重復取出的數據,再用計時器的計時值減去此取出值,將其送回計時器,繼續計時,就可實現本求助帖的控制要求。

3、編程的設計方案解析:本文對此題目做了二種設計方案。

第一種方案:是按上面所述的編程設計構思,用二組指針指令分別對產品進入老化線的時間存入數據區,對產品走出老化線時,從數據區中取出對應數據進行減法運算。這種方案要占據大量的數據區:老化線能容納920個產品,即要占據920個字存儲器,而且產品是不斷的進入老化線,使存儲數據不斷的增加。而PLC的數據塊的容量是有限度的,這樣就會出現數據塊計滿的情況:使后續的提取計時器的時間值無法再存入數據區而丟失,使這種判斷控制失敗。如何解決這個問題呢?本設計是這樣解決的:設數據區為內含1000個字,運行時存儲的數據從首址依次存入數據區,每存入一組數據,存數指針地址加2。讀取數據時也是從數據首址開始,每讀取一次數據,讀取指針地址加2。運行中程序時時判斷指針地址是否已到第1000個數據的地址,如已到,再存數或讀數地址又回到數據區的首地址,這樣可重復使用這1000個字存儲器,即可巧妙地解決數據區計滿的難題。請見第一方案梯形圖:

第二種編程方案:是巧妙地使用填表指令(ATT)與先入先出指令(FIFO)來實現的。如產品之間以1分以內的間隔進入老化線,則進入10個產品所需時間≤10分鐘,以第一次進入的第10個產品進入的時間為計時起點,用填表指令將每進入10個產品的最后時間存入表內,則進入920個產品,共存入表里的數據92個,如果進入920 個產品的時間<4小時,則老化線停車。用計時器的值與4小時時時比較,如相等,說明老化線的頭10個產品老化時間≥4小時(即4~4小時另10 分鐘),打開阻擋器,且啟動老化線運行。出口處的檢測開關,測出10個產品,令阻擋器關門,同時用先入先出指令(FIFO)將表內的第一組數據送給MW6,再用計時器值VW10減去MW6,其差即為下一組產品的老化時間值。再將差值送回計時器VW10。當入口處的檢測開關,測出10個產品,老化線內產品數又=920,如此時的計時時間<4小時,令老化線停車。計時器的計時值時時與4小時比較,如等于,說明第二組的10個產品老化時間≥4小時,打開阻擋器,且啟動老化線運行……反復重復上述動作。當老化工作結束時,最后一組產品的個數有可能<10,如用上述操作,由于MB810,故最后一次的計時時間不能存入表中,就會使最后一組產品留在老化線內而無法傳出。為此增加判斷產品間隔時間計時器MB11,如MB11>4分,則視為工作結束(既無后續產品到來),把此時計時時間存入表內,當MB10=1時老化線內只有最后一組產品,由于其產品數<10且具體數未知,但考慮出口處的產品間距很小,彼此間隔時間<1秒,故用I0.2驅動斷電延時定時器(TOF),定時為5秒,從第一個產品出口使I0.2=1,同時使T101=1起,連續出N個產品,由于NI0.2=1脈沖彼此間隔<5秒,故使T101始終保持=1,第N個脈沖結束后因再無脈沖到來,延時5秒后T101=0T1011變為0的后沿使Q0.1=0,即阻擋器關。請見第二種方案的梯形圖:

    

4、方案比較:

第一種編程方案優點為:對產品之間間隔時間無限制,由于是一個一個的對產品老化時間進行判斷。故可確保每個產品的老化時間值皆= 4小時,即老花時間精確。它的編程的技巧為用二個指針指令。一個為將每個產品進入老化線的時間依次存入數據區,另一個為在產品走出老化線,再從數據區將其對應的下一個產品的入線時間提出來,用計時器值減去該提出值,其差即為下一產品的老花時間。指針指令所用數據區可存儲數據1000個(>920),當所存數據=1000個時,指針又從新指向數據區的首址,其目的可長時間循環使用,不會造成因數據區滿而不能存入數據。該方案的缺點為:如果產品彼此間間隔時間短時,老化線停車頻繁,幾乎每出一個產品就要停車一次,這頻繁啟動對電機是不利的。

第二種編程方案優點為:由于采用10個產品為一組,從而減少老化線的停車次數。由于10個產品為一組,使對920個產品的提取的數據由920個變為92個數據存入數據區,PLC的填表指令最多填寫數據為100,故使利用填表指令(ATT)和先入先出指令(FIFO)來編程變為可能。該方案的編程技巧就是巧妙地利用填表指令(ATT)和先入先出指令(FIFO)的功能特點代替第一方案的用2個指針指令去完成存入數據與提取數據。該方案缺點:對產品彼此間間隔時間有限制,即它只實用于間隔時間小于1分鐘的條件下使用。

    本文到此結束,如有不妥之處請給于指正。謝謝!

投訴建議

提交

查看更多評論
其他資訊

查看更多

對多輸出點PLC設計與編程的實例展示與解析

簡短精煉的3例編程展示及編程思路與技巧解析

如何實現用PLC采集高于其高速計數器最高計數頻率的脈沖數據的探討

超聲波時差法測量流量的公式推導及檢測方法的探討

PLC增擴輸出口的硬件電路圖及與之配合使用的PLC梯形圖的構思與解析