我們今天簡要介紹RS指令在狀態機中怎麼處理的。有些設備按下停止按鈕後,沒有馬上停止,而是到原點後才停止,那麼這種情況在狀態機中如何表示呢?我們以案例說明之,下麵是我們的控制描述。控制描述小車從左位開始,從左向右行使,到達右位後停5秒,然後從右向左運行,到達左位後停3s,繼續向右運行。當按下停止按鈕後... ...
我們今天簡要介紹RS指令在狀態機中怎麼處理的。有些設備按下停止按鈕後,沒有馬上停止,而是到原點後才停止,那麼這種情況在狀態機中如何表示呢?我們以案例說明之,下麵是我們的控制描述。
控制描述
小車從左位開始,從左向右行使,到達右位後停5秒,然後從右向左運行,到達左位後停3s,繼續向右運行。當按下停止按鈕後,小車不是馬上停止,而是到達左位後才停止。我們假設左邊的到位信號位isOnLeftPos,右邊的到位信號為isOnRightPos,向左的運行動作為GoLeftPos,向右的運行動作為GoRightPos,啟動停止按鈕分別為start和stop。
對於這樣的控制任務,我們該怎麼作呢?難點在於處理stop按鈕信號,小車運行中,按下stop按鈕,不是馬上停止,而是要到達左位後才停止。這裡我們用了狀態機的並行結構。Signals狀態處理stop信號,Logic狀態處理邏輯動作。
這一張圖是程式的總體,圖右側的OnRightPos和OnLeftPos是方便我們觀察左右位的狀態,實際使用中可以不用輸出。
這張圖是實際的控制。左邊處理stop信號,右邊處理小車控制邏輯。另外這裡我們要說明一下命名規則:大寫開頭的是指各狀態,比如OnLeftPos,Signals等等,小寫開頭的是條件,比如isOnRightPos, stop. 假設小車的當前狀態處於GoRightPos,按下stop按鈕,Stop的子狀態Set就激活,那麼〔in(Signals.Stop.Set)]條件滿足,但當前狀態不在OnLeftPos,沒有發生轉移,此時小車繼續運行,等小車到達OnLeftPos狀態時,OnLeftPos狀態才開始轉移到Idle狀態,此時〔in(Logic.Idle)]條件滿足,Stop的子狀態從Set轉移到Reset。
控製程序
這次的控製程序和以前稍有不同,用個並行狀態處理stop信號,在第一篇博客中,我們也用一個並行狀態處理上升沿問題。整個程式多了一段case,一段描述Signals,一段描述Logic,方法和以前一樣,也是比較簡單的,等下次我們再次狀態機的基礎上,介紹完歷史狀態後,我們寫出程式。另外,為了方便,我們以後就用ST寫了。