プログラムによるデータの検証と比較
MATLAB® コマンド ラインからプログラムでシミュレーション データ インスペクターの機能を利用できます。
シミュレーション データ インスペクターでは実行と信号のデータを整理し、それぞれの実行と信号に固有の数値識別子を割り当てます。Simulink.sdi.Run オブジェクトと Simulink.sdi.Signal オブジェクトでデータにアクセスし、実行と信号のメタデータを表示および変更できます。シミュレーション データ インスペクターをプログラムで操作する場合、入力として Signal オブジェクトまたは Run オブジェクトを必要とする関数もあれば、信号 ID または実行 ID を使用する関数もあります。ワークスペースの実行 ID にアクセスするには、Simulink.sdi.getAllRunIDs 関数または Simulink.sdi.getRunIDByIndex 関数を使用できます。getSignalIDByIndex メソッドを使って Simulink.sdi.Run オブジェクトにより信号 ID にアクセスできます。
Simulink.sdi.setSubPlotLayout、Simulink.sdi.setRunNamingRule、Simulink.sdi.setVisualization などの関数を使用してシミュレーション データ インスペクターの基本設定を変更できます。シミュレーション データ インスペクターの既定の設定に戻すには、Simulink.sdi.clearPreferences を使用します。
実行の作成とデータの表示
実行を作成してそこにデータを追加してから、シミュレーション データ インスペクターでデータを表示します。
実行のデータの作成
2 つの timeseries オブジェクトを作成し、正弦信号と余弦信号のデータを含めます。各 timeseries オブジェクトに説明的な名前を付けます。
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";
実行の作成とデータの追加
関数 Simulink.sdi.view を使用して、シミュレーション データ インスペクターを開きます。
Simulink.sdi.view
データをワークスペースからシミュレーション データ インスペクターにインポートするには、関数 Simulink.sdi.Run.create を使用して Simulink.sdi.Run オブジェクトを作成します。Run オブジェクトの Name プロパティと Description プロパティを使用して、実行に関する情報をそのメタデータに追加します。
sinusoidsRun = Simulink.sdi.Run.create; sinusoidsRun.Name = "Sinusoids"; sinusoidsRun.Description = "Sine and cosine signals with different frequencies";
関数 add を使用して、ワークスペースで作成したデータを空の実行に追加します。
add(sinusoidsRun,"vars",sine_ts,cos_ts);シミュレーション データ インスペクターでのデータのプロット
関数 getSignalByIndex を使用して、信号データが含まれる Simulink.sdi.Signal オブジェクトにアクセスします。Simulink.sdi.Signal オブジェクトのプロパティを使用して、信号のライン スタイルと色を指定し、シミュレーション データ インスペクターに信号をプロットできます。各信号の LineColor プロパティと LineDashed プロパティを指定します。
sine_sig = getSignalByIndex(sinusoidsRun,1); sine_sig.LineColor = [0 0 1]; sine_sig.LineDashed = "-."; cos_sig = sinusoidsRun.getSignalByIndex(2); cos_sig.LineColor = [1 0 0]; cos_sig.LineDashed = "--";
関数 Simulink.sdi.setSubPlotLayout を使用して、シミュレーション データ インスペクターのプロット領域で 2 行 1 列のサブプロット レイアウトを設定します。次に、関数 plotOnSubplot を使用して、上のサブプロットに正弦信号をプロットし、下のサブプロットに余弦信号をプロットします。
Simulink.sdi.setSubPlotLayout(2,1); plotOnSubPlot(sine_sig,1,1,true); plotOnSubPlot(cos_sig,2,1,true);

シミュレーション データ インスペクターを閉じてデータを保存
プロットされた信号データの検査が完了したら、シミュレーション データ インスペクターを閉じて、セッションを MLDATX ファイルに保存できます。
Simulink.sdi.close("sinusoids.mldatx")同じ実行内に含まれる 2 つの信号の比較
シミュレーション データ インスペクターのプログラムによるインターフェイスを使用して、同じ実行内の信号を比較できます。この例では、航空機用縦方向フライト コントローラーの入力信号と出力信号を比較します。
飛行制御データを含むシミュレーション データ インスペクターのセッション ファイルを読み込みます。
Simulink.sdi.load("AircraftExample.mldatx");最新の実行にアクセスするには、Simulink.sdi.Run.getLatest 関数を使用します。
aircraftRun = Simulink.sdi.Run.getLatest;
Simulink.sdi.getSignalsByName 関数を使用して、コントローラーへの入力を表す Stick 信号と、出力を表す alpha, rad 信号にアクセスします。
stick = getSignalsByName(aircraftRun,"Stick"); alpha = getSignalsByName(aircraftRun,"alpha, rad");
信号 ID を使い、Simulink.sdi.compareSignals 関数を使用して Stick 信号と alpha, rad 信号を比較します。Stick 信号がベースラインです。そのベースラインと比較する信号が alpha, rad 信号です。
comparisonResults = Simulink.sdi.compareSignals(stick.ID,alpha.ID); match = comparisonResults.Status
match =
ComparisonSignalStatus enumeration
OutOfTolerance
比較結果は許容誤差の範囲外です。関数 Simulink.sdi.view を使用して、シミュレーション データ インスペクターを開き、比較結果を表示および解析できます。
Simulink.sdi.view

比較に使用する時間と振幅の許容誤差値を指定できます。比較のベースライン信号に指定された許容誤差値が比較に使用されます。位相シフトを考慮して、Stick 信号に 1 の時間の許容誤差を設定します。振幅の違いを考慮して、Stick 信号に 0.1 の絶対許容誤差値を設定します。
stick.TimeTol = 1; stick.AbsTol = 0.1;
信号を再度比較します。今回は、絶対許容誤差と時間の許容誤差により、信号比較はパスします。
comparisonResults = Simulink.sdi.compareSignals(stick.ID,alpha.ID); match = comparisonResults.Status
match =
ComparisonSignalStatus enumeration
WithinTolerance

