Main Content

このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。

実行順序の制御と表示

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

この実行順序を設定することはできませんが、非バーチャル ブロックに優先順位を割り当て、対応するブロック線図内のその他のブロックに対する相対的な実行順序を指示できます。

一部の非バーチャル ブロックでは、ブロックの優先順位はサポートされません。たとえば、Simulink は次のブロックに設定された優先順位を無視します。

  • Merge ブロック

  • 関数呼び出し入力端子をもつブロック (Function-Call Subsystem ブロックやエクスポート関数モデルを参照する Model ブロックなど)

  • アクション端子をもつブロック (If Action Subsystem ブロックや Switch Case Action Subsystem ブロックなど)

優先順位がこれらのブロックに設定されている場合は、[ブロック優先順位違反] コンフィギュレーション パラメーター設定によって、警告を表示するかエラーを表示するかが決まります。

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

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

実行順序ビューアー

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

Execution Order viewer

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

非バーチャル サブシステムのそれぞれに、モデル内で一意となる独自の [システム インデックス] の値があります。非バーチャル サブシステム内に直接含まれるブロックの [システム インデックス] の値はサブシステムと同じになります。モデル参照階層では同一の [システム インデックス] の値を複数回使用できますが、その階層の各モデル内では一意に保たれます。サブシステムがモデル内の同一のシステムの一部であるかを調べるには、その [システム インデックス] 値を比較します。

[タスク 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 までの範囲で、各非バーチャル ブロックに実行順序が付けられます。

Execution Order viewer for the vdp model

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

バーチャル Subsystem ブロックはグラフィックス上でのみ存在し、実行されることがありません。したがって、これらは実行順序に含まれません。ブロックがブロック パスを基準に並べ替えられている場合、バーチャル サブシステムを作成するとブロックの実行順序に影響を与えることがあります。バーチャル サブシステム内の各ブロックはアトミック単位として実行され、ルートレベル モデルのコンテキストの実行順序か、バーチャル サブシステムが非バーチャル サブシステム内にある場合は親の非バーチャル サブシステムのコンテキストの実行順序を持ちます。バーチャル サブシステムでは、サブシステム内のブロック実行順序のリストが中かっこ {} 内に表示されます。

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

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

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

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

メモ

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

代数ループ

代数ループ内のブロックは非表示の非バーチャル サブシステムに移動します。Simulink は、先に非表示のサブシステムの実行順序を他のブロックのコンテキスト内で決定してから、次に非表示のサブシステム内のブロックの実行順序を決定します。代数ループの概念を参照してください。

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

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

Simulink では、Function-Call SubsystemIf Action Subsystem、または Switch Case Action Subsystem ブロックに設定されているブロックの優先順位は無視されますが、それらのサブシステムを開始するブロックで優先順位を設定できます。

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

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

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

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

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

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

Simulink の実行順序の判定方法

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

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

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

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

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

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

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

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

直達入力による実行順序への影響

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

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

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

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

  • ブロックが別のブロックの直達入力を駆動する場合、駆動ブロックは実行順序内でそれが駆動するブロックの前になければなりません。

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

  • ブロックが別のブロックの直達入力でない入力を駆動する場合、2 つのブロックの間にデータ依存性はないため、相対的な実行順序は問題にはなりません。

以下のモデルはこの結果を説明します。

  • Car Dynamics バーチャル サブシステムの Integrator ブロック 1/s には直達入力はありません。そのため、その入力が Gain ブロック 1/m に接続されていても、Integrator ブロックは Gain ブロック 1/m の前に並べられます。Integrator ブロックの出力が Gain ブロック b の入力を駆動するため、Integrator ブロックはその Gain ブロックの前に並べられます。

  • ルートレベル モデルでは、Step ブロック step responseSum ブロックを駆動するため、Step ブロックは Sum ブロックの前に並べられます。Sum ブロックが Discrete Cruise Controller 非バーチャル サブシステムの直達入力を駆動するため、このサブシステムは Sum ブロックの後に並べられます。

Discrete Cruise Controller 非バーチャル サブシステムは、出力が Kp Gain ブロックとの分岐による現在の入力の値に依存するため、直達入力をもつブロックとして扱われます。サブシステム内の直達入力をもつすべての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 ブロックに関連する相対的な実行順序を変更できます。アップグレード アドバイザーのチェックでは、Simulink の前のバージョンからモデルを更新するときに変更を検出し、元の実行順序を維持するためのオプションを提供します。

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

  2. [Data Store Read ブロックと Data Store Write ブロックの相対的な実行順序のチェック] のチェック ボックスをオンにします。

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

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

コード生成

モデルがコード生成用にコンパイルされると、生成コードでの Data Store Read ブロックと Data Store Write ブロックの相対的な実行順序が、ノーマル シミュレーション モードでの順序と異なる場合があります。モデル アドバイザーのチェックでは、これらの違いを検出して、生成コードの順序に合わせてノーマル シミュレーション モードの実行順序を変更するオプションを提供します。

  1. モデル アドバイザーを開きます。[モデル化] タブで、[モデル アドバイザー][製品別][Simulink Coder]を選択します。

  2. [Data Store Read ブロックと Data Store Write ブロックの相対的な実行順序の変更をチェック] のチェック ボックスをオンにします。

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

  4. [結果] テーブルで変更を確認します。不一致がリストされ、生成コードの実行順序に合わせてノーマル シミュレーションの実行順序を変更する場合は、[ブロックの優先順位の変更] をクリックします。

関連するトピック