この例では、ModelOperatingPoint オブジェクトを使用してシミュレーションの操作点を保存および復元するワークフローとその利点を示します。
ModelOperatingPoint オブジェクトには、モデルのシミュレーションに関連するすべての変数の完全なスナップショットが含まれています。シミュレーション終了時に ModelOperatingPoint オブジェクトを保存した後、Simulink® は操作点を再度読み込み、ModelOperatingPoint オブジェクトが保存された時間からシミュレーションを継続することができます。このアクションは、シミュレーションが中断されなかった場合と同一のシミュレーション結果を再現します。
この例では、以下を説明します。
シミュレーション状態を完全に正確に復元するためには、最終状態 (ログが作成された状態) を保存するだけでは、必ずしも十分とは言えないこと。
シミュレーションの完全な操作点を保存して復元することでシミュレーション ワークフローを高速にする方法。
シミュレーション中に記録された状態は、シミュレーションの状態を完全に説明するために必要なすべての情報のサブセットです。一部のブロックは内部情報に依存しており、この内部情報は状態ログや最終状態のエクスポートの一環として記録されません。たとえば、Transport Delay ブロックです。Transport Delay ブロックがあるモデルは、通常は特定の状態に完全に戻すことは困難です。これは、伝播遅延が「最終状態」データ ログの一部として構造体形式または配列形式で保存されないためです。
この問題を説明するために、次の 2 つのケースのシミュレーション結果を比較してみましょう。
1. Transport Delay ブロックを含むモデルのシミュレーションを 0 秒から 5 秒の間実行し、「最終状態」の値をワークスペースに保存します。その後、この 1 回目の最終状態のセットを読み込んで、5 秒から 10 秒の間シミュレートします。
2. 同じモデルのシミュレーションを 0 秒から 10 秒の間実行し、5 秒でモデルに強制的に出力を生成させます。このシミュレーションはノンストップのシミュレーションなので、このシミュレーション結果をベースライン結果と呼びます。
1 回目のシミュレーションの結果は、ベースライン結果の前半と一致します。最初のシミュレーションのシミュレーション状態が完全に復元されていれば、2 回目のシミュレーションの結果は、ベースラインの後半と一致するはずです。
開始するには、このモデルを読み込みます。
mdl = 'slexVariableTransportDelay';
load_system(mdl);
シミュレーションを 5 秒まで実行し、最終状態を構造体形式で保存します。
out = sim(mdl, 'StopTime', '5', 'SaveFinalState', 'on',... 'FinalStateName','xFinal', 'SaveFormat','Structure'); y1 = out.ScopeData;
最後のシミュレーションから最終状態を読み込んで、10 秒まで実行します。
assignin('base', 'xFinal', out.get('xFinal')); out1 = sim(mdl, 'StartTime', '5', 'StopTime', '10', ... 'SaveFinalState', 'off', ... 'LoadInitialState', 'on', 'InitialState', 'xFinal'); y2 = out1.ScopeData;
ベースライン結果となるノンストップのシミュレーションを実行します。
out2 = sim(mdl, 'OutputOption', 'AdditionalOutputTimes' ,... 'OutputTimes','[0 5 10]', 'LoadInitialState', 'off'); y = out2.ScopeData;
結果をプロットします。ベースライン結果の後半は、5 秒で保存された最終状態から復元した初期状態で実行された 5 秒から 10 秒の間のシミュレーションとは一致しないことに注目してください。
figure; for idx=1:3 subplot(3, 1, idx); plot(y.time,y.signals(idx).values); hold on; plot([y1.time; y2.time],... [y1.signals(idx).values;y2.signals(idx).values],'r--'); hold off; grid on; end
完全な最終操作点を Simulink.op.ModelOperatingPoint オブジェクトに保存することができます。ModelOperatingPoint オブジェクトには、シミュレーション結果を復元するのに必要な変数がすべて含まれています。完全な ModelOperatingPoint を使用することによって、Simulink はシミュレーション状態を完全に復元し、ベースライン シミュレーション結果を再生成することができます。
Simulink がシミュレーションの終了時に完全な操作点を保存するように、パラメーターを設定します。
out3 = sim(mdl, 'StopTime', '5', 'SaveFinalState', 'on', ... 'LoadInitialState', 'off', 'SaveOperatingPoint', 'on',... 'FinalStateName', 'xFinal'); y1 = out3.ScopeData;
最後のシミュレーションから ModelOperatingPoint を読み込んで、さらに 5 秒間実行します。開始時間の値は 0.0 (元のシミュレーションの開始時間の値) のままになっていなければなりません。元のシミュレーションの開始時間が xFinal に保存されます。シミュレーション状態の復元を有効にするには、この値は現在のシミュレーションの開始時間と一致しなければなりません。
assignin('base', 'xFinal', out3.get('xFinal')); out4 = sim(mdl, 'StopTime', '10', 'SaveFinalState', 'off', ... 'LoadInitialState', 'on', 'InitialState', 'xFinal'); y2 = out4.ScopeData;
結果をプロットして、ベースライン シミュレーションと比較します。今回はシミュレーション状態が完全に復元され、操作点の復元後のシミュレーションの結果がベースライン結果と完全に一致していることに注目してください。
figure; for idx=1:3 subplot(3, 1, idx); plot(y.time,y.signals(idx).values); hold on plot([y1.time; y2.time],... [y1.signals(idx).values;y2.signals(idx).values],'r--'); hold off; grid on; end
モデルを閉じて、この例で使用された変数をクリアします。
close_system(mdl, 0); clear mdl idx xFinal y y1 y2 y3 out out1 out2 out3 out4