Main Content

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

Stateflow チャートの作成と実行

Stateflow® チャートは、有限ステート マシンのグラフィカル表現であり、ステート、遷移、およびデータで構成されています。Stateflow チャートを作成すると、外部の入力信号、イベント、および時間ベースの条件に対する MATLAB® アルゴリズムまたは Simulink® モデルの反応を定義できます。

たとえば、次の Stateflow チャートは半波整流器の基礎となるロジックを示しています。チャートには OnOff というラベルの 2 つのステートが含まれています。On ステートでは、チャートの出力信号 y が入力 x と等しくなっています。Off ステートでは、出力信号がゼロに設定されます。何らかのしきい値 t0 を入力信号が横切ると、チャートはこれらのステート間で遷移します。各ステートのアクションにより、シミュレーションのタイム ステップごとに y の値が更新されます。

Stateflow chart with two states.

この例では、Simulink でのシミュレーションおよび MATLAB での実行用にこの Stateflow チャートを作成する方法を説明します。

Stateflow チャートの作成

Stateflow エディターを開く

Stateflow エディターは、状態遷移図、フロー チャート、状態遷移表、および真理値表を設計するためのグラフィカルな環境です。Stateflow エディターを開く前に、ニーズに最も適しているチャート実行モードを決定します。

  • 条件付き、イベントベース、および時間ベースのロジックを周期的または連続時間の Simulink アルゴリズム向けにモデル化するには、関数 sfnew を使用し、Simulink モデル内のブロックとしてシミュレーションを行える Stateflow チャートを作成します。MATLAB コマンド プロンプトで、次のように入力します。

    sfnew rectify     % create chart for simulation in a Simulink model

    Simulink で、空の Stateflow Chart ブロックを含む rectify というモデルが作成されます。Stateflow エディターを開くには、チャート ブロックをダブルクリックします。

  • 再利用可能なステート マシンとタイミング ロジックを MATLAB アプリケーション向けに設計するには、関数 edit を使用し、MATLAB オブジェクトとして実行できるスタンドアロンの Stateflow チャートを作成します。MATLAB コマンド プロンプトで、次のように入力します。

    edit rectify.sfx  % create chart for execution as a MATLAB object

    ファイル rectify.sfx が存在しない場合、Stateflow エディターに rectify という名前の空のチャートが作成されます。

Stateflow エディターの主要なコンポーネントは、チャート キャンバス、オブジェクト パレット、および [シンボル] ペインです。

  • チャート キャンバスは、ステート、遷移、およびその他のグラフィカル要素を組み合わせてチャートを作成するための描画領域です。

  • キャンバスの左側にあるオブジェクト パレットには、チャートにグラフィカル要素を追加するための一連のツールが表示されます。

  • キャンバスの右側にある [シンボル] ペインでは、チャートに新しいデータ、イベント、およびメッセージを追加して未定義や未使用のシンボルをすべて解決します。

Default view of the Stateflow Editor.

ヒント

Stateflow チャートを作成した後は、その内容を実行モードの異なる別のチャートにコピーすることができます。たとえば、MATLAB での実行用にチャートを作成して、その内容を Simulink でのシミュレーション用のチャートにコピーできます。

ステートと遷移の追加

  1. オブジェクト パレットで [ステート] アイコン をクリックし、ポインターをチャート キャンバスに移動します。ステートがそのデフォルト遷移とともに表示されます。ステートを配置するには、キャンバス上の位置をクリックします。テキスト プロンプトで、ステートの名前 On とステート アクション y = x を入力します。

    Chart with one state, On.

  2. ステートをもう 1 つ追加します。On ステートを右クリックしてドラッグします。青いグラフィカル キューはステートを横または縦に揃えるために役立ちます。新しいステートの名前が Off に変わります。ステートをダブルクリックしてステート アクションを y = 0 に変更します。

    Chart with two states, On and Off.

  3. 2 つのステートを揃えなおし、2 つのステート間のスペースで一時停止します。青い遷移キューは、ステートを接続できるいくつかの方法を示しています。遷移を追加するには、該当するキューをクリックします。

    あるいは、遷移を描くために、一方のステートのエッジをクリックし、もう一方のステートのエッジまでドラッグします。

    Chart with the two states joined by transitions.

  4. 各遷移をダブルクリックして、適切な遷移条件 x<t0 または x>=t0 を入力します。条件が大かっこ内に表示されます。

    Chart with transition conditions.

  5. チャートをクリーンアップします。

    • より明確にするため、各遷移ラベルをその対応する遷移の上または下の適した場所に移動します。

    • チャートのグラフィカル要素を整列させてサイズを変更するには、[書式設定] タブで [自動調整] をクリックするか、Ctrl+Shift+A を押します。

    • キャンバスに合わせてチャートのサイズを変更するには、スペース バーを押すか [ビューに合わせる] アイコン をクリックします。

未定義のシンボルの解決

