Main Content

ステートを使用した動作モードの表現

"ステート" とは、リアクティブ システムの動作モードを記述するものです。Stateflow® チャートでは、ステートは、状態遷移図を作成するための順序設計に使用されます。

ステートは、シミュレーション中にアクティブまたは非アクティブのいずれかになります。ステートのアクティビティはイベントと条件によって変化します。イベントにより、ステートがアクティブまたは非アクティブになり、状態遷移図が実行されます。詳細については、Stateflow チャートの実行を参照してください。

システム内の複数のレベルのコンポーネントを表現するには、サブステートをスーパーステート内に入れ子にしてステートの階層を作成します。詳細については、ステートの階層を使用した複雑なマルチレベル ステートの設計を参照してください。

相互に排他的な動作モードをモデル化するには、同時にアクティブになるサブステートが最大で 1 つになるように、ステートで排他的 (OR) 構造を有効にします。同時に実行される動作モードを実装するには、すべてのサブステートが同時にアクティブになるように、ステートでパラレル (AND) 構造を有効にします。詳細については、ステート構造を使用した排他的モードとパラレル モードの定義を参照してください。

たとえば、次のチャートのステート PowerOnPowerOff は、空調機システムのオンとオフのモードを表しています。ステート PowerOn には、1 組のファンの動作モードを表す FAN1FAN2 というパラレル サブステートがあります。これらのステートのそれぞれに OnOff という排他的サブステートが含まれています。この例の詳細については、パラレル構造を使用した同期サブシステムのモデル化を参照してください。

Chart that contains a hierarchy of exclusive and parallel states that represent the operating modes of an air controller system.

ステートの作成

Stateflow チャートにステートを追加するには、次を行います。

  1. チャートを開きます。

  2. オブジェクト パレットで、ステート アイコン をクリックします。

  3. チャート キャンバスで、新しいステートの位置をクリックします。

  4. ステートのラベルを入力し、ステートの外側をクリックします。ラベルでは、ステートの名前とシミュレーション時にステートで実行するオプションのアクションを指定します。詳細については、ステートのアクションの定義を参照してください。

ステートを作成した後、Stateflow エディターを使用してステートのサイズ、位置、内容を変更できます。

  • ステートのサイズを変更するには、ステートの隅をクリックしてドラッグします。

  • ステートを移動するには、ステートの内側をクリックしてドラッグします。

  • ステートのラベルを編集するには、編集する文字の位置付近でラベル テキストをクリックします。

ヒント

親ステートは、そのサブステートすべてを含められるサイズのグラフィックであることが前提です。そのため、新しいサブステートをドラッグする前に、親ステートのサイズの変更が必要になることがあります。あるいは、スーパーステートをサブチャートに変換することもできます。詳細については、サブチャートを使用したモーダル ロジックのカプセル化を参照してください。

ステートのアクションの定義

ステートのラベルでは、ステートの名前とシミュレーション時にステートで実行するオプションのアクションを指定します。ステートのラベルはステートの左上隅に表示されます。一般的な形式は次のとおりです。

name entry: entry_actions during: during_actions exit: exit_actions on event_name: on_event_actions on message_name: on_message_actions bind: event_name, data_name

ステート アクションの順番は任意です。アクションのタイプごとに、各ステートメントを別々の行に入力して複数のステートメントを指定できます。あるいは、同じ行で複数のステートメントを区切るには、コンマまたはセミコロンを使用します。同じステートメントを実行する entryduring、および exit のアクションは組み合わせることもできます。詳細については、ステート アクションの組み合わせによる冗長コードの削除を参照してください。

ヒント

ステート名の直後にステートメントを追加すると、それらのステートメントはチャートで entry アクションと during アクションの組み合わせと解釈されます。

ステート名

ステートのラベルはステート名で始まり、オプションのスラッシュ (/) が続きます。ステート名は、大文字と小文字が区別され、英数字とアンダースコア文字の組み合わせで構成されます。詳細については、Stateflow オブジェクトの命名のガイドラインを参照してください。

名前が競合するのを避けるために、兄弟であるステートに同じ名前を割り当てないでください。ただし、各ステートのフル ネームが一意であれば、複数のステートに同じステート名を使用できます。ステートのフル ネームは、ステートの階層に含まれる一連の先祖の名前をピリオドで区切って構成されます。たとえば、前の例の FAN1FAN2 に含まれるステートは、次の一意のフル ネームで識別されます。

  • PowerOn.FAN1.On

  • PowerOn.FAN1.Off

  • PowerOn.FAN2.On

  • PowerOn.FAN2.Off

entry アクション

