Main Content

動的システムのシミュレーションの段階

モデルのコンパイル

シミュレーションの最初の段階の処理は、システムのモデルを開いて、モデルのシミュレーションを実行したときに行われます。Simulink® エディターで [実行] をクリックします。シミュレーションを実行すると、Simulink エンジンによってモデル コンパイラが呼び出されます。モデル コンパイラはコンパイルと呼ばれるプロセスでモデルを実行可能形式に変換します。特にコンパイラは以下を行います。

  • モデルのブロック パラメーター式を評価し、値を決定します。

  • モデルによって明示的に指定されていない、たとえば、名前、データ型、数値型、次元のような信号の属性を決定し、各ブロックが、入力に接続されている信号を受け入れ可能であることをチェックします。

  • 以前にブロックで指定されていない属性を計算するために、ソース信号から接続しているブロックの入力への属性を伝播します。

  • ブロックを減らす最適化を実行します。

  • バーチャル サブシステムをその構成ブロックで置き換えることにより、モデルの階層構造をフラットにします (ソルバーの比較を参照)。

  • ブロックの実行順序をタスクベースの並べ替えによって決定します。

  • サンプル時間が明示的に指定されていないモデル内のすべてのブロックのサンプル時間を決定します (伝播が継承サンプル時間に影響を与える方法を参照)。

これらのイベントはブロック線図の更新時に発生するイベントと、基本的に同じです。違いは、Simulink ソフトウェアがモデル シミュレーションの一部としてモデルのコンパイルを開始することです。コンパイルが開始されると、リンク フェーズに記載されているように、リンク フェーズに直接移行します。一方、モデルの更新は、モデルに対するスタンドアロン操作としてユーザーが明示的に開始します。

モデルまたはモデルの階層構造をコンパイルする場合、進行状況バーの横にある [キャンセル] ボタンをクリックしてモデルのコンパイルをキャンセルできます。

リンク フェーズ

このフェーズでは、Simulink エンジンは、ブロック線図の実行のために、作業領域 (信号、状態、ランタイム パラメーター) 用に必要なメモリを割り当てます。また、各ブロックの実行時情報を格納するデータ構造体用のメモリを割り当て、初期化します。組み込みブロックに対しては、ブロックの主たる実行時データ構造体は、SimBlock と呼ばれます。これは、ブロックの入出力バッファー、状態、作業ベクトルを指すポインターを格納します。

メソッド実行リスト

リンク フェーズでは、Simulink エンジンは、メソッド実行のリストも作成します。これらのリストは、出力を計算するために、モデルのブロック メソッドを実行するための最適な順番を示します。モデルのコンパイル フェーズ中に生成されたブロックの実行順序リストはメソッド実行リストを作成するために使用されます。

ブロック優先順位

ブロックの処理順序には優先順位を付けることが可能です。優先順位が低いブロックの前に優先順位が高いブロックの出力メソッドが実行されます。ブロックの実行順序に従っている場合にのみ、その優先順位が守られます。

シミュレーション ループ フェーズ

リンク フェーズが完了すると、シミュレーションはシミュレーション ループ フェーズに入ります。このフェーズでは、Simulink は、引き続きモデルが提供する情報を使って、シミュレーション開始時間から終了時間までの区間でシステムの状態と出力を計算します。状態と出力が計算される連続する時間点は、タイム ステップと呼ばれます。ステップ間の時間の長さは、ステップ サイズと呼ばれます。ステップ サイズは、システムの連続状態の計算に使うソルバーのタイプ (ソルバーの比較を参照)、システムの基本サンプル時間 (システム内のサンプル時間を参照)、システムの連続状態が不連続性をもつかどうかに依存します (ゼロクロッシング検出を参照)。

シミュレーション ループ フェーズには、ループ初期化フェーズとループ反復フェーズの 2 つのサブフェーズがあります。初期化フェーズは、ループの開始時に 1 回発生します。反復フェーズは、シミュレーション開始時間から終了時間まで 1 ステップごとに 1 回繰り返されます。

シミュレーションの開始時に、モデルは、シミュレートするシステムの初期状態と初期出力を指定します。各ステップで、システムの入力、状態、出力が計算され、計算値を反映するようにモデルが更新されます。シミュレーションの終了時に、モデルはシステムの入力、状態、出力の最終値を反映させます。Simulink ソフトウェアは、データの表示とログを行うブロックを提供しています。モデルにこれらのブロックを含めることにより、中間結果を表示またはログできます。

次のフローチャートはシミュレーション ループの動作を説明しています。ここで、k はメジャー ステップのカウンターを表します。

ループ反復

各タイム ステップで Simulink エンジンは次のことをします。

  1. モデルの出力を計算します。

    Simulink エンジンは、Simulink モデルの Outputs メソッドを呼び出すことによってこのステップを開始します。モデルの Outputs メソッドは、モデルシステムの Outputs メソッドを呼び出し、これは、シミュレーションのリンク フェーズで生成されたリストによって指定された順番でモデルが含むブロックの Outputs メソッドを呼び出します(ソルバーの比較を参照)。

    システムの Outputs メソッドは、引数として、ブロックのデータ構造体とその SimBlock 構造体を指すポインターを各ブロックの Outputs メソッドに渡します。SimBlock データ構造体は、入出力バッファーの位置を含む、ブロックの出力を計算するのに必要な情報を示します。

  2. モデルの状態を計算します。

    Simulink エンジンは、ソルバーを呼び出すことによってモデルの状態を計算します。どのソルバーを呼び込むかは、モデルが状態をもたないか、離散状態のみか、連続状態のみか、連続と離散の両方をもつかによって決まります。

    モデルが離散状態のみをもつ場合は、Simulink エンジンは、ユーザーが選択した離散ソルバーを起動します。ソルバーは、モデルのサンプル時間をヒットするのに必要なタイム ステップのサイズを計算します。その後で、モデルの Update メソッドを呼び込みます。モデルの Update メソッドは、システムの Updateメソッドを呼び込み、これは、リンク フェーズで生成された Update メソッドのリストで指定された順番でシステムが含むブロックの各々の Update メソッドを呼び込みます。

    モデルが連続状態のみをもつ場合は、Simulink エンジンはモデルによって指定された連続ソルバーを起動します。ソルバーにより、モデルの Derivatives メソッドを 1 回呼び出すか、あるいは、メジャー タイム ステップ内の連続する間隔でモデルの出力と導関数を計算する Output メソッドと Derivative メソッドをソルバーが繰り返し呼び出すマイナー タイム ステップのサブサイクルを入力します。これは、状態の計算の精度を上げるために行われます。モデルの Outputs メソッドと Derivatives メソッドは、リンク フェーズで生成される Output および Derivative メソッドの実行リストで指定される順番で、Outputs および Derivatives ブロックを呼び出す対応するシステム メソッドを起動します。

  3. オプションでブロックの連続状態の不連続性をチェックします。

    連続状態の不連続検出には、ゼロクロッシング検出と呼ばれる手法が使用されます。詳細については、ゼロクロッシング検出を参照してください。

  4. 次のタイム ステップに対する時間を計算します。

シミュレーションの停止時間になるまでステップ 1 ~ 4 を繰り返します。

関連するトピック