Main Content

モデル参照によるデータ管理の詳細ワークフロー

この例では、モデル参照によるデータ管理ワークフローに使用するいくつかのツールと手法について説明します。

このトピックの基本概念については、モデル参照によるデータ管理の紹介を参照してください。

例の要件

この例の実行中、Simulink® と Simulink® Coder™ は、現在のディレクトリ内に作成されたコード生成フォルダーにコードを生成します。このディレクトリにファイルを生成したくない場合 (あるいは生成できない場合) は、作業ディレクトリを変更してください。スタンドアロン アプリケーションに配布するモデル参照バイナリを生成するには、Simulink Coder が必要です。

モデル例を変更する予定がある場合は、以下の手順に従います。

1. 以下のファイルを、名前を変更せずに MATLAB® インストール ディレクトリから他のディレクトリにコピーすることで、この例を元の状態で保存しておきます。

toolbox/simulink/simdemos/simfeatures/modelreference/sldemo_mdlref_datamngt.slx
toolbox/simulink/simdemos/simfeatures/modelreference/sldemo_mdlref_datamngt_wsdata.m
toolbox/simulink/simdemos/simfeatures/modelreference/sldemo_mdlref_counter_datamngt.slx
toolbox/simulink/simdemos/simfeatures/modelreference/sldemo_mdlref_counter_datamngt_types.m
toolbox/simulink/simdemos/simfeatures/modelreference/sldemo_mdlref_counter_datamngt_wsdata.m

2. 現在の作業ディレクトリを、ファイルをコピーしたディレクトリに変更します。

3. 例を続けます。

モデル例を開く

open_system('sldemo_mdlref_datamngt')

例の内容

この例では、次の 3 つの Model ブロックを含んだ最上位モデル (sldemo_mdlref_datamngt) を使用します。これらは、Counter1、Counter2、Counter3 ブロックです。これらのブロックは、同じモデル (sldemo_mdlref_counter_datamngt) を参照します。

参照モデルは、次のような制限カウンター アルゴリズムを実装します。

  • 最初のトリガー入力が変化したら、カウンターをリセットする

  • 2 番目の入力が変化したら、指定した量だけカウンターをインクリメントする

  • 指定した上限および下限の間でカウンターを飽和する

参照モデルは、次の値を含むバス信号を出力します。

  • Count: カウンターの値 (8 ビット整数)

  • OverflowState: カウンターが上限、下限、または範囲内かを示す列挙値

このモデルは、一緒に機能するいくつかの Simulink 機能を表示するように設定されています。

  • 調整可能なパラメーターの構造体: モデルをパラメーター化する MATLAB 構造体に変数を収集します。この例では、参照モデルのモデル引数をパラメーター構造体として定義します。

  • モデル引数: モデル参照の各インスタンスに異なるパラメーター値を渡します。

  • バス オブジェクト: モデル参照インターフェイスで使用する信号およびパラメーターの構造体の "形状" を定義します。生成コードの構造体パラメーターと信号の型名を定義します。

  • Simulink.Bus.createMATLABStruct: バス オブジェクトの形状と一致する MATLAB 構造体を作成する静的メソッド。

  • バスの初期化: パラメーター構造体を使用してバス信号および状態を初期化します。

  • マスクした Model ブロック: Model Reference ブロックのカスタム インターフェイスを作成します。

  • トリガー モデル参照: コンポーネントのスケジューリングを明示的に制御します。

この例では、Simulink でのデータ管理に役立つその他の機能も使用します。

  • Simulink.saveVars: MATLAB スクリプトにワークスペース変数をシリアル化します。インクリメント変更、データの差分操作、およびバージョン管理をサポートしています。

  • Simulink.findVars: モデルによってワークスペース変数がどのように使用されているかを確認します。

例の概要

例の手順は、次のとおりです。

1. 外部インターフェイスで信号とパラメーターの構造体を使用する参照モデル (sldemo_mdlref_counter_datamngt) を準備します。

2. 参照モデルを呼び出す最上位モデル (sldemo_mdlref_datamngt) を準備します。

3. 最上位モデルをシミュレートし、結果を調べます。

