ドキュメンテーション

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

シミュレーション状態 (SimState) の保存と復元

SimState とシミュレーションの反復

システムを設計するときは、モデルを繰り返しシミュレートして、さまざまな入力、境界条件、動作条件に対するシステムの動作を解析します。多くのアプリケーションでは、重要な動的な動作を伴う始動フェーズは、複数のシミュレーションで共通です。たとえば、ガス タービン エンジンのコールド スタートは、飛行機の操縦前に発生します。理想的には、次のようになります。

  1. 始動フェーズを 1 回シミュレートします。

  2. 始動フェーズの終了時にシミュレーション状態を保存します。

  3. 保存したシミュレーション状態をそれぞれの状況や操縦のシミュレーションで初期状態として使用します。

このようなシミュレーションでは、SimState を使用してシミュレーションの状態を保存します。以降のシミュレーションでは、SimState を復元してシミュレーションの初期条件を設定することができます。

SimState には、各ブロックのログが作成された内部状態 (連続状態、離散状態、作業ベクトル、ゼロクロッシング状態など) と Simulink® エンジンの内部状態 (ODE ソルバーのデータなど) の両方が含まれています。

メモ

シミュレーション状態は、[コンフィギュレーション パラメーター] の [データのインポート/エクスポート] ペインにある [最終状態] オプションを使用して保存することもできます。ただし、このオプションで保存されるのは "ログが作成された" 状態 (ブロックの連続状態と離散状態) だけです。これらの状態はモデルの完全なシミュレーション状態の一部にすぎません。一部のブロックのログに記録されない状態に関する情報は含まれません。ブロックを適切に実行するには、ログが作成された状態には含まれないそれらの情報も必要になります。そのため、[最終状態] を使用して、すべてのシミュレーション状態を新しいシミュレーションの初期状態として保存し復元することはできません。

SimState で保存される情報

SimState には以下に関する情報が格納されます。

  • ログが作成された状態

  • ソルバーおよび実行エンジンの状態

  • ゼロクロッシングを登録するブロックのゼロクロッシング信号

  • モデル内の一部のブロックの出力値

    Simulink では、状態情報として出力値が効果的に使用されているかどうかを判定するためにブロックの接続などの情報を解析します。

SimState には以下のブロックのログに記録されない状態も格納されます。

  • Transport Delay

  • Variable Transport Delay

  • From Workspace

  • For Each Subsystem

  • 条件付き実行サブシステム

  • Stateflow

  • MATLAB System

  • Simscape™ Multibody™ Second Generation

SimState では、これらの情報が格納されるため、SimState から開始したシミュレーションと最初から実行したシミュレーションの結果が同じになります。

SimState を使用する利点

  • SimState でシミュレーションの状態を保存すると、モデルのログが作成された状態以外の情報も保存されます。シミュレーションを中断なしで実行した場合と同じ結果を得るには、それらのすべての情報を復元する必要があります。たとえば、ソルバー情報が影響するシミュレーションの場合、SimState を使用せずにブロックの状態を変更すると異なる結果になることがあります。

  • SimState はシミュレーション中に複数保存できます。それらの保存した任意の状態からシミュレーションを再開することができます。

  • SimState を使用すると、Transport Delay ブロックなど、通常は特定の状態に戻すことが難しいブロックの状態も復元することができます。Transport Delay ブロックの状態は、Simstate ではなく [最終状態] コンフィギュレーション パラメーターを使用してデータのログを作成した場合、構造体形式または配列形式で保存されません。ログに記録されない状態があるブロックは復元が特に困難ですが、SimState を使用すればそれらも復元できます。

SimState を保存できるタイミング

SimState は次の場合に保存できます。

  • 最後の [終了時間] にて

  • [一時停止] または [停止] ボタンでシミュレーションを中断する場合

  • get_param またはブロック (Stop ブロックなど) を使用してシミュレーションを停止したとき

SimState の保存

SimState は、最終ステップの始めに次のいずれかの方法で保存できます。

