プログラムによるデータの検証と比較
シミュレーション データ インスペクターの機能を MATLAB® コマンド ラインからプログラムによって利用できます。
シミュレーション データ インスペクターは、実行と信号のデータを整理し、各実行と信号に固有の数値識別子を割り当てます。Simulink.sdi.Run (Simulink) オブジェクトと Simulink.sdi.Signal (Simulink) オブジェクトを使用すると、データにアクセスし、実行および信号メタデータを表示および変更できます。シミュレーション データ インスペクターをプログラムによって操作する場合、一部の関数では入力として Signal オブジェクトまたは Run オブジェクトが必要ですが、その他の関数では信号 ID または実行 ID が使用されます。ワークスペースの実行 ID にアクセスするには、Simulink.sdi.getAllRunIDs (Simulink) 関数または Simulink.sdi.getRunIDByIndex (Simulink) 関数を使用できます。信号 ID には、getSignalIDByIndex (Simulink) メソッドを使用して Simulink.sdi.Run (Simulink) オブジェクトを介してアクセスできます。
シミュレーション データ インスペクターの基本設定を変更するには、Simulink.sdi.setSubPlotLayout (Simulink)、Simulink.sdi.setRunNamingRule (Simulink)、および Simulink.sdi.setVisualization (Simulink) などの関数を使用できます。シミュレーション データ インスペクターの既定の設定に戻すには、Simulink.sdi.clearPreferences (Simulink) を使用します。
実行の作成とデータの表示
実行を作成し、それにデータを追加してから、シミュレーション データ インスペクターでそのデータを表示します。
実行用データの作成
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 つの信号の比較
シミュレーション データ インスペクターのプログラム インターフェイスを使用して、1 つの実行内の信号を比較できます。この例では、航空機の縦方向フライト コントローラーの入力信号と出力信号を比較します。
飛行制御データが含まれているシミュレーション データ インスペクターのセッション ファイルを読み込みます。
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");
Simulink.sdi.compareSignals 関数を使用し、信号 ID を使用して 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 (Simulink)を使用して、最新の 2 つのシミュレーション実行に対応する実行 ID を取得します。
runIDs = Simulink.sdi.getAllRunIDs; runID1 = runIDs(end - 1); runID2 = runIDs(end);
関数Simulink.sdi.compareRuns (Simulink)を使用して実行を比較します。グローバルな相対許容誤差の値 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 (Simulink)を使用して、比較結果を 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
参考
シミュレーション データ インスペクター (Simulink)
トピック
- シミュレーション データの比較 (Simulink)
- シミュレーション データ インスペクターでデータを比較する方法 (Simulink)
- シミュレーション データ インスペクターを使用したプロットの作成 (Simulink)