シミュレーション データ インスペクター 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.setSubPlotLayout
、Simulink.sdi.setRunNamingRule
、Simulink.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
を使用して、シミュレーション データ インスペクターのプロット領域で 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')
この例では、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: Name: 'yout.Ww' Status: OutOfTolerance AlignBy: 'Path' SignalID1: 120877 SignalID2: 120923 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.load('ex_sldemo_absbrake_slp_Ww.mldatx');
プロットされた信号のレポートの作成
レポートにはプロットされた信号のプロットおよびメタデータが含まれます。既定の設定では、レポートには [検査] ペインの信号テーブルに表示される列に対応するメタデータが含まれます。[検査] ペインにより多くの列を表示して、さらに多くのデータをレポートに含めることができます。'ColumnsToReport'
の名前と値のペアおよび列挙型クラス Simulink.sdi.SignalMetaData
を使用して、レポートに含める情報をプログラムで指定することもできます。
signalMetadata = [Simulink.sdi.SignalMetaData.Run, ... Simulink.sdi.SignalMetaData.Line, ... Simulink.sdi.SignalMetaData.BlockName, ... Simulink.sdi.SignalMetaData.SignalName]; Simulink.sdi.report('ReportType','Inspect', 'ReportOutputFile', ... 'absbrake_slp_report.html', '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)