西門子s7-200plc用戶程序可以采用主、子程序結(jié)構(gòu)或普通線性化結(jié)構(gòu)。當(dāng)采用普通線性化結(jié)構(gòu)時,只需要編制主程序obl;當(dāng)采用主、子程序式分塊結(jié)構(gòu)時,plc程序由主程序(obl)、子程序(sbrn)、中斷程序( inrn)等組成。
s7-200 plc的主、子程序結(jié)構(gòu)對程序塊的內(nèi)部排列有規(guī)定的要求。主程序(obl)必須進(jìn)行編寫,且位于程序的最前面;隨后是子程序( sbrn)與中斷程序(inrn)。在s7-200中,子程序(sbrn)、中斷程序(inrn)可以根據(jù)需要進(jìn)行選用與編寫。
(1)主程序
s7-200主程序代號規(guī)定為ob1。早期的s7-200 plc用戶程序不分塊,需要在主程序之后接著安排子程序與中斷程序,因此,主程序的結(jié)束應(yīng)使用指令mend作為標(biāo)記。但如果使用的是micro/win32編程軟件,主程序、子程序、中斷程序都可以通過獨立的區(qū)域進(jìn)行編程,通過編程軟件的自動編譯功能,可以對程序進(jìn)行自動的編排與調(diào)整,主程序的結(jié)束無須再編寫指令mend,如圖1 (a)所示。
圖1 s7-200的程序結(jié)構(gòu)與執(zhí)行過程
主程序081在s7-200 plc中為用戶程序的組織、管理者,必須位于plc用戶程序的最前面,以保證每次執(zhí)行plc循環(huán)時,首先對ob1進(jìn)行掃描。
同樣,早期的s7-200在子程序結(jié)束處應(yīng)使用指令ret作為返回標(biāo)記,子程序srbn必須編在主程序ob1的結(jié)束指令mend之后。采用了micro/win32編程軟件后,這些由編程軟件進(jìn)行自動編排與調(diào)整。
子程序srbn在s7-200 plc中為可選部分,可以編寫也可以不編寫。子程序的執(zhí)行通過主程序ob1的對該子程序的調(diào)用實現(xiàn),并非每次plc循環(huán)都需要執(zhí)行全部子程序。
(3)中斷程序
s7-200 plc的中斷程序代號為intn(n為十進(jìn)制數(shù)值,可以是0--127),用于區(qū)別不同的中斷程序。早期的中斷程序結(jié)束應(yīng)使用指令reti作為返回標(biāo)記,中斷程序intn同樣必須編在主程序ob1的結(jié)束指令mend之后,且習(xí)慣上是放在子程序srbn之后(也可以放在子程序之前)。
中斷程序intn在s7-200中同樣為可以選擇的部分,它需要通過主程序ob1的調(diào)用才能執(zhí)行,并非每次plc循環(huán)都需要執(zhí)行全部中斷程序。
s7-200的程序結(jié)構(gòu)與執(zhí)行過程如圖1 (c)所示。
(4)局部變量堆棧
在進(jìn)行plc程序設(shè)計時,程序中有很多為了簡化邏輯塊結(jié)構(gòu)而設(shè)置的臨時狀態(tài)、數(shù)據(jù)存儲單元,這些存儲單元實際上只是為了方便編程、檢查而設(shè)的臨時存儲單元,它與邏輯外部的程序無關(guān),在s7中將其稱為“局部變量”或“臨時變量(temp)”。
根據(jù)需要,設(shè)計者可以在s7-200的ob1、sbrn、intn中使用“臨時變量”。“臨時變量”存儲在局部變量數(shù)據(jù)堆棧(l)中,這一區(qū)域為全部程序塊所公用,只可以用于ob1或sbrn、intn塊內(nèi)部使用的中間運算結(jié)果寄存(這些中間運算結(jié)果不可以用于塊外部)。局部變量堆棧在程序塊執(zhí)行完成后,數(shù)據(jù)將被其他邏輯所需要的內(nèi)容所替代。
如果需要保存可以用于其他邏輯塊的狀態(tài),應(yīng)使用plc的內(nèi)部標(biāo)志寄存器m或變量存儲器v。