西門子S7-200程序控制指令
? ? ? ?程序控制指令用于對程序流轉(zhuǎn)的控制,可以控制程序的結(jié)束、分支、循環(huán)、子程序或中斷程序調(diào)用等。通過程序控制指令的合理應(yīng)用,可以使程序結(jié)構(gòu)靈活、層次分明,增強程序功能。
1)結(jié)束指令END/MEND

END指令用于在執(zhí)行條件成立時結(jié)束主程序,返回程序起點。MEND指令則是編程軟件STEP7-Micro/WIN32自動在主程序結(jié)束時加上的,用于標(biāo)志主程序的結(jié)束。

指令說明
(1)兩條指令均為無操作數(shù)指令。
(2)結(jié)束指令只能用于主程序中,不能在子程序和中斷程序中使用。
2)暫停指令 ?STOP
在執(zhí)行條件成立時,能夠使PLC的運行方式從運行狀態(tài)(RUN)轉(zhuǎn)為停止?fàn)顟B(tài)(STOP),同時立即終止程序的執(zhí)行。

I0.0閉合時,STOP指令運行,PLC工作方式立即從運行轉(zhuǎn)變?yōu)橥V狗绞?。I0.0為斷開,則程序正常運行。

STOP指令在程序中常用于處理突發(fā)緊急事件;STOP指令無操作數(shù)。
3)監(jiān)視定時器復(fù)位指令WDR
為保證CPU系統(tǒng)可靠運行,PLC內(nèi)部設(shè)置了系統(tǒng)監(jiān)視定時器WDT(watch dog timer),用于監(jiān)視掃描周期是否超時。系統(tǒng)正常工作時掃描周期會小于WDT的定時設(shè)置值(默認為300ms),在每個掃描周期內(nèi)掃描到WDT時,系統(tǒng)都會對WDT復(fù)位一次,從而保證WDT不會報警。但當(dāng)系統(tǒng)出現(xiàn)故障時,掃描周期有可能超過WDT的定時設(shè)置值,這時WDT 不能在設(shè)置值范圍內(nèi)被復(fù)位,則報警并停止CPU運行,同時復(fù)位輸入輸出。
? ? ? ? 但有時在程序正常運行情況下,由于程序過長或使用中斷指令、循環(huán)指令會使掃描周期超過WDT定時器的設(shè)置值,為避免使監(jiān)視定時器動作,就需要在程序中使用WDR指令人為復(fù)位WDT定時器。

I0.0閉合時,WDR指令運行,復(fù)位系統(tǒng)監(jiān)視定時器WDT。
4)跳轉(zhuǎn)與標(biāo)號指令 JMP、LBL

(其中N為0~255的常數(shù))
JMP 跳轉(zhuǎn)指令,在預(yù)置觸發(fā)信號接通時,使程序跳轉(zhuǎn)到N 所指定的相應(yīng)標(biāo)號處。
LBL標(biāo)號指令,標(biāo)記跳轉(zhuǎn)的目的地的位置。由N來標(biāo)記與哪個JMP指令對應(yīng)。
圖為JMP、LBL指令應(yīng)用:

在I0.0閉合期間,程序會從Network1跳轉(zhuǎn)到Network8的標(biāo)號1處繼續(xù)運行。在跳轉(zhuǎn)發(fā)生過程中,被跳過的程序段Network2到Network7停止執(zhí)行。
指令說明
(1)JMP和LBL指令必須成對使用于主程序、子程序或中斷程序中。主程序、子程序或中斷程序之間不允許相互跳轉(zhuǎn)。
(2)多條跳轉(zhuǎn)指令可對應(yīng)同一標(biāo)號,但不允許一個跳轉(zhuǎn)指令對應(yīng)多個相同標(biāo)號。
(3)執(zhí)行跳轉(zhuǎn)指令時,跳過的程序段中各元件的狀態(tài)如下① 各輸出線圈保持跳轉(zhuǎn)前的狀態(tài)。
②計數(shù)器停止計數(shù),當(dāng)前值保持跳轉(zhuǎn)之前的計數(shù)值。
③ 1ms、10ms定時器保持跳轉(zhuǎn)之前的工作狀態(tài),原來工作的繼續(xù)工作,到設(shè)置值后可以正常動作,當(dāng)前值要累計到32767才停止。100ms定時器在跳轉(zhuǎn)時停止工作,但不會復(fù)位,當(dāng)前值保持不變,跳轉(zhuǎn)結(jié)束后若條件允許可繼續(xù)計時,但已不能準(zhǔn)確計時了。
(4)標(biāo)號指令LBL一般放置在JMP指令之后,以減少程序執(zhí)行時間。若要放置在JMP指令之前,則必須嚴(yán)格控制跳轉(zhuǎn)指令的運行時間,否則會引起運行瓶頸,導(dǎo)致掃描周期過長。
例:某生產(chǎn)線對產(chǎn)品進行加工處理,同時利用增減計數(shù)器對成品進行累計,每當(dāng)檢測到100個成品時,就要跳過某些控制程序,直接進入到小包裝控制程序。每當(dāng)檢測到900個成品(9個小包裝),直接進入到大包裝程序。相關(guān)控制程序如圖:

