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

実行順序の制御と表示

モデルの "実行順序" とは、Simulink® がシミュレーション中にブロックの出力メソッドを呼び出す順番です。Simulink は、この順序をモデルの更新中に決定します。モデルの更新を開始するには、[モデル化] タブで [モデルの更新] をクリックします。Simulink はシミュレーション中にもモデルを更新します。

この実行順序を設定することはできませんが、非バーチャル ブロックに優先順位を割り当て、対応するブロック線図内のその他のブロックに対する相対的な実行順序を指示することができます。Simulink は、データの依存関係と競合がない限り、ブロック優先順位の設定を守ろうとします。設定した優先順位の結果を確認するか、モデルをデバッグするには、非バーチャル ブロックとサブシステムの実行順序を表示して確認することができます。

メモ

ブロック メソッドと実行の詳細は、以下を参照してください。

実行順序ビューアー

[デバッグ] タブで [情報のオーバーレイ][実行順序] を選択します。Simulink エディターの右側のペイン内に実行順序ビューアーが開きます。

実行順序ビューアーには、現在のシステムのタスクのリストが表示されます。

[システム インデックス] の各値は、たとえば、ある非バーチャル サブシステム内のブロックなど、その他のブロックとは独立して実行されるブロックのグループに対応します。モデル内で、[システム インデックス] の値は一意です。モデル参照階層では同一の [システム インデックス] の値を複数回使用できますが、その階層の各モデル内では一意に保たれます。サブシステムがモデル内の同一のシステムの一部であるかを調べるには、その [システム インデックス] 値を比較します。

[タスク ID] 列にリストされる各タスクは、共通のサンプル レートをもつブロックのグループに対応しています。固定ステップサイズの場合、Simulink が離散レートのブロックを 1 つのタスクで実行するか複数のタスクで実行するかは、[各離散レートを個別のタスクとして扱う] コンフィギュレーション パラメーターによって決まります。

実行順序ビューアーでタスクを選択すると、そのタスクに属するブロックが強調表示され、その実行順序が表示されます。既定では、Simulink はアクティブなブロック線図に対応する最初のタスクを選択します。

タスクの一部として実行されるブロックがアクティブなブロック線図に含まれない場合、そのタスクを実行順序ビューアーで選択することはできません。アクティブなブロック線図には、そのタスクの一部であるバーチャル ブロック (Inport ブロックなど) が含まれることがあります。

強調表示と実行順序を非表示にするには、[強調表示をクリア] ボタンをクリックします。

ブロックからタスクへの移動

ブロックが実行するタスクを表示するには、ブロックをクリックします。

The selected Subsystem block has an information overlay that says "Task: 0,1." The information overlay contains a link for each task number.

ラベルに表示されるタスク番号はリンクになっており、クリックすると、実行順序ビューアーの対応するタスクが選択されます。モデルに多数のタスクがある場合、実行順序ビューアーのタスク リストをスクロールする代わりにこのリンクを使用できます。

ブロック間でタスクを比較するには、複数のブロックを選択します。

実行順序の注釈

Simulink は、各非バーチャル ブロックの右上に番号を表示します。これらの番号はブロックが実行される順序を示します。最初に実行されるブロックが最小の実行順序 (通常、1) を持ちます。表示される実行順序の番号が飛んでいることがありますが、ブロックは常に表示された番号順に実行されます。あるタスクに実行順序 1、2、4 が表示されていると仮定します。1 のラベルの付いたブロックは 2 のラベルの付いたブロックより先に実行され、2 のラベルの付いたブロックは 4 のラベルの付いたブロックより先に実行されます。

たとえば、vdp モデルで、ブロックの実行順序は 19 までの範囲で、各非バーチャル ブロックに実行順序が付けられます。

バーチャル サブシステムおよび非バーチャル サブシステム

バーチャル Subsystem ブロックはグラフィックス上でのみ存在し、実行されることがありません。したがって、これらは実行順序に含まれません。バーチャル サブシステム内のブロックは、ルートレベル モデルのコンテキストの実行順序を持ちます。バーチャル サブシステムでは、サブシステム内のブロック実行順序のリストが中かっこ {} 内に表示されます。

非バーチャル Subsystem ブロックは機能的に存在しており、1 つのユニットとして実行されます。1 つの実行順序を持ち、親モデルとは異なるシステム インデックスを持ちます。非バーチャル サブシステム内のブロックは、親モデルとは独立した独自の実行順序を持ちます。

たとえば、次のモデルには、「Car Dynamics」という名前のバーチャル サブシステムと、「Discrete Cruise Controller」という名前の Atomic 非バーチャル サブシステムが含まれています。

バーチャルな Car Dynamics サブシステムに含まれるブロックの実行順序のリストが、中かっこで囲んで表示されています。その中に含まれるブロックは、ルート レベルで実行されます。Integrator ブロックが最初に実行され、その出力をルートレベル モデル内の Scope ブロック (2 番目に実行される) に送信します。

非バーチャルな Discrete Cruise Controller サブシステムは単一の実行順序 (5) を持ちます。これは、このサブシステムとその中のブロックがルート レベルのブロックに対して 5 番目に実行されることを示します。

メモ

モデル コンフィギュレーションによっては、Simulink は非表示の非バーチャル サブシステムをモデルに挿入できます。結果として、非表示の Subsystem ブロック内部の表示ブロックには、現在のシステム インデックスとは異なるシステム インデックスを指定できます。たとえば、[条件付き入力分岐実行] コンフィギュレーション パラメーターを選択すると、Simulink で作成される非表示で非バーチャルのサブシステムが、並べ替えられた実行順序に影響を与えます。

代数ループ

代数ループ内のブロックは非表示の非バーチャル サブシステムに移動します。非表示のサブシステムの実行順序はその他のブロックのコンテキスト内で決定され、次に非表示のサブシステム内のブロックの実行順序が決定されます。

関数呼び出しサブシステムとアクション サブシステム

関数呼び出しサブシステムとアクション サブシステムにおいて、サブシステムの実行はイニシエーターの実行に関連付けられています。そのため、サブシステムとそのイニシエーターは実行順序を共有します。

エクスポート関数モデルのルートレベルで、関数呼び出しの実行順序には接頭辞 F が付けられます。

詳細については、エクスポート関数モデルの概要を参照してください。

バスと複数のイニシエーター

ブロックへの異なる実行パスに基づいてブロックが複数回実行される場合、ブロックは複数の実行順序を持ちます。以下に例を示します。

  • バスに接続されたブロックは、そのバスが含む各信号に対応する実行順序を持ちます。

  • 複数のイニシエーターを持つ関数呼び出しサブシステムまたはアクション サブシステムは、各イニシエーターに対応する実行順序を持ちます。

Simulink の実行順序の判定方法

Simulinkは、タスクベースの並べ替えを使用して、派生サンプル時間情報に基づいてブロックと端子の実行順序を設定します。タスクベースの並べ替えにより、ブロックの実行順序の決定プロセスが効率化および単純化されます。

タスクベースの並べ替えを使用すると、次のようになります。

  • タスクはサンプル時間に基づいて個別に並べ替えられる。

  • すべてのタスクに対し、フラットにして並べ替えられたブロックの 1 つのリストの代わりに、複数の並べ替えられたリストが生成される。

  • レート変換の処理が簡易化される。

  • さまざまなタスクのブロックに関連する偽のデータ依存性違反が回避される。

  • コード生成結果は効率的なレート グループにある。

  • 1 つのサブシステムが複数のタスクの異なる並べ替えリストに属することができる。

直達端子による実行順序への影響

実行順序がブロック間のデータの従属関係を確実に反映するように、Simulink は、ブロック出力端子のブロック入力端子に対する従属関係に従って、ブロック入力端子を分類します。その現在値により 1 つのブロック出力の現在値が判定される入力端子は、直達端子呼ばれます。直達端子をもつブロックの例は以下のとおりです。

直達入力をもたないブロックの例は以下のとおりです。

  • Integrator — 出力値はその状態の関数に該当します。

  • Constant — 入力値をもちません。

  • Memory — 出力値は前のタイム ステップからの入力値に依存します。

ブロックの実行順序を決定するルール

