控制任務
大家好,今天我們用狀態機描述稍復雜的實例,同時用LAD和ST語言寫狀態機.我們的控制任務如下:
真空泵A和真空泵B, 按下啟動按鈕后, 泵A啟動, 3秒后泵B也啟動, 此時泵A仍運行, 當容器真空達到后, 泵B停止, 泵A繼續運行, 維持容器真空. 當按下停止按鈕后, 泵A停止. 再次按啟動按鈕, 泵B啟動, 3秒后泵A也啟動, 此時泵B仍運行, 當容器真空達到后, 泵A停止, 泵B繼續運行, 維持容器真空. 當按鈕停止按鈕后, 泵B停止.
注意: 任何狀態按下停止按鈕, 都停止, 在按啟動后, 切換泵的順序.
首先,我們寫畫狀態機.
注意其中兩個中間變量:isActivatedPumpAB和lastPumpA. lastPumpA 是記錄泵的啟動順序,而isActivatedPumpAB保證每次任務,PumpAB只激活一次.另外Idle狀態到PumpA和PumpB少了一個條件,這里我不想修改圖片,直接文字說明一下,應改為
[start && ~stop && ~lastPumpA] 和 [start && ~stop && lastPumpA].
用LAD表達狀態機
程序段1到程序段5代表每個狀態, 每個狀態用一個SR指令表示,S管腳是轉移到此狀態的條件,R管腳代表當有其它狀態激活時,就把當前狀態復位掉,一面有狀態同時激活.
狀態機就這么簡單.
LAD的表達上,有兩點需要注意,每個狀態機需要一個默認的激活步,我們選Idle,那么stateIdle默認是true狀態. 每個步的復位條件,必需RLO上升嚴,否則不會轉移..
用SCL表達狀態機
用SCL表達的狀態機中,用case語句表達狀態的轉移.這里我們還是看stateIdle狀態,其中的兩個IF,是兩個轉移條件.#mainState中的值代表當前激活狀態,它一共可以取4個值,代表4個狀態,這里我用常量表示..另外注意初始狀態,我們給#mainState的值初始化為0,代表stateIdel為初始狀態.其它的比較簡單.