entry アクションを追加するには、entry または en に続けて、コロン (:) と 1 つ以上のステートメントを入力します。これらのステートメントは、チャートでステートがアクティブになった時点で実行されます。たとえば、次のチャートでは、ステート PowerOffentry アクションにより、空調機システムがオフになると airflow の値がゼロに設定されます。詳細については、チャートまたはステートに入るを参照してください。

State with entry action.

during アクション

during アクションを追加するには、during または du に続けて、コロン (:) と 1 つ以上のステートメントを入力します。これらのステートメントは、チャートでステートがアクティブなときに、他のステートへの有効な遷移がないと実行されます。たとえば、次のチャートでは、ステート PowerOnduring アクションにより、空調機システムがオンのときに airflow の値が計算されます。詳細については、Stateflow チャートの実行を参照してください。

State with during action.

exit アクション

exit アクションを追加するには、exit または ex に続けて、コロン (:) と 1 つ以上のステートメントを入力します。これらのステートメントは、チャートでステートがアクティブなときに、ステートから出る遷移が発生した時点で実行されます。たとえば、次のチャートでは、ステート PowerOnexit アクションにより、空調機システムがオフになると airflow の値がゼロに設定されます。詳細については、ステートを出るを参照してください。

State with exit action.

on アクション

on アクションを追加するには、on に続けてイベントまたはメッセージの名前を入力し、その後にコロン (:) と 1 つ以上のステートメントを入力します。これらのステートメントは、チャートでステートがアクティブなときに、指定したイベントまたはメッセージを受け取った時点で実行されます。詳細については、イベントのブロードキャストによるモデル コンポーネントの同期メッセージ送信による Stateflow チャートとの通信を参照してください。

on アクションは、複数のイベントまたはメッセージに対してそれぞれ指定できます。たとえば、次のステートには、イベント E1E2 で異なる on アクションが含まれています。

State with multiple on actions.

複数のイベントが同時に発生する場合、対応する on アクションは、ステート ラベルでの表示順に実行されます。詳細については、Stateflow チャートの実行を参照してください。

ヒント

ステートでの on アクションのトリガーに、暗黙的イベント (changeenterexit など) や時相論理演算子 (afteratbeforeevery など) を使用できます。詳細については、暗黙的イベントを使用したチャート動作の制御および時相論理を使用したチャート実行の制御を参照してください。

bind アクション

bind アクションを追加するには、bind に続けて、コロン (:) と 1 つ以上のイベントまたはデータ オブジェクトの名前を入力します。複数のイベントおよびデータを区切るには、セミコロンまたはコンマを使用するか、イベントおよびデータを別々の行に入力します。たとえば、次のチャートのステート A には、イベント E とデータ オブジェクト x をステートにバインドする bind アクションがあります。

State with bind action that binds an event and a data object to the state.

bind アクションは、ステートがアクティブであるか非アクティブであるかに関係なく適用されます。バインドされたデータの読み取りやバインドされたイベントのリッスンは他のステートから行えますが、バインドされたデータの値の変更やバインドされたイベントのブロードキャストを行えるのは、バインドされたステートとその子だけです。それ以外の場合は、コンパイル時にエラーが発生します。

Function-Call イベントをステートにバインドすると、そのイベントが呼び出す Function-Call Subsystem もバインドされます。Function-Call Subsystem は、バインド ステートがアクティブになると有効になり、バインド ステートが非アクティブになると無効になります。詳細については、bind アクションによる Function-Call Subsystem の制御を参照してください。

複数のステートに同じデータまたはイベントをバインドするアクションがチャートに含まれていると、コンパイル時にエラーが発生します。

bind アクションは、MATLAB® のスタンドアロンの Stateflow チャートではサポートされません。

ステートのグループ化

ステートのグラフィカルな内容をグループ化すると単一のユニットとして扱えるので、チャートの編集を簡略化できます。たとえば、グループ化されたステートを移動すると、そのステートに含まれているサブステート、遷移、およびその他のグラフィカル オブジェクトも移動します。ステートをグループ化するには、ステートを右クリックし、コンテキスト メニューで [グループとサブチャート][グループ] を選択します。

ステートに含まれているオブジェクトを選択したり、他のグラフィカル オブジェクトをステートに移動したりするときは、その前にステートのグループ化を解除する必要があります。たとえば、ステートやグラフィカル関数をグループ化されたステートに移動しようとすると、無効な交差のエラーが発生します。ステートのグループ化を解除するには、ステートを右クリックし、コンテキスト メニューで [グループとサブチャート][グループ] の選択を解除します。

