メインコンテンツ

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

MATLAB® コマンド ラインからプログラムでシミュレーション データ インスペクターの機能を利用できます。

シミュレーション データ インスペクターでは実行と信号のデータを整理し、それぞれの実行と信号に固有の数値識別子を割り当てます。Simulink.sdi.Run オブジェクトと Simulink.sdi.Signal オブジェクトでデータにアクセスし、実行と信号のメタデータを表示および変更できます。シミュレーション データ インスペクターをプログラムで操作する場合、入力として Signal オブジェクトまたは Run オブジェクトを必要とする関数もあれば、信号 ID または実行 ID を使用する関数もあります。次の表に、このようなオブジェクトと ID にアクセスする方法を示します。

アクション関数必要な入力
実行 ID へのアクセス Simulink.sdi.getAllRunIDsなし
Simulink.sdi.getRunIDByIndexシミュレーション データ インスペクター リポジトリ内の実行のインデックス
Simulink.sdi.Run オブジェクトへのアクセスSimulink.sdi.Run.getLatestなし
Simulink.sdi.getCurrentSimulationRunモデル名
Simulink.sdi.getRun実行 ID
信号 ID へのアクセスgetAllSignalIDsRun オブジェクト
getSignalIDByIndexRun オブジェクトおよび実行内の信号のインデックス
getSignalIDsByNameRun オブジェクトおよび信号名
Simulink.sdi.Signal オブジェクトへのアクセスgetAllSignalsRun オブジェクト
getSignalByIndexRun オブジェクトおよび実行内の信号のインデックス
getSignalsByNameRun オブジェクトおよび信号名
Simulink.sdi.getSignal信号 ID

同じ実行内に含まれる 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

参考

トピック