シミュレーションおよびコード生成のための再利用可能なハードウェアに依存しない外部コードの呼び出し
コードの再利用は、ビジネスおよび技術面でメリットがあります。ビジネス面では、コードを再利用することで時間とリソースが節約されます。技術的な面では、一貫性が促進され、メモリ要件が軽減されます。その他の考慮事項は以下のとおりです。
アプリケーションのモジュール化
最適化されたアルゴリズムの再利用
事前定義されたデータセットとの連携
アプリケーション バリアントの開発
シミュレーションやコード生成のために Simulink® 環境へのインポートを検討する再利用可能なハードウェアに依存しないアルゴリズム コードの例は次のとおりです。
ユーティリティ関数
ルックアップ テーブル
デジタル フィルター
特殊な積分器
比例-積分-微分 (PID) 制御モジュール
ワークフロー
シミュレーションとコード生成のために再利用可能な外部アルゴリズム コードを呼び出すには、以下の表に記載されているタスクを反復します。
| タスク | アクション | 詳細 |
|---|---|---|
| 1 | 外部コードの特性と統合要件の評価を確認します。 | |
| 2 | 外部コードを Simulink モデルに追加する統合手法を選択します。 | |
| 3 | モデルをシミュレーションして、アルゴリズムの動作とパフォーマンスを検証します。 | |
| 4 | コード生成用のモデル データの表示を定義します。 | |
| 5 | コードを生成するためにモデルを設定します。 | |
| 6 | コードとコード生成レポートを生成します。 | |
| 7 | 生成コード インターフェイスと静的コード メトリクスを確認します。 | Analyze Generated Data Code Interface Report、Analyze Generated Service Code Interface Report、およびStatic Code Metrics |
| 8 | モデルから実行可能なプログラムをビルドします。 | |
| 9 | 実行可能なプログラムが予測どおり動作するか確認します。 |
統合手法の選択
再利用可能なハードウェアに依存しないアルゴリズム コードを Simulink 環境に統合するには、いくつかの手法があります。一部の手法では、外部コードを直接統合します。外部コードを Simulink または Stateflow® モデリング要素に変換する方法もあります。どの統合手法を選択するかは、以下によって決まります。
外部コードのプログラミング言語 — MATLAB®、C、C++ または Fortran
プログラミング言語の経験と嗜好
パフォーマンス要件
アルゴリズムが連続時間のダイナミクスをモデル化するか、または離散時間および連続時間を使用するアプリケーションにアルゴリズムを統合しているか
モデルベース デザインを活用するかどうか
コード ジェネレーターで生成されるコードに対して必要な制御のレベル
再利用可能なアルゴリズムの統合手法を選択するには、外部コードのプログラミング言語と一致するサブセクションを参照してください。
外部 MATLAB コードの統合手法
外部 MATLAB コードを Simulink 環境に統合する手法は複数あります。次の表を使用して、アプリケーションに最適な統合手法を選択できます。
| 条件または要件 | アクション | 詳細 |
|---|---|---|
| MATLAB Function ブロックをモデルに追加します。MATLAB コードをそのブロックに組み込みます。 | |
| MATLAB System ブロックをモデルに追加します。MATLAB コードを System object™ としてそのブロックに組み込みます。 | |
| Stateflow チャートをモデルに追加します。MATLAB をアクション言語として使用して、チャートから外部コードを呼び出します。 | |
並列計算に parfor 関数を使用する。 | MATLAB Function ブロックをモデルに追加します。MATLAB コードをそのブロックに組み込みます。 | |
| C または C++ によるプログラミングの経験があり、外部 MATLAB コードがコンパクトで、主に C または C++ 構成要素を使用している。 | MATLAB コードを C または C++ コードに手動で変換します。C または C++ コードの統合方法を選択します。 | |
| 外部 MATLAB コードのセクションが組み込みブロックにマッピングする。 | アプリケーションの組み込みブロックを使用して、モデルのコンテキスト内でアルゴリズムを開発します。 | |
| 外部アルゴリズムで連続状態のダイナミクスをモデル化する。 | MATLAB S-Function と、アルゴリズムのための TLC ファイルを作成します。S-Function をモデルに追加します。 |
外部 MATLAB コードを MATLAB Function または MATLAB System ブロックに組み込んだり、MATLAB Coder™ を使用して C または C++ コードを MATLAB コードから生成したりするために、MATLAB コードは C/C++ コード生成でサポートされる関数とクラスを使用しなければなりません。詳細については、C/C++ コードの生成でサポートされている関数およびオブジェクトを参照してください。
外部 C または C++ コードの統合手法
外部 C コードまたは C++ コードを Simulink 環境に統合する手法は複数あります。次の表を参照すると、アプリケーションに最適な統合手法を選択できます。
| 条件または要件 | アクション | 詳細 |
|---|---|---|
| 外部 C コードを生成された C++ コードに統合する、またはその反対を行う | 外部コードの言語を変更して、生成コードの言語選択を一致させます。 | 生成コードに合わせるための外部コードのプログラミング言語の変更 |
| Simulink C Caller ブロックを使用します。 | C Caller ブロックを使用した C コードの統合 |
| C Function ブロックを使用します。 | C Function ブロックを使用した外部 C/C++ コードの Simulink への統合 |
| C Function ブロックを使用します。 | |
| S-Function Builder を使用して、S-Function および TLC ビルドを生成します。必要に応じて、アプリケーション要件を満たすよう生成コードを手動で調整します (生成コードを変更する場合、S-Function と TLC ファイルを再生成すると、変更内容が失われます)。 | Build S-Functions Automatically Using S-Function Builder |
| S-Function Builder を使用して、S-Function および TLC ビルドを生成します。必要に応じて、アプリケーション要件を満たすよう生成コードを手動で調整します (生成コードを変更する場合、S-Function と TLC ファイルを再生成すると、変更内容が失われます)。 | Build S-Functions Automatically Using S-Function Builder |
| S-Function と TLC ファイルを手動で作成します。 | |
| S-Function と TLC ファイルを手動で作成します。 | |
| C/C++ アルゴリズムに、ステート マシンおよびフロー チャートに基づく設計ロジックが含まれている。または、統合する関数でグローバル変数を使用してモデルとデータを交換しなければならない。関数はグローバル変数を定義し、それらの変数を使用して、値を返したり出力を引数に書き込んだりするのではなく、出力を作成する。 | Stateflow チャートをモデルに追加します。C をアクション言語として使用して、チャートから外部コードを呼び出します。チャートで、外部関数を呼び出し、グローバル変数に対して読み書きを実行するコードを作成します。外部コードの出力で計算を実行するために、モデルは実行時にグローバル変数から読み込まなければなりません。 | Integrate External Code with Stateflow Charts |
| シミュレーションおよびコード生成のために外部 C/C++ コードを Stateflow チャートに含める。 | 外部 C または C++ コードを適用するチャートが含まれるモデルを構成します。 |
|
| モデルから外部 C/C++ コードへの呼び出しを迅速に組み込む。パフォーマンスは重要ではない。 | MATLAB Function ブロック内から関数 coder.ceval で C/C++ コードを呼び出します。 |
生成コードに合わせるための外部コードのプログラミング言語の変更
外部 C コードを生成された C++ コードに統合するまたはその逆を行うには、生成されたコードのプログラミング言語に合わせて外部コードの言語を変更します。外部コードのプログラミング言語を生成されたコードに一致させるには、以下で説明している適切な方法を使用します。
生成されたコードのプログラミング言語と一致するように外部コードを書き換える。
C++ コードを生成していて、外部コードが C コードの場合は、C 関数ごとに、関数をプロトタイプするヘッダー ファイルを作成する。次の形式を使用します。
#ifdef __cplusplus extern "C" { #endif int my_c_function_wrapper(); #ifdef __cplusplus } #endifプロトタイプは関数ラッパーの役割を果たします。コンパイラで C++ コードがサポートされている場合、
__cplusplusの値が定義されます。リンケージ指定extern "C"により、名前マングリングを使用しない C リンケージが指定されます。C コードを生成していて、外部コードが C++ コードの場合は、
extern "C"リンケージ仕様を各.cppファイルに含める。たとえば、次の例は、my_func.cppファイルの C++ コードを示します。extern "C" { int my_cpp_function() { ... } }
外部 Fortran コードの統合方法
外部 Fortran コードを統合するには、以下を行います。
S-Function と対応する TLC ファイルを作成します。
S-Function をモデルに追加します。
必要に応じて、サポート ファイルと制御モデルのコード生成およびビルドを Simulink 環境内に追加します。
詳細については、Simulink への Fortran コードの統合を参照してください。