Main Content

MATLAB オブジェクトとして実行する Stateflow チャートの作成

ステート マシンのプログラミングの利点を MATLAB® のすべての機能と組み合わせるために、スタンドアロンの Stateflow® チャートを Simulink® モデル外で作成します。スタンドアロンのチャートは拡張子 .sfx を付けて保存し、MATLAB オブジェクトとして実行します。チャート アニメーションおよびグラフィカル デバッグのツールを使用して設計を調整します。

スタンドアロンのチャートでは、次のような MATLAB アプリケーションを作成できます。

これらのアプリケーションは、Stateflow ライセンスなしで共有および実行できます。詳細については、スタンドアロンのチャートの共有を参照してください。

スタンドアロンのチャートの作成

スタンドアロンの Stateflow チャートを作成するには、関数 edit を使用して Stateflow エディターを開きます。たとえば、MATLAB コマンド ウィンドウで、次のように入力します。

edit chart.sfx
ファイル chart.sfx が存在しない場合、Stateflow エディターでは空のチャートが chart という名前で開きます。それ以外の場合、エディターでは sfx ファイルによって定義されているチャートが開きます。

Stateflow エディターで、ステート、遷移、データ、その他の要素を組み合わせて、スタンドアロンのチャートを作成します。詳細については、Stateflow チャートの作成と実行を参照してください。

スタンドアロンのチャートを保存した後、関数 help は、MATLAB でのチャートの実行に関する情報を表示します。

help chart.sfx

MATLAB コマンド ウィンドウからスタンドアロンのチャートを閉じるには、関数 sfclose を使用します。

sfclose chart

Stateflow チャート オブジェクトの作成

MATLAB でスタンドアロンのチャートを実行するには、まず Stateflow チャート オブジェクトを作成します。スタンドアロンのチャートの sfx ファイルの名前を関数として使用します。データの初期値は、名前と値のペアとして指定します。たとえば、data1 および data2 というデータ オブジェクトをもつスタンドアロンのチャートを定義したとします。この場合、次のコマンドは、チャート オブジェクト chartObject を作成し、data1data2 を初期化して、デフォルト遷移を実行します。

chartObject = chart(data1=value1,data2=value2)

実行の構文、チャート データの値、アクティブ ステートのリストなどのチャート情報を表示するには、関数 disp を使用します。

disp(chartObject)

スタンドアロンのチャートの実行

Stateflow チャート オブジェクトを定義した後、関数 step (必要に応じてデータ値を含める) を呼び出すことにより、スタンドアロンのチャートを実行できます。

step(chartObject,data1=value1,data2=value2)

あるいは、次のいずれかの入力イベント関数を呼び出すこともできます。

event_name(chartObject,data1=value1,data2=value2)

いずれの場合でも、値はチャートの実行前にローカル データに割り当てられます。

チャートにグラフィカル関数または MATLAB 関数が含まれている場合は、それらを MATLAB コマンド ウィンドウで直接呼び出すことができます。チャート関数を呼び出しても、スタンドアロンのチャートは実行されません。

function_name(chartObject,u1,u2)

メモ

nargin をチャート内のグラフィカル関数または MATLAB 関数で使用する場合、nargin は、チャート オブジェクトを入力引数の 1 つとしてカウントします。nargin の値は、関数をチャートと MATLAB コマンド ウィンドウのどちらから呼び出す場合でも同じです。

スタンドアロンのチャートは、Stateflow エディターを開かずに実行できます。チャートが開いている場合、Stateflow エディターでは、チャート アニメーションによってアクティブ ステートと遷移が強調表示されます。

デバッグや単体テストの目的で、Stateflow エディターから直接スタンドアロンのチャートを実行することができます。実行中に、ユーザー インターフェイスからデータ値を入力し、イベントをブロードキャストします。詳細については、Stateflow チャート オブジェクトの実行と単位テストを参照してください。

スタンドアロンのチャートは、MATLAB スクリプト、Simulink モデル、または App Designer のユーザー インターフェイスから実行できます。詳細については、以下を参照してください。

チャートの実行の停止

チャートの実行を停止するには、関数 delete を呼び出してチャート オブジェクトを破棄します。

delete(chartObject)

チャート オブジェクトが削除された後、そのチャート オブジェクトへのハンドルはすべてワークスペースに残りますが、無効になります。ワークスペースから無効なハンドルを削除するには、コマンド clear を使用します。

clear chartObject

有効なチャート オブジェクト ハンドルをクリアしても、同じチャート オブジェクトへの他のハンドルが存在する場合は、チャート オブジェクトは破棄されません。たとえば、チャートを実行する際、Stateflow エディターにはチャート オブジェクトへの内部ハンドルが含まれています。ワークスペースからチャート オブジェクト ハンドルをクリアしても、チャート オブジェクトは破棄されず、エディターからチャート アニメーションの強調表示は削除されません。アニメーションの強調表示をリセットするには、チャート キャンバスを右クリックして [強調表示の削除] を選択します。

