このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
有限ステート マシンのモデル化
Stateflow® は、"有限ステート マシン" に基づくグラフィカルなプログラミング環境です。Stateflow を使用して設計のテストとデバッグを行い、さまざまなシミュレーション シナリオを検討し、ステート マシンからコードを生成することができます。
有限ステート マシンは、1 つの動作モード (ステート) から別のモードへと遷移する動的システムを表現したものです。ステート マシンには次の特徴があります。
複雑なソフトウェア設計プロセスにおける高水準の開始点として機能する。
動作モードと、1 つのモードから次のモードへの移行に必要な条件に注目できる。
モデルの複雑度が増しても明確さと簡潔さが維持されるようなモデルの設計に役立つ。
制御システムの設計は、複雑なロジックを管理するためのステート マシンに大きく依存します。用途には、航空機、自動車、およびロボティクスの制御システムの設計が含まれます。
Stateflow チャートの例
Stateflow チャートでは、ステート、遷移、およびデータを組み合わせて有限ステート マシンを実装します。この Stateflow チャートは、自動車の 4 速オートマチック トランスミッション システムのギアをシフトするロジックの簡易モデルを示しています。チャートでは、ギアの各ポジションが first
、second
、third
、fourth
というラベルの付いた四角形で示されるステートによって表されます。これらのステートは、それぞれが表すギアと同様に排他的なので、一度に 1 つのステートのみがアクティブになります。
図の左側の矢印はデフォルト遷移を表し、最初にアクティブになるステートを示しています。チャートを実行すると、キャンバスでこのステートが強調表示されます。他の矢印はステート間で可能な遷移を示しています。ステート マシンのダイナミクスを定義するには、それぞれの遷移を論理条件またはトリガー イベントに関連付けます。たとえば、このチャートは自動車の速度を監視して、速度がある固定のしきい値を横切ると別のギアにシフトします。シミュレーション中、異なるステートがアクティブになるとチャートの強調表示が変わります。
このチャートは、エンジン スピードやトルクなどの重要な要因を無視したシンプルな設計を提供します。この Stateflow チャートを、MATLAB® や Simulink® 内の他のコンポーネントとリンクすることにより、さらに包括的で現実的なモデルを作成できます。次の例で、可能な 3 つの手法を説明します。
チャートを MATLAB オブジェクトとして実行
この例では、ステートの階層、時相論理、入力イベントを組み込んだオートマチック トランスミッション システムの修正バージョンを示します。
階層: チャートは、前の例の 4 速オートマチック トランスミッション チャートを囲むスーパーステート
gear_logic
で構成されます。このスーパーステートが、自動車の速度と加速度を制御します。実行中、gear_logic
は常にアクティブです。時相論理: ステート
gear_logic
では、アクションon every(0.25,sec)
が自動車の速度を決定します。演算子every
で作成される MATLAB タイマーにより、チャートが実行され、チャート データspeed
が 0.25 秒ごとに更新されます。入力イベント: 入力イベント
SpeedUp
、Cruise
およびSlowDown
は、チャート データdelta
の値をリセットします。このデータにより、実行ステップごとに自動車が加速するか速度を維持するかが決まります。
このチャートは、コマンド ウィンドウで直接、またはスクリプトを使用して、MATLAB 内のオブジェクトとして実行できます。また、グラフィカル ユーザー インターフェイスを使用してチャートのステートを制御する MATLAB アプリをプログラミングすることもできます。たとえば、このユーザー インターフェイスでは、ボタンをクリックすると入力イベントがチャートに送信されます。チャート内で、MATLAB 関数 widgets
がインターフェイス上のゲージとランプの値を制御します。この例を開始するには、App Designer のツールストリップで、[実行] をクリックします。ユーザー インターフェイス ウィンドウを閉じるまで、この例は引き続き実行されます。
あるいは、Stateflow エディターの [ステート チャート] タブで、[実行] をクリックします。車の速度を制御するには、[シンボル] ペインの [SpeedUp]、[SlowDown]、[Cruise] の各ボタンを使用します。この例を停止するには、[停止] をクリックします。
Stateflow チャートを MATLAB オブジェクトとして実行することに関する詳細については、MATLAB での実行を参照してください。
ローカル イベントを使用して Simulink ブロックとしてチャートをシミュレート
この例では、より複雑なオートマチック トランスミッション システムの設計を示します。Stateflow チャートは、Simulink モデル内でブロックとして表示されます。モデル内の他のブロックは、関連する自動車のコンポーネントを表します。チャートは、入出力の接続を使ってデータを共有することにより、他のブロックと連動します。チャートを開くには、shift_logic
ブロックの左下隅にある矢印をクリックします。
このチャートはステートの階層、パラレル化、アクティブ ステート データ、ローカル イベント、および時相論理を組み合わせたものです。
階層: ステート
gear_state
には、4 速オートマチック トランスミッション チャートの修正バージョンが含まれています。ステートselection_state
には、定常状態、アップシフト、およびダウンシフトの各動作モードを表すサブステートが含まれています。ハイ ギアまたはロー ギアへのシフトが必要な状況では、これらのステートがアクティブになります。パラレル化: パラレル ステートである
gear_state
とselection_state
は、破線の境界をもつ四角形として表示されます。これらのステートは、その中にあるサブステートのオンとオフが切り替わっても、同時に動作します。アクティブ ステート データ: 出力値
gear
にはシミュレーション時のギアの選択が反映されます。チャートはgear_state
のアクティブなサブステートからこの値を生成します。ローカル イベント: このチャートは、論理式条件の代わりにローカル イベント
UP
およびDOWN
を使用してギア間の遷移をトリガーします。これらのイベントは、自動車の速度が選択されたギアの動作範囲外になったときに、selection_state
内のsend
コマンドから発生します。Simulink 関数calc_th
は、選択されたギアとエンジンの速度に基づいて動作範囲の境界値を決定します。時相論理: 短時間の連続ギア チェンジを避けるために、
selection_state
は、時相論理演算子after
を使用して、UP
イベントとDOWN
イベントのブロードキャストを遅延させます。ギア チェンジに所定時間TWAIT
よりも長い時間が必要な場合にのみ、ステートはこれらのうちいずれかのイベントをブロードキャストします。
モデルのシミュレーションを実行するには、次を行います。
User Inputs ブロックをダブルクリックします。Signal Editor ダイアログ ボックスの [アクティブなシナリオ] リストで、事前定義されたブレーキ対スロットルのプロファイルを選択します。既定のプロファイルは
Passing Maneuver
です。[実行] をクリックします。Stateflow エディターでは、チャート アニメーションによって、シミュレーション中にアクティブ ステートが強調表示されます。アニメーション速度を遅くするには、[デバッグ] タブで、[アニメーション速度] ドロップダウン リストから
Slow
を選択します。Scope ブロックで、シミュレーションの結果を確認します。各スコープには、シミュレーション中にその入力信号のグラフが表示されます。
時間条件を使用して Simulink ブロックとしてチャートをシミュレート
この例では、自動車のトランスミッション システムをモデル化する別の方法を示します。Stateflow チャートは、Simulink モデル内でブロックとして表示されます。モデル内の他のブロックは、関連する自動車のコンポーネントを表します。チャートは、入出力の接続を使ってデータを共有することにより、他のブロックと連動します。チャートを開くには、Gear_logic
ブロックの左下隅にある矢印をクリックします。
このチャートはステートの階層、アクティブ ステート データ、および時相論理を組み合わせたものです。
階層: このモデルでは、4 速オートマチック トランスミッション チャートをスーパーステート
gear
内に配置します。スーパーステートは車両とエンジンの速度を監視してギア チェンジをトリガーします。ステート gear の左上隅にリストされているアクションは、選択されたギアの動作しきい値と、論理条件up
およびdown
の値を決定します。ラベルen,du
は、ステートがはじめてアクティブになるとき (en
=entry
) と、それ以降ステートがアクティブな間 (du
=during
) の各タイム ステップでステート アクションが実行されることを示します。アクティブ ステート データ: 出力値
gear
にはシミュレーション時のギアの選択が反映されます。チャートはgear
のアクティブなサブステートからこの値を生成します。時相論理: 短時間の連続ギア チェンジを避けるために、論理条件
up
およびdown
は、時相論理演算子duration
を使用してギア間の遷移を制御します。条件は、自動車の速度が、選択されているギアの動作範囲外である時間が所定時間TWAIT
(秒単位で測定) よりも長くなったときに有効になります。
モデルのシミュレーションを実行するには、次を行います。
User Inputs ブロックをダブルクリックします。Signal Editor ダイアログ ボックスの [アクティブなシナリオ] リストで、事前定義されたブレーキ対スロットルのプロファイルを選択します。既定のプロファイルは
Passing Maneuver
です。[実行] をクリックします。Stateflow エディターでは、チャート アニメーションによって、シミュレーション中にアクティブ ステートが強調表示されます。アニメーション速度を遅くするには、[デバッグ] タブで、[アニメーション速度] ドロップダウン リストから
Slow
を選択します。Scope ブロックで、シミュレーションの結果を確認します。シミュレーション中に、選択されたギアのグラフがスコープに表示されます。