北京西門子S7-200SMART代理經(jīng)銷商
西門子S7-200 PLC循環(huán)指令及應(yīng)用實(shí)例

在需要對(duì)某個(gè)程序段重復(fù)執(zhí)行一定次數(shù)時(shí),可采用循環(huán)程序結(jié)構(gòu)。循環(huán)指令由循環(huán)開(kāi)始指令FOR和循環(huán)結(jié)束指令NEXT組成,即對(duì)FOR與NEXT之間的指令重復(fù)執(zhí)行一定次數(shù),指令格式如圖4-62所示。

圖4-62 循環(huán)指令
循環(huán)開(kāi)始指令FOR的功能是標(biāo)記循環(huán)體的開(kāi)始,它有3個(gè)輸入端:
①INDX:存放當(dāng)前循環(huán)計(jì)數(shù)值的單元地址,數(shù)據(jù)類型為:WORD。
②INIT:循環(huán)初值。
③FINAL:循環(huán)終值。
循環(huán)結(jié)束指令NEXT的功能是標(biāo)記循環(huán)體的結(jié)束。
FOR和NEXT必須成對(duì)使用,在FOR和NEXT之間構(gòu)成循環(huán)體。當(dāng)允許輸入EN有效時(shí),執(zhí)行循環(huán)體,首先將循環(huán)初值(INIT)裝入IN-DX,然后每執(zhí)行1次循環(huán)體,INDX自動(dòng)加1,并且與終值相比較,如果INDX大于FINAL,則循環(huán)結(jié)束。
在S7-200中,循環(huán)指令允許嵌套使用,大嵌套深度為8重。
【例】 用循環(huán)指令完成S=1+2+3+…+100,并將求和結(jié)果放在VW100中。
分析:這是一個(gè)典型的累加求和問(wèn)題:S=S+i(S放在VW100,i放在VW10),首先要初始化(對(duì)兩單元清零),然后做循環(huán)結(jié)構(gòu)(FOR、NEXT結(jié)構(gòu))和循環(huán)體(FOR和NEXT之間程序),累加求和的循環(huán)體要做兩件事:i++和S=S+i。具體的程序如圖4-63所示。
S7-200 PLC把程序主要分為三大類:主程序、子程序和中斷程序。在實(shí)際應(yīng)用中有些程序內(nèi)容可能被反復(fù)使用,對(duì)那些需要經(jīng)常執(zhí)行的程序段,可設(shè)計(jì)成子程序的形式,并為每個(gè)子程序賦以不同的編號(hào),在程序執(zhí)行的過(guò)程中,可隨時(shí)調(diào)用某個(gè)編號(hào)的子程序。
子程序的優(yōu)點(diǎn)在于它可以用于對(duì)一個(gè)大的程序進(jìn)行分段及分塊,使其成為較小的更易管理的程序塊。程序調(diào)試、程序檢查和程序維護(hù)時(shí),可充分利用這項(xiàng)優(yōu)勢(shì)。子程序只在需要時(shí)才被調(diào)用、執(zhí)行。這樣就可以更有效地使用PLC,充分利用CPU的時(shí)間。
1)子程序的建立??梢圆捎孟铝蟹椒▌?chuàng)建子程序:
·在編輯環(huán)境的程序塊中點(diǎn)擊鼠標(biāo)右鍵,選擇“插入子程序SBR_n”(n的范圍為:0~63)。
·從編輯菜單中,選擇插入子程序SBR_n。
只要插入了子程序,程序編輯器底部就將出現(xiàn)一個(gè)新標(biāo)簽,標(biāo)志新的子程序名。此時(shí),可以對(duì)新的子程序編程。
2)為子程序定義參數(shù)

根據(jù)子程序有無(wú)參數(shù),可以將子程序分為有參子程序和無(wú)參子程序,如果該子程序帶有參數(shù),就要使用該子程序的局部變量表來(lái)定義參數(shù)。S7-200為每個(gè)程序都安排了局部變量表,必須利用選定該子程序后出現(xiàn)的局部變量表為該子程序的局部變量,S7-200對(duì)其局部變量參數(shù)有以下規(guī)定:
·子程序在帶參數(shù)調(diào)用時(shí),多可以帶16個(gè)參數(shù)。每個(gè)參數(shù)包含變量名、變量類型和數(shù)據(jù)類型。這些參數(shù)在子程序的局部變量表中進(jìn)行定義。
·變量名由不超過(guò)8個(gè)字符的字母和數(shù)字組成,但*個(gè)字符必須是字母。
·變量類型:在子程序帶參數(shù)調(diào)用時(shí)可以使用4種變量類型,根據(jù)數(shù)據(jù)傳遞的方向,依次安排這些變量類型在局部變量表中的位置,包含:
①IN類型(傳入子程序型)。
②IN/OUT類型(傳入/傳出子程序型,調(diào)用子程序時(shí),將地址的參數(shù)傳入子程序,子程序執(zhí)行結(jié)束時(shí),將得到的結(jié)果值返回達(dá)到同一個(gè)地址)。
③OUT類型(傳出子程序型)。
④TEMP類型(暫時(shí)型,用于在子程序內(nèi)部暫時(shí)存儲(chǔ)數(shù)據(jù),不能用來(lái)與主程序傳遞參數(shù)數(shù)據(jù))。
·變量的數(shù)據(jù)類型,可以是:
①布爾能流型( BOOL):該數(shù)據(jù)類型僅對(duì)位輸入操作有效,它是位邏輯運(yùn)算的結(jié)果。對(duì)能流輸入類型的數(shù)據(jù),要安排在局部變量表的前面。
②布爾型( BOOL):該數(shù)據(jù)類型用于單獨(dú)的位輸入和位輸出。
③字節(jié)型( BYTE)、字型(WORD)、雙字型(DWORD):該數(shù)據(jù)類型分別用于說(shuō)明1個(gè)字節(jié)、2個(gè)字節(jié)和4個(gè)字節(jié)的無(wú)符號(hào)的輸入?yún)?shù)或輸出參數(shù)。
④整數(shù)( INT)和雙整數(shù)型(DINT):該數(shù)據(jù)類型分別用于說(shuō)明2個(gè)字節(jié)和4個(gè)字節(jié)的有符號(hào)的輸入?yún)?shù)或輸出參數(shù)。
⑤實(shí)數(shù)型( REAL):該數(shù)據(jù)類型用于說(shuō)明IEEE標(biāo)準(zhǔn)的32位浮點(diǎn)輸入?yún)?shù)或輸出參數(shù)。
【例1】 SBR1子程序是一個(gè)含有4個(gè)輸入?yún)?shù)、1個(gè)輸入輸出參數(shù)、1個(gè)輸出參數(shù)的帶參數(shù)的子程序。在創(chuàng)建這個(gè)子程序時(shí),首先要打開(kāi)這個(gè)子程序的“SIMATIC LAD”(局部變量表)。在局部變量表中,為這6個(gè)參數(shù)賦予名稱(如IN1、IN2、IN3、IN4、INOUT、OUT),然后選定變量類型(IN或者IN OUT或者OUT),并賦予正確的數(shù)據(jù)類型(如BOOL、BYTE、BOOL、WORD、DWORD、WORD),見(jiàn)表4-22。
表4-22 局部變量表

