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

指出狀態在「進入動作」或「結束動作」欄位中有文字。如果您按一下該符號,它會在狀態符號上的「回應」區段中顯示和隱藏文字。範例顯示「回應」區段中的文字。
在此分析層次上,Actuator 部分在指令指示時開啟或關閉額定熱量。熱量委派給 ControlSystem,並流向 SystemUnderControl。
- 若要新增掣動器的狀態圖,請在瀏覽器中,選取「掣動器」區塊,並選取。
- 使用「狀態」工具新增三個狀態,名稱分別是 idle、heating_on 和 heating_off。
- 新增預設轉移為 idle 狀態。
- 使用「條件連接器」工具
,將條件連接器新增至圖表。
- 新增轉移,從 idle 到條件,從條件到 heating_on,並從條件到 heating_off。
- 新增轉移,從 heating_on 到 idle,並從 heating_off 到 idle。
- 按兩下從 idle 至條件的轉移。在「功能」視窗中,將觸發程式設定為 tm(750)。
按一下確定。
- 按兩下轉移,從條件到 heating_on。
在「功能」視窗中,將 Guard 設定為 heat_data,並輸入 cs->setHeat(rating); 作為動作碼。
按一下確定。
- 按兩下轉移,從條件到 heating_off。
在「功能」視窗中,將 Guard 設定為 else,並輸入 cs->setHeat(0.0); 作為動作碼。
按一下確定。
「掣動器」的已完成狀態圖必須類似下面的範例:
註: 當您使用「特性」視窗來指定轉移的觸發程式、保護和動作時,Rhapsody®
會自動新增方括弧和正斜線字元等轉移語法元素。或者,當您直接將文字輸入到圖上的轉移位置保留元中時,您需要自行輸入這些字元。
若要建立
控制器狀態圖,「控制器」僅需要回應作業模式中的變更,其中在待命模式中,必須停用加熱程式,而在標準模式中,必須啟用加熱程式。
稍後,隨著設計的演進,
控制器需要控制演算法。
- 選取瀏覽器中的控制器區塊,並。
- 使用「狀態」工具,在圖表中新增兩個狀態,名稱分別是 controlling 和 standingby。
- 新增預設轉移為 controlling 狀態。
- 新增轉移,從 controlling 到 standingby,並將事件位置保留元設定為叫作 evStandby 的新事件。
- 新增轉移,從 standingby 到 controlling,並設定叫作 evNormal 的新事件。
- 按兩下 controlling 狀態以開啟「特性」視窗。在動作項目上新增下列文字行:setHeat_data(ENABLED);
- 按一下確定。
- 按兩下 standingby 狀態。在動作項目上新增下列文字行:setHeat_data(DISABLED);
- 按一下確定。
已修訂的控制器狀態圖必須類似下列類似:
更新
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%,並且仍然可以閱讀圖表上大部分的資訊。
- 按一下「模擬」控制台上的執行按鈕
,以回復動畫並使用「控制器」狀態圖上的面板按鈕電源和模式,以推動元件層次的系統行為。
您可能需要按兩次「電源」按鈕,才能開啟 ControlSystem。
- 您可以從瀏覽器開啟元件實例的「特性」視窗,來觀察溫度和熱量屬性的值。例如,在瀏覽器中,找出 SystemUnderControl 區塊的實例 Context[0]->s。按兩下該實例,並固定「特性」視窗,如以下範例所示: