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

プログラムによるデータの検証と比較

シミュレーション データ インスペクター API を使用して、MATLAB® コマンド ラインからシミュレーション データ インスペクターの機能を利用できます。

シミュレーション データ インスペクターでは実行と信号のデータを整理し、各実行と信号に固有の数値識別子を割り当てます。シミュレーション データ インスペクター API 関数は、実行または信号そのものを入力として受け入れるのではなく、実行 ID および信号 ID を使用してデータを参照します。ワークスペースの実行 ID にアクセスするには、Simulink.sdi.getAllRunIDs または Simulink.sdi.getRunIDByIndex を使用できます。 Simulink.sdi.Run.getSignalIDByIndex メソッドを使って Simulink.sdi.Run オブジェクトにより信号 ID にアクセスできます。

Simulink.sdi.Run クラスと Simulink.sdi.Signal クラスはデータへのアクセスを提供し、実行および信号メタデータの表示と変更を可能にします。Simulink.sdi.setSubPlotLayoutSimulink.sdi.setRunNamingRuleSimulink.sdi.setMarkersOn などの関数を使用してシミュレーション データ インスペクターの設定を変更できます。シミュレーション データ インスペクターの既定の設定に戻すには、Simulink.sdi.clearPreferences を使用します。

実行を作成してデータを表示

この例では、実行を作成してそこにデータを追加してから、シミュレーション データ インスペクターでデータを表示する方法を示します。

実行からデータを作成

この例では、正弦と余弦の timeseries オブジェクトを作成します。データを可視化するには、シミュレーション データ インスペクターでは少なくともデータに対応する時間ベクトルが必要となります。

% Generate timeseries data
time = linspace(0, 20, 100);

sine_vals = sin(2*pi/5*time);
sine_ts = timeseries(sine_vals, time);
sine_ts.Name = 'Sine, T=5';

cos_vals = cos(2*pi/8*time);
cos_ts = timeseries(cos_vals, time);
cos_ts.Name = 'Cosine, T=8';

シミュレーション データ インスペクターの実行を作成してデータを追加

シミュレーション データ インスペクターでデータにアクセスできるようにするには、create メソッドを使用して実行を作成します。この例では、データを識別しやすくするために一部の実行のプロパティを変更します。シミュレーション データ インスペクターを使用すると、実行と信号のプロパティを簡単に表示できます。

% Create a run
sinusoidsRun = Simulink.sdi.Run.create;
sinusoidsRun.Name = 'Sinusoids';
sinusoidsRun.Description = 'Sine and cosine signals with different frequencies';

% Add timeseries data to run
sinusoidsRun.add('vars', sine_ts, cos_ts);

Simulink.sdi.Signal オブジェクトを使用してデータをプロット

getSignalByIndex メソッドでは、シミュレーション データ インスペクターでの信号のプロットに使用できる Simulink.sdi.Signal オブジェクトが返されます。信号を表すラインの色やスタイルといったプロットの外観の特徴をプログラムで制御することもできます。この例では、サブプロット レイアウトと信号の特性をカスタマイズします。

% Get signal, modify its properties, and change Checked property to true
sine_sig = sinusoidsRun.getSignalByIndex(1);
sine_sig.LineColor = [0 0 1];
sine_sig.LineDashed = '-.';
sine_sig.Checked = true;

% Add another subplot for the cosine signal
Simulink.sdi.setSubPlotLayout(2, 1);

% Plot the cosine signal and customize its appearance
cos_sig = sinusoidsRun.getSignalByIndex(2);
cos_sig.LineColor = [0 1 0];
cos_sig.plotOnSubPlot(2, 1, true);

% View the signal in the Simulation Data Inspector
Simulink.sdi.view

シミュレーション データ インスペクターを閉じてデータを保存

Simulink.sdi.close('sinusoids.mat')

シミュレーション実行内の信号の比較

この例では、slexAircraftExample モデルを使用して、制御システムの入力信号と出力信号の比較を示します。例では、ストリーミング対象の信号をマークした後に、シミュレーション実行用の実行オブジェクトを取得します。実行オブジェクトの信号 ID で、比較する信号を指定します。

% Load model slexAircraftExample and mark signals for streaming
load_system('slexAircraftExample')
Simulink.sdi.markSignalForStreaming('slexAircraftExample/Pilot',1,'on')
Simulink.sdi.markSignalForStreaming('slexAircraftExample/Aircraft Dynamics Model',4,'on')

% Simulate model slexAircraftExample
out = sim('slexAircraftExample');

% Get run IDs for most recent run
allIDs = Simulink.sdi.getAllRunIDs;
runID = allIDs(end);

% Get Run object
aircraftRun = Simulink.sdi.getRun(runID);

% Get signal IDs
signalID1 = getSignalIDByIndex(aircraftRun,1);
signalID2 = getSignalIDByIndex(aircraftRun,2);

if (isValidSignalID(aircraftRun,signalID1))
    % Change signal tolerance
    signal1 = Simulink.sdi.getSignal(signalID1);
    signal1.AbsTol = 0.1;
end

if (isValidSignalID(aircraftRun,signalID1) && isValidSignalID(aircraftRun,signalID2))
    % Compare signals
    sigDiff = Simulink.sdi.compareSignals(signalID1,signalID2);

    % Check whether signal result status
    match = sigDiff.Status
end
match = 
OutOfTolerance

シミュレーション データ インスペクターの実行をプログラムで比較

この例では、シミュレーション データの実行を比較して、シミュレーション データ インスペクターのプログラムによるインターフェイスで比較結果を解析する方法を示します。

シミュレーション データの実行を生成

異なる Desired relative slip 値でモデルのシミュレーションを実行し、シミュレーション データ インスペクターのプログラム インターフェイスで解析するシミュレーション データの実行を作成します。

% Open model
load_system('ex_sldemo_absbrake')

% Set the desired slip ratio to 0.24 and simulate
set_param('ex_sldemo_absbrake/Desired relative slip','Value','0.24')
out_1 = sim('ex_sldemo_absbrake');

% Change the desired slip ratio to 0.25 and simulate
set_param('ex_sldemo_absbrake/Desired relative slip','Value','0.25')
out_2 = sim('ex_sldemo_absbrake');

グローバル許容誤差を使用して実行を比較

関数 Simulink.sdi.getAllRunIDs で作成した実行の実行 ID を取得します。次に、グローバルな相対許容誤差とグローバルな時間の許容誤差を使用して実行を比較し、データが仕様を満たすかどうかを解析します。

% Get run IDs for last two runs
runIDs = Simulink.sdi.getAllRunIDs;
runID1 = runIDs(end - 1);
runID2 = runIDs(end);

% Compare runs
runResult = Simulink.sdi.compareRuns(runID1,runID2,'reltol',0.2,'timetol',0.5);

比較結果のプロットを作成

前の手順で Simulink.sdi.compareRuns で作成した Simulink.sdi.DiffRunResult オブジェクトを使用し、Figure でプロットする Ww 信号結果のデータにアクセスします。

% Plot the |Ww| signal difference
signalResult_Ww = getResultByIndex(runResult,1);
figure(1)
plot(signalResult_Ww.Diff)

信号の許容誤差を使用したシミュレーション データの解析

信号基底による信号の許容誤差の値を変更し、モデル パラメーターの変更による影響を評価できます。この例では slexAircraftExample モデルとシミュレーション データ インスペクターを使用し、制御入力の後にローパス フィルターの時定数を変更することによる影響を評価します。

設定

モデルを読み込み、q, rad/sec 信号および alpha, rad 信号をログ記録するようマークします。次に、モデルのシミュレーションを実行してベースライン実行を作成します。

% Load example model
load_system('slexAircraftExample')

% Mark the q, rad/sec and alpha, rad signals for logging
Simulink.sdi.markSignalForStreaming('slexAircraftExample/Aircraft Dynamics Model',3,'on')
Simulink.sdi.markSignalForStreaming('slexAircraftExample/Aircraft Dynamics Model',4,'on')

% Simulate system
out_1 = sim('slexAircraftExample');

モデル パラメーターの変更

モデル ワークスペースでモデル パラメーター Ts を変更して、入力ローパス フィルターの時定数を変更します。

% Change input filter time constant
modelWorkspace = get_param('slexAircraftExample','modelworkspace');
assignin(modelWorkspace,'Ts',1)

% Simulate again
out_2 = sim('slexAircraftExample');

実行の比較と結果の検査

関数 Simulink.sdi.compareRuns を使用して、シミュレーションで得たデータを比較します。次に、信号結果の match プロパティを検査し、信号が既定の許容誤差 0 の範囲内にあるかどうかを確認します。

% Get run data
runIDs = Simulink.sdi.getAllRunIDs;
runID1 = runIDs(end - 1);
runID2 = runIDs(end);

% Compare runs
diffRun1 = Simulink.sdi.compareRuns(runID1,runID2);

% Get signal result
sig1Result1 = getResultByIndex(diffRun1,1);
sig2Result1 = getResultByIndex(diffRun1,2);

% Check whether signals matched
sig1Result1.Status
ans = 
OutOfTolerance
sig2Result1.Status
ans = 
OutOfTolerance

信号の許容誤差を使用して実行を比較

信号は既定の許容誤差 0 の範囲内に一致しませんでした。時定数の変更の影響をさらに解析するために、信号の許容誤差をベースライン信号プロパティとの比較に追加し、パスに必要な許容誤差を特定します。この例では、時間の許容誤差と絶対許容誤差の組み合わせを使用します。

% Get signal object for sigID1
run1 = Simulink.sdi.getRun(runID1);
sigID1 = getSignalIDByIndex(run1,1);
sigID2 = getSignalIDByIndex(run1,2);

sig1 = Simulink.sdi.getSignal(sigID1);
sig2 = Simulink.sdi.getSignal(sigID2);

% Set tolerances for q, rad/sec
sig1.AbsTol = 0.1;
sig1.TimeTol = 0.6;

% Set tolerances for alpha, rad
sig2.AbsTol = 0.2;
sig2.TimeTol = 0.8;

% Run the comparison again
diffRun2 = Simulink.sdi.compareRuns(runID1,runID2);
sig1Result2 = getResultByIndex(diffRun2,1);
sig2Result2 = getResultByIndex(diffRun2,2);

% Check the result
sig1Result2.Status
ans = 
WithinTolerance
sig2Result2.Status
ans = 
WithinTolerance

プログラムによるシミュレーション データ インスペクター レポートの生成

この例では、シミュレーション データ インスペクターのプログラムによるインターフェイスを使用してレポートを作成する方法を示します。[検査] ペインでプロットされた信号または [比較] ペインの比較データに対するレポートを作成できます。この例では、最初にモデルのシミュレーションを実行してデータを生成した後に、Inspect Signals レポートを作成する方法を示します。この例を説明どおり正確に実行するには、関数Simulink.sdi.clearを使用してシミュレーション データ インスペクターのリポジトリを空にした状態で開始するようにしてください。

データの生成

この例では、2 つの望ましいスリップ比率でモデル ex_sldemo_absbrake を使用してデータを生成します。

% Ensure Simulation Data Inspector is empty
Simulink.sdi.clear

% Open model
load_system('ex_sldemo_absbrake')

% Set slip ratio and simulate model
set_param('ex_sldemo_absbrake/Desired relative slip','Value','0.24')
sim('ex_sldemo_absbrake');

% Set new slip ratio and simulate model again
set_param('ex_sldemo_absbrake/Desired relative slip','Value','0.25')
sim('ex_sldemo_absbrake');

[検査] ペインでの信号のプロット

Inspect Signals レポートには、[検査] ペインのグラフィカルな表示領域でプロットされたすべての信号と、プロットした信号で表示されたすべてのメタデータが含まれます。

% Get Simulink.sdi.Run objects
runIDs = Simulink.sdi.getAllRunIDs;
runID1 = runIDs(end-1);
runID2 = runIDs(end);

run1 = Simulink.sdi.getRun(runID1);
run2 = Simulink.sdi.getRun(runID2);

% Get Simulink.sdi.Signal objects for slp signal
run1_slp = run1.getSignalByIndex(4);
run2_slp = run2.getSignalByIndex(4);

% Plot slp signals
run1_slp.plotOnSubPlot(1, 1, true)
run2_slp.plotOnSubPlot(1, 1, true)

[検査] ペインでプロットされた信号のレポートの作成

シミュレーション データ インスペクターの UI で列を追加してレポートにより多くのデータを含めるか、名前と値のペアおよび列挙型クラス Simulink.sdi.SignalMetaData を使用して、プログラムによりレポートに必要な情報を指定できます。この例では、レポートのデータをプログラムで指定する方法を示します。

% Specify report parameters
reportType = 'Inspect Signals';
reportName = 'Data_Report.html';


signalMetadata = [Simulink.sdi.SignalMetaData.Run, ...
    Simulink.sdi.SignalMetaData.Line, ... 
    Simulink.sdi.SignalMetaData.BlockName, ...
    Simulink.sdi.SignalMetaData.SignalName];

Simulink.sdi.report('ReportToCreate', reportType, 'ReportOutputFile', ...
    reportName, 'ColumnsToReport', signalMetadata);

ログに記録された信号のセットの保存と復元

この例では、Simulink.HMI.InstrumentedSignals オブジェクトを使用して、別の信号ログ コンフィギュレーションを使用したシミュレーションの実行後に復元するために、ログ記録された信号のセットを保存する方法について示します。

初期の信号ログ コンフィギュレーションの保存

この例では、10 個の信号をログ記録するよう構成されている sldemo_fuelsys モデルを使用します。モデルを開き、関数 get_param を使用して、信号ログ コンフィギュレーションを表す Simulink.HMI.InstrumentedSignals オブジェクトを取得します。

load_system sldemo_fuelsys

initSigs = get_param('sldemo_fuelsys','InstrumentedSignals');

初期の信号ログ コンフィギュレーションを、後で使用できるように MAT ファイルに保存できます。

save initial_instSigs.mat initSigs

すべてのログ バッジの削除

信号をログに記録しないという基本に戻るために、関数 set_param を使用してモデルの信号からすべてのログ バッジを削除できます。次に、信号の別のコンフィギュレーションを簡単に選択して Simulink™ エディターにログインするか、関数 Simulink.sdi.markSignalForStreaming を使用できます。

set_param('sldemo_fuelsys','InstrumentedSignals',[])

保存されたログ コンフィギュレーションの復元

ログに記録された信号の異なるセットを操作した後、Simulink.HMI.InstrumentedSignals オブジェクトを使用して、保存されたコンフィギュレーションを復元できます。たとえば、ログ コンフィギュレーションを MAT ファイルに保存した場合、その MAT ファイルの内容をワークスペースに読み込み、関数 set_param を使用して、以前に保存したログ コンフィギュレーションを復元できます。

load initial_instSigs.mat

set_param('sldemo_fuelsys','InstrumentedSignals',initSigs)

参考

関連するトピック