このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
シミュレーションおよびコード生成のための再利用可能な外部アルゴリズム コードの呼び出し
コードの再利用は、ビジネスおよび技術面でメリットがあります。ビジネス面では、コードを再利用することで時間とリソースが節約されます。技術的な面では、一貫性が促進され、メモリ要件が軽減されます。その他の考慮事項は以下のとおりです。
アプリケーションのモジュール化
最適化されたアルゴリズムの再利用
事前定義されたデータセットとの連携
アプリケーション バリアントの開発
シミュレーションやコード生成のために Simulink® 環境へのインポートを検討する再利用可能なハードウェアに依存しないアルゴリズム コードの例は次のとおりです。
ユーティリティ関数
ルックアップ テーブル
デジタル フィルター
特殊な積分器
比例-積分-微分 (PID) 制御モジュール
ワークフロー
シミュレーションとコード生成のために再利用可能な外部アルゴリズム コードを呼び出すには、以下の表に記載されているタスクを反復します。
タスク | アクション | 詳細 |
---|---|---|
1 | 外部コードの特性と統合要件の評価を確認します。 | |
2 | 外部コードのプログラミング言語に基づいて、外部コードを Simulink モデルに追加する統合アプローチを選択します。 | |
3 | モデルをシミュレーションして、アルゴリズムの動作とパフォーマンスを検証します。 | |
4 | コード生成用のモデル データの表示を定義します。 | コード インターフェイスの設定および外部 C/C++ コードと Simulink モデルまたは生成コード間のデータ交換 (Embedded Coder) |
5 | コードを生成するためにモデルを設定します。 | 外部コードの外観に一致するコードの生成 (Embedded Coder) |
6 | コードとコード生成レポートを生成します。 | |
7 | 生成コード インターフェイスと静的コード メトリクスを確認します。 | |
8 | モデルから実行可能なプログラムをビルドします。 | |
9 | 実行可能なプログラムが予測どおり動作するか確認します。 |
統合方法の選択
再利用可能なアルゴリズム コードをコード生成用の Simulink 環境に統合するための方法がいくつかあります。外部コードを直接統合する方法があります。外部コードをシミュレーション用の Simulink または Stateflow® モデリング要素に変換し、後でモデル化されたデザインからコード生成用に変換する方法もあります。どの統合方法を選択するかは、以下によって決まります。
外部コードのプログラミング言語 — MATLAB®、C、C++ または Fortran
プログラミング言語の経験と嗜好
パフォーマンス要件
アルゴリズムが連続時間のダイナミクスをモデル化しなければならないか、または離散時間および連続時間を使用するアプリケーションにアルゴリズムを統合しているか
モデルベース デザインを活用するかどうか
コード ジェネレーターで生成されるコードに対して必要な制御のレベル
再利用可能なアルゴリズムのアプローチを選択するには、外部アルゴリズム コードのプログラミング言語と一致するサブセクションを参照してください。
外部 MATLAB コードの統合方法
外部 MATLAB コードを Simulink 環境に統合する方法は複数あります。次の表を参照すると、統合要件に基づいてアプリケーションに最適な統合方法を選択できます。
条件または要件 | アクション | 詳細 |
---|---|---|
| MATLAB Function ブロックをモデルに追加します。MATLAB コードをそのブロックに組み込みます。 | |
| MATLAB System ブロックをモデルに追加します。MATLAB コードを System object™ としてそのブロックに組み込みます。 | |
| Stateflow チャートをモデルに追加します。MATLAB をアクション言語として使用して、チャートから外部コードを呼び出します。 |
|
関数 parfor を、並列計算または MATLAB Coder™、Simulink Coder、および Embedded Coder® に使用できるインターフェイス データ型に使用する。parfor を使用するには、Parallel Computing Toolbox™ がインストールされていなければなりません。 | ソフトウェアを使用して C コードを生成します。次に、生成したコードを外部 C コードとして呼び出します。 | |
C または C++ によるプログラミングの経験があり、外部 MATLAB コードがコンパクトで、主に C または C++ 構造体を使用している。 | MATLAB コードを C または C++ コードに手動で変換します。C または C++ コードの統合方法を選択します。 | |
外部 MATLAB コードのセクションが組み込みブロックにマッピングする。 | アプリケーションの組み込みブロックを使用して、モデルのコンテキスト内でアルゴリズムを開発します。 | |
アルゴリズムで連続状態のダイナミクスをモデル化しなければならない。 | MATLAB S-Function と、コードを生成する場合は、アルゴリズムのための対応 TLC ファイルを作成します。S-Function をモデルに追加します。 |
外部 MATLAB コードを MATLAB Function ブロックに組み込んだり、MATLAB Coder ソフトウェアを使用して C または C++ コードを MATLAB コードから生成するために、MATLAB コードは C/C++ コード生成でサポートされる関数とクラスを使用しなければなりません。
外部 C または C++ コードの統合方法
外部 C コードまたは C++ コードを Simulink 環境に統合する方法は複数あります。次の表を参照すると、統合要件に基づいてアプリケーションに最適な統合方法を選択できます。
条件または要件 | アクション | 詳細 |
---|---|---|
外部 C コードを生成された C++ コードに統合する、またはその反対を行う | 外部コードの言語を変更して、生成コードの言語選択を一致させます。 | 生成コードに合わせるための外部コードのプログラミング言語の変更 |
| C で記述されたシンプルなアルゴリズムの場合は、Simulink C Caller ブロックの使用を検討してください。 | C Caller ブロックを使用した C コードの統合 |
| C Function ブロックをモデルに追加します。 | MATLAB Function ブロックを使用した C コードの統合 |
| S-Function Builder を使用して、S-Function および TLC ビルドを生成します。必要に応じて、アプリケーション要件を満たすよう生成コードを手動で調整します (生成コードを変更する場合、S-Function と TLC ファイルを再生成すると、変更内容が失われます)。 | |
| レガシ コード ツールを使用して S-Function と TLC ファイルを生成します。必要に応じて、アプリケーション要件を満たすよう生成コードを手動で調整します (生成コードを変更する場合、S-Function と TLC ファイルを再生成すると、変更内容が失われます)。 | |
| S-Function と TLC ファイルを手動で作成します。 | |
アルゴリズムに、ステート マシンおよびフロー チャートに基づく設計ロジックが含まれる。または、統合する関数でグローバル変数を使用してモデルとデータを交換しなければならない。関数はグローバル変数を定義し、それらの変数を使用して、値を返したり出力を引数に書き込むのではなく、出力を作成する。 | Stateflow チャートをモデルに追加します。C をアクション言語として使用して、チャートから外部コードを呼び出します。チャートで、外部関数を呼び出し、グローバル変数に対して読み書きを実行するコードを作成します。外部コードの出力で計算を実行するために、モデルは実行時にグローバル変数から読み込まなければなりません。 | Stateflow チャートへの外部コードの挿入 |
シミュレーションおよびコード生成のために外部 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 環境内に追加します。
C/C++ S-Function の基礎、Simulink への Fortran コードの統合、S-Function とコード生成およびFortran S-Function Examplesを参照してください。
Stateflow チャートへの外部コードの挿入
ライブラリ チャート用の外部コードの統合
コード生成用の Stateflow ライブラリ チャートのみに適用される外部コードを統合するには、チャートをメイン モデルに提供するライブラリ モデルごとに以下の手順を実行します。次に、コードを生成します。
Stateflow エディターで、[モデル コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。パラメーター [ローカルなカスタム コード設定を使用 (メイン モデルから継承しません)] を選択します。
ライブラリ モデルはコード生成中に独自のカスタム コード設定を保持します。
サブペインで、カスタム コードを指定します。
カスタム コードへの相対パスの指定 (Stateflow)のガイドラインに従ってください。
シミュレーションのカスタム コード設定を指定した場合、この設定をコード生成に適用することができます。同じ情報を再び入力せずにすむように、[シミュレーション ターゲットと同じカスタム コードの設定を使用] チェック ボックスをオンにします。
[OK] をクリックします。
ライブラリ モデルごとにこれらの手順を完了してから、コードを生成します。
すべてのチャート用の外部コードの統合
コード生成用のチャートすべてに適用される外部コードを統合するには、以下を行います。
メイン モデルのコード生成用のカスタム コード オプションを指定します。
[モデル コンフィギュレーション パラメーター] ダイアログ ボックスで、[コード生成] 、 [カスタム コード] を選択します。
カスタム コード テキスト フィールドで、カスタム コードを指定します。
カスタム コードへの相対パスの指定 (Stateflow)のガイドラインに従ってください。
シミュレーションのカスタム コード設定を指定した場合、この設定をコード生成に適用することができます。同じ情報を再び入力せずにすむように、[シミュレーション ターゲットと同じカスタム コードの設定を使用] チェック ボックスをオンにします。
チャートをメイン モデルに提供する各ライブラリ モデルのコード生成を設定します。Stateflow エディターで、[モデル コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。パラメーター [ローカルなカスタム コード設定を使用 (メイン モデルから継承しません)] をオフにします。ライブラリ チャートはメイン モデルのカスタム コード設定を継承します。[OK] をクリックします。
コードを生成します。