Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

有限ステート マシンのモデル化

Stateflow® は、"有限ステート マシン" に基づくグラフィカルなプログラミング環境です。Stateflow を使用して設計のテストとデバッグを行い、さまざまなシミュレーション シナリオを検討し、ステート マシンからコードを生成することができます。

有限ステート マシンは、1 つの動作モード (ステート) から別のモードへと遷移する動的システムを表現したものです。ステート マシンには次の特徴があります。

  • 複雑なソフトウェア設計プロセスにおける高水準の開始点として機能する。

  • 動作モードと、1 つのモードから次のモードへの移行に必要な条件に注目できる。

  • モデルの複雑度が増しても明確さと簡潔さが維持されるようなモデルの設計に役立つ。

制御システムの設計は、複雑なロジックを管理するためのステート マシンに大きく依存します。用途には、航空機、自動車、およびロボティクスの制御システムの設計が含まれます。

Stateflow チャートの例

Stateflow チャートでは、ステート、遷移、およびデータを組み合わせて有限ステート マシンを実装します。この Stateflow チャートは、自動車の 4 速オートマチック トランスミッション システムのギアをシフトするロジックの簡易モデルを示しています。チャートでは、ギアの各ポジションが firstsecondthirdfourth というラベルの付いた四角形で示されるステートによって表されます。これらのステートは、それぞれが表すギアと同様に排他的なので、一度に 1 つのステートのみがアクティブになります。

Stateflow chart with states labeled first, second, third, and fourth. The chart transitions between the states when the speed is higher or lower than a specified amount.

図の左側の矢印はデフォルト遷移を表し、最初にアクティブになるステートを示しています。チャートを実行すると、キャンバスでこのステートが強調表示されます。他の矢印はステート間で可能な遷移を示しています。ステート マシンのダイナミクスを定義するには、それぞれの遷移を論理条件またはトリガー イベントに関連付けます。たとえば、このチャートは自動車の速度を監視して、速度がある固定のしきい値を横切ると別のギアにシフトします。シミュレーション中、異なるステートがアクティブになるとチャートの強調表示が変わります。

Chart animation showing states and transitions activating.

このチャートは、エンジン スピードやトルクなどの重要な要因を無視したシンプルな設計を提供します。この Stateflow チャートを、MATLAB® や Simulink® 内の他のコンポーネントとリンクすることにより、さらに包括的で現実的なモデルを作成できます。次の例で、可能な 3 つの手法を説明します。

チャートを MATLAB オブジェクトとして実行

この例では、ステートの階層、時相論理、入力イベントを組み込んだオートマチック トランスミッション システムの修正バージョンを示します。

  • 階層: チャートは、前の例の 4 速オートマチック トランスミッション チャートを囲むスーパーステート gear_logic で構成されます。このスーパーステートが、自動車の速度と加速度を制御します。実行中、gear_logic は常にアクティブです。

  • 時相論理: ステート gear_logic では、アクション on every(0.25,sec) が自動車の速度を決定します。演算子 every で作成される MATLAB タイマーにより、チャートが実行され、チャート データ speed が 0.25 秒ごとに更新されます。

  • 入力イベント: 入力イベント SpeedUpCruise および 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_stateselection_state は、破線の境界をもつ四角形として表示されます。これらのステートは、その中にあるサブステートのオンとオフが切り替わっても、同時に動作します。

  • アクティブ ステート データ: 出力値 gear にはシミュレーション時のギアの選択が反映されます。チャートは gear_state のアクティブなサブステートからこの値を生成します。

  • ローカル イベント: このチャートは、論理式条件の代わりにローカル イベント UP および DOWN を使用してギア間の遷移をトリガーします。これらのイベントは、自動車の速度が選択されたギアの動作範囲外になったときに、selection_state 内の send コマンドから発生します。Simulink 関数 calc_th は、選択されたギアとエンジンの速度に基づいて動作範囲の境界値を決定します。

  • 時相論理: 短時間の連続ギア チェンジを避けるために、selection_state は、時相論理演算子 after を使用して、UP イベントと DOWN イベントのブロードキャストを遅延させます。ギア チェンジに所定時間 TWAIT よりも長い時間が必要な場合にのみ、ステートはこれらのうちいずれかのイベントをブロードキャストします。

モデルのシミュレーションを実行するには、次を行います。

  1. User Inputs ブロックをダブルクリックします。Signal Editor ダイアログ ボックスの [アクティブなシナリオ] リストで、事前定義されたブレーキ対スロットルのプロファイルを選択します。既定のプロファイルは Passing Maneuver です。

  2. [実行] をクリックします。Stateflow エディターでは、チャート アニメーションによって、シミュレーション中にアクティブ ステートが強調表示されます。アニメーション速度を遅くするには、[デバッグ] タブで、[アニメーション速度] ドロップダウン リストから Slow を選択します。

  3. Scope ブロックで、シミュレーションの結果を確認します。各スコープには、シミュレーション中にその入力信号のグラフが表示されます。

時間条件を使用して Simulink ブロックとしてチャートをシミュレート

この例では、自動車のトランスミッション システムをモデル化する別の方法を示します。Stateflow チャートは、Simulink モデル内でブロックとして表示されます。モデル内の他のブロックは、関連する自動車のコンポーネントを表します。チャートは、入出力の接続を使ってデータを共有することにより、他のブロックと連動します。チャートを開くには、Gear_logic ブロックの左下隅にある矢印をクリックします。

このチャートはステートの階層、アクティブ ステート データ、および時相論理を組み合わせたものです。

  • 階層: このモデルでは、4 速オートマチック トランスミッション チャートをスーパーステート gear 内に配置します。スーパーステートは車両とエンジンの速度を監視してギア チェンジをトリガーします。ステート gear の左上隅にリストされているアクションは、選択されたギアの動作しきい値と、論理条件 up および down の値を決定します。ラベル en,du は、ステートがはじめてアクティブになるとき (en = entry) と、それ以降ステートがアクティブな間 (du = during) の各タイム ステップでステート アクションが実行されることを示します。

  • アクティブ ステート データ: 出力値 gear にはシミュレーション時のギアの選択が反映されます。チャートは gear のアクティブなサブステートからこの値を生成します。

  • 時相論理: 短時間の連続ギア チェンジを避けるために、論理条件 up および down は、時相論理演算子 duration を使用してギア間の遷移を制御します。条件は、自動車の速度が、選択されているギアの動作範囲外である時間が所定時間 TWAIT (秒単位で測定) よりも長くなったときに有効になります。

モデルのシミュレーションを実行するには、次を行います。

  1. User Inputs ブロックをダブルクリックします。Signal Editor ダイアログ ボックスの [アクティブなシナリオ] リストで、事前定義されたブレーキ対スロットルのプロファイルを選択します。既定のプロファイルは Passing Maneuver です。

  2. [実行] をクリックします。Stateflow エディターでは、チャート アニメーションによって、シミュレーション中にアクティブ ステートが強調表示されます。アニメーション速度を遅くするには、[デバッグ] タブで、[アニメーション速度] ドロップダウン リストから Slow を選択します。

  3. Scope ブロックで、シミュレーションの結果を確認します。シミュレーション中に、選択されたギアのグラフがスコープに表示されます。

以降の手順