An Embedded Engineer’s Blog

とある組み込みエンジニアの備忘録的なブログです。

UMLのステートマシン図を実装する for C# - その2

まえがき

今回は、前回作成したベースクラスを使って実装するステートマシンのサンプルについて説明します。

f:id:an-embedded-engineer:20190414174321p:plain
エアコンステートマシン


上記ステートマシンは、エアコンの状態遷移を表したものになります。
なお、今回作成するステートマシンはサンプルのため、現実のエアコンの挙動とは異なる場合があります。

エアコンステートマシンは大きく 3 つの状態に別れます。

状態 詳細 備考
Initial 初期状態
Stop エアコン停止状態
Running エアコン稼働状態
Clean エアコンクリーニング状態


Initial 状態

Initial 状態はステートマシン開始前の初期状態(疑似状態)です。
システム起動後、各種初期化が完了すると、「T_Initialized」トリガが発行され、Stop 状態に遷移します。


Stop 状態

Stop 状態は、エアコンが停止し、ユーザからの要求を待機している状態です。
ユーザがリモコンのスタートボタンを押すと、「T_SwitchStart」トリガが発行され、Running 状態に遷移します。
また、状態遷移時に「E_SwitchStartEffect」エフェクトが実行されます。


Running 状態

Running 状態は、エアコンが通常動作している状態です。 今回作成するエアコンでは、冷房/暖房/除湿の動作モードがあり、それぞれユーザのリモコン操作で切り替えることができるものとします。

Running 状態でユーザがストップボタンを押すと「T_SwitchStop」トリガが発行され、Stop 状態に遷移します。
また、状態遷移時に「E_SwitchStopEffect」エフェクトが実行されます。


Running 状態でユーザが内部クリーニングボタンを押すと「T_SwitchClean」トリガが発行され、Clean 状態に遷移します。


Running 状態でユーザが各種モード切り替えボタンを押すことでサブ状態が変化し、動作モードを変更することができます。

Running 状態のサブ状態を示します。

状態 詳細 備考
History 履歴疑似状態
Cool 冷房状態
Heat 暖房状態
Dry 除湿状態


History サブ状態

前回 Running 状態を出た時のサブ状態を記憶しておくための疑似状態です。
Running 状態への初回遷移時には、履歴が存在しないため Cool 状態に遷移します。


Cool サブ状態

Cool サブ状態は、冷房制御を行っている状態です。
指定された目標温度になるように室内の温度制御を行います。


Cool サブ状態でユーザが暖房ボタンを押すと「T_SwitchHeat」トリガが発行され、Heat サブ状態に遷移します。


Cool サブ状態でユーザが除湿ボタンを押すと「T_SwitchDry」トリガが発行され、Dry サブ状態に遷移します。


Heat サブ状態

Heat サブ状態は、暖房制御を行っている状態です。
指定された目標温度になるように室内の温度制御を行います。


Heat サブ状態でユーザが冷房ボタンを押すと「T_SwitchCool」トリガが発行され、Cool サブ状態に遷移します。


Heat サブ状態でユーザが除湿ボタンを押すと「T_SwitchDry」トリガが発行され、Dry サブ状態に遷移します。


Dry サブ状態

Dry サブ状態は、除湿制御を行っている状態です。
湿度が下がるように室内の湿度制御を行います。


Dry サブ状態でユーザが冷房ボタンを押すと「T_SwitchCool」トリガが発行され、Cool サブ状態に遷移します。


Dry サブ状態でユーザが暖房ボタンを押すと「T_SwitchHeat」トリガが発行され、Heat サブ状態に遷移します。


Clean 状態

Clean 状態は、エアコンが内部クリーニングをしている状態です。 今回作成するエアコンでは、内部の汚れレベル(Low / High)を自動的に判断し、レベルに応じてクリーニングモード(入念 / あっさり)を自動的に切り替えます。

Running 状態でユーザがストップボタンを押すと「T_SwitchStop」トリガが発行され、Stop 状態に遷移します。
また、状態遷移時に「E_SwitchStopEffect」エフェクトが実行されます。


クリーニング処理が完了すると、自動的に Running 状態に遷移します。
また、状態遷移時に「E_CleanEndEffect」エフェクトが実行されます。


Clean 状態に入ると、汚れレベルの判定およびクリーニング処理が自動的に行われ、その際にサブ状態も自動的に遷移します。


Clean 状態のサブ状態を示します。

状態 詳細 備考
Initial 開始疑似状態
StainLevelAnalysis 汚れレベル解析状態
DeepClean 入念クリーニング状態
LightClean あっさりクリーニング状態
Final 最終状態


Initial サブ状態

Inital サブ状態は Clean 状態におけるサブステートマシン開始前の初期状態(疑似状態)です。
Clean 状態に入ると、サブ状態は自動的に StainLevelAnalysis サブ状態に遷移します。


StainLevelAnalysis サブ状態

StainLevelAnalysis サブ状態は、汚れレベルの解析を行っている状態です。 汚れレベルの解析が終了すると、解析された汚れレベルに応じて、自動的に状態遷移が発生します。

汚れレベル(Stain Level)が High だった場合、DeepClean サブ状態に遷移します。
また、汚れレベルが Low だった場合は LightClean サブ状態に遷移します。


DeepClean サブ状態

DeepClean サブ状態は、入念クリーニングを行っている状態です。 クリーニング処理が終了すると、Final 状態に自動的に遷移します。


LightClean サブ状態

LightClean サブ状態は、あっさりクリーニングを行っている状態です。 クリーニング処理が終了すると、Final 状態に自動的に遷移します。


Final サブ状態

Final サブ状態は、クリーニング処理が完了した状態です。 Final サブ状態に遷移すると、Clean 状態は自動的に Running 状態に遷移します。


次回予告

次回はいよいよステートマシンを実装していきます。

an-embedded-engineer.hateblo.jp