ドキュメンテーション センター

  • 評価版
  • 製品アップデート

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

SimState を使用したシミュレーションの保存と復元

この例では、SimState オブジェクトを使用してシミュレーション状態 (SimState) を保存、復元する方法を示します。また、SimState オブジェクトを使用する利点についても説明します。

SimState オブジェクトには、モデルのシミュレーションに関連するすべての変数のセットが含まれています。シミュレーション終了時に SimState オブジェクトを保存した後、Simulink は SimState を再度読み込み、SimState が保存された時間からシミュレーションを継続することができます。このアクションは、シミュレーションが中断されなかった場合と同一のシミュレーション結果を再現します。

この例では、以下を説明します。

  • シミュレーション状態を完全に正確に復元するためには、最終状態 (ログが作成された状態) を保存するだけでは、必ずしも十分とは言えないこと。

  • SimState 機能を使用して、完全なシミュレーション状態を保存して復元する方法。

可変の転送遅延があるモデルでの問題

シミュレーション中に記録された状態は、シミュレーションの状態を完全に説明するために必要なすべての情報のサブセットです。一部のブロックは内部情報に依存しており、この内部情報は SimState に対応しないため、最終状態のログの一部はエクスポートされません。たとえば、Transport Delay ブロックです。Transport Delay ブロックがあるモデルは、通常は特定の状態に完全に戻すことは困難です。これは、伝播遅延が「最終状態」データ ログの一部として構造体形式または配列形式で保存されないためです。

この問題を説明するために、次の 2 つのケースのシミュレーション結果を比較してみましょう。

1. Transport Delay ブロックを含むモデルのシミュレーションを 0 秒から 5 秒の間実行し、「最終状態」の値をワークスペースに保存します。その後、この 1 回目の最終状態のセットを読み込んで、5 秒から 10 秒の間シミュレートします。

2. 同じモデルのシミュレーションを 0 秒から 10 秒の間実行し、5 秒でモデルに強制的に出力を生成させます。このシミュレーションはノンストップのシミュレーションなので、このシミュレーション結果をベースライン結果と呼びます。

1 回目のシミュレーションの結果は、ベースライン結果の前半と一致します。最初のシミュレーションのシミュレーション状態が完全に復元されていれば、2 回目のシミュレーションの結果は、ベースラインの後半と一致するはずです。

開始するには、このモデルを読み込みます。

mdl = 'sldemo_VariableTransportDelay';
load_system(mdl);

シミュレーションを 5 秒まで実行し、最終状態を構造体形式で保存します。

out = sim(mdl, 'StopTime', '5', 'SaveFinalState', 'on',...
          'FinalStateName','xFinal', 'SaveFormat','Structure');
y1 = out.get('ScopeData');

最後のシミュレーションから最終状態を読み込んで、10 秒まで実行します。

assignin('base', 'xFinal', out.get('xFinal'));
out1 = sim(mdl, 'StartTime', '5', 'StopTime', '10', ...
           'SaveFinalState', 'off', ...
           'LoadInitialState', 'on', 'InitialState', 'xFinal');
y2 = out1.get('ScopeData');

ベースライン結果となるノンストップのシミュレーションを実行します。

out2 = sim(mdl, 'OutputOption', 'AdditionalOutputTimes' ,...
             'OutputTimes','[0 5 10]', 'LoadInitialState', 'off');
y = out2.get('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

完全な SimState の保存と復元

完全な最終 SimState を Simulink.SimState オブジェクトに保存することができます。SimState オブジェクトには、シミュレーション結果を復元するのに必要な変数がすべて含まれています。完全な SimState を使用することによって、Simulink はシミュレーション状態を完全に復元し、ベースライン シミュレーション結果を再生成することができます。

Simulink がシミュレーションの終了時に完全な SimState を保存するように、パラメーターを設定します。

out3 = sim(mdl, 'StopTime', '5', 'SaveFinalState', 'on', ...
          'LoadInitialState', 'off', 'SaveCompleteFinalSimState', 'on',...
          'FinalStateName', 'xFinal');
y1 = out3.get('ScopeData');

最後のシミュレーションから SimState を読み込んで、さらに 5 秒間実行します。開始時間の値は 0.0 (元のシミュレーションの開始時間の値) のままになっていなければなりません。元のシミュレーションの開始時間が xFinal に保存されます。シミュレーション状態の復元を有効にするには、この値は現在のシミュレーションの開始時間と一致しなければなりません。

assignin('base', 'xFinal', out3.get('xFinal'));
out4 = sim(mdl, 'StopTime', '10', 'SaveFinalState', 'off', ...
          'LoadInitialState', 'on', 'InitialState', 'xFinal');
y2 = out4.get('ScopeData');

結果をプロットして、ベースライン シミュレーションと比較します。今回はシミュレーション状態が完全に復元され、SimState の結果がベースライン結果と完全に一致していることに注目してください。

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
この情報は役に立ちましたか?