網(wǎng)上有很多求助PLC編程的帖子,很有探討價(jià)值,我經(jīng)常幫助他們?nèi)ゾ幊,這不僅是幫助他們解決問題,而且對(duì)己也是一種鍛煉與提高,F(xiàn)選出幾個(gè)求助帖,都是具有一定難度的編程命題,它可以使我們?cè)鰪?qiáng)思維,提高編程的技巧和能力,F(xiàn)將這幾個(gè)帖子并同我為之編寫的程序一起貼出,愿與大家共享與探討,如有 不對(duì)之處,請(qǐng)給于指正,本人深表感謝。
一帖:“我想做一個(gè)小程序,每半個(gè)小時(shí)循環(huán)一次,每次循環(huán)內(nèi)部又要執(zhí)行20次幾乎相同的操作(第一個(gè)90秒之內(nèi)Q0.0 輸出5秒,Q0.0輸出延時(shí)2秒Q0.1 輸出0.5秒。第二個(gè)90秒,輸出點(diǎn)變?yōu)?span lang="EN-US">Q0.2和Q0.3,以此類推)。我想用一個(gè)子程序,不想書寫20次子程序調(diào)用,只書寫一次子程序調(diào)用,利用循環(huán) 可以實(shí)現(xiàn)不,任何實(shí)現(xiàn)?請(qǐng)高手給我指點(diǎn)指點(diǎn)。期待您的指點(diǎn)。”
我的思路:按著樓主要求用S7-200編寫了一個(gè)子程序(SBR_1),該子程序運(yùn)行時(shí)間為半小時(shí),在此時(shí)間內(nèi)重復(fù)執(zhí)行20次類似的控制動(dòng)作,不同點(diǎn)就是輸出口依次下移:第一次輸出口為Q0.0、Q0.1,第二次輸出為Q0.2、 Q0.3,第三次輸出為Q0.4、Q0.5……。在主程序中,設(shè)定I0.1為啟動(dòng)命令按鈕,設(shè)I0.2為停止運(yùn)行按鈕。只要按一下I0.1啟動(dòng),程序?qū)⒆?動(dòng)執(zhí)行每半小時(shí)調(diào)一次SBR_1子程序,重復(fù)調(diào)用,直到按下I0.2停止按鈕,程序才終止運(yùn)行。
該子程序共占據(jù)輸出口40個(gè),整整是5個(gè)輸出通道( QB0、QB1、…QB5)如按正常編程,這20個(gè)類似動(dòng)作由于輸出口不同,需一一調(diào)用,這樣編出的程序太長(zhǎng)。經(jīng)過反復(fù)思考,我是這樣編程的:
1、 我利用指針指令,首址指向QB0,每執(zhí)行完一個(gè)通道動(dòng)作后,令指針地址加1,這樣循環(huán)5次,其輸出即可由QB0依次移到QB5。
2、 對(duì) 一個(gè)輸出通道內(nèi)的傳送地址,是采用“與”、“或”指令進(jìn)行的,比如第一次輸出,先將QB0清0,將MB2=1,MB3=2。當(dāng)運(yùn)行80秒時(shí)將QB0與 MB2相或運(yùn)算,其結(jié)果:Q0.0=1,延時(shí)82秒將QB0與MB3相或運(yùn)算,其結(jié)果:Q0.0=1,Q0.1=1。當(dāng)運(yùn)行85秒時(shí)將MB2求反送入 MB4,此時(shí)MB4=16#FE,再用QB0與MB4相與運(yùn)算,其結(jié)果:Q0.0=0,Q0.1=1,當(dāng)運(yùn)行87秒時(shí)將MB3求反送入MB5,此時(shí) MB5=16#FB,再用QB0與MB5相與運(yùn)算,其結(jié)果:Q0.0=0,Q0.1=0,從而達(dá)到在第一個(gè)90秒內(nèi)使Q0.0輸出為1且保持5秒后復(fù)位, 使Q0.1滯后Q0.1兩秒輸出為1且保持5秒復(fù)位的控制要求。第二次動(dòng)作時(shí),先將MW2左移2位,即使MB2=04,MB3=8再重復(fù)上述動(dòng)作,其結(jié) 果:Q0.2=1,延時(shí)5秒復(fù)位,Q0.3滯后二秒輸出為1,保持5秒復(fù)位,從而達(dá)到第二次動(dòng)作時(shí)其輸出下移到Q0.2、Q0.3。具體動(dòng)作控制,請(qǐng)見下 面梯形圖:
主程序:
子程序:SBR_1
該程序經(jīng)上機(jī)運(yùn)行(為縮短運(yùn)行時(shí)間按圖中注解的試驗(yàn)時(shí)改動(dòng)數(shù)據(jù)運(yùn)行),動(dòng)作正確,符合命題要求。
二 帖:“有5個(gè)執(zhí)行動(dòng)作我轉(zhuǎn)換為操作數(shù),姑且定為D10、D20、D30、D40、D50,它們每一個(gè)都可能寫入從0 到5的數(shù)值。最后執(zhí)行是從1到5 依次執(zhí)行輸出,是0的不執(zhí)行跳過,不知如何編,請(qǐng)高手指點(diǎn),謝謝了!”又“……如這一次是按1/2/3/4/5依次動(dòng)作,下一次也許設(shè)置為按5/3/2 /動(dòng)作,再下一次就1/5/2/3/。。。。。”、“兩次執(zhí)行的間隔時(shí)間可設(shè)定,暫定3秒看設(shè)備運(yùn)轉(zhuǎn)情況而定”
我的編程構(gòu)思:
一、PLC的硬件設(shè)置及有關(guān)事項(xiàng)說明:選用S7-200PLC編程。
1、其輸入口:
I1.0 為啟動(dòng)按鈕,
I1.1 為停止動(dòng)作按鈕。
*** 以下的I0.0 ~ I0.5 六個(gè)輸入點(diǎn)是為手動(dòng)設(shè)置參數(shù)的按鈕地址。是為在沒有上位機(jī)或觸摸屏與PLC通訊的條件下,可用這6個(gè)按鈕,對(duì)5路執(zhí)行機(jī)構(gòu)的動(dòng)作順序號(hào)及動(dòng)作間隔時(shí)間進(jìn)行手動(dòng)設(shè)置。其各輸入點(diǎn)定義如下:
I0.0 為設(shè)置第1路執(zhí)行機(jī)構(gòu)執(zhí)行動(dòng)作的順序號(hào)按鈕
I0.1 為設(shè)置第2 ~ 5路執(zhí)行機(jī)構(gòu)執(zhí)行動(dòng)作的順序號(hào)按鈕,設(shè)置值:0~5
I0.2 為設(shè)置第2 ~ 5路執(zhí)行機(jī)構(gòu)執(zhí)行動(dòng)作的順序號(hào)左移8位按鈕
I0.3 為復(fù)位按鈕,即將第1~ 第5 路機(jī)構(gòu)的順序號(hào)清0,其作用是為更改5個(gè)機(jī)構(gòu)動(dòng)作的順序號(hào)值做清0準(zhǔn)備。
I0.4 為相鄰二個(gè)機(jī)構(gòu)動(dòng)作時(shí)間間隔值的個(gè)位數(shù)設(shè)置按鈕,設(shè)置值:0~F(16進(jìn)制數(shù))
I0.5 將時(shí)間設(shè)定值左移4位按鈕
2、其輸出口:
Q0.0 為第1路執(zhí)行機(jī)構(gòu)輸出
Q0.1 為第2路執(zhí)行機(jī)構(gòu)輸出
Q0.2 為第3路執(zhí)行機(jī)構(gòu)輸出
Q0.3 為第4路執(zhí)行機(jī)構(gòu)輸出
Q0.4 為第5路執(zhí)行機(jī)構(gòu)輸出
3、VB10、VB11、VB12、VB13、VB14分別為第1~第5執(zhí)行機(jī)構(gòu)動(dòng)作順序號(hào)設(shè)置區(qū)
為節(jié)省設(shè)置按鈕,將VB11、VB12、VB13、VB14合并為一個(gè)雙字存儲(chǔ)器VD11。
4、 VW30 為相鄰二個(gè)機(jī)構(gòu)動(dòng)作時(shí)間間隔設(shè)置區(qū)?捎冒粹o對(duì)其設(shè)置時(shí)間。VW30也是第一個(gè)執(zhí)行機(jī)構(gòu)的動(dòng)作時(shí)間,2倍的VW30(即VW32)是第二個(gè)執(zhí)行機(jī)構(gòu)的動(dòng)作 時(shí)間,3倍的VW30(即VW34)是第三個(gè)執(zhí)行機(jī)構(gòu)的動(dòng)作時(shí)間,4倍的VW30(即VW36)是第四個(gè)執(zhí)行機(jī)構(gòu)的動(dòng)作時(shí)間,5倍的VW30(即 VW38)是第五個(gè)執(zhí)行機(jī)構(gòu)的動(dòng)作時(shí)間。
5、從按下啟動(dòng)命令開始,先將計(jì)時(shí)器(MW2)清0,再用秒脈沖對(duì)MW2進(jìn)行加1計(jì)數(shù),當(dāng) MW2=VW30時(shí), 第一個(gè)執(zhí)行機(jī)構(gòu)動(dòng)作,當(dāng)MW2=VW32時(shí), 第二個(gè)執(zhí)行機(jī)構(gòu)動(dòng)作……直到MW2=VW38時(shí), 第五個(gè)執(zhí)行機(jī)構(gòu)動(dòng)作為止。那路執(zhí)行機(jī)構(gòu)是第一個(gè)、第二個(gè)動(dòng)作…取決它設(shè)定的順序號(hào)。
6、設(shè)MB0為第幾個(gè)機(jī)構(gòu)動(dòng)作標(biāo)記區(qū),按啟動(dòng)按鈕時(shí),將 其清0,每當(dāng)計(jì)時(shí)VW30,MB0加1,故MB0等于幾就應(yīng)為第幾個(gè)執(zhí)行機(jī)構(gòu)執(zhí)行動(dòng)作,(如:第一次機(jī)構(gòu)動(dòng)作時(shí),MB0=1……第五次機(jī)構(gòu)動(dòng)作 時(shí),MB0=5)。在執(zhí)行動(dòng)作前,先用MB0與VB10~VB14比較,那路執(zhí)行機(jī)構(gòu)的順序號(hào)=MB0,那路執(zhí)行機(jī)構(gòu)就動(dòng)作,這樣就可確保動(dòng)作執(zhí)行的的正 確性。
詳細(xì)動(dòng)作控制請(qǐng)見以下梯形圖:
二、S7-200編程的梯形圖:
該程序是經(jīng)過上機(jī)運(yùn)行及調(diào)試,證明程序是正確的、好用的。
VB10、VD11及VW30可由上位機(jī)或觸摸屏設(shè)置,如沒有上位機(jī)或觸摸屏,可用幾個(gè)按鈕與PLC輸入口I0.0~I0.5相連,用按鈕可對(duì)其參數(shù)進(jìn)行設(shè)置,以下就是用按鈕直接在PLC上設(shè)定參數(shù)的程序。這種用PLC輸入口設(shè)置內(nèi)部參數(shù)的方法對(duì)初學(xué)者也是有幫助的。
三帖、這也是網(wǎng)友的求助帖,經(jīng)整理為:
輸入點(diǎn)4個(gè):I0.0、I0.1、I0.2、I0.3; 輸出點(diǎn)2個(gè):Q0.0、Q0.1。
要求:
1、4個(gè)輸入點(diǎn)分別有脈沖信號(hào)輸入,其四路連續(xù)累計(jì)9個(gè)輸入脈沖信號(hào)的時(shí)間間隔 < 1 分鐘時(shí)。其輸出Q0.0=1,否則Q0.0=0。
2、4個(gè)輸入點(diǎn)分別有脈沖信號(hào)輸入,其四路連續(xù)累計(jì)15個(gè)輸入脈沖信號(hào)的時(shí)間間隔 < 1 分鐘時(shí)。其輸出Q0.1=1,否則Q0.1=0。
編程構(gòu)思:本程序采用二個(gè)指針指令,一個(gè)首址為VB100,指針為VD80;另一個(gè)首址
為VB200。指針為VD84。初始化將VB0、VB1、VW2清0.。用I0.0~I0.3四個(gè)輸入信號(hào)的
后沿并聯(lián)觸發(fā)M0.0,這樣那路最先出現(xiàn)又最先結(jié)束,將M0.0置1,M0.0=1開始秒脈沖對(duì)
VW2加1計(jì)時(shí),計(jì)時(shí)中那路出現(xiàn)輸入信號(hào),其前沿VW2計(jì)時(shí)值送入VD80與VD84指針?biāo)?/span>
指的地址中。且判斷輸入脈沖數(shù)(VB0)<=9,如<=9,VB0加1,指針VD80加2。同時(shí)判斷
VB1,如VB1<=15,則VB1加1,指針VD84加2。且使M0.1=1。
在M0.1=1掃描周期內(nèi),先判斷VB0=9?如=9,再判斷VB3<=60,如<=60 則使Q0.0=1,
否則使Q0.0=0。同時(shí)又判斷VB1=15?如=15,再判斷VB3<=60,如<=60 則使Q0.1=1,
否則使Q0.0=0。
在M0.1=1掃描周期內(nèi),如果VB0=10時(shí),用VW2-VW100=MW4,判斷MW4<60 則
使Q0.0=1,否則使Q0.0=0,再將VW102為首址的連續(xù)9個(gè)字的內(nèi)容前移到以VW100為首
址的連續(xù)9個(gè)字里。同樣如果VB1=16時(shí),用VW2-VW200=MW6,判斷MW6<60 則使
Q0.1=1,否則使Q0.1=0,再將VW202為首址的連續(xù)9個(gè)字的內(nèi)容前移到以VW200為首址的
連續(xù)9個(gè)字里。詳見梯形圖:
四帖:網(wǎng)友求助:“S7-300編程實(shí)現(xiàn)一個(gè)輸入四個(gè)輸出順序輸出:就要希望實(shí)現(xiàn)第一次按i4.1,輸出m1,第二次輸出m2,第三次輸出m3,第四次輸出m4.如此循環(huán)。一次輸出一個(gè)”
回復(fù):我用s7-200編了你所要的梯形圖,上機(jī)運(yùn)行正確無(wú)誤,并將此程序翻譯為S7-300,供你參考.。
s7-200梯形圖:
用S7-300的梯形圖:
對(duì)程序的解析:這二個(gè)程序的編程特點(diǎn)就是巧妙地運(yùn)用循環(huán)左移、與、或等編程指令編寫的。使程序短小精悍。以S7-200程序?yàn)槔寒?dāng)?shù)谝淮伟粹o時(shí)由于M1.0=0,故不執(zhí)行第二網(wǎng)絡(luò)指令,只能執(zhí)行第三網(wǎng)絡(luò)指令,即先將MB0置數(shù)為0001_0001,再將M1.0置1,M1.0=1進(jìn)行與、或運(yùn)算,將MB0的低4位數(shù)0001送入QB0的低4位,使Q0.0=1,而QB0的高4位不受影響(即仍保持原狀態(tài))。當(dāng)?shù)诙伟粹o,由于M1.0=1,程序執(zhí)行第二網(wǎng)絡(luò)指令而不再執(zhí)行第三網(wǎng)絡(luò)指令,即使MB0循環(huán)左移一位,即0010——0010,再進(jìn)行與、或運(yùn)算,將MB0的低4位數(shù)0010送入QB0的低4位,使Q0.1=1,而QB0的高4位仍不受影響……,故可達(dá)到每按一次按鈕,輸出口Q0.0~Q0.3 只有一位輸出,而且是依次循環(huán)輸出的控制目的。
S7-300沒有字節(jié)循環(huán)指令及字節(jié)與或指令,采用雙字循環(huán)移位、字與、字或等指令完成的,故編程顯得不易被看懂,但二者思路是一樣的,大家按我上述說明去分析一定會(huì)看懂的。