Stateflow學習筆記之狀態圖的內部轉移(inner transition)

 

處理內部轉移的事件

 

考慮下圖所示的狀態圖。

狀態A有一個內部轉移。轉移動作爲A_two。

狀態B有一個指向自身的外部轉移(自循環轉移self loop transition)。注意,這個不是內部轉移!後面將會看到差別。

初始化完成後,狀態A爲活動狀態。然後狀態圖進入休眠。

 

發生事件時,不轉移到外部狀態

假設條件C_one爲FALSE。

當事件E_one發生時,狀態圖被激活,該事件的處理步驟如下:

  1. 圖表根目錄檢查是否存在事件E_one的有效的轉換。檢測到從狀態A到狀態B的潛在有效轉換。但是,轉換無效,因爲條件[C_one]爲假
  2. 執行狀態A的during動作:durA()
  3. 狀態A檢查其子狀態是否存在有效轉移,並檢測有效的內部轉移
  4. 狀態A仍然保持爲活動狀態。執行內部轉移的轉移動作A_two因爲它是內部轉移,所以不執行狀態A的退出和進入動作
  5. 圖表又回到睡眠狀態。

 

發生事件,轉移到外部狀態

還是上面那張圖。假設初始化已經完成,狀態A爲活動狀態。

但這一次,假設條件C_one爲TRUE。

當事件E_one發生時,狀態圖被激活,該事件的處理步驟如下:

  1. 圖表根目錄檢查是否存在事件E_one的有效轉移

    從狀態A到狀態B的轉移現在是有效的,因爲條件[C_one]爲真

  2. 執行狀態A的退出動作:exitA()。

  3. 狀態A標記爲無效。

  4. 執行轉移動作:A_one

  5. 狀態B標記爲活動。

  6. 執行狀態B的進入動作:entB()

  7. 圖表又回到睡眠狀態。

 

自循環外部轉移

還是這張圖。不過,起始條件不一樣。假設已經進入了狀態B。條件C_two爲FALSE。

當事件E_two發生時,狀態表被喚醒,該圖表從根向下的層次結構來處理事件:

  1. 圖表根目錄檢查是否存在事件E_two的有效的轉移。

    檢測到從狀態B到狀態A的潛在有效轉移。但轉換無效,因爲條件[C_two]爲假。但是,活動狀態B具有有效的自循環轉移。

  2. 執行狀態B退出動作(exitB())並完成。

  3. 狀態B標記爲無效。

  4. 執行自循環轉移操作A_four,並完成。

  5. 狀態B標記爲活動。

  6. 執行狀態B的進入動作(entB())並完成。

  7. 圖表又回到了睡眠狀態。

此序列完成了與事件E_two關聯的Stateflow圖表的執行。此示例顯示內部轉移和自循環轉移之間的行爲差​​異

 

 

處理事件:包含指向節點的內部轉移

考慮以下狀態圖。父狀態A包括3個子狀態:A1,A2和A3。其中A1爲默認狀態。

同時,狀態A還有一個內部轉移,該內部轉移先指向一個結點,再根據條件轉移到子狀態。

 

切換子狀態的內部轉移

假設初始化已經完成,A1爲活動狀態。條件C_two爲TRUE

事件E_one發生並喚醒圖表,該圖表從根向下的層次結構來處理事件:

  1. 圖表檢查根級別是否存在事件E_one的有效轉移。沒有有效的轉移。
  2. 執行狀態A的during動作:durA()。
  3. 狀態A檢查自身是否存在有效轉移。檢測到有效的內部轉移,該轉移的目標對象是連接點。

    評估條件以確定其中一個轉換是否有效。因爲條件[C_two]爲真,經過連接點再到狀態A.A2的內部轉移是有效的

  4. 執行狀態A.A1的退出動作:exitA1()

  5. 狀態A.A1被標記爲無效。

  6. 狀態A.A2標記爲活動。

  7. 執行狀態A.A2的進入動作:entA2()

  8. 圖表又回到睡眠狀態。

 

不切換子狀態的內部轉移

現在,活動狀態是A2。條件C_two仍然爲TRUE

事件E_one發生並喚醒圖表,該圖表從根向下的層次結構來處理事件:

  1. 狀態圖檢查根級別是否存在事件E_one的有效轉移。沒有有效的轉移。

  2. 執行狀態A的during動作:durA()。

  3. 狀態A檢查自身的有效轉移,並檢測到指向連接點的有效內部轉移。

    評估條件以確定其中一個轉移是否有效。因爲條件[C_two]是真,經過結點然後到狀態A.A2的內部轉移是有效的。

  4. 執行狀態A.A2的退出動作:exitA2()

  5. 狀態A.A2被標記爲無效。

  6. 狀態A.A2標記爲活動。

  7. 執行狀態A.A2的進入動作:entA2()

  8. 圖表又回到睡眠狀態。

 

可以看出,對於具有有效內部轉移的狀態,活動子狀態可以先退出並立即重新進入。

 

 

指向歷史結點的內部轉移

考慮以下狀態圖。父狀態A包含2個子狀態A1和A2,並且還包含一個歷史狀態結點。當事件E_one發生時,狀態A發生內部轉移到該歷史狀態結點。

初始化完成後,狀態A.A1爲活動狀態。當事件E_one發生時,喚醒狀態圖,該圖從根向下的層次結構來處理事件:

  1. 狀態圖檢查根級別是否存在事件E_one的有效的轉移。沒有有效的轉移。

  2. 執行狀態A的during動作:durA()

  3. 狀態A檢查自身是否存在有效轉移,並檢測到有效的指向歷史結點的內部轉移。根據歷史信息,最後一個活動狀態A.A1是目標狀態。

  4. 執行狀態A.A1的退出動作exitA1()並完成。

  5. 狀態A.A1標記爲無效。

  6. 狀態A.A1標記爲活動。

  7. 執行狀態A.A1的進入動作entA1()並完成。

  8. 圖表又回到了睡眠狀態。

 

同樣地,對於具有有效內部轉移的狀態,活動子狀態可以先退出並立即重新輸入。

 


 

參考資料

Process Events Using Inner Transitions

https://ww2.mathworks.cn/help/stateflow/ug/inner-transition-examples.html

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章