4. コードを生成し、最上位モデルのスタンドアロンの実行ファイルを作成します。

参照モデル: パラメーターの設定

参照モデルには、モデルのブロックをパラメーター化する 2 つのモデル引数 (CounterParams、CounterICs) があります。モデル引数は、参照モデルの各インスタンスに異なるパラメーター値を指定します。このモデルでは、参照モデルに渡される引数の数を低減するために、引数がパラメーター構造体として定義されています。

モデル引数を定義するプロセスは、次のとおりです。

1. 参照モデル (sldemo_mdlref_counter_datamngt) を開きます。

2. MATLAB 構造体を定義して参照モデルをパラメーター化します。

CounterParams.Increment  = int8(1);
CounterParams.LowerLimit = int8(-10);
CounterParams.UpperLimit = int8(10);
CounterICs.Count         = int8(0);
CounterICs.OverflowState = SlDemoRangeCheck.InRange;

メモ: この例では、カウンターに 8 ビット整数を使用するため、数値フィールドにも 8 ビット整数を使用します。

3. MATLAB 構造体をモデル引数として使用します。

モデル引数は、参照モデルのモデル ワークスペースに変数として定義されています。モデル ワークスペースは、いくつかの異なるデータ ソースから初期化できます。この例では、MATLAB スクリプト (sldemo_mdlref_counter_datamngt_wsdata) を使用して、モデル引数のパラメーター構造体を作成します。MATLAB スクリプトを使用すると、モデルの外部で簡単にパラメーター構造体を作成、および変更することができます。さらに、インクリメント変更、バージョン管理、およびデータの差分操作も容易になります。

モデル ワークスペースのダイアログでデータ ソースを設定します。

または、MATLAB コマンド ラインからデータ ソースを設定することもできます。

hWS = get_param('sldemo_mdlref_counter_datamngt', 'ModelWorkspace');
hWS.DataSource = 'MATLAB File';
hWS.FileName = 'sldemo_mdlref_counter_datamngt_wsdata.m';
hWS.reload;

モデル エクスプローラーを使用して、モデル ワークスペースの内容を表示して編集できます。

[引数] チェック ボックスをオンにして、変数をモデル引数として設定します。

または、MATLAB コマンド ラインからモデル引数のリストを設定することもできます。

set_param('sldemo_mdlref_counter_datamngt', ...
          'ParameterArgumentNames', 'CounterParams,CounterICs');

4. 参照モデルがどのようにモデル引数を使用するかを調べます。

参照モデル内のいくつかのブロックがモデル引数を使用します。

  • Constant ブロックは、インクリメント量 (CounterParams.Increment) を指定します。

  • "Range Check" サブシステム内のさまざまなブロックは、上限および下限 (CounterParams.LowerLimit および CounterParams.UpperLimit) の値を使用します。

  • さまざまなブロックがカウンターの初期条件 (CounterICs.Count) を使用します。

  • ルートの Outport ブロックは、初期条件構造体 (CounterICs) を使用して、実行前にシステム出力を初期化します。

Simulink.findVars を使用して、モデル引数を使用するブロックを確認することができます。

paramInfo = Simulink.findVars('sldemo_mdlref_counter_datamngt', ...
                              'Name', 'CounterParams');
icInfo    = Simulink.findVars('sldemo_mdlref_counter_datamngt', ...
                              'SearchMethod', 'cached', ...
                              'Name',         'CounterICs');
paramBlks = paramInfo.UsedByBlocks
icBlks    = icInfo.UsedByBlocks
paramBlks =

  3x1 cell array

    {'sldemo_mdlref_counter_datamngt/Increment'                  }
    {'sldemo_mdlref_counter_datamngt/Range Check/Detect Overflow'}
    {'sldemo_mdlref_counter_datamngt/Range Check/Saturate Count' }


icBlks =

  3x1 cell array

    {'sldemo_mdlref_counter_datamngt/Initial Count' }
    {'sldemo_mdlref_counter_datamngt/Previous Count'}
    {'sldemo_mdlref_counter_datamngt/outputs'       }

