アクティブ ステート データによるステート アクティビティの監視
アクティブ ステート データを使用すると、チャート階層との相関性が高いデータを維持する必要がないため、一部の Stateflow® チャートの設計を簡素化することができます。アクティブ ステート データを有効にすると、Stateflow は、出力端子を介して Simulink® へ、またはチャート内のローカル データとして、ステート アクティビティを報告します。アクティブ ステート データを使用すると、次のことが可能です。
チャート アクティビティを反映させる手動のデータ更新を回避する。
スコープ、シミュレーション データ インスペクター、またはロジック アナライザーを使用してチャート アクティビティを表示する。
診断のためにチャート アクティビティをログに記録する。
他の Simulink サブシステムを駆動する。
アクティブ ステート データの型
アクティブ ステート データを有効にすると、Stateflow では、アクティビティ タイプと一致する boolean または列挙データ オブジェクトが作成されます。
| アクティビティ タイプ | アクティブ ステートのデータ型 | 説明 |
|---|---|---|
| 自己アクティビティ | Boolean | ステートがアクティブかどうか |
| 子アクティビティ | Enumeration | アクティブな子はどれか |
| リーフ ステート アクティビティ | Enumeration | アクティブなリーフ ステートはどれか |
リーフ ステート アクティビティとは、子をもたないステートのアクティビティを指します。さらに、Stateflow では、パラレル (AND) 構造をもつサブステートはリーフ ステートとして扱われます。たとえば、以下のチャートでは、A1、A2、B がリーフ ステートです。言い換えれば、次のようになります。
OR 構造が設定されたステートは、子をもたなければリーフ ステートになります。
AND 構造が設定されたステートは、常にリーフ ステートになります。

似たチャートでも、ステート B が排他的 (OR) 構造でマークされていれば、A1、A2、B1、C1、C2 がリーフ ステートになります。

チャートまたはステートの自己アクティビティでは、アクティブな場合はデータ値が true に、非アクティブな場合は false になります。子アクティビティおよびリーフ ステート アクティビティの場合、データは列挙型になります。Stateflow で列挙型クラスを定義するか、手動で定義を作成できます。詳細については、ステート アクティビティの列挙型の定義を参照してください。
アクティブ ステート データは、Stateflow チャート、ステート、状態遷移表、Atomic サブチャートで有効にすることができます。以下の表は、各種の Stateflow オブジェクトでサポートされているアクティビティ タイプを示しています。
| Stateflow オブジェクト | 自己アクティビティ | 子アクティビティ | リーフ ステート アクティビティ |
|---|---|---|---|
| チャート | サポートなし | サポートあり | サポートあり |
| 排他的 (OR) 構造が設定されたステート | サポートあり | サポートあり | サポートあり |
| パラレル (AND) 構造が設定されたステート | サポートあり | サポートなし | サポートなし |
| Atomic サブチャート | コンテナー レベルのサポートあり | サブチャート内のサポートあり | サブチャート内のサポートあり |
| 状態遷移表 | サポートなし | サポートあり | サポートあり |
アクティブ ステート データの有効化
アクティブ ステート データは、[プロパティ インスペクター]、モデル エクスプローラー、または監視対象の Stateflow オブジェクトのプロパティ ダイアログ ボックスで有効にすることができます。
[プロパティ インスペクター] を使用するには、次を行います。
[モデル化] タブの [データの設計] で、[プロパティ インスペクター] を選択します。
Stateflow エディターで、監視対象の Stateflow オブジェクトを選択します。
[プロパティ インスペクター] の [監視] セクションで、[監視する出力の作成] を選択し、以下に示すアクティブ ステート データのプロパティを編集します。
モデル エクスプローラーを使用するには、次を行います。
[モデル化] タブの [データの設計] で、[モデル エクスプローラー] を選択します。
[モデルの階層構造] ペインで、監視対象の Stateflow オブジェクトをダブルクリックします。
[ダイアログ] ペインで、[監視する出力の作成] を選択し、以下に示すアクティブ ステート データのプロパティを編集します。
プロパティ ダイアログ ボックスを使用するには、次を行います。
Stateflow エディターで、監視対象の Stateflow オブジェクトを右クリックします。
[プロパティ] を選択します。
プロパティ ダイアログ ボックスで、[監視する出力の作成] を選択し、以下に示すアクティブ ステート データのプロパティを編集します。
アクティビティ タイプ
監視対象のステート アクティビティのタイプ。以下のオプションから選択します。
自己アクティビティ子アクティビティリーフ ステート アクティビティ
データ名
アクティブ ステート データ オブジェクトの名前。詳細については、Stateflow オブジェクトの命名のガイドラインを参照してください。
Enum 名
アクティブ ステート データ オブジェクトの列挙データ型の名前。このプロパティは、子アクティビティおよびリーフ ステート アクティビティにのみ適用されます。
手作業で列挙型を定義
列挙データ型を手動で定義するかどうかを指定します。このプロパティは、子アクティビティおよびリーフ ステート アクティビティにのみ適用されます。詳細については、ステート アクティビティの列挙型の定義を参照してください。
アクティブ ステート データのスコープの設定
既定では、アクティブ ステート データは Output のスコープをもっています。Stateflow は、Simulink モデル内のチャート ブロック上に出力端子を作成します。
Stateflow チャート内のアクティブ ステート データにアクセスするには、[シンボル] ペインまたはモデル エクスプローラーで、スコープを Local に変更します。
ローカルのアクティブ ステート データを Simulink.Signal (Simulink) オブジェクトにバインドすると、コード生成に関する情報を指定できます。オブジェクトのプロパティは、CoderInfo プロパティを使用して変更します。詳細については、Simulink.CoderInfo (Simulink)を参照してください。
ステート アクティビティの列挙型の定義
既定では、Stateflow は、子アクティビティおよびリーフ アクティビティに列挙データ型を定義します。[手作業で列挙型を定義] チェック ボックスがオンで、列挙データ型の定義が存在しない場合、Stateflow は、定義を作成するリンクを提供します。[テンプレートから列挙型定義を作成する] リンクをクリックすると、カスタマイズ可能な定義が生成されます。