対話型の実行

  1. [コンフィギュレーション パラメーター] ダイアログ ボックスの [データのインポート/エクスポート] ペインで、[最終状態] チェック ボックスをオンにします。[最終状態のすべての SimState を保存] チェック ボックスが選択可能になります。

  2. [最終状態のすべての SimState を保存] チェック ボックスをオンにします。

  3. [最終状態] テキスト ボックスに SimState の変数名を入力します。

  4. モデルのシミュレーションを実行します。

MATLAB コマンド プロンプトを使用

set_paramsim コマンドを使用します。SaveCompleteFinalSimState パラメーターを on に設定します。

set_param(mdl,'SaveFinalState','on','FinalStateName',...
 [mdl 'SimState'],'SaveCompleteFinalSimState','on')
simOut = sim(mdl,'StopTime',tstop)
set_param(mdl,'SaveFinalState','off')

SimState の復元

[開始時間] の値は、SimState を生成したシミュレーションの値と同じになります。元のシミュレーションと現在のシミュレーションの両方において、この値がすべての時間と時間依存変数の基準値になります。たとえば、ブロックは、シミュレーションが開始されてから発生したサンプル時間のヒット数を SimState として保存し復元できます。

0 ~ 100 秒の範囲で実行したモデルを 100 ~ 200 秒の範囲で実行するとします。[開始時間] は、元のシミュレーション (0 ~ 100 秒) でも現在のシミュレーション (100 ~ 200 秒) でも 0 秒です。現在のシミュレーションの初期時間は 100 秒です。また、元のシミュレーション中にブロックで 10 のサンプル時間のヒットがあった場合、Simulink は、次のサンプル時間のヒットは 100 秒ではなく 0 秒を基準として、11 番目のヒットであると認識します。

メモ

SimState を復元する前に [開始時間] を変更した場合、Simulink によって、[開始時間] の値が SimState に保存されている値に置き換えられます。

SimState は、次のいずれかの方法で復元できます。

対話型の実行

  1. [コンフィギュレーション パラメーター] ダイアログ ボックスの [データのインポート/エクスポート] ペインで、[ワークスペースから読み込み] にある [初期状態] チェック ボックスをオンにします。テキスト ボックスが入力可能になります。

  2. テキスト ボックスに SimState が格納された変数の名前を入力します。

  3. [終了時間] の値を SimState を保存した時間よりも後の時間に設定します。

MATLAB コマンド プロンプトを使用

set_param を使用して、SimState を初期条件として指定します。

set_param(mdl,'LoadInitialState','on','InitialState',...
[mdl 'xFinal']);
simOut.get([mdl 'SimState']);

以前のバージョンの Simulink で保存された SimState の復元

R2010a 以降のリリースで保存された SimState オブジェクトを使用してモデルの SimState を復元することができます。ただし、この方法で復元できるのは、モデルのログが作成された状態だけです。SimState の保存に使用された Simulink のバージョンは、SimState オブジェクトの [バージョン] パラメーターで確認できます。

Simulink では、初期状態として指定された SimState オブジェクトが現在のリリースで保存されたものかどうかを確認します。Simulink の既定の設定では、SimState が現在のリリースで保存されたものでなければエラー メッセージが表示されます。Simulink で警告としてメッセージを表示できるように診断を設定することによって、可能な限り多くの値の復元を試みることができます。

ここで最善の結果が得られるように復元を有効にするには、[コンフィギュレーション パラメーター] ダイアログ ボックスの [すべてのパラメーター] ペインで、[古いリリースからの SimState オブジェクト] のメッセージを [警告] に設定します。

SimState 内でブロックの状態を変更する

  • ブロックの状態を取得または設定するには、loggedStates を使用します。xout が Simulink からワークスペースにエクスポートされた状態ログである場合、loggedStates フィールドの構造は xout.signals と同じになります。

  • ログに記録されていない状態は変更できません。これらの状態を変更するとシミュレーションと一致しなくなる可能性があるため、Simulink ではこの変更は許可されていません。

S-Function

C およびレベル 2 の MATLAB® S-Function の API を使用して、S-Function で SimState を操作することができます。S-Function 内におけるこれらの API の実装方法の詳細は、「S-Function Compliance with the SimState」を参照してください。

