解析用S7-200編寫的幾個程序的構(gòu)思與技巧
解析用S7-200編寫的幾個程序的構(gòu)思與技巧
本文展示的幾個編程實例,都是從網(wǎng)上看到的求助帖,按其命題要求編程都有一定難度和可探討性。實為是提高我們編程構(gòu)思與鍛煉編程能力的好命題。本人對此作了編程,經(jīng)上機運行,程序運行正確符合命題要求。本文對編寫的程序作以解析,將其編程構(gòu)思與技巧作以介紹,現(xiàn)展示給大家,起個拋磚引玉的作用。清大家進一步深入探討,廣開思路,巧妙的使用編程指令,編出更加精煉短小的程序,共同鍛煉與提高我們的編程水平和能力。
一、 請教:“PLC輸入點任意一點變化均觸發(fā)一次,用什么指令比較精簡”
當(dāng)輸入點 有信號輸入時,是否能做到依次輸出且依次關(guān)閉已動作了輸出點。如:I0.0由0變1,其輸出狀態(tài)為輸出Q0.0=1。接著使I1.2由0變1,其輸出狀態(tài)為輸出Q1.2=1而Q0.0=0,再使I0.4由0變1,其輸出狀態(tài)為Q0.4=1而Q1.2=0 ……
編程構(gòu)思:對此命題要求有二種編程方案:
(1)、如果PLC的16個輸入點的輸入信號皆為單脈沖,或外接不自鎖式的點動按鈕時,在未有輸入信號或未按按鈕時,PLC的16個輸入點皆=0。在這種條件下,最精簡的編程為:用比較與傳遞指令就可完成。見下梯形圖:
編程說明:以PLC的16輸入點皆外接不自鎖式的點動按鈕為例:當(dāng)為未按鈕時,PLC的16個輸入點皆=0,即:IW0=0,故網(wǎng)絡(luò)1不執(zhí)行MOV_W指令動作。當(dāng)PLC輸入點有任意一點按下按鈕,都會使IW0<>0,使網(wǎng)絡(luò)1執(zhí)行MOV_W指令動作:將IW0的狀態(tài)傳送給QW0,
如:按下I0.0的按鈕,使I0.0由0變?yōu)?/span>1,即 IW0≠0,使MOV_W指令使能,將IW0傳送給QW0,使對應(yīng)輸出Q0.0=1。I0.0復(fù)位(即I0.0=0)由于IW0=0,不滿足IW0<>0比較條件,MOV_W不使能,故輸出仍保持Q0.0=1的輸出狀態(tài)。如按下I0.7的按鈕,使I0.7=1,執(zhí)行MOV_W傳送,使對應(yīng)輸出Q0.7=1而Q0.0=0。I0.7復(fù)位(I0.7=0)仍保持Q0.7=1不變。再輸入I1.1=1,對應(yīng)Q1.1=1,而Q0.7=0。。。。
(2)、如果PLC的16輸入點的輸入信號為既有單脈沖又有電平信號,或外接按鈕為自鎖式或不自鎖式按鈕都可用時的編程:
編程思考:這種要求編程顯然比(1)要難的多,我們可以這樣處理,以按鈕輸入為例:將未按按鈕前的PLC的輸出狀態(tài)先存入一字存儲器MW10里,但某一按鈕按下,其輸入點由0變1時,立刻用此時的輸入端的各點狀態(tài)與存儲器MW10對應(yīng)的各點進行比較判斷:如果二者的狀態(tài)相同(或皆為0或皆為1),說明此點不是本次的信號輸入點,可令其對應(yīng)輸出=0。只有二者不同(輸入=1,而輸出=0)時才是本次的信號輸入點,令其輸出=1。按這種思路編程,即可實現(xiàn)本命題的控制要求。請見梯形圖:
圖一、用求反、與、或指令編寫的梯形圖
編程說明:圖一中的MW2為IW0的反碼,MW4為MW10的反碼,當(dāng)IW0<> MW10時,說明此時輸入端按鈕有變化:如果IW0<MW10,說明輸入按鈕有由按下變抬起的,故不執(zhí)行“與”“或”等運算,即輸出狀態(tài)保持不變,僅將IW0傳送給MW10。如果IW0> MW10,說明此時輸入側(cè)有信號輸入(既有按鈕按下),此時的IW0各位的值應(yīng)≥MW10對應(yīng)的各位的值,即:如IW0某一位的值=0時,MW10對應(yīng)的位的值一定=0 而不可能=1,如IW0某一位的值=1時,MW10對應(yīng)的位的值可能=0也可能=1。
用MW2與MW10進行“與”運算,“與”的結(jié)果送入MW6。二者狀態(tài)不等其“與”的結(jié)果=0,二者相等則“與”的結(jié)果=1。由于MW2是IW0的反碼,故MW2的某位=1時(即未按鈕的輸入點),其MW10對應(yīng)位的值一定=0,這樣“與“的結(jié)果,使MW6對應(yīng)位的值=0,而MW2的某位=0時,其“與“的結(jié)果使MW6對應(yīng)位的值=0.
用MW4為IW0進行“與”運算,“與”的結(jié)果送入MW8。如輸入=0,“與”的結(jié)果=0。如輸入=1時,其對應(yīng)的輸出=1(即MW4對應(yīng)點=0)與的結(jié)果=0,如其對應(yīng)的輸出=0(即MW4對應(yīng)點=1)與的結(jié)果=1。
再將MW6與MW8相“或”運算,其結(jié)果送入QW0,即為最后輸出狀態(tài)。
對上面的運算處理仔細分析整理,就會發(fā)現(xiàn)實際上是執(zhí)行這樣的運算:
顯然這是異或的運算形式,而S7-200有現(xiàn)成的異或指令,故上面的程序可以用異或指令來完成,從而可大大的精簡程序。見下梯形圖:
圖二、用異或指令編寫的梯形圖
舉例說明:
原IW0狀態(tài)=0000_0000_0110_0011,現(xiàn)按下一按鈕,使I0.3=1,此時IW0=0000_0000_0110_1011,MW10仍=0000_0000_0110_0011,由于IW0≠MW10且IW0>MW10,故IW0與MW10進行異或運算,由于此時IW0與MW10只有第3位的內(nèi)容不等(I0.3=0,M10.3=1),其他各個對應(yīng)位相同,故異或的結(jié)果使QW0=8,即 Q0.3=1。隨后將現(xiàn)在的IW0=0000_0000_0110_1011的值 送入給MW10。
如該按鈕又抬起,使IW0=0000_0000_0110_0011,此時IW0與MW10的值又不相等(I0.3=0、MW10.3=1),但IW0<MW10,故Q0.3仍=1,QW0輸出不變。但IW0值送入MW10(0000_0000_0110_0011)。
如此時將I0.0的按鈕抬起(I0.0=0),IW0=0000_0000_0110_0010,此時IW0≠MW10,且IW0<MW10,故QW0輸出不變。但IW0值送入MW10(0000_0000_0110_0010)。
當(dāng)輸入按鈕有幾個以處于按下(即接通狀態(tài)),時,如要抬起任一按下的按鈕,其輸出都不會發(fā)生變化,如現(xiàn)輸入狀態(tài)為: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。
可見,圖二的編程由于巧妙地運用異或指令和比較指令,不僅簡化編程(見圖一),而且對輸入口狀態(tài)無條件限制,使之可適用與各類按鈕。從中可以看出,對同一命題,只要開闊思路,深入分析探討,就會靈活巧妙的使用編程指令,使編程更加精煉短小。
二、編程要求:有5個按鈕和5個信號燈,編號1#~5#,每次只按下一個按鈕,按的次序是隨意的且沒有時間限制,每按下一個按鈕輸出就亮一個對應(yīng)的信號燈,持續(xù)10秒后自動熄滅,但是同一時刻只允許亮一個燈,即前燈不滅后燈不亮,并且亮燈的次序嚴格按照按鈕按下的次序,例如按鈕是2#——1#——5#——3#——4#,則亮燈也按照2#——1#——5#——3#——4#,不能亂。
編程構(gòu)思:這個編程命題還是頗有難度的,我共編寫了2個程序,第一個程序為完成此功能編寫了二個功能塊子程序,調(diào)用二個指針指令,且多次調(diào)用子程序,多次 選用各種比較指令。雖然上機運行好使,但程序編的很長,不易被人看懂。第二個程序,由于選用填表指令與先入先出指令及比較指令進行巧妙地配合,使編寫的程序長度大為縮短,經(jīng)上機運行,效果很好,現(xiàn)展示出來與大家共享:
三、求助帖原文:有一自動老化線,線長三百米,線速18米/分,線進口有一個產(chǎn)品進入老化線檢測開關(guān),出口有一個阻擋器和一個產(chǎn)品出檢測開關(guān).老化線體上可容納920臺產(chǎn)品,產(chǎn)品在進入老化線上的時間間隔不等,當(dāng)產(chǎn)品老化時間等于四小時就可出產(chǎn)品,產(chǎn)品是一邊進一邊出,流水作業(yè).但要求每一臺產(chǎn)品在老化線上老化的時間都必須是四個小時或大于四小時.望高手們給指點一下怎么編這個程序?
我的編程思維與編程方案:
1、對題目的分析:老化線的線長三百米,線速
2、編程的設(shè)計構(gòu)思:
如果以第一個產(chǎn)品進入老化線的時刻起使一計時器從0開始計時,第二個產(chǎn)品進入老化線立即讀取計時器的計時值且存入數(shù)據(jù)區(qū)的首址,第三個產(chǎn)品進入老化線立即讀取計時器的計時值且存入數(shù)據(jù)區(qū)的首址下面的第二個地址……,以此規(guī)律不斷的將進入老化線產(chǎn)品的時間存入數(shù)據(jù)區(qū)。
當(dāng)老化時間≥4小時時阻擋器移開,第一個產(chǎn)品走出老化線,同時將數(shù)據(jù)區(qū)首址數(shù)據(jù)取出,再用計時器的計時值減去這取出的數(shù)據(jù),其差值即為第二個產(chǎn)品的老花時間,將其送回計時器,繼續(xù)計時,第一產(chǎn)品走出老化線阻擋器回原位。當(dāng)計時器的計時值又等于4小時時,再移開阻擋器,使第二個產(chǎn)品走出老化線,同時將數(shù)據(jù)區(qū)第二個數(shù)據(jù)取出,再用計時器的計時值減去這取出的數(shù)據(jù),其差值即為第三個產(chǎn)品的老花時間,將其送回計時器,繼續(xù)計時……,不斷的重復(fù)取出的數(shù)據(jù),再用計時器的計時值減去此取出值,將其送回計時器,繼續(xù)計時,就可實現(xiàn)本求助帖的控制要求。
3、編程的設(shè)計方案解析:本文對此題目做了二種設(shè)計方案。
第一種方案:是按上面所述的編程設(shè)計構(gòu)思,用二組指針指令分別對產(chǎn)品進入老化線的時間存入數(shù)據(jù)區(qū),對產(chǎn)品走出老化線時,從數(shù)據(jù)區(qū)中取出對應(yīng)數(shù)據(jù)進行減法運算。這種方案要占據(jù)大量的數(shù)據(jù)區(qū):老化線能容納920個產(chǎn)品,即要占據(jù)920個字存儲器,而且產(chǎn)品是不斷的進入老化線,使存儲數(shù)據(jù)不斷的增加。而PLC的數(shù)據(jù)塊的容量是有限度的,這樣就會出現(xiàn)數(shù)據(jù)塊計滿的情況:使后續(xù)的提取計時器的時間值無法再存入數(shù)據(jù)區(qū)而丟失,使這種判斷控制失敗。如何解決這個問題呢?本設(shè)計是這樣解決的:設(shè)數(shù)據(jù)區(qū)為內(nèi)含1000個字,運行時存儲的數(shù)據(jù)從首址依次存入數(shù)據(jù)區(qū),每存入一組數(shù)據(jù),存數(shù)指針地址加2。讀取數(shù)據(jù)時也是從數(shù)據(jù)首址開始,每讀取一次數(shù)據(jù),讀取指針地址加2。運行中程序時時判斷指針地址是否已到第1000個數(shù)據(jù)的地址,如已到,再存數(shù)或讀數(shù)地址又回到數(shù)據(jù)區(qū)的首地址,這樣可重復(fù)使用這1000個字存儲器,即可巧妙地解決數(shù)據(jù)區(qū)計滿的難題。請見第一方案梯形圖:
第二種編程方案:是巧妙地使用填表指令(ATT)與先入先出指令(FIFO)來實現(xiàn)的。如產(chǎn)品之間以1分以內(nèi)的間隔進入老化線,則進入10個產(chǎn)品所需時間≤10分鐘,以第一次進入的第10個產(chǎn)品進入的時間為計時起點,用填表指令將每進入10個產(chǎn)品的最后時間存入表內(nèi),則進入920個產(chǎn)品,共存入表里的數(shù)據(jù)92個,如果進入920 個產(chǎn)品的時間<4小時,則老化線停車。用計時器的值與4小時時時比較,如相等,說明老化線的頭10個產(chǎn)品老化時間≥4小時(即4~4小時另10 分鐘),打開阻擋器,且啟動老化線運行。出口處的檢測開關(guān),測出10個產(chǎn)品,令阻擋器關(guān)門,同時用先入先出指令(FIFO)將表內(nèi)的第一組數(shù)據(jù)送給MW6,再用計時器值VW10減去MW6,其差即為下一組產(chǎn)品的老化時間值。再將差值送回計時器VW10。當(dāng)入口處的檢測開關(guān),測出10個產(chǎn)品,老化線內(nèi)產(chǎn)品數(shù)又=920,如此時的計時時間<4小時,令老化線停車。計時器的計時值時時與4小時比較,如等于,說明第二組的10個產(chǎn)品老化時間≥4小時,打開阻擋器,且啟動老化線運行……反復(fù)重復(fù)上述動作。當(dāng)老化工作結(jié)束時,最后一組產(chǎn)品的個數(shù)有可能<10,如用上述操作,由于MB8≠10,故最后一次的計時時間不能存入表中,就會使最后一組產(chǎn)品留在老化線內(nèi)而無法傳出。為此增加判斷產(chǎn)品間隔時間計時器MB11,如MB11>4分,則視為工作結(jié)束(既無后續(xù)產(chǎn)品到來),把此時計時時間存入表內(nèi),當(dāng)MB10=1時老化線內(nèi)只有最后一組產(chǎn)品,由于其產(chǎn)品數(shù)<10且具體數(shù)未知,但考慮出口處的產(chǎn)品間距很小,彼此間隔時間<1秒,故用I0.2驅(qū)動斷電延時定時器(TOF),定時為5秒,從第一個產(chǎn)品出口使I0.2=1,同時使T101=1起,連續(xù)出N個產(chǎn)品,由于N個I0.2=1脈沖彼此間隔<5秒,故使T101始終保持=1,第N個脈沖結(jié)束后因再無脈沖到來,延時5秒后T101=0,T101由1變?yōu)?/span>0的后沿使Q0.1=0,即阻擋器關(guān)。請見第二種方案的梯形圖:
4、方案比較:
第一種編程方案優(yōu)點為:對產(chǎn)品之間間隔時間無限制,由于是一個一個的對產(chǎn)品老化時間進行判斷。故可確保每個產(chǎn)品的老化時間值皆= 4小時,即老花時間精確。它的編程的技巧為用二個指針指令。一個為將每個產(chǎn)品進入老化線的時間依次存入數(shù)據(jù)區(qū),另一個為在產(chǎn)品走出老化線,再從數(shù)據(jù)區(qū)將其對應(yīng)的下一個產(chǎn)品的入線時間提出來,用計時器值減去該提出值,其差即為下一產(chǎn)品的老花時間。指針指令所用數(shù)據(jù)區(qū)可存儲數(shù)據(jù)1000個(>920),當(dāng)所存數(shù)據(jù)=1000個時,指針又從新指向數(shù)據(jù)區(qū)的首址,其目的可長時間循環(huán)使用,不會造成因數(shù)據(jù)區(qū)滿而不能存入數(shù)據(jù)。該方案的缺點為:如果產(chǎn)品彼此間間隔時間短時,老化線停車頻繁,幾乎每出一個產(chǎn)品就要停車一次,這頻繁啟動對電機是不利的。
第二種編程方案優(yōu)點為:由于采用10個產(chǎn)品為一組,從而減少老化線的停車次數(shù)。由于10個產(chǎn)品為一組,使對920個產(chǎn)品的提取的數(shù)據(jù)由920個變?yōu)?/span>92個數(shù)據(jù)存入數(shù)據(jù)區(qū),PLC的填表指令最多填寫數(shù)據(jù)為100,故使利用填表指令(ATT)和先入先出指令(FIFO)來編程變?yōu)榭赡?。該方案的編程技巧就是巧妙地利用填表指令?/span>ATT)和先入先出指令(FIFO)的功能特點代替第一方案的用2個指針指令去完成存入數(shù)據(jù)與提取數(shù)據(jù)。該方案缺點:對產(chǎn)品彼此間間隔時間有限制,即它只實用于間隔時間小于1分鐘的條件下使用。
本文到此結(jié)束,如有不妥之處請給于指正。謝謝!
提交
對多輸出點PLC設(shè)計與編程的實例展示與解析
簡短精煉的3例編程展示及編程思路與技巧解析
如何實現(xiàn)用PLC采集高于其高速計數(shù)器最高計數(shù)頻率的脈沖數(shù)據(jù)的探討
超聲波時差法測量流量的公式推導(dǎo)及檢測方法的探討
PLC增擴輸出口的硬件電路圖及與之配合使用的PLC梯形圖的構(gòu)思與解析