列挙データ型の定義には、ステート名ごとに 1 つの列挙値が含まれます。既定では、定義には、列挙データ型の既定値として使用され、アクティブなサブステートがないことを示す列挙値が含まれます。たとえば、モデル sf_car 内では、ステート gear_state に、自動車のギアに対応する 4 つの子ステート (first、second、third、fourth) が含まれます。この例を開くには次のように入力します。
openExample("sf_car")このモデルでは、子アクティビティのデータ型を、次の列挙型クラス定義で指定します。
classdef gearType < Simulink.IntEnumType enumeration None(0), first(1), second(2), third(3), fourth(4) end ... end
列挙値を並べ替えるか、既定値の名前を変更することにより、この定義をカスタマイズできます。ステートに対応する列挙値の名前を変更したり、別の既定値を指定するのに getDefaultValue メソッドを使用したりしないでください。詳細については、列挙データ型の定義を参照してください。
ヒント
自動的に作成される列挙型の基本ストレージ型は、既定で Native Integer に設定されます。使用するメモリ フットプリントを小さくするには、[コンフィギュレーション パラメーター] ダイアログ ボックスを開き、[最適化] ペインで [自動的に作成される列挙型の基本ストレージ型] パラメーターの値を変更します。詳細については、自動的に作成される列挙の基本ストレージ型 (Simulink Coder)を参照してください。
ステート アクティビティとパラレル ステート
パラレル (AND) 構造をもつステートでは、パラレル サブステートが同時にアクティブとなるため、子アクティビティとリーフ ステート アクティビティは使用できません。
たとえば、以下のチャートのリーフ ステート アクティビティを有効にするとします。ステート B はパラレル構造であるため、そのサブステート B1 と B2 は同時にアクティブになります。よって、B はチャートのリーフ ステートとして処理されます。

シミュレーション中に、アクティブ ステートの出力データに接続されているスコープは、リーフ ステート A1、A2 および B の列挙値を示します。

アクティブ ステート データの制限
子アクティビティをもたないステートの子アクティビティ出力を有効にすると、コンパイル時および実行時にエラーが発生します。
パラレル構造のチャートまたはステート内では、子またはリーフ ステート アクティビティを有効にすることはできません。パラレル ステートのサブステートのステート アクティビティをチェックするには、
in演算子を使用します。詳細については、in 演算子を使用したステート アクティビティのチェックを参照してください。クラシック セマンティクスまたは Mealy のセマンティクスを使用するチャートでは、チャートのプロパティ [チャート実行ごとに出力を初期化] が有効になっている場合、アクティブ ステート データはサポートされません。
参考
オブジェクト
Simulink.Signal(Simulink) |Simulink.CoderInfo(Simulink)
ツール
- モデル エクスプローラー (Simulink)