ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

Variant Subsystem

このモデルでは Simulink® Variant Subsystem について説明します。Variant Subsystem を使用すると、1 つのサブシステムを複数実装することができるようになります。ただし、シミュレーション中はそのうちの 1 つの実装だけがアクティブになります。プログラムでアクティブな実装を切り替え、モデルを変更せずに他の実装で置き換えることができます。

Variant Subsystem の概要

Variant Subsystem ブロックには複数の子サブシステムがあり、モデルの実行時にいずれかの子がアクティブになります。アクティブな子サブシステムは "アクティブなバリアント" と呼ばれます。Variant Subsystem ブロックのアクティブなバリアントは、ベース ワークスペース内の変数の値を変更することによってプログラムで切り替えるか、または Variant Subsystem ブロックのダイアログを使用してバリアントの選択を手動でオーバーライドすることによって切り替えることができます。"アクティブなバリアント" はモデルのコンパイル時に Simulink によって Variant Subsystem の Inport ブロックと Outport ブロックにプログラムで結線されます。

バリアントの選択をプログラムで制御するには Variant Subsystem ブロックのダイアログで Simulink.Variant オブジェクトを各子サブシステムに関連付けます。Simulink.Variant オブジェクトは MATLAB® ベース ワークスペースで作成されます。これらのオブジェクトには、論理値として評価され、アクティブなバリアントの子サブシステムを決定するために使用される式である、Condition という名のプロパティがあります。たとえば、

VSS_LINEAR_CONTROLLER=Simulink.Variant('VSS_MODE==1');

を定義すると、ベース ワークスペースに Simulink.Variant オブジェクトが作成され、コンストラクターの引数 ('VSS_MODE==1') はそのバリアントがアクティブになるときを定義します。次に [Variant Subsystem] ダイアログを使用し、VSS_LINEAR_CONTROLLER を Variant Subsystem 内の子サブシステムの 1 つに関連付けます。ベース ワークスペースで、

VSS_MODE=1

を定義すると、VSS_LINEAR_CONTROLLER バリアントがアクティブ化されます。条件引数は、スカラー変数、列挙型、等値、非等値、&&、, および ~ で構成される "単純な式" にすることができます。かっこ () を使用すると、優先順位をグループ化できます。

Variant Subsystem の使用方法

この例のモデルでは、次のバリアント オブジェクトとバリアント制御変数を使用します。これらは MATLAB のベース ワークスペースで定義します。

VSS_LINEAR_CONTROLLER=Simulink.Variant('VSS_MODE==1');

VSS_NONLINEAR_CONTROLLER=Simulink.Variant('VSS_MODE==2');

VSS_MODE=2;

モデル例 sldemo_variant_subsystems を開くと、[ファイル]、[モデル プロパティ]、[コールバック] で定義された "PreLoadFcn" が実行されます。これにより、ベース ワークスペースに Controller という名の Variant Subsystem ブロックの変数が入力されます。

図 1: モデル例、 sldemo_variant_subsystems

Simulink.Variant オブジェクトの Controller サブシステム用の関連付けを指定するには、Controller サブシステムを右クリックし、[サブシステムのパラメーター] を選択します。これで [Controller subsystem ブロック] ダイアログが開きます。

[Controller subsystem ブロック] ダイアログで、可能なバリアントが 2 つ指定されます。それらの 2 つのバリアントが、VSS_LINEAR_CONTROLLERVSS_NONLINEAR_CONTROLLER という 2 つの Simulink.Variant オブジェクトに関連付けられます。これらのオブジェクトはベース ワークスペース内に存在しています。これらのオブジェクトには、論理値として評価され、どのバリアントがアクティブになるのかを特定する式である、Condition という名のプロパティがあります。条件は、[Variant Subsystem ブロック] ダイアログにも表示されます。この例では、VSS_LINEAR_CONTROLLERVSS_NONLINEAR_CONTROLLER の条件のプロパティはそれぞれ VSS_MODE == 1VSS_MODE == 2 です。変数 VSS_MODE はベース ワークスペース内に存在し、標準の MATLAB 変数または Simulink.Parameter にすることができます。

関連付けられたバリアント オブジェクトが存在しないか、または [Variant Subsystem パラメーター] ダイアログ ボックスでバリアント オブジェクトの先頭に "%" (コメント) 文字が付いている場合は、子サブシステムはコメントと見なされ、モデル実行中は使用されません。

図 2: Controller subsystem ブロックのコンテンツ

Variant Subsystem ブロック内に、Inport ブロック、Outport ブロック、Subsystem ブロックを配置することができます。この例では、Linear Controller Subsystem ブロックはバリアント オブジェクト VSS_LINEAR_CONTROLLER に関連付けられ、Nonlinear Controller Subsystem ブロックはバリアント オブジェクト VSS_NONLINEAR_CONTROLLER に関連付けられます。

Variant Subsystem 内で信号の接続はできません。Simulink はモデルのシミュレーション時に、Inport ブロックと Outport ブロックをアクティブなバリアントにプログラム上で接続します。

アクティブなバリアントの切り替え

Linear Controller バリアントを使用してシミュレーションを行うには、

VSS_MODE=1

を定義してから、モデルをシミュレートします。

図 3: Linear Controller バリアントを使用したシミュレーション

Nonlinear Controller を使用してシミュレートするには、ベース ワークスペースで

