Main Content

実行順序の制御と表示

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

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

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

  • Merge ブロック。

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

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

  • For Iterator Subsystem ブロック内の For Iterator ブロックと While Iterator Subsystem ブロック内の While Iterator ブロック。For Iterator ブロックと While Iterator ブロックは、それぞれ For Iterator Subsystem ブロックと While Iterator Subsystem ブロック内で最初に実行されるブロックでなければなりません。

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

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

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

実行順序ビューアー

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

Execution Order pane

[実行順序] ペインには、最新のコンパイル済み実行順序に基づく情報が表示されます。

  • システム インデックス — 現在のシステムまたは非バーチャル サブシステムを表すモデル内の一意の値。最上位モデルの場合、システム インデックスは 0 です。各非バーチャル サブシステムの場合、システム インデックスは正の整数です。

    非バーチャル サブシステム内に直接含まれるブロックのシステム インデックスはサブシステムと同じになります。サブシステムがモデル内の同一のシステムの一部であるかを調べるには、そのシステム インデックスを比較します。

    モデル参照階層では同一のシステム インデックスを複数回使用できます。これは階層の各モデル内でのみ一意に保たれます。

  • 実行順序ブロック リスト — タスクベースの実行順序に並べたブロックのリスト。このブロック リストには選択したタスクの完全な実行順序の情報が示され、ブロック線図に表示されるよりも多くの情報が得られます。たとえば、このリストにはサブシステムのブロック線図内のブロックと非表示のブロックが含まれます。

  • タスク ID — 現在のシステム内の各タスクに固有の識別子。各タスクは、派生サンプル時間情報に基づいて互いに対して相対的に設定された順序で実行されるブロックのグループに対応しています。単一の [タスク ID] に、複数の異なるタイプのサンプル時間をもつブロックを含めることができます。実行順序では、別個のタスクに異なるタイプの定数サンプル時間をもつブロックが表示されます。たとえば、定数サンプル時間 [Inf 0] および [Inf Inf] をもつ Simulink ブロックがそれぞれ [タスク 1] および [タスク 2] に表示されます。サンプル時間の詳細については、定数サンプル時間を参照してください。

    プログラムによってサンプル時間情報を取得するには、関数 get_param を使用します。

    get_param('model_name/block_name','CompiledSampleTime')
    詳細については、ブロックのコンパイルされたサンプル時間を参照してください。

    Model that displays blocks with different constant sample times in separate tasks with unique task ID values

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

最後のコンパイル以降に変更があったモデルの実行順序の情報を更新するには、モデルを再コンパイルします。[実行順序] ペインで [モデルを再コンパイルして実行順序の情報を更新します] ボタン をクリックします。

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

メモ

R2023b 以降、実行順序の表示では、選択したタスクの信号線およびバーチャル ブロックが強調表示されなくなりました。

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

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

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

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

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

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

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

実行順序の注釈

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

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

Each block in the model is labelled with their execution order. Execution Order pane also shows those blocks arranged in their execution order.

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

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

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

たとえば、次のモデルには、car dynamics という名前のバーチャル サブシステムと、discrete cruise controller という名前の Atomic 非バーチャル サブシステムが含まれています。

Execution of the virtual and nonvirtual subsystems

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

Execution order of blocks inside the virtual subsystem

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

Execution order of blocks in the nonvirtual subsystem

メモ

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

代数ループ

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

Execution order of blocks in a model with algebraic loop

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

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

Execution order model containing function fall subsystem

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

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

Execution order for root-level export-function model

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

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

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

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

    Execution order for Bus

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

    Execution order for function call subsystem with multiple function-call initiators

実行順序の判定

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Execution order for blocks in the virtual subsystem

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

    Execution of the virtual and nonvirtual subsystems

discrete cruise controller 非バーチャル サブシステムは、出力が Kp という名前の Gain ブロックとの分岐による現在の入力の値に依存するため、直達入力をもつブロックとして扱われます。サブシステム内の直達入力をもつすべての Gain ブロックは、それらが駆動する Sum ブロックより前に実行されます。

Execution order of blocks in the nonvirtual subsystem

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

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

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

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

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

    Execution order display for a model with a discrete rate and asynchronous rate

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

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

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

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

    Execution order display for a model with a discrete rate and two asynchronous rates

  • タスクベースの並べ替えは、非同期サンプル時間の和集合をサポートしていません。複数の非同期サンプル時間の和集合に関連しているブロックはすべて、単一のタスク内で並べ替えられます。

    たとえば、下のモデルにおいて、同じ [Simulink タスクの優先順位] をもつ 2 つの非同期関数呼び出しイニシエーター (2 つの Async Interrupt (Simulink Coder) ブロック) は同じ離散レート D1 によってトリガーされます。このモデルでは、Rate Transition ブロック RTB1_UnionU1 = union(A4 , A5). を計算します。和集合に関連しているブロックは Task 0 でグループ化されます。union サンプル時間の詳細については、What Is Union Sample Time?を参照してください。非同期のサンプル時間については、非同期のサンプル時間を参照してください。

    Model that contains union of asynchronous sample times

    Execution order display for a model with that contains union of asynchronous sample times

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

モデルのアップグレード

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

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

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

    Upgrade Advisor

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

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

コード生成

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

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

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

    Model Advisor

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

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

関連するトピック