西門(mén)子plc S7-1200 由以下幾類(lèi)基本元素組成:
OB:組織塊,英文名Organization block。組織塊是CPU系統和用戶(hù)程序之間的接口,可以在CPU上電啟動(dòng)時(shí)調用,也可以循環(huán)調用,也可以在PLC發(fā)生錯誤時(shí)候調用。
DB:數據塊,英文名Data block。從字面含義便知主要用于儲存用戶(hù)數據,比如模擬量轉換數據,相當于200里面的V區,歐姆龍PLC的W區。
FC:函數,英文名Function。我們常常在FC函數中寫(xiě)一些需要重復執行的代碼,可以在程序不同地方調用,可以被OB調用,也可以被FC調用。使用FC可以簡(jiǎn)化我們需要重復執行的任務(wù),提高代碼的運行效率。FC類(lèi)似于200的子程序。
FB:FC+DB組合,意思是含有DB塊的FC函數,與FC的區別是當函數調用結束后,通過(guò)Static變量仍然可以保留數值,經(jīng)常用于調用間的數據共享。
OB組織塊
當我們新建一個(gè)程序時(shí),系統會(huì )自動(dòng)建立一個(gè)Main[OB1]程序,該程序會(huì )在PLC的每個(gè)掃描周期被調用。Main程序和200里面的主程序,是一個(gè)同樣的概念。也類(lèi)似于C里面的Main ,即為函數入口點(diǎn),我們可以在Main程序里面調用各種函數和塊。下面的圖是在程序中調用一個(gè)FC和FB,然后在FC中調用另外一個(gè)FC,形成嵌套調用。
注:<調用fc>、<調用fb>是別名,方便我們記憶和理解,真正的地址在[.....]中,如OB1,FC2,FC1,FB1等等。
Mian程序包含程序段1(NW1)和程序段2(NW2),在Main的調用結構中包含了3個(gè)元素test、調用FB和調用FC。其實(shí)應該是4個(gè),還有一個(gè)嵌套在<調用fc>中,點(diǎn)擊<調用fc>左側箭頭,出現如下圖所示:

圖1 FC嵌套調用

圖2 OB分類(lèi)
分析上圖中的OB類(lèi)型。OB塊主要用于程序循環(huán)、啟動(dòng)、延時(shí)中斷、循環(huán)中斷、硬件中斷、HSC中斷、診斷錯誤和時(shí)間錯誤八大事件。OB塊還有兩個(gè)屬性是編號和優(yōu)先級,優(yōu)先級越高,中斷級別越高。在同樣的優(yōu)先級別,OB編號越小,越優(yōu)先執行。Main程序的地址在OB1,是一個(gè)循環(huán)運行程序,優(yōu)先級為1較低。時(shí)間錯誤事件的優(yōu)先級最高,當發(fā)生該事件時(shí),會(huì )暫停執行Main程序,優(yōu)先執行時(shí)間錯誤事件OB塊。程序循環(huán)OB類(lèi)塊的編號屬性為'1;>=123',意為可以創(chuàng )建多個(gè)類(lèi)似OB塊。因為新建程序默認OB編號為1,假設創(chuàng )立該事件類(lèi)型OB塊,那么默認編號為123起,同時(shí)OB1的執行要優(yōu)先于OB123。診斷錯誤事件OB塊和時(shí)間錯誤OB塊只有一個(gè)。

圖3 添加OB新塊

圖4 手動(dòng)選擇創(chuàng )建編號
圖4 添加OB新塊界面,可以看到,在紅色矩形框處,OB編號數值為123,選擇的創(chuàng )建方式為自動(dòng)。如果你想起用別的編號,可以選擇手動(dòng)方式,同時(shí)可以選擇創(chuàng )建OB塊采用的語(yǔ)言。不妨試一試。
這里講解幾個(gè)常用的OB類(lèi)型塊使用,其他類(lèi)型OB塊使用,大家可以翻閱系統編程手冊。
程序循環(huán)事件OB塊(program cycle):該塊主要用于執行循環(huán)運行的程序,一般一個(gè)程序中創(chuàng )建一個(gè)便可以,就是默認的Main程序(OB1),可以通過(guò)調用FC和FB來(lái)實(shí)現其他功能。系統CPU每個(gè)掃描周期都會(huì )執行該類(lèi)型OB塊。
啟動(dòng)事件OB塊(Startup):該塊主要用于初始化變量,當PLC斷電重啟或者CPU從STOP切換為RUN時(shí)候執行,往后不再運行,也就是只運行一次。新建一個(gè)DB1塊,添加兩個(gè),設置初始值。
然后新建一個(gè)Startup事件OB塊,寫(xiě)如下程序(SCL語(yǔ)言)。
可以看到該類(lèi)型OB塊編號為100,如果再建一個(gè)該類(lèi)型OB塊,編號必須>=123。然后下載程序,這里順便提一下下載選項。
如果是初次下載,選擇'硬件和軟件(僅更改)'。如果不是初次,可以選擇你修改的部分,這樣會(huì )提高下載速度。
循環(huán)中斷事件OB塊(Cyclic interrupt):常常用于需要定時(shí)執行的任務(wù),比如需要1秒鐘采樣50個(gè)模擬值,我們可以把循環(huán)時(shí)間設置為20毫秒??赡軙?huì )有人問(wèn),為什么不采用普通定時(shí)器每隔20毫秒采樣一次呢?因為普通定時(shí)器會(huì )受到CPU掃描周期的影響。在PID程序中,我們需要采用循環(huán)中斷事件來(lái)調整計算PID輸出。
在實(shí)驗程序里,通過(guò)INC指令把DB1塊里面的變量,每隔1秒加1,運行效果如下:

圖5 循環(huán)中斷事件OB
可以看到在OB30這個(gè)程序塊里面,'Data'.Var2的值會(huì )每隔1秒變化,如果把INC指令放在Main[OB1]里面會(huì )是什么情況呢?
診斷錯誤事件OB塊(Diagnostic error interrupt):當PLC發(fā)生故障時(shí),會(huì )觸發(fā)該事件;解除故障時(shí),也會(huì )觸發(fā)該事件,在該模塊里面,我們可以讀到故障信息。

圖6 添加診斷錯誤事件OB塊
在實(shí)驗程序里,我們需要捕捉模擬量輸入的溢出錯誤,所以需要對模擬量輸入進(jìn)行配置,添加溢出診斷功能,AI通道硬件標識符。
在配置硬件組態(tài)時(shí),TIA PORTAL 將為每個(gè)硬件對象(如模塊、接口或模塊端口,甚至是智能設備的傳輸區)自動(dòng)分配硬件標識符,相當于我們的身份證號碼,獨一無(wú)二。
在診斷程序中,可以獲取錯誤IO狀態(tài),硬件標識符和通道,并添加了STP指令。當錯誤發(fā)生時(shí)候,使PLC處于STOP狀態(tài),若不添加STP指令,PLC仍以RUN狀態(tài)運行。
通過(guò)讀取IO_State,LADDR和Channel三個(gè)變量,IO狀態(tài)以二進(jìn)制格式顯示,第4位為1,所以會(huì )出現錯誤。