注:首先完成局部變量表SBR1的編輯,這時(shí)再調(diào)用SBR1時(shí),這個(gè)子程序自然就帶參數(shù)了。表中局部變量一項(xiàng)(L區(qū))參數(shù)是自動(dòng)形成的,不需用戶填寫(xiě)。
3)子程序調(diào)用指令和返回指令

子程序調(diào)用指令CALL的功能是將程序執(zhí)行轉(zhuǎn)移到編號(hào)為n的子程序。
子程序的入口用指令SBR n表示,在子程序執(zhí)行過(guò)程中,子程序?qū)?zhí)行全部指令直至滿足返回條件而返回,或者執(zhí)行到子程序末尾而返回。當(dāng)子程序返回時(shí),返回到原主程序出口的下一條指令執(zhí)行,繼續(xù)向下掃描程序。
在梯形圖中,子程序調(diào)用指令以功能框形式編程,子程序返回指令以線圈形式編程,如圖4-59所示,其中調(diào)用指令“CALL SBR_1”,也可寫(xiě)成“CALL 1”。

圖4-59 子程序調(diào)用及返回指令
4)子程序編程步驟
①建立子程序( SBR_n)。
②在子程序( SBR_n)中編寫(xiě)應(yīng)用程序,如果子程序帶有參數(shù),應(yīng)首先在子程序中填寫(xiě)局部變量表,然后再編寫(xiě)應(yīng)用程序。
③在主程序或其他子程序中編寫(xiě)調(diào)用子程序(SBR_n)指令。
5)注意事項(xiàng)
①程序內(nèi)一共可有64個(gè)子程序,允許子程序嵌套調(diào)用(在子程序內(nèi)放置子程序的調(diào)用指令),嵌套深度多為8重。
②S7-200不允許直接遞歸調(diào)用(例如,不能在SBR0中調(diào)用SBR0),但允許間接遞歸。
③各子程序的參數(shù)大限制是16個(gè),如果要下載的程序超過(guò)此限制,將返回錯(cuò)誤。
④用Micro/WIN32軟件編程時(shí),編程人員不用手工輸入RET指令,而是由軟件自動(dòng)加在每個(gè)子程序的結(jié)束處,在子程序中不能使用END指令。
【例2】 圖4-60是一個(gè)帶有6個(gè)參數(shù)的子程序調(diào)用。在這個(gè)例子中,在建立SBR1時(shí),要首先填寫(xiě)局部變量表,見(jiàn)表4-25。
在使用語(yǔ)句表編程時(shí),要注意CALL指令的*個(gè)參數(shù)是子程序標(biāo)號(hào),接著是有關(guān)參數(shù),其中參數(shù)的順序和局部變量表中參數(shù)填寫(xiě)的順序*相同,先輸入,后輸入/輸出,后是輸出。

【例3】 采用子程序的形式來(lái)控制一臺(tái)交流電動(dòng)機(jī)的起/停控制,系統(tǒng)的I/O分配為:
電動(dòng)機(jī)起動(dòng)按鈕(常開(kāi)):I0.0;停止按鈕(常開(kāi));I0.1;電動(dòng)機(jī)電源接觸器:Q0.0編程步驟:
①采用子程序編寫(xiě)電動(dòng)機(jī)的起/停控制,則該子程序一定帶有參數(shù),且需要2個(gè)輸入?yún)?shù),1個(gè)輸出參數(shù)。所以建立子程序SBR0后,應(yīng)先填寫(xiě)局部變量表,見(jiàn)表4-23。
表4-23 SBR0局部變量表

②填寫(xiě)完局部變量表后,就可以編寫(xiě)應(yīng)用程序,應(yīng)采用名稱作為指令的操作數(shù)。
③在主程序中應(yīng)一直(采用常閉點(diǎn)SM0.0)調(diào)用子程序SBR0。具體的子程序及主程序如圖4-61所示。

圖4-61 子程序編程舉例
北京西門子S7-200SMART代理經(jīng)銷商