MBSE建模學習之六:狀態機和狀態機圖

狀態機(StateMachine

狀態機(StateMachine)用于表示事件驅動的行為。在狀態機圖中,用系統的不同狀態之間事件驅動的轉移機制來說明一系列的行為發生過程。它一般作為一個模塊(Block)的類目行為(ClassifierBehavior)。類目行為是一個類(如模塊)從開始工作,一直到結束的整個過程的行為。一個模塊只有一個類目行為。它也可以作為模塊的一個普通的擁有行為(OwnedBehavior),表示模塊的一種功能。

和活動(Activity)一樣,狀態機同時也是一種模塊(Block)元素。一個復雜的狀態機行為可以進行分解。在上層的狀態機行為中,通過一個“子機狀態”(SubmachineState)元素表示對下層或其它狀態機的調用。

作為行為,狀態機的發生一樣需要規定發生的語境(Context)。如果狀態機是某個模塊的類目行為或擁有行為,則這個模塊是狀態機的語境;否則它自己是它的語境。狀態機中的狀態的內部行為(entrydoexit)如果沒有明確的語境,則它們的語境是這個狀態機的語境。

狀態機是通過狀態機中的狀態(State)以及狀態是如何轉換的來說明系統的行為過程。狀態機中的狀態(State)和轉移(Transition)不像活動圖中的動作(Action),它們本身并不說明究竟這個行為是如何把一個輸入的信息(或其它物質)轉為輸出的信息(或其它物質)。(動作—Action中,可以通過語句或專用的動作類型來說明對象的生成、變換或刪除等)但是,在狀態和轉移中可以包含其它行為(如一個活動),它可以用它包含的行為來說明具體是轉換的細節。狀態機更像是把系統的行為串聯起來的一種作用,它著重展現的是系統在這個行為之間所處的狀態,以及狀態是在什么時機,或通過什么機制來轉換的(這個時機被定義為觸發器,這個機制是觸發器的事件)。所以它適合作為系統的整個工作過程的總體說明,例如用來說明系統工作的任務階段說明。

狀態(State

狀態(State)是系統處于某種工作狀態一種表示方法。狀態除了有一個名稱外,狀態的“狀態不變量”(StateInvariant)屬性說明了系統處于這個狀態的條件?!盃顟B不變量”是一個約束(約束通常表示為一個等式或不等式),當系統處于這個狀態的時候,應該滿足這個約束(約束表達式的值應該是True)。

狀態并非靜態的概念。當系統進入、保持和退出一個狀態的時候,都伴隨著行為的發生。這三種行為稱為狀態的“entry”、“do”和“exit”內部行為。這三種內部行為,可以僅僅是一段文字描述(對應一個不透明行為),或者具體活動(Activity)、交互(Interaction)或另外一個狀態機元素。這三個行為的發生順序是:當系統進入這個狀態的時候,先執行“entry”行為;執行完畢之后,如果有“do”行為,則執行。當有一個引發狀態轉移的事件發生的時候,在系統離開這個狀態之前,執行“exit”行為(如果此時,“do”還沒有執行完,則中斷“do”的執行)。

狀態用一個圓角矩形表示。其中的文字用“狀態名稱[狀態不變量表達式]”表示。在“智睿思維基于模型的系統工程軟件”(MBSES)中狀態的內部行為可以通過屬性框設置是否顯示。下圖是“開機”狀態的兩種顯示方式。

MBSE建模學習之六:狀態機和狀態機圖的圖1

                           

有三種具體的狀態類型。這三種狀態都具有以上狀態的這些基本特征。其中,簡單狀態(SimpleState)代表一個普通的狀態。組合狀態是可以包含其它狀態的狀態;子機狀態是代表另外一個狀態機的狀態。在進一步說明其它狀態類型之前,先搞清楚狀態的轉移是如何發生的。

轉移(Transition

“轉移”用一個帶箭頭的線表示系統從一個狀態轉換到另外一個狀態。轉移的發生是由系統中的觸發器(Trigger)引發的。在表示轉移的線上面,會顯示轉移的說明文字,這個文字的語法如下:

[<trigger>[‘,’ <trigger>]* [‘[‘ <guard>’]’] [‘/’<behavior-expression>]]

用中文表示語法表示為:

[<觸發器> [‘,’ <觸發器>]*[‘[‘ <守衛條件>’]’] [‘/’ <行為表達式>]]

如上所示,一個轉移,它可能有一個或多個觸發器,一個守衛條件(轉移的發生需要滿足這個條件,這個條件也是一個約束)。當轉移發生的時候,可能還有一個行為發生,稱為轉移的“影響”屬性。這個行為可能是一個活動、交互或另外一個狀態機。

一個表示轉移的文字示例如下:

“按下開機鍵[電源狀態=有電]/接通電源()

上面的文字表示系統從關閉狀態到開機狀態的轉移,這個轉移的觸發器是用戶“按下開機鍵”事件。此時,如果也滿足“電源狀態=有電”這個約束條件,則轉移發生。轉移發生后,將進行“接通電源()”這個“影響”行為。

轉移也可以有“名稱”。如果有名稱,在MBSES軟件中會顯示在最前面,并且用“:”和觸發器分隔。但一般情況下,應該把轉移的觸發條件作為觸發器寫在觸發器屬性,而不是名稱。

轉移的表示方法示例如下:

MBSE建模學習之六:狀態機和狀態機圖的圖2

從上面的說明我們可以了解到,狀態機中狀態以及狀態的轉移過程都是伴隨是具體行為的發生的。造成轉移發生的觸發器,也是由于其它行為執行過程中產生的事件引發的。下面講講觸發器

觸發器(Trigger

觸發器是行為中定義中的一個點,在該點上一個事件的發生可能會產生這種影響。所以,觸發器總是和一個事件關聯在一起的。表示觸發器的字符串,直接使用它關聯事件的表達式(雖然觸發器也可以有名稱,但是在轉移中觸發器的表達式是直接使用關聯事件的表達式,而不用它的名稱)。

在進行狀態機的仿真運行的時候,需要模擬觸發器的觸發,才能引發狀態的轉移。模擬觸發的動作,通過選擇仿真工具欄中觸發器的下拉框。此外,有些觸發器是會在仿真過程中由活動中的動作引發的,如“信號事件”觸發器,則會通過一個“發送信號動作”引發。這種仿真中自動引發的事件,也會引起轉移的發生。

觸發器的事件類型

觸發器的事件有5種事件類型,分別說明如下:

1)調用事件(CallEvent

調用事件是當作為狀態機語境的模塊的操作(Operation)被調用的時候發生的事件(對一個硬件來說,一個模塊的操作被調用,可以理解為啟動了硬件的一個功能)。當模塊的操作被調用,可能會產生標識這個狀態的屬性或變量的變化,從而會引發狀態的改變。

調用事件是用被調用操作的名稱標識的,它的表示語法如下:

<call-event>::= <name> [‘(‘ [<assignment-specification>] ‘)’]

<name>:被調用操作的名稱

<assignment-specification>:可選的顯示項,對應被調用操作的參數值。

調用事件一般通過“調用操作動作”(CallOperationAction)(見MBSE建模學習之四)引發。

2)信號事件(SignalEvent

信號事件是當作為狀態機的語境的模塊,接收到一個某種類型的信號的時候發生的事件。信號(Signal)是一種包含有屬性的元素,它一般定義為一種有結構的數據類型。一個模塊能夠接收某種類型的信號,則應該有一個和信號對應的接收(Reception)方法來處理接收到的信號,這個接收的名稱和信號名稱相同,接收的參數和信號的屬性對應。

定義一個信號事件,應該定義它對應的信號元素。信號事件觸發器顯示的是信號事件的信號名稱。信號事件顯示的語法如下:

<signal-event>::= <name> [‘(‘ [<assignment-specification>] ‘)’]

<name>:信號的名稱

[<assignment-specification>]:可選的顯示項,和信號對應接收的參數的具體值,這些參數和信號的屬性也對應。

信號接收事件可以由“發送信號動作”(SendSignalAction)觸發(見MBSE建模學習之四)。

3)任何接收事件(AnyReceiveEvent

任何接收事件會顯示一個“all”字符串。任何接收事件表示模塊接收到任何信號或操作調用的時候都會發生。但是如果這個接收有具體對應的信號事件或調用事件對應,則不會重復的發生。任何接收事件也可以由一個“發送對象動作”(SendObjectAction)引發,所以可以用任何接收事件來處理除了信號事件和調用事件之外的其它任何接收事件。

4)變動事件(ChangeEvent

變動事件是當模塊中的屬性或一個變量的值變動時,符合變動事件給出的條件,則引發這個事件。

變動事件的語法是:

<change-event>::= ‘when’ <value-specification>

即:“when”后面有個結果為布爾值的表達式,當這個表達式的值為“真”的時候,變動事件就引發。

5)時間事件(TimeEvent

時間事件是當系統時間符合事件定義的時間表達式的時候,事件就引發。時間表達式的定義有兩種,一種是“絕對”時間,一種是“相對”時間。當時間事件的“是否是相對時間”屬性等于True時,時間事件表示為“after+ “時間量”。如“after 5s”,表示系統進入當前狀態5之后引發此事件。當“是否相對時間”屬性等于False時,時間事件表示為“at+ “絕對時間表達式”。如“at 2021-12-24 18:00:00”;如果時間表達式中沒有日期,表示每天這個時間都會發生一次。

一個轉移可以有多個觸發器,任何一個觸發器發生,則轉移就會發生。在“智睿思維基于模型的工程軟件”(MBSES)中,轉移的觸發器定義界面如下:

MBSE建模學習之六:狀態機和狀態機圖的圖3

在定義了“調用事件”或“信號事件”后,要通過工具欄上面的“選擇操作”或“選擇信號”按鈕選擇在模塊中定義的操作或其它地方定義的信號。

組合狀態(CompositeState

組合狀態是可以包含其它狀態的狀態。首先組合狀態直接包含一個或多個“區域”(Region)元素,“區域”再包含其它的狀態。

狀態機也是包含一個默認的“區域”的,狀態機中的狀態都包含在這個區域中。在一個區域中,只有一個當前狀態。不同的區域可以有各自的當前狀態。不同區域中的行為是并行的。這種具有多個區域的組合狀態稱為“正交的”組合狀態(是否正交屬性=True)。

組合狀態中每個區域都有自己的初始狀態和終態。當進入組合狀態之后,也是先從初始狀態開始轉移到第一個狀態。組合狀態中的狀態可以直接轉移到組合狀態外的一個狀態。

下圖是一個系統簡單的狀態機圖,其中“開機”狀態是一個組合狀態,其中包含兩個狀態“加載”和“工作”。

MBSE建模學習之六:狀態機和狀態機圖的圖4

偽狀態(Pseudostate

偽狀態即狀態機圖上不是系統真實狀態的節點,這些偽狀態節點為了表示狀態機的開始、結束、分支等等。偽狀態有如下幾種類型:

“初始偽狀態”(InitialPseudostate):表示狀態機的開始。用一個實心圓形表示;如。

“選擇偽狀態”(ChoicePseudostate):類似活動圖中的決定節點,從一個菱形節點分支出去多個轉移,每個轉移有各自的“守衛”條件,只有符合條件的轉移才發生。

MBSE建模學習之六:狀態機和狀態機圖的圖5

“連接偽狀態”(JunctionPseudostate):連接偽狀態可以有多個“入”及多個“出”的轉移。從連接偽狀態“出”的轉移應該具有不同的觸發器及守衛條件。要記住,在一個區域中是不能有多個“當前狀態”,所以從連接偽狀態一次只能一個轉移生效。

“分支”和“集合”偽狀態:分支節點從一個狀態分支到兩個或多個并行狀態區域;集合節點合并多個并行的區域。如下所示“分支”和“集合”的應用:

MBSE建模學習之六:狀態機和狀態機圖的圖6

“終止偽狀態”(TerminatePseudostate):用一個?來表示,表示某個分支流程的終止。

“深歷史偽狀態”(DeepHistoryPseudostate)和“淺歷史偽狀態”(ShallowHistoryPseudostate):狀態歷史是和組合狀態的區域相關的概念。這個概念可以跟蹤從區域中退出時所處的狀態配置。當從“深歷史偽狀態”退出區域,區域再次活動的時候,恢復到區域中最深層次的那個最后狀態。當從“淺歷史偽狀態“退出區域時,區域再次成為活動區域,返回到區域中最頂層的那個最后狀態。

“入點”(entryPoint)和“退出點”(exitPoint):當封裝一個組合狀態、不允許從其中的狀態直接轉移進或出的時候,設置一個“入點”和一個“退出點”,只能從外部狀態轉移進“入點”偽狀態,從“退出點”偽狀態轉移出。

終態(FinalState

用一個實心環形表示,代表狀態機行為的結束。

狀態機圖的案例

下圖是一個衛星“姿態控制”狀態機(參考《SysML精粹》圖8.1)的案例。

MBSE建模學習之六:狀態機和狀態機圖的圖7

此圖是“姿態控制子系統”的類目行為,即姿態控制子系統的整個工作過程。從初始狀態開始,衛星處于“入軌”狀態,執行內部行為“自旋穩定”。當軌道轉移的時候,退出前執行“exit”內部行為“消自旋”,停止自旋。當軌道轉移完成,進入新軌道“捕獲”狀態,首先“甩動量”,然后“確定姿態”;更新衛星的姿態之后,如果衛星“當前姿態==規則姿態”,則轉移為“在站”組合狀態;否則“轉向”(Slew),直到衛星“當前姿態==規則姿態”。如果在“轉向”狀態收到“脫離軌道”命令(產生的觸發器),則“姿態控制子系統”工作完畢。“在站”組合狀態中常規情況下執行“維持規則姿態”行為。如果此時處于“有通訊鏈路”狀態時,收到新的調整姿態命令(調用了“獲取目標(規則姿態) ”操作產生的調用操作事件)轉移到“轉向”狀態,繼續調整姿態。如果“無通訊鏈路”狀態超過2分鐘,觸發時間觸發器“after 2 min”,狀態轉為“安全模式”(或者有“系統錯誤”事件也轉為安全模式),跟蹤太陽方位,直到“通訊鏈路恢復”事件發生,轉入“捕獲”狀態。在“在站”組合狀態下,收到“脫離軌道”命令事件,則子系統工作完畢,轉為“終態”。


文章來源:智睿思維MBSE

登錄后免費查看全文
立即登錄
App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP

2
1
1