狀態機的一般概念
過去我在學習PLC編程時,看的大部分書僅僅停留在軟件的操作上,沒有真正講述如何組織程序,這里我們講一個通用的描述控制算法的方法,就是狀態機,和SFC很類似,其實SFC也是源於狀態機啦。狀態機是UML中的概念,在嵌入式開發中應用很廣,但在PLC編程中基本沒有流行。下面是一張用matlab畫的狀態機,包含了大部分基本元素。它描述的就是啟保停電路,經典的控制。。。我們會在這個電路的基礎上慢慢擴展。
這個狀態機中包含兩個狀態,分別是Off和On,這兩個狀態只能有一個是激活的,這和SFC一樣。Off狀態上帶個小箭頭的,表示這個系統激活,Off狀態就激活,也就是SFC中的初始步。Off狀態到On狀態中間有兩根帶方向的轉移線,轉移線上分別有兩個條件。當按下start按鈕后,〔start〕條件激活,狀態轉移至On狀態(注意,轉移方向是單向的),再按下stop按鈕后,〔stop〕條件激活,狀態由Off轉移到On,從而完成電機的啟保停電路,很方便吧。那這樣的狀態機我們分別用梯形圖和ST語言來表示。
很簡單吧,用狀態機來表示啟保停電路,乍一看這么這么復雜啊,傳統的很簡單。。如果控制任務復雜,那么它的優勢就來了,不容易出錯,程序容易理解。這里有幾點要注意:
- 需要給它一個初始步,這里初始步是Off,startupSet是在OB100中的,PLC啟動是置“1",保證Off步能激活。
- 每個步的復位條件必需用上升沿,否則就不行了,原理自己想想。。
下面我們再這個狀態機上擴展一鍵啟停電路,傳統的程序基本是經驗法,我到現在都記不住,狀態機嗎,就很方便了。
我們對這個狀態機作簡要說明,我們前面的狀態機只能有一個激活步,這里的兩個帶虛線框的步可以同時處於激活狀態,這是並行結構,為啥要用並行呢,因為一鍵啟停要用到沿觸發,左邊的的那個步主要是用來處理next信號生成pNext上升沿的,右邊的轉移條件全換成pNext。下圖是梯形圖中的表示方法。
顏色有誤差,不過也能分辨出來。這段程序寫在了FB塊中,pNext是個塊外傳進來的沿觸發信號。
下圖是用西門子SCL寫的。
在圖右邊的scl寫的狀態機,左邊調用了它。
這個狀態機用一個case語句表示,共兩個分支,分別是#offState、#onState,每個分支里有一個if語句,用來切換狀態的,#nextTrig是沿觸發。。
https://github.com/drongh/siemensPlcCodes,最后一例的代碼,我放github上了,需要TIA博途V14SP1打開。
狀態機的概念基本寫完了,對於復雜的狀態機,手寫起來感覺很啰嗦,所以呢,我們下次通過matlab自動把狀態機轉譯成SCL代碼,怎么樣?聽起來很強大吧。