メモ: モデルをコンパイルすると、Simulink.findVars を使用して 'cached' 変数の使用情報を取得できます。

参照モデル: 出力バス信号の形状の定義

参照モデルは、2 つの結果を生成し、バス信号にパッケージ化します。

  • Count: カウンターの値 (8 ビット整数)

  • OverflowState: カウンターが上限、下限、または範囲内かを示す列挙値

参照モデルのルート出力のバス型を定義するには

1. バス エディターを使用してバス オブジェクト (OutputType) を定義します。

または、MATLAB コマンド ラインでバス オブジェクトを作成することもできます。

OutputType = Simulink.Bus;
OutputType.Elements = Simulink.BusElement;
OutputType.Elements(1).Name = 'Count';
OutputType.Elements(1).DataType = 'int8';
OutputType.Elements(2) = Simulink.BusElement;
OutputType.Elements(2).Name = 'OverflowState';
OutputType.Elements(2).DataType = 'Enum: SlDemoRangeCheck';

2. 参照モデルのルートの出力端子を設定して、このバス オブジェクト (OutputType) に基づいて非バーチャルのバス信号を出力します。

または、MATLAB コマンド ラインからブロック パラメーターを設定することもできます。

set_param('sldemo_mdlref_counter_datamngt/outputs', ...
          'UseBusObject',      'on', ...
          'BusObject',         'OutputType', ...
          'BusOutputAsStruct', 'on');

3. MATLAB スクリプトを作成して、このバス オブジェクトを再作成します。

この例では、MATLAB スクリプト (sldemo_mdlref_counter_datamngt_types) を使用して、参照モデルが使用するバス オブジェクトを再作成します。

この MATLAB スクリプトは、手動で作成するか、Simulink.saveVars を使用できます。

Simulink.saveVars('sldemo_mdlref_counter_datamngt_types.m', 'OutputType');

4. 参照モデルを設定して、参照モデルが使用するグローバル データを作成します。

モデルでは一般的に、モデルが使用するすべてのグローバル データおよび型を再作成します。この例では、参照モデルの "PreLoadFcn" を使用して、参照モデルのバス オブジェクトを作成する MATLAB スクリプトを実行します。参照モデルは、他のグローバル変数を使用しません。

PreLoadFcn モデル コールバックを設定するには、[モデル設定] ボタンの矢印をクリックしてから、[最上位モデル] の下で [モデル プロパティ] を選択し、[モデル化] タブから [モデル プロパティ] ダイアログ ボックスを開きます。[モデル プロパティ] ダイアログ ボックスの [コールバック] タブにある、[モデル プリロード関数] ボックスで sldemo_mdlref_counter_datamngt_types スクリプトを呼び出してから、[適用] をクリックします。

または、MATLAB コマンド ラインからコールバックを設定します。

set_param('sldemo_mdlref_counter_datamngt', ...
          'PreLoadFcn', 'sldemo_mdlref_counter_datamngt_types');

5. モデル階層内でバス型がどのように使用されているかを調べます。

このバス型は、参照モデルのインターフェイスの一部を構成し、最上位モデルと参照モデルの両方のブロックにより参照されます。find_mdlrefs および Simulink.findVars を使用して、このバス オブジェクトが使用されているモデル参照階層内のすべての場所を確認します。

models = find_mdlrefs('sldemo_mdlref_datamngt');
open_system(models);
varInfo = Simulink.findVars(models, 'Name', 'OutputType');
blks = vars.UsedByBlocks
models =

  2x1 cell array

    {'sldemo_mdlref_counter_datamngt'}
    {'sldemo_mdlref_datamngt'        }


blks =

  7x1 cell array

    {'sldemo_mdlref_counter_datamngt/Initial Count'          }
    {'sldemo_mdlref_counter_datamngt/Previous Count'         }
    {'sldemo_mdlref_counter_datamngt/Range Check/Bus Creator'}
    {'sldemo_mdlref_counter_datamngt/outputs'                }
    {'sldemo_mdlref_datamngt/Counter1'                       }
    {'sldemo_mdlref_datamngt/Counter2'                       }
    {'sldemo_mdlref_datamngt/Counter3'                       }

