Stateflow チャートを使用した有限ステート マシンのモデル化
"有限ステート マシン" は、変更の定義条件が真になった場合に動作モードが別の動作モードに遷移するイベントドリブンのリアクティブ システムの表現です。たとえば、ステート マシンを使用して、自動車のオートマチック トランスミッションを表す場合について考えてみます。トランスミッションには、パーキング、リバース、ニュートラル、ドライブ、1 速などの動作モードがあります。ドライバーがギアシフトを動かすと、システムの動作モードが別の動作モードに遷移します。
Stateflow ブロックのタイプ
有限ステート マシンの入力、出力、動作モードの関係を表現するために、Stateflow® ブロックを Simulink® モデルに追加して、状態遷移図、状態遷移表、および真理値表を作成できます。
Chart は、有限ステート マシンの状態遷移図に基づくグラフィカル表現です。Stateflow チャートでは、ステートと遷移によって順序論理システムの基本構成ブロックが形成されます。ステートは動作モードに対応し、遷移はステート間の経路を表します。詳細については、ステートを使用した動作モードの表現および動作モード間の遷移を参照してください。
State Transition Table は、順序モーダル ロジック用の有限ステート マシンを表形式で表現します。ステートと遷移を Stateflow チャートで描画する代わりに、状態遷移表を使用して、グラフィカル オブジェクトのメンテナンスが必要最小限で済む簡潔でコンパクトな形式でステート マシンをモデル化できます。詳細については、状態遷移表を使用した順序論理の表形式での表現を参照してください。
Truth Table は、表形式で組み合わせ論理設計を実装します。Truth Table ブロックを使用して、故障検出と管理、およびモード切り替えの論理判定をモデル化できます。詳細については、真理値表を使用して組み合わせ論理をモデル化を参照してください。
Stateflow チャートと State Transition Table ブロックで制御ロジックを実装するには、MATLAB® または C をアクション言語として使用できます。Truth Table ブロックでは、MATLAB のみをアクション言語として使用します。詳細については、アクション言語構文としての MATLAB と C の相違点を参照してください。
ヒント
ステート マシンのプログラミングの利点を MATLAB のすべての機能と組み合わせるために、スタンドアロンの Stateflow チャートを作成できます。スタンドアロンのチャートは、MATLAB オブジェクトとしてコマンド ウィンドウから直接実行するかスクリプトを使用して実行します。また、グラフィカル ユーザー インターフェイスを使用してチャートのステートを制御する MATLAB アプリをプログラミングすることもできます。詳細については、MATLAB オブジェクトとして実行する Stateflow チャートの作成を参照してください。
Stateflow チャートのプログラミング
有限ステート マシンをモデル化する Stateflow チャートを作成するには、次を行います。
関数
sfnew
を呼び出して、空の Stateflow チャートを含む Simulink モデルを作成します。sfnew
Stateflow エディターを開くには、チャート ブロックをダブルクリックします。Stateflow エディターの使用の詳細については、Stateflow エディターの操作を参照してください。
システムの各動作モードについて、ステートを使用した動作モードの表現の説明に従ってステートを描画し、ステート ラベルを追加してステート アクションを実装します。
複雑なシステムを整理するには、親ステート内に子ステートを描画してステートの階層を定義します。たとえば、同じステート アクションを共有するサブステートをスーパーステートを使用して囲むことができます。詳細については、ステートの階層を使用した複雑なマルチレベル ステートの設計を参照してください。
同時にアクティブになる動作モードをモデル化するには、親ステートでパラレル (AND) 構造を有効にします。詳細については、ステート構造を使用した排他的モードとパラレル モードの定義を参照してください。
ステート間のフロー ロジックの方向を表現するには、動作モード間の遷移の説明に従って遷移を描画し、遷移ラベルを追加して遷移条件を実装します。
最初にアクティブになる遷移にマークを付けるには、デフォルト遷移を使用します。詳細については、デフォルト遷移を使用した最初のサブステート アクティビティの指定を参照してください。
単一の遷移元から複数の遷移先へのパス、または複数の遷移元から単一の遷移先へのパスを作成するには、遷移とコネクティブ ジャンクションを結合します。詳細については、遷移とジャンクションを結合して分岐パスを作成を参照してください。
システムに入力や出力がある場合や、システムが状態変数に依存する場合は、Stateflow データの追加の説明に従って、入力データ、出力データ、ローカル データを追加します。
システムがイベント トリガーに反応する場合や、システムでチャートのアクションやモデル内の他のブロックのアクションをトリガーする必要がある場合は、イベントのブロードキャストによるモデル コンポーネントの同期の説明に従って、入力イベント、出力イベント、ローカル イベントを追加します。
チャートに複雑なステート アクションや遷移条件がある場合は、再利用可能な関数をチャートに追加します。ステート アクションや遷移条件での計算の種類に応じて、次の関数から最も自然な関数形式を選択して使用します。
グラフィカル関数 — ロジックと反復ループのパターンを含むフロー チャートをカプセル化します。グラフィカル関数の定義によるロジック パターンの再利用を参照してください。
MATLAB 関数 — データ解析と可視化のための行列指向アルゴリズムを記述します。MATLAB 関数の定義による MATLAB コードの再利用を参照してください。
Simulink 関数 — Simulink の Function-Call Subsystem を呼び出して設計を合理化します。Stateflow チャートでの Simulink 関数の再利用を参照してください。
真理値表 — 意思決定アプリケーション用の組み合わせ論理を表現します。真理値表を使用して組み合わせ論理をモデル化を参照してください。
あるいは、独自の C または C++ コードを記述してチャートに統合できます。詳細については、Stateflow チャートでのカスタム コードの再利用を参照してください。
入力端子と出力端子を使用して、チャートを Simulink モデル内の他のブロックに接続します。
モデルをシミュレートするには、[実行] をクリックします。シミュレーション中、Stateflow エディターではチャート アニメーションによってアクティブ ステートと遷移が強調表示されます。
このワークフローに関するチュートリアルについては、Stateflow チャートの作成と実行を参照してください。
参照
[1] Harel, David. "Statecharts: A Visual Formalism for Complex Systems." Science of Computer Programming 8, no.3 (June 1987): 231-74.
[2] Hatley, Derek J. and Imtiaz A. Pirbhai. Strategies for Real-Time System Specification. New York, NY: Dorset House Publishing, 1988.