5).循環(huán)指令FOR和NEXT

INDX記錄循環(huán)次數(shù),每執(zhí)行1次循環(huán)體,自動加1,并與終值比較,大于時,停止;
INIT:循環(huán)次數(shù)的初值;FINAL:循環(huán)次數(shù)的終值
◆FOR 標(biāo)記循環(huán)程序的開始。
◆NEXT 標(biāo)記循環(huán)程序的結(jié)束無操作數(shù)。
◆FOR與NEXT共同構(gòu)成循環(huán)指令,用于重復(fù)執(zhí)行指定次數(shù)的FOR與NEXT之間的循環(huán)體指令段。
指令說明
(1)FOR、NEXT指令必須成對使用。
(2)初值大于終值時,循環(huán)指令不被執(zhí)行。
(3)每次EN端口執(zhí)行條件重新有效時,自動復(fù)位各參數(shù),同時將INIT指定初值放入當(dāng)前循環(huán)計數(shù)器中,使循環(huán)指令可以重新執(zhí)行。
INDX記錄循環(huán)次數(shù),從1開始計數(shù),每執(zhí)行1次循環(huán)體,自動加1,并與終值比較,大于時,停止;
INIT指定循環(huán)次數(shù)的初值;FINAL指定循環(huán)次數(shù)的終值
指令應(yīng)用舉例
圖為FOR、NEXT指令應(yīng)用。當(dāng)l0.0接通時,將INIT指定初值放入W100中,開始執(zhí)行循環(huán)體,W100中的值從1增加到8,循環(huán)體執(zhí)行8次,WW100中的值變?yōu)?(9>8)時,循環(huán)結(jié)束。
FOR、NEXT指令應(yīng)用

6).子程序
(1)建立子程序
可以選擇編程軟件“編輯”--“插入”--“子程序”。默認的子程序名為SBR_N,編號N的范圍為0~63,從0開始按順序遞增;
也可以通過重命名命令為子程序改名。
(2)子程序調(diào)用與返回指令CALL、CRET指令

CALL 子程序調(diào)用指令,當(dāng)EN端口執(zhí)行條件存在時,將主程序轉(zhuǎn)到子程序入口開始執(zhí)行子程序。SBR_N是子程序名,標(biāo)志子程序人口地址。
CRET 有條件子程序返回指令,在其邏輯條件成立時,結(jié)束子程序執(zhí)行,返回主程序中的子程序調(diào)用處繼續(xù)向下執(zhí)行。
子程序調(diào)用應(yīng)用舉例1
a)I0.0閉合,調(diào)用子程序SBR_0,子程序所有指令執(zhí)行完畢,返回主程序調(diào)用處,繼續(xù)執(zhí)行主程序。每個掃描周期子程序運行一次,直到I0.0斷開。在子程序調(diào)用期間,若I0.1閉合,則線圈Q0.0接通。
b)在M0.0閉合期間,調(diào)用子程序DIANJI,在子程序執(zhí)行期間,若I0.3閉合,則線圈Q0.1接通;I0.4斷開且I0.5閉合,則MOV_B指令執(zhí)行;若I0.4閉合,則執(zhí)行有條件子程序返回指令CRET,程序返回主程序繼續(xù)執(zhí)行,MOV_B指令不運行。

例2:2重循環(huán)程序

7).與ENO指令
某些指令的指令盒右側(cè)設(shè)有"ENO"使能輸出,若EN端有"能流"且指令被正常執(zhí)行,則ENO端會將"能流"輸出,傳送到下一個程序單元。如果指令運行出錯,ENO端狀態(tài)為0。