このページの翻訳は最新ではありません。ここをクリックして、英語の最新版を参照してください。
外部コード ベースにエクスポートするコンポーネント ソース コードの生成
Embedded Coder® ソフトウェアを使用している場合は、モデリング コンポーネントから関数のソース コードを生成して、外部コード ベースで使用できます。生成されるコードには、スケジューリング コード (ステップ関数など) のサポートは含まれません。Simulink® 環境外のロジックを制御するには、生成された関数コードを呼び出します。
モデリング オプション
以下のモデリング コンポーネント用にエクスポートする関数コードを生成できます。
エクスポート関数モデル (エクスポート関数モデルの概要で説明されている、Function-Call Subsystem、関数呼び出しの Model ブロック、またはその他のエクスポート関数モデルで排他的に構成される機能ブロックを含むモデル)
エクスポート関数サブシステム (Function-Call Subsystem を含むバーチャル サブシステム)
これらのモデリング コンポーネント用にコード ジェネレーターで生成されたコードをエクスポートするには、モデリング コンポーネントが特定の要件を満たしていなければなりません。
以前のリリースで設計したモデルの場合、コード ジェネレーターは Triggered Subsystem から関数をエクスポートできます。エクスポート関数サブシステムに対して指定されている要件は、Triggered Subsystem からの関数のエクスポートにも適用されますが、次の例外があります。
最上位のバーチャル サブシステムで関数をエクスポートする Triggered Subsystem をカプセル化する。
Triggered Subsystem は、Function-Call Subsystem を含むバーチャル サブシステムで指定された要件や制限を満たす必要はない。
絶対時間または経過時間を使用するエクスポート関数は、Triggered Subsystem からの関数のエクスポートには適用されない。
要件
モデル ソルバーは、固定ステップ離散ソルバーでなければなりません。
Function-Call Subsystem をトリガーする各ルートレベルの Inport ブロックを構成して、関数呼び出しトリガーが出力されるように構成しなければなりません。これらの Inport ブロックは Asynchronous Task Specification ブロックに接続できません。
モデルまたはサブシステムには、ルート レベルの次のブロックのみ含まれなければなりません。
Function-Call ブロック (ソルバー モデルのコンフィギュレーション パラメーター [タスクとサンプル時間オプション] 、 [周期的なサンプル時間の制約] が
[サンプル時間に依存しない]
に設定されている場合のルート レベルの Function-Call Subsystem、Simulink Function、S-Function および Function-Call Model ブロックなど)Inport ブロックと Outport ブロック (端子)
Constant ブロック (Add など定数に解決されるブロックを含む)
サンプル時間が Inf のブロック
Merge ブロックおよび Data Store Memory ブロック
バーチャル接続ブロック (Function-Call Split、Mux、Demux、Bus Creator、Bus Selector、Signal Specification、およびこれらのブロックを含むバーチャル サブシステム)
Scope ブロックなどの信号ビューアー ブロック (エクスポート関数サブシステムのみ)
Constant ブロックがモデルまたはサブシステムの最上位に表示されている場合は、モデルまたは含まれているモデルのモデル コンフィギュレーション パラメーター [最適化] 、 [既定のパラメーター動作] を
[インライン]
に設定しなければなりません。モデルまたはサブシステム内のブロックはコード生成をサポートしなければなりません。
絶対時間または経過時間を使用するブロックは、対応する関数呼び出しのルートレベル Inport ブロックで指定された離散サンプル時間をもつ周期的な Function-Call Subsystem の内部になければなりません。絶対時間または経過時間を使用するエクスポート関数を参照してください。
エクスポート システム境界を越えるデータ信号はバーチャル バスにできず、Goto-From 接続として実装できません。エクスポート境界を越えるデータ信号は、スカラー、多重化または非バーチャル バスでなければなりません。
さらに、エクスポート関数モデルの場合は、エクスポート関数モデルの複数のインスタンスを含むレートベース モデルのコードは生成できません。たとえば、シミュレーション中に再利用可能なエクスポート関数モデルのスケジュールに使用するテスト ハーネス モデルのコードは生成できません。
エクスポート関数サブシステムの場合、以下の要件が追加適用されます。
エクスポート関数サブシステムの境界を越えるトリガー信号はスカラーでなければなりません。トリガーとして機能しない入力および出力データ信号はスカラーである必要はありません。
定数信号がエクスポート関数サブシステムの出力端子を駆動する場合、信号でストレージ クラスを指定しなければなりません。
絶対時間または経過時間を使用するエクスポート関数
絶対時間または経過時間を使用するブロックをもつモデリング コンポーネントの関数コードをエクスポートする場合、それらのブロックは次の Function-Call Subsystem 内になければなりません。
周期的な実行用に構成している
離散サンプル時間でルートレベルの Inport ブロックを構成している
周期的な実行用に Function-Call Subsystem を構成するには、次を行います。
Function-Call Subsystem で Trigger ブロックを右クリックし、コンテキスト メニューから [ブロック パラメーター] を選択します。
パラメーター [サンプル時間タイプ] を
[周期的]
に設定します。[サンプル時間] を関数呼び出しイニシエーターで (直接または継承により) 指定された同じ粒度に設定します。
[OK] または [適用] をクリックします。
詳細については、絶対時間と経過時間の計算を参照してください。
関数呼び出しサブシステムの制限
Subsystem ブロックのパラメーターは、生成コードを含むファイルの名前を制御しません。ファイル名は、エクスポートされたサブシステムの名前から始まります。
Subsystem ブロックのパラメーターは、生成コードの最上位関数の名前を制御しません。各関数名には、関数をトリガーする信号の名前が反映されるか、(名前の付いていない信号の場合) 信号の発生元となるブロックが反映されます。
C++ クラスのコード インターフェイスのパッケージ化用の関数呼び出しシステムは、その関数の仕様が [既定の step メソッド] に設定されている場合に限りエクスポートできます。Interactively Configure C++ Interfaceを参照してください。エクスポート関数は、シングルスレッド実行と互換しません。共有信号の潜在的なデータ レース状況を回避するには、クラスのすべてのメンバーを同じ実行スレッドから呼び出します。
コード ジェネレーターは、その関数呼び出しイニシエーターがアクセラレータ モードで非インライン化されている場合に限り、SIL または PIL ブロックをアクセラレータ モードでサポートします。非インライン化イニシエーターの例として、Stateflow® チャートがあります。
レベル 2 の S-Function イニシエーター ブロック (Stateflow チャートまたは組み込みの Function-Call Generator ブロックなど) は SIL ブロックを駆動しなければなりません。
非同期 (サンプル時間) function-call system をエクスポートできますが、ソフトウェアは、非同期システムの SIL または PIL ブロックをサポートしません。
エクスポート関数サブシステムにおいて、TLC 関数
LibIsFirstInit
の使用は削除されました。
ワークフロー
エクスポートされた関数用のコードを生成するには、この表に示されているタスクを繰り返してください。
タスク | アクション | 詳細 |
---|---|---|
1 | 外部コードの特性と統合要件の評価を確認します。 | 外部コード統合ワークフローの選択 |
2 | エクスポートしているモデルまたはサブシステムが関数のエクスポート要件を満たしていることを確認します。 | 要件 |
3 | モデルまたはサブシステムを変更して、データ インターフェイス要件に対応します。 | 外部 C/C++ コードと Simulink モデルまたは生成コード間のデータ交換 |
4 | 必要に応じて、関数プロトタイプを構成します。 | Configure Entry-Point Function Interfaces for Simulink Function and Function Caller Blocks。固定ステップのレートベース モデルについては生成された C 関数インターフェイスをモデルのエントリポイント関数用に構成またはInteractively Configure C++ Interface |
5 | 必要に応じて、モデルを更新し、外部のアプリケーション固有のコードを生成されたシステム関数に配置します。 | 生成されたコードへの外部 C/C++ コードの配置 |
6 | シミュレーション中の関数の動作と実行が予想どおりであることを、テスト ハーネス モデルを作成および使用して確認します。テスト ハーネス モデルは、シミュレーション中の関数の実行をスケジューリングします。 | モデルの構成、コード生成およびシミュレーション。Simulink Test™ ソフトウェアを使用している場合は、Test Authoring (Simulink Test) |
7 | コード生成用のモデルまたはサブシステムを構成します。 | モデル コンフィギュレーション セットのカスタマイズ |
8 | コードとコード生成レポートを生成します。 | コード生成 |
9 | 生成コード インターフェイスと静的コード メトリクスを確認します。 | Analyze Generated Data Code InterfaceおよびStatic Code Metrics |
10 | エクスポートされた関数コードを含む実行可能プログラムをビルドします。 | Simulink 環境外での統合コードの作成 |
11 | 実行可能プログラムの動作と実行が予想どおりであることを確認します。 | 検証、テスト、および認定 |
統合方法の選択
外部開発環境にエクスポートするための関数コードの生成については、複数の方法を利用できます。次の表では、方法を比較しています。統合要件に最適な方法を選択してください。エクスポート関数モデルの作成方法の詳細については、エクスポート関数モデルの概要を参照してください。Function Call Subsystem のコード生成の詳細については、外部コード ベースにエクスポートするコンポーネント ソース コードの生成を参照してください。
条件または要件 | 使用 | 詳細 |
---|---|---|
| Function-Call Subsystem | |
| Simulink Function ブロック | |
コードが初期化イベントに対応 | Initialize Function ブロック | |
コードがリセット イベントに対応 | Reset Function ブロック | |
コードには、コード ジェネレーターが既定で生成する範囲を超えたエントリポイント関数が含まれている ( 、 、 ) | S-Function | S-Function とコード生成 |
テスト ハーネスとして使用し、モデルの一部のために生成されたコードをエクスポートする単一モデルの実行フレームワーク | エクスポート関数サブシステム |
エクスポート関数モデルの C 関数コードの生成
この例では、スケジューリング コードを生成せずに、個々の Simulink® Function ブロックおよび Function-Call Subsystem の関数コードをモデル内で生成する方法について説明します。
エクスポート用の関数コードを生成するには、次を行います。
エクスポートする関数を含むモデルを作成します。
シミュレーション中の関数の実行をスケジューリングするテスト ハーネス モデルを作成します。
テスト ハーネス モデルを使用して関数を含むモデルをシミュレーションします。
関数を含むモデルのコードを生成します。
エクスポートする関数を含むモデルの作成
エクスポートする関数を含むモデルは、モデルのルート レベルでアーキテクチャの制約を満たさなければなりません。ルート レベルで有効なブロックは次のとおりです。
Inport
Outport
Function-Call Subsystem
Simulink Function
Goto
From
Merge
コード ジェネレーターは Function-Call Subsystem ブロックと Simulink Function ブロック、Initialize Function ブロックと Reset Function ブロックの関数コードを生成します。Function-Call Subsystem ブロックは、関数呼び出し信号をアサートするルートの Inport ブロックとブロックの入力端子を接続します。サブシステムは受信した関数呼び出し信号に基づいて実行されます。Simulink Function ブロックは、対応する Function Caller ブロックまたは Stateflow チャートの実行に応じて実行されます。Initialize Function ブロックは、モデル初期化イベントの発生時に実行されます。Reset Function ブロックは、ユーザー定義のリセット イベントの発生時に実行されます。
関数をエクスポートするために、モデル rtwdemo_functions
には、エクスポートする関数用の 2 つの Function-Call Subsystem (f1_alg
および f2_alg
) と Simulink Function ブロック (f3
) が含まれています。モデルには、Initialize Function ブロック (Initialize Function
) と Reset Function ブロック (Reset Function
) も含まれています。モデルの他の部分の状態によってブロックの初期条件を計算するために、State Writer ブロックが Initialize Function ブロックと Reset Function ブロックの内部で使用されます。
open_system('rtwdemo_functions')
Function Caller ブロックを含むモデルの作成
Function Caller ブロックを使用して Simulink Function ブロックを呼び出します。Function Caller ブロックは Simulink Function ブロックと同じモデル内に含まれていたり、別のモデル内に含まれることもあります。
複数の Function Caller ブロックで Simulink Function ブロックを呼び出すこともできます。Function Caller ブロックは Function-Call Subsystem の内部に配置できます。コード生成の最中に、コード ジェネレーターは Function-Call Subsystem から関数をエクスポートします。
モデル rtwdemo_caller
は、Function Caller ブロックを含む Function-Call Subsystem をエクスポートします。
open_system('rtwdemo_caller')
シミュレーション用のテスト ハーネス モデルの作成
関数をエクスポートする際に、生成コードにはスケジューラは含まれません。シミュレーション中のスケジューリングを処理するテスト ハーネス モデルを作成します。展開するコードを生成するためにテスト ハーネス モデルを使用しないでください。
モデル rtwdemo_export_functions
はテスト ハーネスです。このモデルは次を行います。
rtwdemo_caller
の Function Caller ブロックを含む Simulink Function ブロックをスケジュールします。モデル初期化イベントとリセット イベントを含むモデルのコンテンツをスケジュールするために、関数呼び出し信号をこの例の他のモデルに提供します。
open_system('rtwdemo_export_functions')
テスト ハーネス モデルのシミュレーション
エクスポートする関数を含むモデルが予期したとおりに実行されることを、テスト ハーネス モデルのシミュレーションによって検証します。たとえば、rtwdemo_export_functions
をシミュレーションします。
sim('rtwdemo_export_functions')
関数コードの生成
Embedded Coder アプリを開きます。次に、エクスポートする関数のコードを生成します。たとえば、rtwdemo_functions
のコードを生成します。
slbuild('rtwdemo_functions')
### Starting build procedure for: rtwdemo_functions ### Successful completion of code generation for: rtwdemo_functions Build Summary Top model targets built: Model Action Rebuild Reason ====================================================================================== rtwdemo_functions Code generated. Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 10.23s
生成コードのレビュー
生成コードのレビュー
ert_main.c
はモデル用の main プログラムの例 (実行フレームワーク) を示す。このコードは、エクスポートされた関数を呼び出す方法を示しています。また、このコードは生成済みのコードの初期化と実行の方法も示しています。rtwdemo_functions.c
は、モデルのコンポーネントf1_alg
、f2_alg
およびf3
の初期化関数 (Initialize Function
を含む) とエクスポート関数を呼び出す。rtwdemo_functions.h
はモデルのデータ構造と、エクスポートされたエントリポイント関数およびデータ構造のパブリック インターフェイスを宣言する。f3.h
は、Simulink 関数f3
の呼び出しインターフェイスを宣言する共有ファイル。rtwtypes.h
は、生成コードが必要とするデータ型、構造体およびマクロを定義する。
インターフェイス コードの記述
コード インターフェイス レポートを開いてレビューします。実行フレームワークのインターフェイス コードを記述するために、このレポートの情報を使用します。
命令
#include rtwdemo_functions.h
、#include f3.h
および#include rtwtypes.h
を追加することによって、生成されたヘッダー ファイルをインクルードします。モデルの Inport ブロックの生成コードへの入力データを記述します。
生成されたエントリポイント関数を呼び出します。
モデルの Outport ブロックの生成コードからデータを読み取ります。
入力端子:
次元 1 の
real_T
型のrtU.U1
次元 1 の
real_T
型のrtU.U2
エントリポイント関数:
エントリポイント関数の初期化、
void rtwdemo_functions_initialize(void)
。開始時にこの関数を一度呼び出します。エントリポイント関数のリセット、
void rtwdemo_functions_reset(void)
。必要に応じてこの関数を呼び出します。エクスポート関数、
void f1(void)
。必要に応じてこの関数を呼び出します。エクスポート関数、
void f2(void)
。必要に応じてこの関数を呼び出します。Simulink 関数、
void f3(real_T rtu_u, real_T *rty_y)
。必要に応じてこの関数を呼び出します。
出力端子:
次元 [2] の
int8_T
型のrtY.Accumulator1
次元 [2] の
int8_T
型のrtY.Accumulator2
次元 1 の
int8_T
型のrtY.TicToc10
詳細
モデル例を閉じる
bdclose('rtwdemo_export_functions') bdclose('rtwdemo_functions') bdclose('rtwdemo_caller')
エクスポート関数モデルの C++ 関数とクラス コードの生成
この例では、Function-Call Subsystem を含むエクスポート関数モデルの関数コードの生成方法を示します。コード ジェネレーターは、スケジューリング コードを含まない関数とクラス コードを生成します。
エクスポート用の関数コードを生成するには、次を行います。
エクスポートする関数を含むモデルを作成します。
シミュレーション中の関数の実行をスケジューリングするテスト ハーネス モデルを作成します。
テスト ハーネス モデルを使用して関数を含むモデルをシミュレーションします。
関数を含むモデルのコードを生成します。
エクスポート用の関数と C++ クラス インターフェイスを含むモデルの作成
C++ モデル クラス インターフェイスを使用してエクスポートする関数を含むモデルは、モデルのルート レベルでアーキテクチャの制約を満たさなければなりません。C++ クラスの生成において、ルート レベルで有効なブロックは次のとおりです。
Inport
Outport
Function-Call Subsystem
Goto
From
Merge
メモ: C++ クラス インターフェイスを使用した Function-Call Subsystem のエクスポートは、Simulink Function ブロックをサポートしません。
コード ジェネレーターは Function-Call Subsystem ブロックの関数コードを生成します。Function-Call Subsystem ブロックは、関数呼び出し信号をアサートするルートの Inport ブロックとブロックの入力端子を接続します。サブシステムは受信した関数呼び出し信号に基づいて実行されます。
モデル rtwdemo_cppclass_functions
には、関数をエクスポートするための Function-Call Subsystem f1
、f2
、f3
が含まれます。
open_system('rtwdemo_cppclass_functions')
シミュレーション用のテスト ハーネス モデルの作成
関数をエクスポートする際に、生成コードにはスケジューラは含まれません。シミュレーション中のスケジューリングを処理するテスト ハーネス モデルを作成します。展開するコードを生成するためにテスト ハーネス モデルを使用しないでください。
モデル rtwdemo_cppclass_export_functions
はテスト ハーネスです。このモデルは、モデルのコンテンツをスケジュールするために、関数呼び出し信号をこの例の他のモデルに提供します。
open_system('rtwdemo_cppclass_export_functions')
テスト ハーネス モデルのシミュレーション
エクスポートする関数を含むモデルが予期したとおりに実行されることを、テスト ハーネス モデルのシミュレーションによって検証します。たとえば、rtwdemo_cppclass_export_functions
をシミュレーションします。
sim('rtwdemo_cppclass_export_functions')
関数のコードとレポートの生成
エクスポートする関数のコードとコード生成レポートを生成します。たとえば、rtwdemo_cppclass_functions
のコードを生成します。
slbuild('rtwdemo_cppclass_functions')
### Starting build procedure for: rtwdemo_cppclass_functions ### Successful completion of build procedure for: rtwdemo_cppclass_functions Build Summary Top model targets built: Model Action Rebuild Reason ============================================================================================================ rtwdemo_cppclass_functions Code generated and compiled. Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 14.616s
生成コードのレビュー
コード生成レポートで生成されたコードをレビューします。
ert_main.cpp
はモデル用の main プログラムの例 (実行フレームワーク) を示す。このコードは、エクスポートされた関数を呼び出す方法を示しています。また、このコードは生成済みのコードの初期化と実行の方法も示しています。rtwdemo_cppclass_functions.cpp
は、モデル サブシステムのコンポーネントf1
、f2
およびf3
の初期化関数 (Initialize Function
を含む) とエクスポート関数を呼び出す。rtwdemo_cppclass_functions.h
はモデルのデータ構造と、エクスポートされたエントリポイント関数およびデータ構造のパブリック インターフェイスを宣言する。rtwtypes.h
は、生成コードが必要とするデータ型、構造体およびマクロを定義する。
インターフェイス コードの記述
コード インターフェイス レポートを開いてレビューします。実行フレームワークのインターフェイス コードを記述するために、このレポートの情報を使用します。
命令
#include rtwdemo_cppclass_functions.h
および#include rtwtypes.h
を追加することによって、生成されたヘッダー ファイルをインクルードします。モデルの Inport ブロックの生成コードへの入力データを記述します。
生成されたエントリポイント関数を呼び出します。
モデルの Outport ブロックの生成コードからデータを読み取ります。
入力端子:
次元 1 の
real_T
型のrtU.U1
次元 1 の
real_T
型のrtU.U2
次元 1 の
real_T
型のrtU.U3
エントリポイント関数:
エントリポイント関数の初期化、
void initialize(void)
。開始時にこの関数を一度呼び出します。エクスポート関数、
void t_1tic_A(void)
。必要に応じてこの関数を呼び出します。エクスポート関数、
void t_1tic_B(void)
。必要に応じてこの関数を呼び出します。エクスポート関数、
void t_1tic_C(void)
。必要に応じてこの関数を呼び出します。
出力端子:
次元 [2] の
int8_T
型のrtY.TicToc1
次元 [2] の
int8_T
型のrtY.TicToc2
次元 1 の
int8_T
型のrtY.TicToc10
詳細
モデル例を閉じる
bdclose('rtwdemo_cppclass_export_functions') bdclose('rtwdemo_cppclass_functions')
エクスポート関数サブシステムのコード生成
エクスポート関数サブシステムのコードを生成するには、以下を行います。
コードを生成しているサブシステムがエクスポートの要件を満たしていることを確認します。
[コンフィギュレーション パラメーター] ダイアログ ボックスで、以下の操作を実行します。
パラメーター [システム ターゲット ファイル] を
ert.tlc
などの ERT ベースのシステム ターゲット ファイルに設定します。検証のために生成コードで SIL ブロックが必要な場合は、モデル コンフィギュレーション パラメーター [ブロックの作成] を
[SIL]
に設定します。[OK] または [適用] をクリックします。
サブシステム ブロックを右クリックし、コンテキスト メニューから [C/C++ コード]、[関数のエクスポート] を選択します。
この操作によって、元のサブシステムのコンテンツを含む新しいモデル
が作成およびビルドされ、Model ブロックを含むsubsystem
.slxScratchModel
が作成されます。このブロックは新しく作成された
モデルを参照します。subsystem
.slxコード ジェネレーターはコードを生成し、そのコードを作業フォルダーに配置します。
手順 2b で [ブロックの作成] を
[SIL]
に設定した場合、Simulink は生成コードを表す S-Function ブロックを含む新しいウィンドウを開きます。このブロックのサイズ、形状、コネクタは元のサブシステムと同じです。
これでコード生成とオプションのブロック作成が完了しました。生成された ERT コードと S-Function ブロック用に実行するときに、コードとオプションのブロックをテストおよび使用できます。オプションのワークフロー タスクについては、カスタム初期化関数名の指定とカスタムの説明の指定を参照してください。
カスタム初期化関数名の指定
エクスポートされた関数のカスタム初期化関数名を、slbuild
コマンドの引数として指定できます。コマンドの形式は次のようになります。
blockHandle = slbuild('subsystem', 'Mode', 'ExportFunctionCalls',.. 'ExportFunctionInitializeFunctionName', 'fcnname')
は関数名を指定します。たとえば、名前 fcnname
'myinitfcn'
を指定する場合、ビルド プロセスは次のようなコードを出力します。
/* Model initialize function */ void myinitfcn(void){ ... }
カスタムの説明の指定
Inport ブロックの [ブロック プロパティ] ダイアログ ボックスを使用して、エクスポートする関数についてのカスタムの説明を入力できます。
コードをエクスポートしているサブシステムの制御端子を駆動する Inport ブロックを右クリックします。
[プロパティ] を選択します。
[一般] タブの [説明] フィールドに説明テキストを入力します。
関数のエクスポート中、入力したテキストは Inport ブロックのヘッダーの生成コードに出力されます。たとえば、プログラム例 rtwdemo_exporting_functions
を開き、端子 t_1tic_A
の [ブロック プロパティ] ダイアログ ボックスに説明を入力した場合、コード ジェネレーターは次のようなコードを生成します。
/* * Output and update for exported function: t_1tic_A * * My custom description of the exported function */ void t_1tic_A(void) { ... }
エクスポート関数サブシステム用に生成されたコードの最適化
エクスポート関数サブシステム用に生成されたコードを最適化するには、サブシステムの境界を越える入力信号および出力信号ごとに別々のストレージ クラスを指定します。
エクスポートしている各 Function-Call Subsystem に対して、以下を行います。
サブシステムを右クリックします。
コンテキスト メニューから [ブロックのパラメーター (Subsystem)] を選択します。
[コード生成] タブを選択します。
[関数のパッケージ化] を
[自動]
に設定します。[OK] または [適用] をクリックします。