参照モデル: バス出力の初期値の設定

一般的に、バス信号と状態の開始値は、'0' と指定することができます。この場合、バスのすべての要素がゼロ (またはそれぞれのグラウンド値) に初期化されます。ただし、バス信号および状態にゼロ以外の開始値を指定することが望ましい場合があります。この例では、カウンターの初期状態を調整できるため、出力信号の開始値を常に設定しなければなりません。

参照モデルの出力の開始値を指定するには

1. 初期化するバス信号と互換性があるパラメーター構造体を作成します。モデル引数の 1 つ (CounterICs) は、出力信号の形状と一致するパラメーター構造体です。この構造体は、次のように定義されています。

CounterICs.Count         = int8(0);
CounterICs.OverflowState = SlDemoRangeCheck.InRange;

または、静的メソッド Simulink.Bus.createMATLABStruct を使用して、OutputType のグラウンド値を使用する構造体を作成できます。

CounterICs = Simulink.Bus.createMATLABStruct('OutputType');

2. ルートの Outport のダイアログ ボックスを開き、[初期出力] フィールドに構造体の名前 (CounterICs) を入力します。

または、MATLAB コマンド ラインからブロック パラメーターを設定することもできます。

set_param('sldemo_mdlref_counter_datamngt/outputs', ...
         'InitialOutput', 'CounterICs');

メモ: 一般的に、バス信号または状態を初期化する場合、パラメーター構造体がバス型と正確に一致する必要はありませんが、そのフィールドがバス オブジェクトの要素のサブセットでなければならず、これらのフィールドの属性がバス オブジェクトの要素と一致しなければなりません。

参照モデル: 参照モデルのマスク

通常、参照モデルをマスクしてユーザー インターフェイスをカスタマイズすると便利です。モデルにマスクを作成し、それを Model ブロックから参照できます。モデルをマスクするには、モデルのモデル エクスプローラーの [モデル ワークスペース] セクションで [モデル マスクの作成] をクリックします。

マスクしたモデルを Model ブロックから参照すると、Model ブロックにマスクが自動的に生成されます。詳細については、「マスクしたモデルの作成と参照」のトピックを参照してください。

最上位モデル: Model ブロックのパラメーター化

参照モデルは、そのモデル引数の構造体を受け入れるように設定されています。この例では、パラメーター値の異なる参照モデルの各インスタンスを呼び出します。

1. 最上位モデル (sldemo_mdlref_datamngt) を開きます。

2. 参照モデルで定義されたモデル引数と同じ "形状" のパラメーター構造体を作成します。

Param1.Increment  = int8(1);
Param1.LowerLimit = int8(-20);
Param1.UpperLimit = int8(20);
Param2 = Param1;
Param2.Increment  = int8(2);
IC1.Count         = int8(0);
IC1.OverflowState = SlDemoRangeCheck.InRange;
IC2 = IC1;
IC2.Count = int8(-10);

3. これらのパラメーターを使用するように、マスクした Model ブロックのマスク パラメーターを設定します。

たとえば、最初の Model ブロック ('sldemo_mdlref_datamngt/Counter1') のパラメーターは次のように設定されています。

  • カウンター パラメーターParam1

  • 初期条件IC1

または、MATLAB コマンド ラインからブロック パラメーターを設定することもできます。

set_param('sldemo_mdlref_datamngt/Counter1', ...
          'CounterParams', 'Param1', ...
          'CounterICs',    'IC1');

3. MATLAB スクリプトを作成して、これらのワークスペース変数を再作成します。

この例では、MATLAB スクリプト (sldemo_mdlref_datamngt_wsdata) を使用して、これらのワークスペース変数を再作成します。

この MATLAB スクリプトは、手動で作成するか、Simulink.saveVars を使用できます。

Simulink.saveVars('sldemo_mdlref_datamngt_wsdata.m', 'Param*');

4. 最上位モデルを設定して、すべてのグローバル変数を作成します。

最上位モデルで、モデル参照階層を通して使用されるすべてのグローバル データと型を再作成することをお勧めします。この設定により、最上位モデルをシミュレートするとき、参照モデルを読み込む必要がなくなります。

この例では、最上位モデルの "PreLoadFcn" を使用して、最上位モデルのワークスペース データと参照モデルの型を作成する MATLAB スクリプトを実行します。参照モデルは、グローバル データを使用しません。

set_param('sldemo_mdlref_datamngt', ...
         'PreLoadFcn', ['sldemo_mdlref_datamngt_wsdata; ', ...
                        'sldemo_mdlref_counter_datamngt_types']);

最上位モデル: 参照モデルの呼び出しのスケジューリング

前述のように、参照モデルは、2 つのトリガー入力の制限カウンター アルゴリズムを実装します。このアルゴリズムは、トリガー入力の "立ち上がりエッジ" を検出して、次のように動作します。

  • 最初のトリガー入力が変化したら、カウンターをリセットする。

  • 2 番目の入力が変化したら、指定した量だけカウンターをインクリメントする。

この例では、Stimulus サブシステムにより生成される同じトリガー入力で、カウンター アルゴリズムの 3 つのインスタンスのすべてを駆動します。トリガー入力の周期とサンプル時間は、Stimulus サブシステムのマスク パラメーターに入力された値によって定義されます。

  • カウンターを 4 秒ごとにリセットする。

  • カウンターを毎秒 5 回インクリメントする (周期 = 0.2 秒)。

  • サンプル時間は 0.1 秒である。

メモ: リセット周期とインクリメント周期は、サンプル時間の 2 倍以上でなければなりません。

最上位モデルのシミュレーション

1. 参照モデルを保存するか、閉じます。

最上位モデルで参照モデルを使用するには、参照モデルを保存する必要があります。または、参照モデルを閉じ、この例に提供されている元のバージョンのモデルを使用できます。

2. [シミュレーション][実行] を選択して、最上位モデルのシミュレーションを実行します。

sim('sldemo_mdlref_datamngt')

メモ:最上位モデルをシミュレートすると、参照モデルのシミュレーション ターゲットが自動的に生成されます。

3. Scope ブロックに表示されたシミュレーション結果を確認します。

最上位モデルのコードの生成 (Simulink Coder が必要)

コードを生成し、最上位モデルのスタンドアロンの実行ファイルを作成するには、最上位モデルを開いて Ctrl+B キーを押します。

または、MATLAB コマンド ラインで rtwbuild を使用します。

rtwbuild('sldemo_mdlref_datamngt')

メモ:最上位モデルのコードを生成すると、Simulink Coder は、自動的に参照モデルのコードを生成します。Embedded Coder™ を使用して、量産配布用の組み込みコードを生成します。

モデル引数の型名の制御

既定の設定では、Simulink Coder は、パラメーター構造体の型名を自動的に生成します。この名前は、一意で確定的ですが、認識が難しくなります。Simulink.Parameter オブジェクトを使用して、型を定義するパラメーター構造体と Simulink.Bus オブジェクトを定義することで、この型名を制御することができます。

1. バス エディターを使用するか、MATLAB コマンド ラインに次のコマンドを入力してモデル引数のバス型を定義します。

CounterParamType = Simulink.Bus;
CounterParamType.Elements = Simulink.BusElement;
CounterParamType.Elements(1).Name     = 'Increment';
CounterParamType.Elements(1).DataType = 'int8';
CounterParamType.Elements(2) = Simulink.BusElement;
CounterParamType.Elements(2).Name     = 'LowerLimit';
CounterParamType.Elements(2).DataType = 'int8';
CounterParamType.Elements(3) = Simulink.BusElement;
CounterParamType.Elements(3).Name     = 'UpperLimit';
CounterParamType.Elements(3).DataType = 'int8';

2. 既存の MATLAB スクリプトを変更してこのバス オブジェクトを再作成します。

このバス型は、参照モデルの出力のバス型と共に、ベース ワークスペースに定義されていなければなりません。参照モデルの型を定義する MATLAB スクリプトを手動で変更するか、Simulink.saveVars を使用してこの変数を既存の MATLAB スクリプトに付加できます。

Simulink.saveVars('sldemo_mdlref_counter_datamngt_types.m', 'CounterParamType', '-append');

3. Simulink.Parameters を作成して、モデル引数を定義します。

バス型をモデル引数と関連付けるには、参照モデルのモデル ワークスペースで、MATLAB 構造体の代わりに Simulink.Parameter オブジェクトを使用しなければなりません。

CounterParams = Simulink.Parameter;
CounterParams.Value.Increment  = 1;
CounterParams.Value.LowerLimit = -10;
CounterParams.Value.UpperLimit = 10;
CounterParams.DataType = 'Bus: CounterParamType';
CounterICs = Simulink.Parameter;
CounterICs.Value.Count         = 0;
CounterICs.Value.OverflowState = SlDemoRangeCheck.InRange;
CounterICs.DataType = 'Bus: OutputType';

メモ: パラメーター オブジェクトのデータ型をバス タイプに設定した場合、パラメーター構造体の数値フィールドに倍精度値を使用できます。Simulink は、モデルのコンパイル中に、これらの倍精度値を適切な数値データ型に変換します。

モデル引数を定義する MATLAB スクリプトを手動で変更するか、Simulink.saveVars を使用して既存の MATLAB スクリプトを更新できます。

Simulink.saveVars('sldemo_mdlref_counter_datamngt_wsdata.m', '-update');

メモ: -update オプションを使用すると、Simulink.saveVars により、MATLAB スクリプトで既に定義されている変数の値のみが書き出されるため、書き出す変数を指定する必要がありません。

5. モデル ワークスペースの内容を再読み込みします。

これで、参照モデルのワークスペースで使用されるデータ ソースが変更されました。このモデルが開いている場合は、モデル ワークスペースの内容を再読み込みしなければなりません。

モデル ワークスペースのダイアログ ボックスを使用するか、MATLAB コマンド ラインから再読み込みすることができます。

hWS = get_param('sldemo_mdlref_counter_datamngt', 'ModelWorkspace');
hWS.reload;

最上位モデルにおけるパラメーター表現の制御

同じアプローチを使用して、Simulink.Parameter オブジェクトを使用するように最上位モデルのパラメーター構造体を変換することができます。この設定では、型名に加え、生成コードにおけるこれらのパラメーターの表示方法を制御できるようになります。

1. ExportedGlobal ストレージ クラスを使用して Simulink.Parameter オブジェクトを作成し、エクスポートされた調整可能な生成コード内の変数として、最上位モデルのパラメーター構造体を定義します。

Param1 = Simulink.Parameter;
Param1.Value.Increment  = 1;
Param1.Value.LowerLimit = -10;
Param1.Value.UpperLimit = 10;
Param1.DataType = 'Bus: CounterParamType';
Param1.CoderInfo.StorageClass = 'ExportedGlobal';
Param2 = Param1.copy;
Param2.Value.Increment = 2;
IC1 = Simulink.Parameter;
IC1.Value.Count = 0;
IC1.Value.OverflowState = SlDemoRangeCheck.InRange;
IC1.DataType = 'Bus: OutputType';
IC1.CoderInfo.StorageClass = 'ExportedGlobal';
IC2 = IC1.copy;
IC2.Value.Count = -10;

2. 既存の MATLAB スクリプトを変更して、これらのワークスペース変数を再作成します。

最上位モデルのパラメーターを定義する MATLAB スクリプトを手動で変更するか、Simulink.saveVars を使用して既存の MATLAB スクリプトを更新できます。

Simulink.saveVars('sldemo_mdlref_datamngt_wsdata.m', '-update');

メモ: -update オプションを使用すると、Simulink.saveVars により、MATLAB スクリプトで既に定義されている変数の値のみが書き出されるため、書き出す変数を指定する必要がありません。

最上位モデルのコードの再生成 (Simulink Coder が必要)

コードを生成し、最上位モデルのスタンドアロンの実行ファイルを作成するには、最上位モデルを開いて Ctrl+B キーを押します。

または、MATLAB コマンド ラインで rtwbuild を使用します。

rtwbuild('sldemo_mdlref_datamngt')