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

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

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

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

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

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

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

実行からデータを作成

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 = [0 1 0];
cos_sig.LineDashed = '--';

関数 Simulink.sdi.setSubPlotLayout を使用して、シミュレーション データ インスペクターのプロット領域で 21 列のサブプロット レイアウトを設定します。次に、関数 plotOnSubplot を使用して、上のサブプロットに正弦信号をプロットし、下のサブプロットに余弦信号をプロットします。

Simulink.sdi.setSubPlotLayout(2,1);

plotOnSubPlot(sine_sig,1,1,true);
plotOnSubPlot(cos_sig,2,1,true);

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

プロットされた信号データの検査が完了したら、シミュレーション データ インスペクターを閉じて、セッションを MLDATX ファイルに保存できます。

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

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

この例では、slexAircraftExample モデルを使用して、制御システムの入力信号と出力信号の比較方法を示します。

モデルの設定とシミュレーション

slexAircraftExample モデルはデータを記録しません。モデルを読み込み、入力信号と出力信号をログ記録するようマークします。

load_system('slexAircraftExample')
Simulink.sdi.markSignalForStreaming('slexAircraftExample/Pilot',1,'on')
Simulink.sdi.markSignalForStreaming('slexAircraftExample/Aircraft Dynamics Model',4,'on')

モデルをシミュレートします。ログ信号のデータはシミュレーション データ インスペクターとワークスペースに記録されます。

out = sim('slexAircraftExample');

シミュレーション データへのアクセス

シミュレーション データ インスペクターのプログラムによるインターフェイスを使用して、データにアクセスします。関数 Simulink.sdi.Run.getLatest は、シミュレーション データ インスペクター リポジトリ内で最後に作成された実行を返します。関数 getSignalIDByIndex を使用して、ログ信号の信号 ID にアクセスします。

aircraftRun = Simulink.sdi.Run.getLatest;

signalID1 = getSignalIDByIndex(aircraftRun,1);
signalID2 = getSignalIDByIndex(aircraftRun,2);

許容誤差値の指定

比較に使用する許容誤差値を、記録された Simulink.sdi.Signal オブジェクトのプロパティとして指定できます。関数 Simulink.sdi.getSignal を使用し、信号 ID を使用して Signal オブジェクトにアクセスします。

signal1 = Simulink.sdi.getSignal(signalID1);
signal1.AbsTol = 0.1;

信号の比較

関数 Simulink.sdi.compareSignals を使用して、入力信号と出力信号を比較します。この例では、関数 isValidSignalID を使用して、両方の信号 ID が関数 Simulink.sdi.compareSignals の呼び出し前に依然として有効であることを検証します。信号がシミュレーション データ インスペクターから削除されると、信号 ID は無効になります。比較後、Simulink.sdi.DiffSignalResult オブジェクトのステータスをチェックします。

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

    match = sigDiff.Status
end
match = 
OutOfTolerance

比較結果は許容誤差の範囲外です。関数 Simulink.sdi.view を使用して、比較結果を検証および解析できます。

シミュレーション データのプログラムでの比較と解析

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

シミュレーション データの作成

まず、データを記録するモデルのシミュレーションを行ってシミュレーション データを作成します。この例では ex_sldemo_absbrake モデルを使用し、Desired relative slip の値を変更する場合の影響を解析します。

モデルを読み込みます。関数 set_param を使用して、相対すべりの初期値を指定し、モデルのシミュレーションを行います。

load_system('ex_sldemo_absbrake')

set_param('ex_sldemo_absbrake/Desired relative slip','Value','0.24')
out_1 = sim('ex_sldemo_absbrake');

関数 set_param を使用して、相対すべりの異なる値を指定し、再度モデルのシミュレーションを行います。

set_param('ex_sldemo_absbrake/Desired relative slip','Value','0.25')
out_2 = sim('ex_sldemo_absbrake');

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

まず、関数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: 2
      WithinTolerance: 2
            Unaligned: 0
        UnitsMismatch: 0
                Empty: 0
             Canceled: 0
          EmptySynced: 0
     DataTypeMismatch: 0
         TimeMismatch: 0
    StartStopMismatch: 0
          Unsupported: 0

実行内で 2 つの信号の比較が許容範囲内、2 つが許容範囲外でした。

比較結果のプロット

プロットを使用して比較結果を解析できます。関数getResultByIndexを使用して、比較の結果を含む DiffRunResult オブジェクトからの Ww 信号の信号結果にアクセスします。Simulink.sdi.DiffSignalResult オブジェクトの Status プロパティをチェックします。

signalResult_Ww = getResultByIndex(runResult,1)
signalResult_Ww = 
  DiffSignalResult with properties:

           Status: OutOfTolerance
          AlignBy: 'Path'
        SignalID1: 43582
        SignalID2: 43628
    MaxDifference: 12.4878
            Sync1: [1x1 timeseries]
            Sync2: [1x1 timeseries]
             Diff: [1x1 timeseries]

signalResult_Ww.Status
ans = 
OutOfTolerance

Ww 信号の比較の結果は許容範囲外です。差分信号をプロットして結果を解析します。

figure(1)
plot(signalResult_Ww.Diff)

比較結果の保存

比較の結果を MLDATX ファイルに保存して、後で解析したり、同僚と共有したりできます。関数saveResultを使用して実行データと比較結果を保存できます。

saveResult(runResult,'desiredSlipResults')