スタンドアロンのチャートの共有

Stateflow のライセンスを持っていない共同作業の相手とスタンドアロンのチャートを共有できます。

共同作業の相手が自分と同じバージョン、またはそれより新しいバージョンの MATLAB を持っている場合、相手は Stateflow エディターを開かずに、MATLAB オブジェクトとしてスタンドアロンのチャートを実行できます。チャートのアニメーションとデバッグはサポートされません。実行時エラー メッセージは、チャート内のエラーが発生したステートや遷移にリンクしません。

メモ

R2019a または R2019b で保存したスタンドアロン チャートを実行するには、共同作業の相手は同じバージョンの MATLAB を使用していなければなりません。

共同作業の相手が MATLAB の以前のバージョンを使用している場合は、スタンドアロン チャートを相手が使用できる形式にエクスポートします。R2019a 以降のリリースにのみエクスポートできます。エクスポート処理を完了するには、エクスポート元とエクスポート先の Stateflow のバージョンにアクセスする必要があります。

  1. Stateflow の新しいバージョンを使用して、スタンドアロン チャートを開きます。

  2. [ステート チャート] タブで、[保存][以前のバージョン] を選択します。

  3. [前バージョンにエクスポート] ダイアログ ボックスで、エクスポートするチャートのファイル名を指定します。

  4. [ファイルの種類] リストで、チャートのエクスポート先となる、以前のバージョンを選択します。

  5. [保存] をクリックします。

  6. 古い方の Stateflow バージョンを使用して、エクスポートしたチャートを開き、再保存します。

チャートを MATLAB コマンド ウィンドウからエクスポートするには、Stateflow 関数 exportToVersion を呼び出します。詳細については、チャートを MATLAB の以前のバージョンにエクスポートを参照してください。

メモ

エクスポートされたチャートを、再保存する前に実行しようとすると、エラーが発生します。

Stateflow チャート オブジェクトのプロパティと関数

Stateflow チャート オブジェクトは、以下を提供することにより、単一の構造体でデータと演算をカプセル化します。

  • スタンドアロンのチャートの内部状態変数を含むプライベート プロパティ

  • チャートのセマンティクスを実装するさまざまな演算を呼び出す関数 step

チャート オブジェクトには、チャート内に存在するさまざまな要素に対応するその他のプロパティや関数も含まれる場合があります。

スタンドアロンのチャートの要素チャート オブジェクトの要素
ローカル データと定数データパブリック プロパティ
入力イベントチャートを実行する関数
グラフィカル関数と MATLAB 関数MATLAB コマンド ウィンドウから呼び出すことのできる関数

チャート オブジェクトの構成オプション

チャート オブジェクトを作成するときに、以下の構成オプションを名前と値のペアとして含めることでチャートの動作を指定できます。

構成オプション説明
-animationDelay各遷移セグメントを強調表示するためにチャート アニメーションが使用する遅延を指定します。既定値は 0.01 秒です。アニメーションの遅延がないチャートを生成するには、0 に設定します。

1 秒の遅延を指定することで、低速のアニメーションがあるチャート オブジェクトを作成します。

chartObject = chart('-animationDelay',1)

-enableAnimationチャート アニメーションとデバッグのインストルメント化を有効にします。既定値は true です。

アニメーションとデバッグのインストルメント化が無効にされているチャート オブジェクトを作成します。

chartObject = chart('-enableAnimation',false)

-eventQueueSizeイベントと時相論理演算に使用するキューのサイズを指定します。既定値は 20 です。イベントのキューを無効にするには、0 に設定します。詳細については、スタンドアロン チャートのイベントを参照してください。

チャートが他の演算を処理中に発生するすべてのイベントを警告なしで無視するチャート オブジェクトを作成します。

chartObject = chart('-eventQueueSize',0)

-executeInitStepデフォルト遷移の内部実行を有効にします。既定値は true です。

チャート オブジェクトを作成しますが、デフォルト遷移は実行しません。

chartObject = chart('-executeInitStep',false)

-warningOnUninitializedDataチャート オブジェクトの初期化後に、空のチャート データに関する警告を有効にします。既定値は true です。

チャート オブジェクト作成時に警告を回避します。

chartObject = chart('-warningOnUninitializedData',false)

チャート データの初期化

Stateflow エディターで、[シンボル] ペインを使用してチャート データの初期値を指定できます。チャート オブジェクトを作成すると、チャート データはそのスコープに従ってアルファベット順に初期化されます。定数データが最初に初期化されます。ローカル データは最後に初期化されます。

