このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
エクスポート関数モデルの概要
エクスポート関数モデルは、外部環境およびスケジューラと統合できる独立した関数のコードを生成する Simulink® モデルです。関数は、Function-Call Subsystem ブロック、関数呼び出し Model ブロック、Simulink Function ブロック、Message Triggered Subsystem ブロック、および S-Function ブロックを使用して定義されます。
以下のエクスポート関数モデルには、Function-Call Subsystem ブロックで定義された 2 つの関数が含まれています。このモデルを作成する手順については、エクスポート関数モデルの作成を参照してください。
このモデルから生成されたコードには、遅延関数用と関数 square 用の 2 つの独立した関数が含まれています。
/* * File: export_function_model.c * Code generated for Simulink model 'export_function_model'. */ void function_call_100ms(void) /* Sample time: [0.1s, 0.0s] */ { export_function_model_Y.output_100ms = export_function_model_DW.UnitDelay_DSTATE; export_function_model_DW.UnitDelay_DSTATE = export_function_model_Y.output_100ms + 1.0; } void function_call_10ms(void) /* Sample time: [0.01s, 0.0s] */ { export_function_model_Y.output_10ms = export_function_model_U.input_10ms * export_function_model_U.input_10ms; }
エクスポート関数モデルのワークフロー
エクスポート関数モデルを作成するための 4 つの一般的なプロセスは、関数のコードを生成する前のモデルのシミュレーションとテストの方法が異なります。
関数呼び出しシーケンスが単純でモデル入力として指定できる場合、入力行列を使用したシミュレーションが、エクスポート関数モデルをテストする推奨方法になります。入力行列を使用したエクスポート関数モデルのシミュレーションのテストを参照してください。
関数呼び出しシーケンスが複雑すぎて入力行列で指定できない場合、テスト モデル (ハーネス) を作成してターゲット環境の動作を再現します。このテスト モデルを使用して関数呼び出し入力をエクスポート関数モデルに提供します。関数呼び出しジェネレーターを使用したエクスポート関数モデルのシミュレーションのテスト、スケジュール エディターを使用したエクスポート関数モデルのシミュレーションのテスト、およびStateflow チャートを使用したエクスポート関数モデルのシミュレーションのテストを参照してください。
許可されるブロック
最上位で、エクスポート関数モデルは、バーチャル ブロック、定数 (inf
) のサンプル時間をもつブロック、および以下のブロックに制限されます。
Inport
Outport
Bus Creator
Bus Selector
In Bus Element
Out Bus Element
Function-Call Subsystem
関数呼び出し入力端子をもつ Model
Simulink Function
Function Element
Function Element Call
Message Triggered Subsystem
Initialize Function
Reinitialize Function
Reset Function
Terminate Function
Data Store Memory
Merge
関数呼び出し入力端子をもつ S-Function
Function-Call Split
Display
Scope
非バーチャル ブロックとバーチャル ブロックを参照してください。
エクスポート関数モデルの要件
エクスポート関数モデルで関数コードを正常に生成するには、以下の要件を満たさなければなりません。
モデル コンフィギュレーション パラメーター:
ソルバーの [タイプ] を
[固定ステップ]
に設定します。[ソルバー] を
[自動]
または[離散]
に設定します。[コード生成] の [システム ターゲット ファイル] を
[ert.tlc]
に設定します。ert.tlc
を選択するには、Embedded Coder® ライセンスが必要です。関数呼び出し Model ブロックの場合、参照モデルの [周期的なサンプル時間の制約] を
[サンプル時間に依存しない]
に設定します。
ルートレベルの関数呼び出し Inport ブロック:
[関数呼び出しの出力] チェック ボックスはオンにします。
Asynchronous Task Specification ブロックから信号を受信できません。
ルートレベルの Outport ブロックは、これらのブロックのいずれかに接続するか、未接続のままにするか、接地する必要があります。
ルートレベルの関数呼び出し Inport ブロックによって駆動される関数呼び出しブロック。このブロックは、Function-Call Subsystem ブロック、関数呼び出し Model ブロック、または関数呼び出し入力をもつ S-Function ブロックのいずれかの場合があります。
Simulink Function ブロック。
Initialize Function ブロック、Reinitialize Function ブロック、Reset Function ブロック、または Terminate Function ブロック。
このようなブロックのみによって駆動される Merge ブロックまたは Mux ブロック。
ルートレベルのデータ Inport ブロックと Outport ブロックは、バーチャル バス データ信号に接続できません。
ルートレベルの Function-Call Subsystem ブロックおよび関数呼び出し Model ブロック:
ブロック内のすべての内部ブロックはコード生成をサポートしなければなりません。
Trigger ブロックの [サンプル時間タイプ] は、次のように設定されます。
[トリガー]
。内部ブロックの [サンプル時間] は-1
に設定しなければなりません。[周期的]
。ルートレベルの関数呼び出し Inport ブロックの [サンプル時間] を指定された離散時間に設定し、すべての内部ブロックの [サンプル時間] を-1
または指定された離散時間に設定しなければなりません。
エクスポート関数モデルの指定
エクスポート関数モデルを作成する際、エクスポート関数モデルとして指定することで、Simulink にモデルをエクスポート関数モデルとして扱うように指示します。
モデルをエクスポート関数モデルとして指定するには、プロパティ インスペクターを開きます。モデルのルート レベルが表示され、強調表示されたブロックがない状態で、[実行] タブに移動し、[実行領域の設定] チェック ボックスをオンにします。[領域] リストから [エクスポート関数]
を選択します。
また、モデルの IsExportFunctionModel
パラメーターを設定することで、モデルをエクスポート関数モデルとして指定することもできます。
set_param(ModelName,'IsExportFunctionModel','on')
Simulink は バッジをキャンバスの左下隅に表示し、モデルがエクスポート関数モデルとして指定されていることを示します。
モデルをエクスポート関数モデルとして指定した後、Simulink はコンパイル時にチェックを行い、モデルがエクスポート関数モデルの要件を満たしていない場合に警告します。
R2022a より前のリリースで作成および保存されたモデルを読み込む場合、モデルがエクスポート関数モデルの要件を満たしていれば、Simulink によりそのモデルがエクスポート関数モデルとして指定されます。場合によっては、そのようなモデルをエクスポート関数モデルとして手動で指定する必要がある場合があります。
Function-Call Subsystem のサンプル時間
エクスポート関数モデルでは、ルートレベルの Function-Call Subsystem ブロックまたは関数呼び出し Model ブロック内のルートレベルの関数呼び出し Inport ブロックと Trigger ブロックにサンプル時間を指定できます。これらのサンプル時間を指定する方法について次の表で説明します。
Trigger ブロックの [サンプル時間タイプ] | Trigger ブロックの [サンプル時間] | Inport ブロックの [サンプル時間] | シミュレーション中の関数呼び出しレート |
| 未指定で、パラメーターは非アクティブです。 | -1 (継承) | シミュレーションの場合、Inport ブロックに接続されている関数呼び出しイニシエーターがシミュレーションのレートを設定します。 |
指定された離散時間 | Inport ブロックに接続されたテスト モデルの関数呼び出しイニシエーターのサンプル時間は、Inport ブロックの指定された離散時間と一致しなければなりません。 シミュレーションでは、指定された離散レートでコンポーネントが実行されます。関数呼び出しソースが別のサンプルを使用すると、Simulink にエラー メッセージが表示されます。 | ||
エクスポート関数モデルが Model ブロックから参照される場合、周期関数呼び出しの実行時チェックが適用されます。 | -1 (継承) または Inport ブロックの指定された離散時間。 | -1 (継承) | この構成は許可されません。Simulink にエラー メッセージが表示されます。 |
指定された離散時間 | シミュレーションの場合、コンポーネントは指定された離散サンプル時間で実行されます。関数呼び出しソースが異なるサンプル時間を使用すると、Simulink にエラー メッセージが表示されます。 |
ルートレベルの関数呼び出し Inport ブロックの実行順序
関数呼び出し Inport ブロックのサンプル時間と優先順位を指定すると、Function-Call Subsystem と関数呼び出しモデルのシミュレーション時の実行順序を制御できます。あるいは、スケジュール エディターまたは Stateflow® チャートを使用して、スケジューリングをテストできます。スケジュール エディターを使用したエクスポート関数モデルのシミュレーションのテストおよびStateflow チャートを使用したエクスポート関数モデルのシミュレーションのテストを参照してください。
シミュレーション実行のサンプル時間を指定します。関数呼び出し Inport ブロックを右クリックし、[ブロック パラメーター] を選択します。
[信号属性] タブを選択します。[サンプル時間] ボックスに、離散時間を入力します。
シミュレーションのブロック優先順位を指定します。関数呼び出し Inport ブロックを右クリックし、[プロパティ] を選択します。
[優先順位] ボックスに、優先順位値を入力します。
シミュレーションのブロック実行順序を表示します。[デバッグ] タブで、[情報のオーバーレイ]
を選択してから、ドロップダウン ダイアログから [実行順序] を選択します。この表示は生成されるコードに影響しません。
以下のエクスポート関数モデルでは、Inport ブロック 2 の [サンプル時間] を 0.01
(10 ms) に設定した Function-Call Subsystem 2 が、Inport ブロック 1 の [サンプル時間] を 0.1
(100 ms) に設定した Function-Call Subsystem 1 よりも前に実行されます。
相対的な実行順序の決定
Simulink では、関数呼び出し Inport ブロックのプロパティを比較し、以下のルールを使用して相対実行順序を決定します。
優先順位 – 優先順位の高い (数値が小さい) 方が最初に実行される
サンプル時間 – サンプル時間が小さい方が最初に実行される
端子番号 – 端子番号が小さい方が最初に実行される
モデルの
OrderFunctionsByDependency
パラメーターが'on'
に設定されている場合は、各ブロックが接続されている関数の相対的なデータ依存性に基づいて、同じサンプル時間をもつブロックがさらに並べ替えられます。
OrderFunctionsByDependency
パラメーターの効果を確認するために、次のモデルについて考えてみます。
Inport ブロック 1 は、Inport ブロック 2 および 3 (この 2 つのサンプル時間は同じ) よりもサンプル時間が長いため最後に実行されます。OrderFunctionsByDependency
が 'off'
に設定されている場合、端子番号に基づいて Inport ブロック 2 が Inport ブロック 3 よりも先に実行されます。実行順序は 2、3、1 になります。
OrderFunctionsByDependency
パラメーターは既定では 'off'
に設定されています。オンにするには次のコマンドを使用します。
set_param(ModelName,'OrderFunctionsByDependency','on')
OrderFunctionsByDependency
が 'on'
に設定されている場合、Function-Call Subsystem 2 と 3 の間のデータ依存性に基づいて Inport ブロック 3 が Inport ブロック 2 よりも先に実行されます。実行順序は 3、2、1 になります。OrderFunctionsByDependency
パラメーターは設定されたモデルにしか影響しないことに注意してください。このパラメーターは参照モデルには伝播されません。
2 つのブロックの [優先順位] パラメーターの値が異なる場合は、より高い優先順位をもつブロックが最初に実行されます。[優先順位] パラメーターが等しい場合は、より速いレート (サンプル時間が小さい) をもつブロックが最初に実行されます。両方のブロックの [優先順位] とサンプル時間が同じ場合は、より小さい端子番号をもつブロックが最初に実行されます。ただし、ブロック間にデータ依存性があり、OrderFunctionsByDependency
が 'on'
に設定されている場合は例外で、他のブロックに依存するブロックの方が後に実行されます。
メモ
最上位モデルのシミュレーション モードがアクセラレータまたはラピッド アクセラレータの場合、Simulink はルートレベルの関数呼び出し Inport ブロックの実行順序に関する実行時シミュレーション チェックを参照されるエクスポート関数モデル内で実行しません。
エクスポート関数モデルに、表に示すブロック プロパティをもつ 5 つのルートレベルの関数呼び出し Inport ブロック A ~ E があると仮定します。ブロック間にデータ依存性がないか、OrderFunctionsByDependency
が 'off'
に設定されています。相対的な実行順序を決定するために、Simulink は、それらの [優先順位] パラメーター、サンプル時間 (異なる継承されないサンプル時間の場合)、端子番号を順に比較します。
ルートレベルの関数呼び出し Inport ブロック | A | B | C | D | E |
---|---|---|---|---|---|
優先順位 | 10 | 30 | 40 | 40 | 30 |
サンプル時間 | –1 | 0.2 | 0.1 | 0.1 | –1 |
端子番号 | 5 | 4 | 3 | 2 | 1 |
ブロック A は 5 個のブロックの中で最高の優先順位をもっています。A が最初に実行されます。
B と E が A の後、C と D の前に実行されます。B と E は同じ優先順位のため、Simulink はサンプル時間を比較して実行順序を決定します。E のサンプル時間は
-1
(継承) であり、B のサンプル時間0.2
よりも小さくなります。E が B の前に実行されます。C と D は同じ優先順位と同じ別個の継承されないサンプル時間をもちます。D の端子番号 (2) は C (3) よりも小さいため、D が C の前に実行されます。
これらの関数呼び出し Inport ブロックの相対実行順序は A、E、B、D、C です。
入れ子にされたエクスポート関数モデル
入れ子にされたエクスポート関数モデルは、編成の追加の層を提供します。以下のモデルは、Model ブロックから参照された 2 つの参照エクスポート関数モデルをもっています。
メモ
エクスポート関数モデルは、非同期関数呼び出し入力をもつ参照モデルを含むことはできませんが、Function-Call Subsystem および関数呼び出しモデルを含むことはできます。非同期関数呼び出し入力をもつモデルは、エクスポート関数モデル、Function-Call Subsystem または関数呼び出しモデルを含むことができます。
複数インスタンスの関数呼び出しモデルをもつエクスポート関数モデル
エクスポート関数モデル内では、Function-Call Subsystem ブロックまたは関数呼び出し Model ブロックを使用できます。関数呼び出し Model ブロックを使用する場合、モデルの複数のインスタンスも作成できます。
Trigger ブロックを含むモデルでアルゴリズムを定義します。[トリガー タイプ] を
[関数呼び出し]
に設定します。Model ブロックからモデルを参照します。結果は関数呼び出しモデルになります。
関数呼び出し Inport ブロックを接続し、[関数呼び出しの出力] チェック ボックスをオンにします。信号 Inport ブロックおよび Outport ブロックを追加します。モデルを更新します (Ctrl + D)。結果は、関数呼び出しモデルをもつエクスポート関数モデルになります。
参照モデルと端子ブロックをコピーして、モデルの 2 つ目のインスタンスを作成します。2 つのインスタンスは、異なるタスクの異なるルートレベルの関数呼び出し Inport ブロックで呼び出されます。
エクスポート関数モデルと非同期関数呼び出し入力をもつモデル
エクスポート関数モデルの機能は JMAAB-B モデルとも呼ばれる非同期関数呼び出し入力端子をもつモデルで使用できます。これらのモデルは関数が Simulink スケジューラで呼び出される Simulink 環境で主に使用します。
比較特性 | エクスポート関数モデル | 非同期関数呼び出し入力をもつモデル |
---|---|---|
定義 | これらのモデルには、Asynchronous Task Specification ブロックに接続されない、ルートレベルの関数呼び出し Inport ブロックがあります。これらの Inport ブロックは、Function-Call Subsystem または関数呼び出しモデル (Trigger ブロックをもつ Model ブロック) をトリガーします。 | これらのモデルには、Asynchronous Task Specification ブロックに接続されたルートレベルの関数呼び出し Inport ブロックがあります。これらの Inport ブロックは、Function-Call Subsystem または関数呼び出しモデルをトリガーします。 |
ルートレベル ブロック | 関数呼び出しコンテキストで実行されるブロックのみ、ルート レベルに存在することが許されます。 | 関数呼び出しコンテキスト以外で実行されるブロックも許されます。 |
データ転送 | データ転送インジケーターを使用してシミュレーション結果を解釈します。既定で、エクスポート関数モデルのデータ転送は、生成されるコード内で保護されません。詳細については、Function-Call Subsystem のラッチされた入力データを参照してください。 | Rate Transition ブロックを使用して、異なるレートで実行される Function-Call Subsystem 間でのデータ転送を保護します。詳細については、Rate Transitionを参照してください。 |
シミュレーションのサポート | これらのモデルは、スタンドアロン シミュレーションとテスト モデル シミュレーションをすべてのシミュレーション モードでサポートします。 | これらのモデルは、テスト モデル シミュレーションをすべてのシミュレーション モードで、スタンドアロン シミュレーションをノーマル、アクセラレータ、ラピッド アクセラレータの各モードでサポートします。 |
コード生成のサポート | 最上位モデルおよびスタンドアロンのコード生成はサポートされます。 | 最上位モデルおよびスタンドアロンのコード生成はサポートされます。 |
参考
Function-Call Subsystem | Trigger | Model