Stateflow チャートの作成と実行
Stateflow® チャートは、有限ステート マシンのグラフィカル表現であり、ステート、遷移、およびデータで構成されています。Stateflow チャートを作成すると、外部の入力信号、イベント、および時間ベースの条件に対する MATLAB® アルゴリズムまたは Simulink® モデルの反応を定義できます。
たとえば、次の Stateflow チャートは半波整流器の基礎となるロジックを示しています。チャートには On
と Off
というラベルの 2 つのステートが含まれています。On
ステートでは、チャートの出力信号 y
が入力 x
と等しくなっています。Off
ステートでは、出力信号がゼロに設定されます。何らかのしきい値 t0
を入力信号が横切ると、チャートはこれらのステート間で遷移します。各ステートのアクションにより、シミュレーションのタイム ステップごとに y
の値が更新されます。
この例では、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 エディターの主要なコンポーネントは、チャート キャンバス、オブジェクト パレット、および [シンボル] ペインです。
チャート キャンバスは、ステート、遷移、およびその他のグラフィカル要素を組み合わせてチャートを作成するための描画領域です。
キャンバスの左側にあるオブジェクト パレットには、チャートにグラフィカル要素を追加するための一連のツールが表示されます。
キャンバスの右側にある [シンボル] ペインでは、チャートに新しいデータ、イベント、およびメッセージを追加して未定義や未使用のシンボルをすべて解決します。
ヒント
Stateflow チャートを作成した後は、その内容を実行モードの異なる別のチャートにコピーすることができます。たとえば、MATLAB での実行用にチャートを作成して、その内容を Simulink でのシミュレーション用のチャートにコピーできます。
ステートと遷移の追加
オブジェクト パレットで [ステート] アイコン
をクリックし、ポインターをチャート キャンバスに移動します。ステートがそのデフォルト遷移とともに表示されます。ステートを配置するには、キャンバス上の位置をクリックします。テキスト プロンプトで、ステートの名前
On
とステート アクションy = x
を入力します。ステートをもう 1 つ追加します。
On
ステートを右クリックしてドラッグします。青いグラフィカル キューはステートを横または縦に揃えるために役立ちます。新しいステートの名前がOff
に変わります。ステートをダブルクリックしてステート アクションをy = 0
に変更します。2 つのステートを揃えなおし、2 つのステート間のスペースで一時停止します。青い遷移キューは、ステートを接続できるいくつかの方法を示しています。遷移を追加するには、該当するキューをクリックします。
あるいは、遷移を描くために、一方のステートのエッジをクリックし、もう一方のステートのエッジまでドラッグします。
各遷移をダブルクリックして、適切な遷移条件
x<t0
またはx>=t0
を入力します。条件が大かっこ内に表示されます。チャートをクリーンアップします。
より明確にするため、各遷移ラベルをその対応する遷移の上または下の適した場所に移動します。
チャートのグラフィカル要素を整列させてサイズを変更するには、[書式設定] タブで [自動調整] をクリックするか、Ctrl+Shift+A を押します。
キャンバスに合わせてチャートのサイズを変更するには、スペース バーを押すか [ビューに合わせる] アイコン
をクリックします。
未定義のシンボルの解決
チャートを実行できるようにするには、チャート内で使用するシンボルをそれぞれ定義し、スコープ (入力データ、出力データ、ローカル データなど) を指定しなければなりません。[シンボル] ペインでは、未定義のシンボルに赤のエラー バッジ のマークが付いています。[タイプ] 列には、未定義のシンボルに推奨されるスコープが、チャート内での用途に基づいて表示されます。
[シンボル] ペインを開きます。
チャートを Simulink モデル内に作成している場合、[モデル化] タブの [データの設計] で [[シンボル] ペイン] を選択します。
MATLAB で実行するスタンドアロン チャートを作成している場合、[ステート チャート] タブで、[データの追加] 、 [[シンボル] ペイン] を選択します。
[シンボル] ペインで [未定義のシンボルを解決]
をクリックします。
Simulink モデル内でチャートを作成する場合、Stateflow エディターはシンボル
x
およびt0
を入力データに、
y
を出力データに解決します。
MATLAB での実行用にスタンドアロンのチャートを作成する場合、Stateflow エディターは
t0
、x
およびy
をローカル データに解決します。
しきい値
t0
はシミュレーション中は変わらないため、スコープを定数データに変更します。[タイプ] 列で、t0
の横のデータ型アイコンをクリックして[定数データ]
を選択します。しきい値
t0
の値を設定します。[値] 列で、t0
の横の空白のエントリをクリックして、0 の値を入力します。Stateflow チャートを保存します。
これで、チャートを Simulink でシミュレートするか、MATLAB で実行する準備ができました。
Simulink ブロックとしてのチャートのシミュレーション
Simulink モデル内でチャートをシミュレートするには、入出力端子を使用して、チャート ブロックをモデル内の他のブロックに接続します。MATLAB コマンド ウィンドウからチャートを実行する場合は、MATLAB オブジェクトとしてのチャートの実行を参照してください。
Simulink エディターに戻るには、キャンバス上部のエクスプローラー バーで、Simulink モデルの名前
[rectify]
をクリックします。エクスプローラー バーが表示されない場合は、オブジェクト パレットの上部にある [エクスプローラー バーの非表示/表示] アイコンをクリックします。
モデルにソースを追加します。
Simulink Sources ライブラリから、Sine Wave (Simulink) ブロックを追加します。
Sine Wave ブロックをダブルクリックして [サンプル時間] を 0.2 に設定します。
Sine Wave ブロックの出力を Stateflow チャートの入力に接続します。
信号に
x
というラベルを付けます。
モデルに Sink を追加します。
Simulink Sinks ライブラリから、2 つの入力端子をもつ Scope (Simulink) ブロックを追加します。
Sine Wave ブロックの出力を、Scope ブロックの 1 つ目の入力に接続します。
Stateflow チャートの出力を、Scope ブロックの 2 つ目の入力に接続します。
信号に
y
というラベルを付けます。
Simulink モデルを保存します。
モデルをシミュレートするには、[実行]
をクリックします。シミュレーション中、Stateflow エディターではチャート アニメーションによってアクティブ ステートと遷移が強調表示されます。
モデルをシミュレートした後に、Scope ブロックをダブルクリックします。スコープにチャートの入力信号と出力信号のグラフが表示されます。
シミュレーションの結果には、整流器が負の入力値をフィルターで除外することが示されています。
MATLAB オブジェクトとしてのチャートの実行
MATLAB コマンド ウィンドウでチャートを実行するには、チャート オブジェクトを作成して、その関数 step
を呼び出します。Simulink モデル内でチャートをシミュレートする場合は、Simulink ブロックとしてのチャートのシミュレーションを参照してください。
チャート定義を関数として含む
sfx
ファイルの名前を使用して、チャート オブジェクトr
を作成します。チャート データx
の初期値を、名前と値のペアとして指定します。r = rectify(x=0);
チャート実行のために入出力データを初期化します。ベクトル
X
には、正弦波からの入力値が含まれています。ベクトルY
は空のアキュムレータです。T = 0:0.2:10; X = sin(T); Y = [];
関数
step
を複数回呼び出して、チャート オブジェクトを実行します。ベクトルX
の個々の値をチャート データx
として渡します。結果として得られたy
の値をベクトルY
で収集します。実行中、Stateflow エディターではチャート アニメーションによってアクティブ ステートと遷移が強調表示されます。for i = 1:51 step(r,x=X(i)); Y(i) = r.y; end
チャート オブジェクト
r
を MATLAB ワークスペースから削除します。delete(r)
チャート実行の結果を調べます。たとえば、関数
stairs
を呼び出すと、X
とY
の値を比較する階段状グラフを作成できます。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")
実行の結果には、整流器が負の入力値をフィルターで除外することが示されています。