Main Content

外部コード ベースにエクスポートするコンポーネント ソース コードの生成

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 を構成するには、次を行います。

  1. Function-Call Subsystem で Trigger ブロックを右クリックし、コンテキスト メニューから [ブロック パラメーター] を選択します。

  2. パラメーター [サンプル時間タイプ][周期的] に設定します。

  3. [サンプル時間] を関数呼び出しイニシエーターで (直接または継承により) 指定された同じ粒度に設定します。

  4. [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 のコード生成の詳細については、外部コード ベースにエクスポートするコンポーネント ソース コードの生成を参照してください。

条件または要件使用詳細
  • モデル要素と生成コード間のトレーサビリティ

  • ローカル入力 (Inport ブロック) および出力 (Outport ブロック)

Function-Call Subsystem
  • 生成された関数プロトタイプの制御

  • 正式な入力引数 (Argument Inport ブロック) および出力引数 (Argument Outport ブロック)

  • ローカル入力 (Inport ブロック) および出力 (Outport ブロック)

Simulink Function ブロック
コードが初期化イベントに対応Initialize Function ブロック
コードがリセット イベントに対応Reset Function ブロック
コードには、コード ジェネレーターが既定で生成する範囲を超えたエントリポイント関数が含まれている (model_initializemodel_stepmodel_terminate)S-FunctionS-Function とコード生成
テスト ハーネスとして使用し、モデルの一部のために生成されたコードをエクスポートする単一モデルの実行フレームワークエクスポート関数サブシステム

エクスポート関数モデルの C 関数コードの生成

この例では、スケジューリング コードを生成せずに、モデル内の個々の Function-Call Subsystem の関数コードを生成する方法について説明します。

エクスポート用の関数コードを生成するには、次を行います。

  1. エクスポートする関数を含むモデルを作成します。

  2. コード インターフェイスを構成します。

  3. シミュレーション中の関数の実行をスケジューリングするテスト ハーネス モデルを作成します。

  4. テスト ハーネス モデルを使用して関数を含むモデルをシミュレーションします。

  5. 関数を含むモデルのコードを生成します。

エクスポートする関数を含むモデルの作成

エクスポートする関数を含むモデルは、モデルのルート レベルでアーキテクチャの制約を満たさなければなりません。ルート レベルで有効なブロックは次のとおりです。

  • Inport

  • Outport

  • Function-Call Subsystem

  • Simulink Function

  • Goto

  • From

  • Merge

この例のコード ジェネレーターは、Initialize Function、Terminate Function および Function-Call Subsystem の各ブロックの関数コードを生成します。Initialize Function ブロックはモデル初期化イベントで実行され、Terminate Function ブロックは終了イベントで実行されます。Function-Call Subsystem ブロックは、関数呼び出し信号をアサートするルートの Inport ブロックとブロックの入力端子を接続します。サブシステムは受信した関数呼び出し信号に基づいて実行されます。

関数をエクスポートするために、モデル ComponentDeploymentFcn には 2 つの Function-Call Subsystem (Integrator および Accumulator) が含まれています。Function-call subsystem Integrator は、積分器の非周期関数を表します。この関数は前進積分法を適用し、関数を実行するたびに状態変数 x の値にゲイン値 1.25 を適用します。Function-call subsystem Accumulator は、状態変数 x の値を 1 インクリメントして調整可能なゲイン値 k を適用する周期関数を表します。この関数は、毎秒実行されます。

open_system('ComponentDeploymentFcn')

モデルのコード インターフェイスの構成

モデル ComponentDeploymentFcn は、ComponentDeploymentCoderDictionary.sldd に定義されているサービス コード インターフェイスを使用するように構成されています。コード ジェネレーターはリンクされているディクショナリを使用して、既定のコード マッピングを設定します。コード マッピング エディターまたはコード マッピング プログラミング インターフェイスを使用して、このコード マッピングの表示と変更ができます。

要素の既定のインターフェイスが要件を満たしている場合、その要素を変更する必要はありません。この例では、コード インターフェイスの要件を満たすために、以下の調整が行われました。

  • [関数] タブで、積分器の非周期関数とアキュムレータの周期関数について、既定の関数カスタマイズ テンプレートにより関数名 CD_AperiodicCD_Periodic が生成されます。これらの関数に関するターゲット プラットフォームの要件を満たすために、コード マッピングは関数名 CD_integratorCD_accumulator を指定して、既定の関数名をオーバーライドします。

  • 代替タイマー サービス インターフェイスが積分器の関数に関連付けられました。コーダー ディクショナリには、2 つのタイマー サービス インターフェイスが定義されています。既定のインターフェイスと、関数名に関するターゲット プラットフォームのタイマー サービスの要件を満たす代替インターフェイス get_CD_tick です。タイマー サービスの設定を確認するには、[関数] タブで、Exported Function:Aperiodic の行を選択して鉛筆アイコンをクリックします。表示されたダイアログ ボックスで、[タイマー サービス] プロパティが get_CD_tick に設定されていることを確認します。あるいは、プロパティ インスペクターでこのプロパティを設定できます。

  • [パラメーター] タブで、Gain ブロックの [ゲイン] パラメーター k にコード識別子が指定されました。識別子の設定を確認するには、[モデル パラメーター] タブで、そのパラメーターの行を選択して鉛筆アイコンをクリックします。表示されたダイアログ ボックスで、[識別子] プロパティに指定された値 k を確認します。識別子は、生成コード内での変数の表現方法をコード ジェネレーターに通知します。あるいは、プロパティ インスペクターでこのプロパティを設定できます。

  • [信号/状態] タブで、Discrete-Time Integrator ブロックおよび Unit Delay ブロックに関連付けられている状態に、コード識別子が指定されました。識別子の設定 (dti および delay) を確認するには、着目する状態の行を選択して鉛筆アイコンをクリックします。表示されたダイアログ ボックスで、[識別子] プロパティに指定された値を確認します。識別子は、生成コード内での対応する変数の表現方法をコード ジェネレーターに通知します。あるいは、プロパティ インスペクターでこのプロパティを設定できます。

コード マッピングを確認するには、Embedded Coder アプリを開きます。次に、[コード インターフェイス][コンポーネント インターフェイス] を選択します。アプリ表示の下部に、コード マッピング エディターが表示されます。

コード マッピング エディターで、送信側、受信側、データ転送およびタイマーの各サービスのインターフェイスを変更できます。送信側、受信側およびデータ転送のサービスを変更するには、対応するタブをクリックし、サービス列から別のサービスを選択します。タイマー サービスを変更するには、[Functions] タブをクリックし、積分器の関数の行を選択して鉛筆アイコンをクリックします。そして、表示されたダイアログで、別のインターフェイスを選択します。既定のインターフェイスは、実行外のデータ通信方法を使用します。代替インターフェイスは、実行中および直接アクセスのデータ通信を使用します。インターフェイスを変更して、生成コード内の差異を確認することを検討してください。インターフェイスを変更することを選択した場合は、信号のデータ パスに沿って呼び出されるサービスのそれぞれについて、同じデータ通信方法が適用されるようにインターフェイスを設定します。

サービス インターフェイスに応じたモデルのコード マッピングの詳細については、C サービス インターフェイスおよびコード マッピング エディター – Cを参照してください。

シミュレーション用のテスト ハーネス モデルの作成

関数をエクスポートする際に、生成コードにはスケジューラは含まれません。シミュレーション中のスケジューリングを処理するテスト ハーネス モデルを作成します。展開するコードを生成するためにテスト ハーネス モデルを使用しないでください。

モデル ComponentDeploymentFcnHarness はテスト ハーネスです。このモデルはこの例の他のモデルに、モデルの内容をスケジュールする (モデルの初期化および終了のイベントなど) 関数呼び出し信号を提供します。

open_system('ComponentDeploymentFcnHarness')

このモデルの場合、Embedded Coder アプリの [出力]Simulation Only に設定されています。この設定では、ユーザーが別の Simulink エディター ウィンドウを開くことなく、テスト ハーネス モデルと、コードを生成する対象のモデルとの間でフォーカスを切り替えることができます。

テスト ハーネス モデルのシミュレーション

エクスポートする関数を含むモデルが予期したとおりに実行されることを、テスト ハーネス モデルのシミュレーションによって検証します。たとえば、ComponentDeploymentFcnHarness のシミュレーションを実行します。

sim('ComponentDeploymentFcnHarness')

関数コードの生成

"Embedded Coder" アプリ内で、ComponentDeploymentFcn をダブルクリックしてフォーカスをコンポーネント モデルに切り替えます。次に、エクスポートする関数のコードを生成します。

slbuild('ComponentDeploymentFcn')
### Starting build procedure for: ComponentDeploymentFcn
### Successful completion of code generation for: ComponentDeploymentFcn

Build Summary

Top model targets built:

Model                   Action           Rebuild Reason                                    
===========================================================================================
ComponentDeploymentFcn  Code generated.  Code generation information file does not exist.  

1 of 1 models built (0 models already up to date)
Build duration: 0h 0m 22.959s

生成コードのレビュー

生成コードのレビューコード ジェネレーターは、現在の作業フォルダーにフォルダー ComponentDeploymentFcn_ert_rtw を作成し、そのフォルダーにソース コード ファイルを配置します。生成コードは 2 つの主要ファイル、すなわちヘッダー ファイル ComponentDeploymentFcn.h とソース コード ファイル ComponentDeploymentFcn.c に入れられます。ComponentDeploymentFcn.c は初期化関数、エクスポートされた関数 Integrator および Accumulator、さらに終了関数を呼び出します。モデル データとエントリポイント関数は、ヘッダー ファイルをインクルードすることで呼び出し元からアクセスできます。

コード ジェネレーターは、rtwtypes.h およびサービス ヘッダー ファイルも生成します。コード ジェネレーターは既定でこのヘッダー ファイルに services.h という名前を付けます。ヘッダー ファイル rtwtypes.h は、生成コードが必要とするデータ型、構造体およびマクロを定義します。ヘッダー ファイル services.h はインターフェイス ヘッダー ファイルであり、サブフォルダー services に配置されます。

生成コードを検査するには、生成されたコード インターフェイス レポートを使用するか、Embedded Coder アプリのコード ビューを使用します。このレポートは、生成されたインターフェイス コードがターゲット プラットフォームの要件を満たしていることを検証する上で役立ちます。詳細については、Analyze Generated Service Code Interface Reportを参照してください。

インターフェイス コードの記述

コード インターフェイス レポートを開いてレビューします。実行フレームワークのインターフェイス コードを記述するために、このレポートの情報を使用します。

  1. 命令 #include ComponentDeploymentFcn.h#include rtwtypes.h および #include services.h を追加することによって、生成されたヘッダー ファイルをインクルードします。

  2. モデルの Inport ブロックの生成コードへの入力データを記述します。

  3. 生成されたエントリポイント関数を呼び出します。

  4. モデルの Outport ブロックの生成コードからデータを読み取ります。

エントリポイント関数:

  • 初期化エントリポイント関数 void CD_initialize(void)。開始時にこの関数を一度呼び出します。この関数はインターフェイス関数 get_CD_initialize_InBus_NVM を呼び出すことにより、ターゲット環境の受信側サービスを使用して不揮発性メモリからデータを読み取ります。

  • 終了エントリポイント関数 void CD_terminate(void)。シャットダウン時に、この関数を一度呼び出します。この関数はインターフェイス関数 getref_CD_terminate_OutBus_NVM を呼び出すことにより、ターゲット環境の送信側サービスを使用して不揮発性メモリにデータを書き込みます。

  • エクスポートされた周期関数 void CD_accumulator(void)。必要に応じてこの関数を呼び出します。この関数はインターフェイス関数 getref_CD_accumulator_OutBus_y を呼び出すことにより、ターゲット環境の送信側サービスを使用して関数の出力を書き込みます。

  • エクスポートされた非周期関数 void CD_integrator(void)。必要に応じてこの関数を呼び出します。この関数はインターフェイス関数 get_CD_integrator_inBus_u を呼び出すことにより、ターゲット環境の受信側サービスを使用して入力を関数に読み込みます。また、関数 CD_integrator もターゲット環境のタイマー サービスを使用し、インターフェイス関数 get_tick_outside_CD_integrator を呼び出すことにより、ターゲット環境の関数の時間刻みを取得します。

詳細

エクスポート関数モデルの C++ 関数とクラス コードの生成

この例では、Function-Call Subsystem を含むエクスポート関数モデルの関数コードの生成方法を示します。コード ジェネレーターは、スケジューリング コードを含まない関数とクラス コードを生成します。

エクスポート用の関数コードを生成するには、次を行います。

  1. エクスポートする関数を含むモデルを作成します。

  2. シミュレーション中の関数の実行をスケジューリングするテスト ハーネス モデルを作成します。

  3. テスト ハーネス モデルを使用して関数を含むモデルをシミュレーションします。

  4. 関数を含むモデルのコードを生成します。

エクスポート用の関数と C++ クラス インターフェイスを含むモデルの作成

C++ モデル クラス インターフェイスを使用してエクスポートする関数を含むモデルは、モデルのルート レベルでアーキテクチャの制約を満たさなければなりません。C++ クラスの生成において、ルート レベルで有効なブロックは次のとおりです。

  • Inport

  • Outport

  • Function-Call Subsystem

  • Goto

  • From

  • Merge

メモ: C++ クラス インターフェイスを使用した Function-Call Subsystem のエクスポートは、Simulink Function ブロックをサポートしません。

コード ジェネレーターは Function-Call Subsystem ブロックの関数コードを生成します。Function-Call Subsystem ブロックは、関数呼び出し信号をアサートするルートの Inport ブロックとブロックの入力端子を接続します。サブシステムは受信した関数呼び出し信号に基づいて実行されます。

モデル CppClassFunctions には、関数をエクスポートするための Function-Call Subsystem f1f2f3 が含まれます。

open_system('CppClassFunctions')

シミュレーション用のテスト ハーネス モデルの作成

関数をエクスポートする際に、生成コードにはスケジューラは含まれません。シミュレーション中のスケジューリングを処理するテスト ハーネス モデルを作成します。展開するコードを生成するためにテスト ハーネス モデルを使用しないでください。

モデル CppClassFunctionsHarness はテスト ハーネスです。このモデルは、モデルのコンテンツをスケジュールするために、関数呼び出し信号をこの例の他のモデルに提供します。

open_system('CppClassFunctionsHarness')

テスト ハーネス モデルのシミュレーション

エクスポートする関数を含むモデルが予期したとおりに実行されることを、テスト ハーネス モデルのシミュレーションによって検証します。たとえば、CppClassFunctionsHarness をシミュレーションします。

sim('CppClassFunctionsHarness')

関数のコードとレポートの生成

エクスポートする関数のコードとコード生成レポートを生成します。たとえば、CppClassFunctions のコードを生成します。

slbuild('CppClassFunctions')
### Starting build procedure for: CppClassFunctions
### Successful completion of build procedure for: CppClassFunctions

Build Summary

Top model targets built:

Model              Action                        Rebuild Reason                                    
===================================================================================================
CppClassFunctions  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 15.984s

生成コードのレビュー

コード生成レポートで生成されたコードをレビューします。

  • ert_main.cpp はモデル用の main プログラムの例 (実行フレームワーク) を示す。このコードは、エクスポートされた関数を呼び出す方法を示しています。また、このコードは生成済みのコードの初期化と実行の方法も示しています。

  • CppClassFunctions.cpp は、モデル サブシステムのコンポーネント f1f2 および f3 の初期化関数 (Initialize Function を含む) とエクスポート関数を呼び出す。

  • CppClassFunctions.h はモデルのデータ構造と、エクスポートされたエントリポイント関数およびデータ構造のパブリック インターフェイスを宣言する。

  • rtwtypes.h は、生成コードが必要とするデータ型、構造体およびマクロを定義する。

インターフェイス コードの記述

コード インターフェイス レポートを開いてレビューします。実行フレームワークのインターフェイス コードを記述するために、このレポートの情報を使用します。

  1. 命令 #include CppClassFunctions.h および #include rtwtypes.h を追加することによって、生成されたヘッダー ファイルをインクルードします。

  2. モデルの Inport ブロックの生成コードへの入力データを記述します。

  3. 生成されたエントリポイント関数を呼び出します。

  4. モデルの 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('CppClassFunctionsHarness')
bdclose('CppClassFunctions')

詳細

エクスポート関数サブシステムのコード生成

エクスポート関数サブシステムのコードを生成するには、以下を行います。

  1. コードを生成しているサブシステムがエクスポートの要件を満たしていることを確認します。

  2. [コンフィギュレーション パラメーター] ダイアログ ボックスで、以下の操作を実行します。

    1. パラメーター [システム ターゲット ファイル]ert.tlc などの ERT ベースのシステム ターゲット ファイルに設定します。

    2. 検証のために生成コードで SIL ブロックが必要な場合は、モデル コンフィギュレーション パラメーター [ブロックの作成][SIL] に設定します。

    3. [OK] または [適用] をクリックします。

  3. サブシステム ブロックを右クリックし、コンテキスト メニューから [C/C++ コード]、[関数のエクスポート] を選択します。

    この操作によって、元のサブシステムのコンテンツを含む新しいモデル subsystem.slx が作成およびビルドされ、Model ブロックを含む ScratchModel が作成されます。このブロックは新しく作成された 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 ブロックの [ブロック プロパティ] ダイアログ ボックスを使用して、エクスポートする関数についてのカスタムの説明を入力できます。

  1. コードをエクスポートしているサブシステムの制御端子を駆動する Inport ブロックを右クリックします。

  2. [プロパティ] を選択します。

  3. [一般] タブの [説明] フィールドに説明テキストを入力します。

関数のエクスポート中、入力したテキストは Inport ブロックのヘッダーの生成コードに出力されます。たとえば、モデルを開き、端子 f1 の [ブロック プロパティ] ダイアログ ボックスに説明を入力した場合、コード ジェネレーターは次のようなコードを生成します。

   * Block description for RootInportFunctionCallGenerator generated from '<Root>/f1':
   *  My custom description
   */

エクスポート関数サブシステム用に生成されたコードの最適化

エクスポート関数サブシステム用に生成されたコードを最適化するには、サブシステムの境界を越える入力信号および出力信号ごとに別々のストレージ クラスを指定します。

エクスポートしている各 Function-Call Subsystem に対して、以下を行います。

  1. サブシステムを右クリックします。

  2. コンテキスト メニューから [ブロックのパラメーター (Subsystem)] を選択します。

  3. [コード生成] タブを選択します。

  4. [関数のパッケージ化][自動] に設定します。

  5. [OK] または [適用] をクリックします。

関連するトピック