VSS_MODE=2

を定義してから、モデルをシミュレートします。

図 4: Nonlinear Controller バリアントを使用したシミュレーション

列挙と再利用

sldemo_variant_subsystems_enum モデルは以下の Simulink.Variant の機能を説明します。

1.列挙型: MATLAB 列挙型クラスを使用すると、バリアント オブジェクトの条件を読みやすくすることができます。

2.再利用: Simulink.Variant オブジェクトは、別の Variant Subsystem ブロックで再利用できます。

この例では、MATLAB ベース ワークスペースで定義される以下の変数を使用します。

VSSE_LINEAR_CONTROLLER=Simulink.Variant( ... 'VSSE_MODE==sldemo_vss_CONTROLLER_TYPE.LINEAR')

VSSE_NONLINEAR_CONTROLLER=Simulink.Variant( ... 'VSSE_MODE==sldemo_vss_CONTROLLER_TYPE.NONLINEAR')

VSSE_MODE=sldemo_vss_CONTROLLER_TYPE.LINEAR

VSSE_PROTOTYPE=Simulink.Variant( ... 'VSSE_MODE_BUILD==sldemo_vss_BUILD_TYPE.PROTOTYPE')

VSSE_PRODUCTION=Simulink.Variant( ... 'VSSE_MODE_BUILD==sldemo_vss_BUILD_TYPE.PRODUCTION')

VSSE_MODE_BUILD=sldemo_vss_BUILD_TYPE.PRODUCTION

これらの Simulink.Variant オブジェクトでは列挙クラス sldemo_vss_BUILD_TYPE.msldemo_vss_CONTROLLER_TYPE.m を使用し、Simulink.VariantCondition パラメーターを定義して、読みやすさを改善します。

Variant Subsystem ブロックの 3 つのフィルター、Filter1、Filter2、Filter3 はすべて VSSE_PROTOTYPEVSSE_PRODUCTION Simulink.Variant オブジェクトを使用します。

モデル例 sldemo_variant_subsystems_enum を開くと、[ファイル]、[モデル プロパティ]、[コールバック] で定義された "PreLoadFcn" が実行されます。これにより、ベース ワークスペースに Variant Subsystem ブロックの変数が入力されます。

図 5: モデル例、 sldemo_variant_subsystems_enum

コード生成

Simulink® Coder™ を使用して、Variant Subsystem ブロックを含むモデルからコードを生成することができます。既定の設定では、生成されたコードにはアクティブなバリアントだけが含まれます。別の方法として、Embedded Coder™ を使用する際に C 言語のプリプロセッサの条件文 (#if#elif#endif) で保護して、すべてのバリアント用のコードを生成できます。

プリプロセッサの条件を生成する際に、Variant Subsystem ブロックの子サブシステム内に配置できるブロックのタイプが制限されます。コード生成プロセスで、Variant Subsystem 内の各 Outport ブロックの入力部に 1 つ Merge ブロックが配置され、Variant Subsystem 内の子サブシステムに接続されます。このため Merge ブロックに課される制約が Variant Subsystem ブロックの内容に適用されます。制約のチェックはコード生成時にのみ行われます。また、Variant Subsystem ブロックの子サブシステムは Atomic subsystem でなければなりません。これは [Subsystem パラメーター] ダイアログ ボックスの [Atomic サブシステムとして扱う] パラメーターを選択することにより生成されます。

プリプロセッサの条件のコード生成は以下の場合にアクティブになります。

  1. [コンフィギュレーション パラメーター] ダイアログ ボックスの [コード生成] ペインで Embedded Coder ターゲットが選択されている。

  2. Variant Subsystem の [ブロック パラメーター] ダイアログ ボックスで [バリアント条件をオーバーライドして以下のバリアントを使用] が "オフ" になっている。

プリプロセッサの条件のコード生成がアクティブな場合、生成されたコードには、C 言語のプリプロセッサの条件文で保護された Variant Subsystem ブロックのすべての子サブシステムが含まれます。この場合、アクティブなバリアントの選択は、生成されたコードのコンパイル時まで行われません。C マクロでエンコードされる 1 つのバリアント オブジェクトだけが真として (つまりアクティブとして) 評価されます。

またバリアント制御変数 (上述の VSS_MODEVSSE_MODE など) は、生成されたコード内でバリアント制御変数の #define 文をどのように管理するかを指定する Simulink.Parameter オブジェクトでなければなりません。sldemo_variant_subsystems では、ベース ワークスペースから VSS_MODE の double を消去することができます。Model Explorer -> Simulink Root -> Base Workspace を使用し、VSS_MODE という名前の新しい Simulink.Parameter を追加します。パラメーターの [値]1 または 2 に、[データ型]int32 に、[ストレージ クラス]ImportedDefine (Custom) に、[カスタム属性ヘッダー ファイル]sldemo_variant_subsystems_vdef.h に指定します。次に、現在の作業ディレクトリにこのヘッダーを作成します。

/* File: sldemo_variant_subsystems_vdef.h */
#ifndef SLDEMO_VARIANT_SUBSYSTEM_VDEF_H
#define SLDEMO_VARIANT_SUBSYSTEM_VDEF_H
#define VSS_MODE 1
#endif

Variant Subsystem 用のコード生成の詳細は、Embedded Coder のドキュメンテーションを参照してください。

この情報は役に立ちましたか?