グローバル許容誤差を使用して実行を比較
2 つのシミュレーション実行の比較に使用するグローバル許容誤差値を指定できます。グローバル許容誤差値は実行内のすべての信号に適用されます。この例では、実行比較のグローバル許容誤差値を指定する方法と、比較結果を解析して保存する方法を説明します。
比較するデータを含むシミュレーション データ インスペクターのセッション ファイルを読み込みます。セッション ファイルには航空機用縦方向フライト コントローラーの 4 つのシミュレーションについてのデータが含まれています。この例では、さまざまな入力フィルターの時定数を使用する 2 つの実行のデータを比較します。
Simulink.sdi.load("AircraftExample.mldatx");比較する実行データにアクセスするには、関数Simulink.sdi.getAllRunIDsを使用して、最新の 2 つのシミュレーション実行に対応する実行 ID を取得します。
runIDs = Simulink.sdi.getAllRunIDs; runID1 = runIDs(end - 1); runID2 = runIDs(end);
関数Simulink.sdi.compareRunsを使用して実行を比較します。グローバル相対許容誤差の値 0.2 およびグローバル時間許容誤差の値 0.5 を指定します。
runResult = Simulink.sdi.compareRuns(runID1,runID2,"reltol",0.2,"timetol",0.5);
返された Simulink.sdi.DiffRunResult オブジェクトの Summary プロパティをチェックし、信号が許容誤差値の範囲内または範囲外のどちらであるかを確認します。
runResult.Summary
ans = struct with fields:
OutOfTolerance: 0
WithinTolerance: 3
Unaligned: 0
UnitsMismatch: 0
Empty: 0
Canceled: 0
EmptySynced: 0
DataTypeMismatch: 0
TimeMismatch: 0
StartStopMismatch: 0
Unsupported: 0
3 つの信号の比較結果はすべて指定したグローバル許容誤差の範囲内にあります。
関数saveResultを使用して、比較の結果を MLDATX ファイルに保存できます。
saveResult(runResult,"InputFilterComparison");信号の許容誤差を使用したシミュレーション データの解析
シミュレーション データ インスペクターを使用して、実行した比較で使用する信号の許容誤差値をプログラムによって指定できます。この例では、航空機用縦方向飛行制御システムのモデルをシミュレーションして収集したデータを比較します。各シミュレーションは入力フィルターの時定数に異なる値を使用して、入出力信号をログに記録します。シミュレーション データ インスペクターと信号許容誤差を使用して結果を比較し、時定数の変更の影響を解析します。
まず、シミュレーション データを含むセッション ファイルを読み込みます。
Simulink.sdi.load('AircraftExample.mldatx');セッション ファイルには 4 つの実行が含まれます。この例では、ファイル内の最初の 2 つの実行からデータを比較します。ファイルから読み込まれた最初の 2 つの実行について、Simulink.sdi.Run オブジェクトにアクセスします。
runIDs = Simulink.sdi.getAllRunIDs; runIDTs1 = runIDs(end-3); runIDTs2 = runIDs(end-2);
許容誤差を指定しないで 2 つの実行を比較します。
noTolDiffResult = Simulink.sdi.compareRuns(runIDTs1,runIDTs2);
関数 getResultByIndex を使用して q 信号と alpha 信号の比較結果にアクセスします。
qResult = getResultByIndex(noTolDiffResult,1); alphaResult = getResultByIndex(noTolDiffResult,2);
各信号結果の Status プロパティをチェックし、比較結果が許容誤差の範囲内であるか範囲外であるかを確認します。
qResult.Status
ans =
ComparisonSignalStatus enumeration
OutOfTolerance
alphaResult.Status
ans =
ComparisonSignalStatus enumeration
OutOfTolerance
比較では、すべての許容誤差に 0 の値を使用しているため、OutOfTolerance の結果は信号が同一でないことを意味します。
信号の許容誤差値を指定して、時定数の影響をさらに解析できます。比較対象の信号に対応する Simulink.sdi.Signal オブジェクトのプロパティを設定し、許容誤差を指定します。比較ではベースライン信号に対して指定された許容誤差が使用されます。この例では、時間の許容誤差と絶対許容誤差を指定します。
許容誤差を指定するには、最初にベースライン実行から Signal オブジェクトにアクセスします。
runTs1 = Simulink.sdi.getRun(runIDTs1); qSig = getSignalsByName(runTs1,'q, rad/sec'); alphaSig = getSignalsByName(runTs1,'alpha, rad');
q 信号に対して、それぞれ AbsTol プロパティと TimeTol プロパティを使用して、0.1 の絶対許容誤差と 0.6 の時間の許容誤差を指定します。
qSig.AbsTol = 0.1; qSig.TimeTol = 0.6;
alpha 信号に対して、0.2 の絶対許容誤差と 0.8 の時間の許容誤差を指定します。
alphaSig.AbsTol = 0.2; alphaSig.TimeTol = 0.8;
結果を再度比較します。比較の結果にアクセスし、各信号の Status プロパティをチェックします。
tolDiffResult = Simulink.sdi.compareRuns(runIDTs1,runIDTs2); qResult2 = getResultByIndex(tolDiffResult,1); alphaResult2 = getResultByIndex(tolDiffResult,2); qResult2.Status
ans =
ComparisonSignalStatus enumeration
WithinTolerance
alphaResult2.Status
ans =
ComparisonSignalStatus enumeration
WithinTolerance