在本課中,您將使用狀態圖指定控制系統元件的高層次行為,並模擬完整的模型。
在起始設計中,您已使用狀態圖來指定 ControlSystem 的行為。由於 ControlSystem
的結構現在已按照其元件指定,所以您需要新增每個元件區塊的狀態圖以反映其行為,並且需要修改
ControlSystem 狀態圖以反映其協同行為。
建立元件區塊的狀態圖
若要新增 Sensor 的狀態圖,請執行下列動作:
- 在瀏覽器中,選取 Sensor 區塊,然後選取。
- 使用「狀態」工具
,新增名稱為 idle 和 reading 的兩個狀態。
- 使用「預設轉移」工具
,在 idle 狀態新增預設轉移。
- 使用「轉移」工具
,新增從 idle 狀態到 reading 狀態的轉移。在出現在轉移上的位置保留元中,新增名稱為 evRead 的事件。
- 新增從 reading 狀態回到 idle 狀態的轉移。
在接收到 evRead 事件時,Sensor 組件會從其 idle 狀態轉移至其 reading 狀態。然後,它會將溫度的值從
ControlSystem(稱為 cs)傳送至其溫度屬性,然後回到 idle。Sensor 狀態圖應該類似於以下範例。
註: reading 狀態右上角的符號

指出狀態在「進入動作」或「結束動作」欄位中有文字。如果您按一下該符號,它會在狀態符號上的「回應」區段中顯示和隱藏文字。範例顯示「回應」區段中的文字。
在此分析層次,Actuator 組件在得到命令時,會打開或關閉額定的熱量。熱量委派給
ControlSystem 並流到 SystemUnderControl。
若要新增 Actuator 的狀態圖,請執行下列動作:
- 在瀏覽器中選取 Actuator 區塊,然後選取。
- 使用「狀態」工具新增三個狀態,名稱分別是 idle、heating_on 和 heating_off。
- 在 idle 狀態新增「預設轉移」。
- 使用「條件連接器」工具
,將條件連接器新增至圖表。
- 新增從 idle 至條件、從條件至 heating_on 以及從條件至 heating_off 的「轉移」。
- 新增從 heating_on 至 idle 以及從 heating_off 至 idle 的「轉移」。
- 按兩下從 idle 至條件的轉移。在「特性」視窗中,設定觸發程式:tm(750)。按一下確定。
- 按兩下從條件至 heating_on 的轉移。在「特性」視窗中,將「保護:」設定為 heat_data,並輸入
cs->setHeat(rating); 作為「動作」的程式碼。按一下確定。
- 按兩下從條件至 heating_off 的轉移。在「特性」視窗中,將「保護:」設定為 else,並輸入
cs->setHeat(0.0); 作為「動作」的程式碼。按一下確定。
Actuator 的完成狀態圖應該類似於以下範例。
註: 當您使用「特性」視窗來指定轉移的觸發程式、保護和動作時,Rhapsody®
會自動新增方括弧和正斜線字元等轉移語法元素。或者,當您直接將文字輸入到圖上的轉移位置保留元中時,您需要自行輸入這些字元。
建立 Controller 狀態圖
此時,在設計中,Controller 僅需回應作業模式的變更,在待命模式中,它必須停用加熱器,而在正常模式中,它必須啟用加熱器。稍後,隨著設計發展,Controller 需要控制演算法。
- 在瀏覽器中選取 Controller 區塊,然後選取。
- 使用「狀態」工具,在圖表中新增兩個狀態,名稱分別是 controlling 和 standingby。
- 在 controlling 狀態新增「預設轉移」。
- 新增從 controlling 到 standingby 的「轉移」,並將事件位置保留元設定為名稱為 evStandby 的新事件。
- 新增從 standingby 到 controlling 的「轉移」並設定名稱為 evNormal 的新事件。
- 按兩下 controlling 狀態以開啟「特性」視窗。將以下文字行新增至項目的「動作」:setHeat_data(ENABLED);
- 按一下確定。
- 按兩下 standingby 狀態。將以下文字行新增至項目的「動作」:setHeat_data(DISABLED);
- 按一下確定。
修訂的 Controller 狀態圖應該類似於以下範例。
更新
ControlSystem 狀態圖
現在,必須變更在 ControlSystem 起始狀態圖中指定的行為,以反映其組件提供的行為。具體地說,溫度傳送要由 Sensor 元件執行,因此
ControlSystem 必須將溫度流程委派給其 Sensor。同樣地,Controller 現在命令其 Actuator 產生委派回 ControlSystem 的熱量流程。ControlSystem
還必須將模式變更事件委派給 Controller。
- 若要清除圖表繪圖區,請選取。
- 在瀏覽器中,開啟 ControlSystem 的狀態圖。
- 在畫面元素周圍繪製選取框,並將它們作為一個群組向下移動到圖表框架底端,以容許 On 狀態延長約 50%。
- 按住 Alt 鍵,將 On 狀態符號向下展開約 50% 高,向右展開約 50% 寬。
- 使用「And 線條」工具,按一下 On 狀態左邊以錨定 "and" 線條,沿 On 狀態水平繪製以建立另一個垂直區段。按一下 On 狀態右側以完成該線條。移動「And 線條」,以便它剛好位於 Standby 狀態下方。
- 按兩下上方區段中的空白區域,以開啟該區段(狀態)的「特性」視窗。將「名稱:」設定為 delegating_mode。按一下確定。對下方區段執行相同的作業,並將其名稱設定為 delegating_temperature。將每個區段的「顯示選項」設定為「名稱」。
- 將 Standby 狀態移至右側,以將它放置在 On 狀態右邊緣附近。
- 若要刪除兩個 evMode 轉移,請用滑鼠右鍵按一下這些轉移,然後選取從模型刪除。
- 使用傳送動作工具
,在 Normal 與 Standby 狀態之間新增兩個垂直間隔的傳送動作。遵循下列步驟來定義傳送動作:- 按兩下上方傳送動作以開啟「特性」視窗。設定 Target: itsController;設定 Event: evStandby。按一下確定。
- 新增從 Normal 狀態到上方傳送動作的轉移,以及從傳送動作到 Standby 狀態的另一個轉移。
- 用滑鼠右鍵按一下轉出 Normal 的轉移,然後選取。
- 按兩下下方傳送動作以開啟其「特性」視窗。設定 Target: con;設定 Event: evNormal。按一下確定。
- 繪製從 Standby 狀態到下方傳送動作的轉移,以及從傳送動作到 Normal 狀態的另一個轉移。不需要考量傳送動作符號的方向。僅需考慮轉移的方向。
- 用滑鼠右鍵按一下轉出 Standby 的轉移,然後選取。
- 將「狀態」新增至 delegating_temperature 區段左側;將它命名為 idle。
- 將「傳送動作」新增至區段右側。設定 Target:
sen;設定 Event: evRead。按一下確定。
- 連接從 idle 狀態到傳送動作的轉移。用滑鼠右鍵按一下轉移,然後選取。
- 連接從傳送動作到 idle 狀態的轉移。
完成的狀態圖應該類似於以下範例。
完整模型模擬
若要產生和建置完整模型模擬的配置,請執行下列動作:
- 選取。
- 檢閱「輸出」視窗中的「建置」頁面,以找出「建置已完成」訊息。
- 將會顯示一個 DOS 視窗,其中含有指出該模型「正在執行」的訊息。
- 按一下 Go Idle 按鈕
,開始模擬。模擬會自動停止,以容許您設定動畫狀態圖和其他構件來觀察執行。
- 選取,並選取 ControlSystem 狀態圖 Context[0]->cs 實例。展開該狀態圖以顯示檢測畫面元素。
- 選取,並選取 Controller 狀態圖 Context[0]->cs->con 實例。
- 選取,並選取 Actuator 狀態圖 Context[0]->cs->act 實例。您可能還要選取,並選取 Sensor 狀態圖 Context[0]->cs->sen 實例,但是模擬作業不需要此圖。
- 並排視窗以排列這些狀態圖。請注意,您可以將縮放係數減少為 75%,並且仍然可以閱讀圖表上大部分的資訊。
- 按一下「模擬」控制台上的 Go 按鈕
以回復動畫,並使用 Controller 狀態圖上的畫面按鈕(「電源」和「模式」),以驅動元件層次的系統行為。您可能需要按兩次「電源」按鈕,才能開啟 ControlSystem。
- 您可以從瀏覽器開啟元件實例的「特性」視窗,來觀察溫度和熱量屬性的值。例如,在瀏覽器中,找出 SystemUnderControl 區塊的實例 Context[0]->s。按兩下該實例,並固定「特性」視窗,如以下範例所示: