Main Content

MAT ファイルを利用した、ラピッド シミュレーションに対応する Inport ブロックへのデータ入力

この例では、コード ジェネレーター RSim -i オプションで、ラピッド シミュレーションの Inport ブロックへの入力データ ソースとして MAT ファイルを使用する方法を説明します。このような MAT ファイルのデータは、次の形式で示すことができます。

  • double 値の時間/入力データ行列を定義する 1 つの変数。

  • Simulink® データ型の組み合わせを使用する構造体を定義する 1 つの変数。

  • 複数の変数。それぞれが Simulink® データ型の組み合わせを使用する構造体を定義します。

このような柔軟性は、さまざまなデータ ファイルに保存されている入力データの範囲全体にシミュレーションの実行を必要とするアプリケーションに役立ちます。この例では、この機能を利用する方法を説明します。

Simulink 環境で複数のシミュレーションをすばやく実行するには、RSim の代わりにラピッド アクセラレータの使用を検討してください。アクセラレーションとはを参照してください。

モデルの準備

モデルを開いて書き込み可能な場所にそのコピーを保存します。次に、[Simulink Coder] アプリを開きます。モデル コンフィギュレーション パラメーター *[システム ターゲット ファイル] を rsim.tlc に設定します。

操作のグラフィカルな実行と RSim システム ターゲット ファイルに関連するその他のモデル コンフィギュレーション パラメーターの設定の詳細については、システム ターゲット ファイルの構成 (Embedded Coder)を参照してください。

mdlName = 'rtwdemo_rsim_i';
open_system(mdlName);
cs = getActiveConfigSet(mdlName);
cs.switchTarget('rsim.tlc',[]);

Inport ブロックの設定

RSim -i オプションを使用するには、各 Inport ブロックを適切に設定しなければなりません。Inport ブロックをダブルクリックすると、そのプロパティを表示できます。既定の設定では、Inport ブロックは下流のブロックからプロパティを継承します。外部 MAT ファイルからデータをインポートする前に、MAT ファイルのデータと一致するように各 Inport ブロックのパラメーターを設定しなければなりません。多くの場合、Inport ブロックの次のパラメーターを設定しなければなりません。

  • データを内挿する

  • 端子の次元

  • データ型

  • 信号タイプ

これらのパラメーターの詳細は、ヘルプ ボタンをクリックします。このモデル例には、3 つの Inport ブロックが含まれます。例の要件では、Inport 1 および Inport 2 についてはデータ間を内挿し、Inport 3 については内挿しません。各 Inport ブロックの次元は、それぞれ、2、1、2 です。信号は実信号です。設定は、以下のとおりです。

for i =1:3
    portName      =['/In', num2str(i)];
    Interp        = get_param(strcat(mdlName,portName),'Interpolate');
    PortDimension = get_param(strcat(mdlName,portName),'PortDimensions');
    DataType      = get_param(strcat(mdlName,portName),'OutDataTypeStr');
    SignalType    = get_param(strcat(mdlName,portName),'SignalType');
end
  • 入力端子 In1 および In2 の場合、内挿が選択されます。入力端子 In3 の場合、内挿がクリアされます。

  • 入力端子 In1 および In3 の場合、端子の次元が 2 に設定されます。入力端子 In2 の場合、端子の次元が 1 に設定されます。

  • 入力端子 In1In2、および In3 の場合、データ型は double で、信号のタイプは real です。

モデルの作成

モデルの実行可能ファイルを作成します。ビルド プロセスの間、構造的なチェックサムが計算され、生成された実行可能プログラムに組み込まれます。このチェックサムを使用して、実行可能プログラムに渡されたパラメーター セットとプログラムに互換性があることを確認します。

evalc('slbuild(mdlName)');

データ ファイルの信号の特定

Inport ブロックを設定したら、Inport ブロックに基づいてデータ ファイルを準備します。次の図は、使用する入力信号を示しています。

t=[0:0.01:2*pi]';
s1 = [2*sin(t) 2*cos(t)];
s2 = sin(2*t);
s3 = [0.5*sin(3*t) 0.5*cos(3*t)];
figure;
plot(t, [s1 s2 s3]);

Figure contains an axes object. The axes object contains 5 objects of type line.

この図は、入力信号を示しています。

MAT ファイルの準備

一般的に、ワークスペース変数から MAT ファイルを作成できます。RSim -i オプションは、次の 3 つのデータ ファイル形式をサポートします。

TU 行列形式の double の 1 つの変数

この形式の場合、最初の列は時間ベクトルであり、残りの列は入力ベクトルです。TU 行列の列数は、ルート Inport ブロックの次元の和に 1 を加えた値に等しくなります。この MATLAB® コードは、TU 行列形式の 1 つの変数 var_matrix を含む MAT ファイルを生成します。モデル内の入力端子が同じデータ型をもつ場合にのみ、この形式を使用できます。

t=[0:0.1:2*pi]';
Ina1 = [2*sin(t) 2*cos(t)];
Ina2 = sin(2*t);
Ina3 = [0.5*sin(3*t) 0.5*cos(3*t)];
var_matrix = [t Ina1 Ina2 Ina3];
save rsim_i_matrix.mat var_matrix;

MAT ファイル rsim_i_matrix.mat には、TU 行列形式の 1 つの変数 var_matrix が含まれます。

構造体形式の 1 つの変数

この形式の場合、変数は、'time' および 'signal' の 2 つのフィールドを含まなければなりません。Inport ブロックの 1 つにブロック パラメーター [データを内挿する] を設定する場合、変数の 'time' フィールドを空のベクトルにすることはできず、信号の幅は、Inport ブロックの幅の合計に等しくしなければなりません。次のコードは、信号変数構造体形式の 1 つの変数 var_matrix を含む MAT ファイルを生成します。この形式は、異なるデータ型の入力端子をサポートできるため、TU 行列形式よりも柔軟性に富んでいます。

t= [0:0.1:2*pi]';
var_single_struct.time = t;
var_single_struct.signals(1).values(:,1) = 2*sin(t);
var_single_struct.signals(1).values(:,2) = 2*cos(t);
var_single_struct.signals(2).values = sin(2*t);
var_single_struct.signals(3).values(:,1) = 0.5*sin(3*t) ;
var_single_struct.signals(3).values(:,2) = 0.5*cos(3*t) ;
v=[var_single_struct.signals(1).values var_single_struct.signals(2).values ...
    var_single_struct.signals(3).values ];
save rsim_i_single_struct.mat var_single_struct;

MAT ファイル rsim_i_single_struct.mat には、struct 形式の 1 つの変数 var_single_struct が含まれます。

構造体形式の複数の変数

この形式の場合、変数の数は、Inport ブロックの数と等しくなります。異なる変数が、別々の時間ベクトルをもつことができます。次のコードは、構造体形式の複数の変数を含む MAT ファイルを生成します。この方法は、各 Inport ブロックが独自の時間ベクトルをもつことができるため、最も柔軟性が高い方法です。

t= [0:0.1:2*pi]';
Inb1.time = t;
Inb1.signals.values(:,1) = 2*sin(t);
Inb1.signals.values(:,2) = 2*cos(t);
t= [0:0.2:2*pi]';
Inb2.time = t;
Inb2.signals.values(:,1) = sin(2*t);
t= [0:0.1:2*pi]';
Inb3.time =  t;
Inb3.signals.values(:,1) = 0.5*sin(3*t);
Inb3.signals.values(:,2) = 0.5*cos(3*t);
save rsim_i_multi_struct.mat Inb1;
save rsim_i_multi_struct.mat Inb2 -append;
save rsim_i_multi_struct.mat Inb3 -append;

MAT ファイル rsim_i_multi_struct.mat には、struct 形式の 3 つの変数 Inb1, Inb2Inb3 が含まれます。save コマンドを -append オプション付きで使用して、生成された MAT ファイルで変数の順序を保持します。

RSim シミュレーションの実行と結果のプロット

RSim -i オプションは、バッチ モードのシミュレーションで使用できます。異なる MAT ファイルを準備し、RSim 実行可能プログラムを MAT ファイルで実行します。

例のこの部分は、3 つのプロットを示しています。各プロットは、異なる変数形式での MAT ファイルのシミュレーション結果を示しています。モデルは一度コンパイルされます。

figure
fileName = ({'rsim_i_matrix', 'rsim_i_single_struct', 'rsim_i_multi_struct'});
for i=1:3
    % bang out and run a simulation using new parameter data
    name = fileName(i);
    runstr = ['.', filesep, 'rtwdemo_rsim_i -i ',char(name),'.mat', ' -v'];
    evalc('system(runstr)');
    pause(0.5);
    % load simulation data into MATLAB(R) for plotting.
    load rtwdemo_rsim_i.mat;
    subplot(3,1,i);
    axis([0,6, -5, 5]);
    plot(rt_tout, rt_yout);
    hold on
end

Figure contains 3 axes objects. Axes object 1 contains 3 objects of type line. Axes object 2 contains 3 objects of type line. Axes object 3 contains 3 objects of type line.

close_system(mdlName, 0);