チャートを実行できるようにするには、チャート内で使用するシンボルをそれぞれ定義し、スコープ (入力データ、出力データ、ローカル データなど) を指定しなければなりません。[シンボル] ペインでは、未定義のシンボルに赤のエラー バッジ のマークが付いています。[タイプ] 列には、未定義のシンボルに推奨されるスコープが、チャート内での用途に基づいて表示されます。

  1. [シンボル] ペインを開きます。

    • チャートを Simulink モデル内に作成している場合、[モデル化] タブの [データの設計][[シンボル] ペイン] を選択します。

    • MATLAB で実行するスタンドアロン チャートを作成している場合、[ステート チャート] タブで、[データの追加][[シンボル] ペイン] を選択します。

  2. [シンボル] ペインで [未定義のシンボルを解決] をクリックします。

    • Simulink モデル内でチャートを作成する場合、Stateflow エディターはシンボル x および t0 を入力データ に、y を出力データ に解決します。

    • MATLAB での実行用にスタンドアロンのチャートを作成する場合、Stateflow エディターは t0x および y をローカル データ に解決します。

    Before and after views of the Symbols pane resolving the undefined symbols t0, x, and y.

  3. しきい値 t0 はシミュレーション中は変わらないため、スコープを定数データに変更します。[タイプ] 列で、t0 の横のデータ型アイコンをクリックして [定数データ] を選択します。

  4. しきい値 t0 の値を設定します。[値] 列で、t0 の横の空白のエントリをクリックして、0 の値を入力します。

  5. Stateflow チャートを保存します。

これで、チャートを Simulink でシミュレートするか、MATLAB で実行する準備ができました。

Simulink ブロックとしてのチャートのシミュレーション

Simulink モデル内でチャートをシミュレートするには、入出力端子を使用して、チャート ブロックをモデル内の他のブロックに接続します。MATLAB コマンド ウィンドウからチャートを実行する場合は、MATLAB オブジェクトとしてのチャートの実行を参照してください。

  1. Simulink エディターに戻るには、キャンバス上部のエクスプローラー バーで、Simulink モデルの名前 [rectify] をクリックします。エクスプローラー バーが表示されない場合は、オブジェクト パレットの上部にある [エクスプローラー バーの非表示/表示] アイコン をクリックします。

  2. モデルにソースを追加します。

    • Simulink Sources ライブラリから、Sine Wave (Simulink) ブロックを追加します。

    • Sine Wave ブロックをダブルクリックして [サンプル時間] を 0.2 に設定します。

    • Sine Wave ブロックの出力を Stateflow チャートの入力に接続します。

    • 信号に x というラベルを付けます。

  3. モデルに Sink を追加します。

    • Simulink Sinks ライブラリから、2 つの入力端子をもつ Scope (Simulink) ブロックを追加します。

    • Sine Wave ブロックの出力を、Scope ブロックの 1 つ目の入力に接続します。

    • Stateflow チャートの出力を、Scope ブロックの 2 つ目の入力に接続します。

    • 信号に y というラベルを付けます。

  4. Simulink モデルを保存します。

    In a Simulink model, a Sine Wave block creates an input signal for the chart. A Scope block plots the input and output of the chart.

  5. モデルをシミュレートするには、[実行] をクリックします。シミュレーション中、Stateflow エディターではチャート アニメーションによってアクティブ ステートと遷移が強調表示されます。

  6. モデルをシミュレートした後に、Scope ブロックをダブルクリックします。スコープにチャートの入力信号と出力信号のグラフが表示されます。

    Scope block showing the input and output of the chart.

    シミュレーションの結果には、整流器が負の入力値をフィルターで除外することが示されています。

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

MATLAB コマンド ウィンドウでチャートを実行するには、チャート オブジェクトを作成して、その関数 step を呼び出します。Simulink モデル内でチャートをシミュレートする場合は、Simulink ブロックとしてのチャートのシミュレーションを参照してください。

  1. チャート定義を関数として含む sfx ファイルの名前を使用して、チャート オブジェクト r を作成します。チャート データ x の初期値を、名前と値のペアとして指定します。

    r = rectify(x=0);
  2. チャート実行のために入出力データを初期化します。ベクトル X には、正弦波からの入力値が含まれています。ベクトル Y は空のアキュムレータです。

    T = 0:0.2:10;
    X = sin(T);
    Y = [];
  3. 関数 step を複数回呼び出して、チャート オブジェクトを実行します。ベクトル X の個々の値をチャート データ x として渡します。結果として得られた y の値をベクトル Y で収集します。実行中、Stateflow エディターではチャート アニメーションによってアクティブ ステートと遷移が強調表示されます。

    for i = 1:51
        step(r,x=X(i));
        Y(i) = r.y;
    end
  4. チャート オブジェクト r を MATLAB ワークスペースから削除します。

    delete(r)
  5. チャート実行の結果を調べます。たとえば、関数 stairs を呼び出すと、XY の値を比較する階段状グラフを作成できます。

    ax1 = subplot(2,1,1);
    stairs(ax1,T,X,color="#0072BD")
    title(ax1,"x")
    
    ax2 = subplot(2,1,2);
    stairs(ax2,T,Y,color="#D95319")
    title(ax2,"y")

    MATLAB figure showing the input and output of the chart.

    実行の結果には、整流器が負の入力値をフィルターで除外することが示されています。

関連するトピック