SimState コンプライアンス レベルが宣言されていないか、あるいは unknown または disallowed に宣言された、P-work ベクトルをもつ S-Function では、SimState はサポートされません。詳細は、「S-Function Compliance with the SimState」を参照してください。

モデルの変更と SimState

  • SimState を保存してから SimState を使用してシミュレーションを復元するまでの間に、モデルに構造的な変更を加えることはできません。たとえば、SimState を保存した後でブロックを追加または削除するには、シミュレーションを繰り返し、新しい SimState を保存する必要があります。

  • SimState インターフェイスのチェックサムは、主にモデルのコンフィギュレーション設定に基づいています。SimState を保存してから復元するまでの間に、非構造的な変更であれば、モデルに変更を加えることができます。そのような変更を追跡するには、[コンフィギュレーション パラメーター] ダイアログ ボックスの [診断] ペインにある [SimState インターフェイスのチェックサムの不一致] 診断を使用します。これを使用して、復元された SimState のインターフェイスのチェックサムが現在のインターフェイスのチェックサムと一致するかどうかを確認できます。

    不一致が生じる可能性があるのは、保存されている SimState を生成したときと異なるソルバーを使用してシミュレーションを実行しようとした場合です。Simulink では、このようなソルバーの変更が可能です。たとえば、ode15s ソルバーを使用してシミュレーションの最初のスティッフな部分を解き、最終的な SimState を保存することができます。その後、ode45 を使用して、復元された SimState でシミュレーションを継続できます。つまり、この診断はソルバーの変更を確認するためのものであり、シミュレーションの問題を示すものではありません。

  • 可変ステップ ソルバーを使用する場合、最大ステップ サイズを auto に設定すると、Simulink の新しいシミュレーションでは復元された SimState の最大ステップ サイズが使用されます。2 つのシミュレーションの連結された SimState の軌跡が中断なしで実行したシミュレーションと一致するようにするには、最大ステップ サイズの値を指定します。

SimState の制限

メモ

場合によっては、部分的な状態情報を保存することで、SimState の使用に関する一部の制限を回避できることがあります。状態データを保存する 2 通りの方法の比較については、SimState と最終状態ログの比較を参照してください。

ブロックのサポート

次のブロックは SimState をサポートしていません。

  • Stack ブロックと Queue ブロックでは、[Push full stack] オプションの既定の設定は [Dynamic reallocation] です。この既定の設定は SimState をサポートしません。その他の設定 ([Ignore][Warning] および [Error]) は SimState をサポートします。

  • Simscape Multibody First Generation のブロック

  • SimEvents® ブロック

Simulink は、ブロックの出力を SimState の一部として保存しようとします。S-Function の場合、これは関数で SimState が不要であると宣言されていても起こります。ブロック出力がカスタム タイプである場合、Simulink では SimState を保存できず、エラーが表示されます。S-Function での SimState の使用についての詳細は、S-Functionを参照してください。

モデル参照では、SimState が部分的にサポートされます。詳細は、モデル参照を参照してください。

シミュレーション

  • SimState を保存できるのは、シミュレーションを一時停止または停止する最終停止時間または実行時間に限られます。

  • シミュレーションのノーマル モードまたはアクセラレータ モードのみを使用できます。

  • SimState をノーマル モードで保存し、アクセラレータ モードで復元することはできません。その逆も同様です。

  • 一部のブロックのログに記録されない状態を変更することはできません。詳細は、SimState 内でブロックの状態を変更するを参照してください。

コード生成

SimState 機能では Simulink Coder™ または Embedded Coder® のコード生成はサポートされません。

モデル参照

  • アクセラレータ モードの参照モデル内にあるブロックのログが作成された状態は変更できません。

  • 次のブロックがアクセラレータ モードの参照モデルに含まれている場合、SimState はサポートされません。

    • レベル 2 の MATLAB S-Function

    • MATLAB System

    • n-D Lookup Table

    • S-Function (カスタムの SimState または PWork ベクトルを含む)

    • To File

    • Simscape ブロック

  • 詳細は、参照モデルの状態情報を参照してください。

モデル関数

関数 modelSimState を入力することはできません。

関連するトピック

この情報は役に立ちましたか?