ブロックを並べ替えるには、Simulink は次のルールを使用します。

  • ブロックが別のブロックの直達端子に接続されている場合、実行順序内でそれが接続されるブロックの前になければなりません。

    このルールにより、Simulink が現在の入力を要求するブロック メソッドを呼び出すときに、ブロックへの直達入力が確実に有効になります。

  • 直達入力をもたないブロックは、それが接続される直達入力をもつブロックの前にある限り、実行順序のどこにあってもかまいません。

    直達端子をもたないすべてのブロックを実行順序の先頭に置くことで、このルールを満たすことができます。これにより Simulink は、並べ替えプロセスでこれらのブロックを無視することができます。

これらのルールを適用すると、実行順序が作成されます。直達端子をもたないブロックは任意の順序でリストの先頭にあります。その次に直達端子をもつブロックが、それらが接続するブロックに有効な入力を指定するために必要な順番で続きます。

以下のモデルはこの結果を説明します。次のブロックには直達がないため、ルートレベル システムの実行順序の最初に示されます。

  • Car Dynamics バーチャル サブシステムの Integrator ブロック

  • ルートレベル モデルの Speed ブロック

Discrete Cruise Controller Subsystem にある直達端子をもつすべての Gain ブロックは、それらが接続する Sum ブロックより前に実行されます。

非同期タスクを含むモデルでブロックの実行順序を決定するルール

シミュレーションにおいて、あるタスク内のブロックの並べ替え順序を決定するときに最も高い優先順位を持つのは、非同期関数呼び出しイニシエーターです。詳細については、非同期のサンプル時間およびRate Transitions ブロックと Asynchronous ブロック (Simulink Coder)を参照してください。

Simulink は、次のルールを使用して、非同期のサンプル時間をもつモデルでブロックの実行順序を決定します。

  • 対応するレート変換ブロックで共有される離散レートによって非同期関数呼び出しイニシエーターがトリガーされた場合、共通の離散レートのタスク内で、その非同期関数呼び出しイニシエーターが 1 番目に並べ替えられます。

    たとえば、以下のモデルでは、離散レート D1 によってトリガーされる非同期関数呼び出しイニシエーターが 1 つあります。この離散タスク内で、非同期関数呼び出しイニシエーターが 1 番目に並べ替えられます。Rate Transition ブロックは、非同期レート A1 と離散レート D1 の間の変換を行います。

  • Rate Transition ブロックが NoOp に削減された場合、Rate Transition ブロックは実行されず、離散タスク内の並べ替え順序における位置は、接続先の上流または下流の離散ブロックに伝達されます。

    たとえば、上のモデルにおいて、RTB2NoOp に削減されるため、並べ替え順序における位置は、下流の Gain ブロックに伝達されます。

  • 2 つの非同期関数呼び出しイニシエーターが共通の離散レート タスクを共有している場合、最も高い優先順位を持つ非同期関数呼び出しイニシエーターが離散レート タスクの中で最初に実行されます。

    たとえば、下のモデルにおいて、2 つの非同期関数呼び出しイニシエーターは同じ離散レート D1 によってトリガーされます。タスクの優先度が高い方が先に並べ替えられます。

  • タスクベースの並べ替えは、非同期サンプル時間の和集合をサポートしていません。複数の非同期サンプル時間の和集合をもつモデルは、既定でグローバルな実行順序になります。つまり、すべてのブロックが単一のタスク内で並べ替えられます。

Data Store Memory ブロックに関連する実行順序の変更のチェック

ブロックの並べ替えではなくタスクベースの並べ替えを使用して、Data Store Memory ブロックに関連する相対的な実行順序を変更できます。アップグレード アドバイザーのチェックは、モデルの更新時に変更を検出し、元の実行順序を維持するためのオプションを提供します。

  1. アップグレード アドバイザーを開きます。[モデル化] タブで [モデル アドバイザー][アップグレード アドバイザー] を選択します。

  2. [Check relative execution orders for Data Store Read and Data Store Write blocks] のチェック ボックスをオンにします。

  3. [このチェックを実行] ボタンをクリックします。

  4. [結果] テーブルで変更を確認します。元の実行順序を保持する場合、[変更] ボタンをクリックします。

関連するトピック