初期値を指定する式を使用する場合、チャートは以下の方法で式の解決を試みます。

  • チャート内の他のデータの値を使用

  • 検索パス上での関数の呼び出し

たとえば、式 y を使用して、ローカル データ x の初期値を指定するとします。その場合、次のようになります。

  • y という定数がチャートに含まれている場合は、yx より前に初期化されます。ローカル データ x には、y と同じ初期値が代入されます。

  • y というローカル データがチャートに含まれている場合は、xy より前に初期化されます。ローカル データ x は空の配列に代入されます。構成オプション -warningOnUninitializedDatatrue に設定されている場合は、警告が発生します。

  • y という名前のデータがチャートに含まれていない場合、x は関数 y を呼び出すことによって初期化されます。ファイル y.m が検索パスにない場合は、次のエラーが発生します。

    Undefined function or variable 'y'.

Stateflow では、MATLAB ワークスペースを検索して初期値を解決することはないため、このエラーは、y という変数が MATLAB ワークスペース内にある場合であっても発生します。

機能および制限事項

サポートされている機能

  • MATLAB をアクション言語とする Classic チャートのセマンティクス。Simulink でのコード生成が制限されている関数を含めて、MATLAB のすべての機能を使用できます。スクリプトとモデルを使用した Stateflow チャート オブジェクトの実行を参照してください。

    メモ

    スタンドアロンの Stateflow チャートでは、オペレーティング システムのコマンド記号 ! はサポートされません。オペレーティング システムのコマンドを実行するには、関数 system を使用します。

  • 階層をもつ排他的 (OR) およびパラレル (AND) ステート構造。ステート構造を使用した排他的モードとパラレル モードの定義ステートの階層を使用した複雑なマルチレベル ステートの設計を参照してください。

  • フロー チャート、グラフィカル関数および MATLAB 関数。チャート内の再利用可能なコンポーネントを参照してください。

  • パターン ウィザードを使用して MATLAB コードをグラフィカル関数に変換。MATLAB コードの Stateflow フロー チャートへの変換を参照してください。

  • チャートのローカル データと定数データ (型の制限なし)。Stateflow チャート オブジェクトの実行と単位テストを参照してください。

  • 入力イベント。Stateflow チャートを使用したヒューマンマシン インターフェイスのロジックの設計を参照してください。

  • ローカル データの値の変化を検出する演算子 hasChangedhasChangedFrom、および hasChangedTo

    メモ

    スタンドアロンの Stateflow チャートは、行列の要素または構造体内のフィールドでの変化検出をサポートしません。

  • 次の時相論理演算子。

    • afteratevery は入力イベント数、チャートの呼び出し回数 (tick)、絶対時間 (sec) に対して演算を行います。これらの演算子はステート on アクションで遷移トリガーとして使用します。

    • count は、チャートの呼び出し回数 (tick) に対して演算を行います。

    • temporalCount は、絶対時間 (secmsecusec) に対して演算を行います。

    • elapsed は、絶対時間 (sec) に対して演算を行います。

    スタンドアロン チャートは、絶対時間時相論理を時計時間で定義します。この時間の精度は 1 ミリ秒に制限されています。

  • チャートの実行時にアクティブなステートにアクセスする関数 getActiveStates。アクティブ ステートを cell 配列として保存するには、次のように入力します。

    states = getActiveStates(chartObject)

  • スタンドアロン チャートを等価の MATLAB クラスとしてエクスポートする Stateflow 関数 exportAsClass。この関数は、診断の難しい実行時エラーをデバッグするために使用します。たとえば、MATLAB アプリケーションを制御する Stateflow チャートの実行中にエラーが発生したとします。チャートを MATLAB クラス ファイルとしてエクスポートした場合、アプリケーション内のチャートをクラスに置き換えて、MATLAB デバッガーを使用してエラーを診断することができます。チャート chart.sfx をクラス ファイル chart.m としてエクスポートするには、次のように入力します。

    Stateflow.exportAsClass("chart.sfx")
    MATLAB クラスを実行する際、Stateflow エディターは元のチャートをアニメーション化しません。

制限

Simulink に固有の内容:

  • サンプル時間と連続時間のセマンティクス

  • C アクション言語

  • ステートとしての Simulink 関数および Simulink サブシステム

  • 入力、出力およびパラメーターのデータ

  • データ ストア メモリのデータ

  • 出力イベントとローカル イベント

  • 入力、出力およびローカルのメッセージ

その他の制限は次のとおりです。

  • Mealy や Moore のセマンティクスなし

  • 状態遷移表なし

  • 真理値表関数なし

  • ステートを親とするローカル データや関数なし

  • 遷移アクション (遷移元ステートからの出力後、遷移先ステートへの入力前に実行されるアクション) なし

参考

| | | | |

関連するトピック