MLDATX ファイル desiredSlipResults は作業ディレクトリに作成されます。関数Simulink.sdi.loadまたは関数openを使用して MLDATX ファイルの結果を表示します。

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

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

モデルの設定

モデルを読み込んで、関心のある信号をログ記録用にマークします。この例では、q 信号と alpha 信号のデータを記録します。

load_system('slexAircraftExample')

Simulink.sdi.markSignalForStreaming('slexAircraftExample/Aircraft Dynamics Model',3,'on')
Simulink.sdi.markSignalForStreaming('slexAircraftExample/Aircraft Dynamics Model',4,'on')

シミュレーションの実行

異なるローパス フィルターの時定数でシミュレーションを実行し、比較する結果を生成します。slexAircraftExample モデルは、そのモデルに関連付けられている変数をモデル ワークスペースに格納します。時定数値を変更するには、モデル ワークスペースにアクセスして関数 assignin を使用します。

out1 = sim('slexAircraftExample');

modelWorkspace = get_param('slexAircraftExample','modelworkspace');
assignin(modelWorkspace,'Ts',1)

out2 = sim('slexAircraftExample');

シミュレーション結果へのアクセスと比較

シミュレーション データ インスペクターのプログラムによるインターフェイスを使用して、シミュレーション結果にアクセスします。各シミュレーションによって、一意の実行 ID をもつ実行がシミュレーション データ インスペクターに作成されます。実行 ID を使用して、シミュレーション結果を比較します。

runIDs = Simulink.sdi.getAllRunIDs;
runIDTs1 = runIDs(end-1);
runIDTs2 = runIDs(end);

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

diffRun1 = Simulink.sdi.compareRuns(runIDTs1,runIDTs2);

sig1Result1 = getResultByIndex(diffRun1,1);
sig2Result1 = getResultByIndex(diffRun1,2);

sig1Result1.Status
ans = 
OutOfTolerance
sig2Result1.Status
ans = 
OutOfTolerance

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

既定では、信号はすべての許容誤差値に 0 を使用するため、信号が同一でない場合は、比較によって許容誤差外の結果が返されます。時定数の変更の影響をさらに解析するために、信号の許容誤差値を指定します。比較する実行内の Simulink.sdi.Signal オブジェクトのプロパティを使用して、プログラムによる比較の許容誤差を指定できます。比較ではベースラインの Signal オブジェクトに対して指定された許容誤差が使用されます。この例では、時間の許容誤差と絶対許容誤差の組み合わせを指定します。

許容誤差を指定するには、まず比較する必要がある実行内の各信号に対応する Simulink.sdi.Signal オブジェクトにアクセスします。

run1 = Simulink.sdi.getRun(runIDTs1);
sigID1 = getSignalIDByIndex(run1,1);
sigID2 = getSignalIDByIndex(run1,2);

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

Name プロパティをチェックして、各 Signal オブジェクトを特定します。

sig1.Name
ans = 
'q, rad/sec'
sig2.Name
ans = 
'alpha, rad'

ベースラインの実行で q 信号オブジェクトの AbsTol プロパティと TimeTol プロパティを使用する q 信号に対して、0.1 の絶対許容誤差と 0.6 の時間の許容誤差を指定します。

sig1.AbsTol = 0.1;
sig1.TimeTol = 0.6;

ベースラインの実行で alpha 信号オブジェクトの AbsTol プロパティと TimeTol プロパティを使用する alpha 信号に対して、0.2 の絶対許容誤差と 0.8 の時間の許容誤差を指定します。

sig2.AbsTol = 0.2;
sig2.TimeTol = 0.8;

実行を再度比較し、結果にアクセスします。

diffRun2 = Simulink.sdi.compareRuns(runIDTs1,runIDTs2);
sig1Result2 = getResultByIndex(diffRun2,1);
sig2Result2 = getResultByIndex(diffRun2,2);

比較結果が指定された許容誤差の範囲内にあるかどうかを判断するには、各信号の Status プロパティをチェックします。

sig1Result2.Status
ans = 
WithinTolerance
sig2Result2.Status
ans = 
WithinTolerance

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

この例では、シミュレーション データ インスペクターにプロットされた信号のレポートを関数 Simulink.sdi.report を使用して作成する方法を示します。関数 Simulink.sdi.report を使用して、[検査] ペインでプロットされた信号を含むレポートまたは比較結果のレポートを作成できます。この例ではモデルをシミュレートしてデータを生成し、プロットされた信号とプロット領域のイメージに関する情報が含まれるレポートの作成方法を示します。この例を説明どおり正確に実行するには、関数Simulink.sdi.clearを使用してシミュレーション データ インスペクターのリポジトリを空にした状態で開始するようにしてください。

データの生成

この例では、各シミュレーションで異なる、目的のスリップ率を使用して、モデル ex_sldemo_absbrake をシミュレートしてデータを生成します。

Simulink.sdi.clear

load_system('ex_sldemo_absbrake')

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

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

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

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

% 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 で列を追加してレポートにより多くのデータを含めるか、名前と値のペア 'ColumnsToReport' および列挙型クラス Simulink.sdi.SignalMetaData を使用して、プログラムによりレポートに必要な情報を指定できます。この例では、レポートに含めるメタデータをプログラムで指定する方法を示します。

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


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

Simulink.sdi.report('ReportType', 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)

参考

関連するトピック