Stateflow エディターでは、グループ化されたステートはグループ化されていないステートよりも濃い色で表示されます。たとえば、次のチャートでは、ステート FAN1 はグループ化されていて、ステート FAN2 はグループ化されていません。

Stateflow chart that contains a grouped state called FAN1 and an ungrouped state called FAN2.

ステートのプロパティの指定

以下に示すプロパティを使用して、ステートが Stateflow チャート内の他のコンポーネントとどのように相互作用するかを指定できます。これらのプロパティは、[プロパティ インスペクター]、[モデル エクスプローラー] ダイアログ ボックス、または [ステート プロパティ] ダイアログ ボックスで変更できます。

[プロパティ インスペクター] を使用するには、次を行います。

  1. [モデル化] タブの [データの設計] で、[プロパティ インスペクター] を選択します。

  2. Stateflow エディターで、ステートを選択します。

  3. [プロパティ インスペクター] で、ステートのプロパティを編集します。

モデル エクスプローラーを使用するには、次を行います。

  1. [モデル化] タブの [データの設計] で、[モデル エクスプローラー] を選択します。

  2. [モデルの階層構造] ペインで、ステートを選択します。

  3. [ダイアログ] ペインで、ステートのプロパティを編集します。

ステートのプロパティ ダイアログ ボックスを使用するには、次を行います。

  1. Stateflow エディターで、ステートを右クリックします。

  2. [プロパティ] を選択します。

  3. プロパティ ダイアログ ボックスで、ステートのプロパティを編集します。

ステートのプロパティは、Stateflow.State オブジェクトを使用してプログラムで変更することもできます。Stateflow プログラム インターフェイスの詳細については、Stateflow API の概要を参照してください。

名前

ステートの名前。このプロパティは読み取り専用です。モデル エクスプローラーおよびステートのプロパティ ダイアログ ボックスでステート名のハイパーリンクをクリックすると、Stateflow エディターでステートが前面に移動します。

実行順序

パラレル (AND) ステートの実行順序。排他的 (OR) ステートの場合、このプロパティは表示されません。詳細については、パラレル ステートの実行順序を参照してください。

監視する出力の作成

ステートのアクティブ ステート データの出力端子を作成するかどうか。アクティブ ステート データによるステート アクティビティの監視を参照してください。

関数インライン オプション

生成コード内でのステート関数の外観。オプションは次のとおりです。

  • 自動 — 内部計算により、生成コード内のステート関数の外観が決まります。

  • インライン — ステート関数に対する呼び出しがコードで置き換えられます。ただし、関数が再帰の一部でない場合に限ります。

  • 関数 — ステート関数は別個の静的関数として実装されます。

詳細については、ステート関数の生成コード内インライン化 (Simulink Coder)を参照してください。このプロパティは、[プロパティ インスペクター] では使用できません。

ラベル

ステートのラベル。詳細については、ステートのアクションの定義を参照してください。このプロパティは、[プロパティ インスペクター] では使用できません。

自己アクティビティのログ

信号のログを有効にするかどうか。信号のログでは、シミュレーション中にステートの自己アクティビティが MATLAB ワークスペースに保存されます。詳細については、ステートとデータのシミュレーション出力のログを参照してください。

ログ名

ステート アクティビティのログの記録に使用する信号名。

  • ステートの名前を使用するには、[ステート名を使用] を選択します。

  • 別の名前を指定するには、[カスタム] を選択してカスタムのログ名を入力します。

データ点の制限

ログに記録するデータ点の数を指定した最大数までに制限するかどうか。たとえば、データ点の最大数を 5000 に設定すると、チャートではシミュレーションで生成された最後の 5000 データ点のみがログに記録されます。

間引き

指定した間引き間隔を使用してサンプルをスキップすることでログ データの量を制限するかどうか。たとえば、間引き間隔を 2 に設定すると、チャートでサンプルが 1 つおきにログに記録されます。

テスト ポイント

シミュレーション時にフローティング スコープで監視できるテスト ポイントとしてステートを設定するかどうか。テスト ポイントの値を MATLAB ワークスペースにログ記録することも可能です。詳細については、Stateflow チャートのテスト ポイントの監視を参照してください。

説明

ステートの説明。

ドキュメント リンク

ステートのオンライン ドキュメンテーションへのリンク。HTML ファイルまたは MATLAB コマンド ウィンドウのテキストとしてドキュメンテーションを表示する、Web の URL アドレスまたは MATLAB コマンドを入力できます。[ドキュメント リンク] ハイパーリンクをクリックすると、Stateflow でリンクが評価され、ドキュメンテーションが表示されます。

参考

オブジェクト

ツール

関連するトピック