Main Content

Stateflow チャートでのバリアント コンフィギュレーションの作成

この例では、バリアント遷移を使用して、単一の Stateflow® チャート内で複数の設計をモデル化する方法を説明します。各バリアント遷移は、システムのバリアント コンフィギュレーションを表す 1 つのステートにつながります。チャートからコードを生成する際に、使用するバリアント コンフィギュレーションを選択できます。既定では、生成コードには、選択したバリアント コンフィギュレーションの実行に必要なコードとデータのみが含まれます。

ランプ制御システムのバリアント コンフィギュレーション

この例では、Stateflow チャートはランプの制御システムをモデル化します。このチャートではバリアント コンフィギュレーションを使用して、3 つの可能なランプ設計を組み合わせます。

最も単純な設計は、単一のオンとオフのスイッチをもつ 1 つのランプで構成されます。この設計をモデル化するには、2 つのステート OnOff をもつ Stateflow チャートを作成します。これらのステートは、チャート出力 light をそれぞれ 0 または 100 に設定します。チャートは、入力イベント SWITCH_ONSWITCH_OFF を受け取ったときに、これらのステート間で遷移します。

より高度なランプ設計には、高と低の 2 つの設定をもつ調光器が含まれます。このランプ設計をモデル化するには、ステート On に 2 つのサブステートを追加できます。ランプがオンになると、サブステート High および Low はチャート出力 light の値をそれぞれ 100 または 50 に設定します。入力イベント DIM により、これらのサブステート間の遷移がトリガーされます。

最後に、3 つ目の設計では、高、中、低の 3 つの設定をもつ調光器を使用します。この設計をモデル化するチャートでは、ステート On に 3 つのサブステートが含まれ、それぞれがチャート出力 light の値を 10075、または 50 に設定します。入力イベント DIM により、High から MediumMedium から Low、および Low から High への遷移がトリガーされます。

この例では、これらの設計を組み合わせて 1 つの Stateflow チャートを作成します。ステート On において、サブステート Dimmer1Dimmer2、および NoDimmer はシステムのバリアント コンフィギュレーションを表します。バリアント遷移のペアはパラメーター HAS_DIMMER1 および HAS_DIMMER2 を評価し、これらの各サブステートへのエントリをガードします。

モデルのシミュレーション、コンパイル、またはモデルからのコード生成を行うと、バリアント遷移の条件によってアクティブなバリアント コンフィギュレーションが特定されます。非アクティブなバリアント コンフィギュレーションに対応するチャートの部分は、Stateflow キャンバスでグレー表示されます。たとえば、次のチャートでは、3 つの調光設定をもつバリアント コンフィギュレーションがアクティブになっています。

現在アクティブなバリアント コンフィギュレーションを変更するには、ベース ワークスペースでガード用のパラメーターを変更し、モデルを更新します。

バリアント コンフィギュレーション用のコードの生成

Stateflow チャートからコードを生成するには、Simulink Coder™ または Embedded Coder® がなければなりません。既定では、生成コードには、アクティブなバリアント コンフィギュレーションのコードとデータのみが含まれます。たとえば、3 つの調光設定をもつバリアント コンフィギュレーションを選択すると、生成コードでは以下の定数が定義されます。

/* Named constants for Chart: '<Root>/Lamp' */
#define sfVariantLam_IN_NO_ACTIVE_CHILD ((uint8_T)0U)
#define sfVariantLampE_event_SWITCH_OFF (1)
#define sfVariantLampEx_event_SWITCH_ON (2)
#define sfVariantLampExample_IN_High   ((uint8_T)1U)
#define sfVariantLampExample_IN_Low    ((uint8_T)2U)
#define sfVariantLampExample_IN_Medium ((uint8_T)3U)
#define sfVariantLampExample_IN_Off    ((uint8_T)1U)
#define sfVariantLampExample_IN_On     ((uint8_T)2U)
#define sfVariantLampExample_event_DIM (0)

Embedded Coder を使用している場合、Stateflow チャートのプロパティの指定で説明されているように、チャートのプロパティ [プリプロセッサの条件を生成] を有効にすることで、生成コードにプリプロセッサ条件 #if ステートメントを含めることができます。たとえば、このチャート プロパティを有効にした場合、生成コードでは、どのバリアント コンフィギュレーションがアクティブかに関係なく、以下の定数が定義されます。

/* Named constants for Chart: '<Root>/Lamp' */
#if HAS_DIMMER1 == 1 || HAS_DIMMER2 == 1
#define sfVariantLam_IN_NO_ACTIVE_CHILD ((uint8_T)0U)
#endif
#define sfVariantLampE_event_SWITCH_OFF (1)
#define sfVariantLampEx_event_SWITCH_ON (2)
#if HAS_DIMMER1 == 1 || HAS_DIMMER2 == 1
#define sfVariantLampExample_IN_High   ((uint8_T)1U)
#endif
#if HAS_DIMMER1 == 1 || HAS_DIMMER2 == 1
#define sfVariantLampExample_IN_Low    ((uint8_T)2U)
#endif
#if HAS_DIMMER1 == 1
#define sfVariantLampExample_IN_Medium ((uint8_T)3U)
#endif
#define sfVariantLampExample_IN_Off    ((uint8_T)1U)
#define sfVariantLampExample_IN_On     ((uint8_T)2U)
#define sfVariantLampExample_event_DIM (0)

コードの生成の詳細については、Simulink Coder を使用したコード生成 (Simulink Coder)およびEmbedded Coder を使用したコード生成 (Embedded Coder)を参照してください。

バリアント マネージャーによるバリアント コンフィギュレーションの管理

バリアント マネージャーを使用して、モデル内のバリアント コンフィギュレーションを管理できます。バリアント マネージャーを開くには、[モデル化] タブにある [データの設計] で、[バリアント マネージャー] を選択します。

バリアント マネージャーの使用方法の詳細については、Variant Manager for Simulink (Simulink)を参照してください。

バリアント遷移の使用に関するガイドライン

複数のシステム設計を単一のチャートでモデル化するには、1 つ以上のステートをもつ各バリアント コンフィギュレーションをバリアント遷移で接続して表します。以下のガイドラインに従います。

  • 各バリアント コンフィギュレーションへの遷移パスでは、バリアント遷移またはラベルが空の遷移を組み合わせることができます。

  • ベース ワークスペースで定義されている Simulink® パラメーターまたは MATLAB® 変数を使用して、各バリアント遷移をガードします。詳細については、Simulink および MATLAB ワークスペースとのパラメーターの共有Options to Represent Variant Parameters in Generated Code (Embedded Coder)を参照してください。

  • モデルのシミュレーション、コンパイル、またはモデルからのコード生成時に、どのバリアント コンフィギュレーションがアクティブであるかがチャートによって特定されるため、バリアント遷移には、イベント トリガーまたはメッセージ トリガー、条件アクション、または遷移アクションを含めることはできません。

  • 遷移をバリアント遷移に変換するには、遷移をクリックします。その後、[遷移] タブで、[バリアント遷移] を選択します。バリアント遷移の中間点にバリアント遷移バッジが表示されます。

関連するトピック