メインコンテンツ

シミュレーションおよびコード生成のための再利用可能なハードウェアに依存しない外部コードの呼び出し

コードの再利用は、ビジネスおよび技術面でメリットがあります。ビジネス面では、コードを再利用することで時間とリソースが節約されます。技術的な面では、一貫性が促進され、メモリ要件が軽減されます。その他の考慮事項は以下のとおりです。

  • アプリケーションのモジュール化

  • 最適化されたアルゴリズムの再利用

  • 事前定義されたデータセットとの連携

  • アプリケーション バリアントの開発

シミュレーションやコード生成のために Simulink® 環境へのインポートを検討する再利用可能なハードウェアに依存しないアルゴリズム コードの例は次のとおりです。

  • ユーティリティ関数

  • ルックアップ テーブル

  • デジタル フィルター

  • 特殊な積分器

  • 比例-積分-微分 (PID) 制御モジュール

ワークフロー

シミュレーションとコード生成のために再利用可能な外部アルゴリズム コードを呼び出すには、以下の表に記載されているタスクを反復します。

タスクアクション詳細
1外部コードの特性と統合要件の評価を確認します。

外部コード統合ワークフローの選択

2外部コードを Simulink モデルに追加する統合手法を選択します。

統合手法の選択

3モデルをシミュレーションして、アルゴリズムの動作とパフォーマンスを検証します。

シミュレーション

4コード生成用のモデル データの表示を定義します。

コード インターフェイスの設定および外部 C/C++ コードと Simulink モデルまたは生成コード間のデータ交換

5コードを生成するためにモデルを設定します。

モデル コンフィギュレーション セットのカスタマイズ

6コードとコード生成レポートを生成します。

コード生成

7生成コード インターフェイスと静的コード メトリクスを確認します。

Analyze Generated Data Code Interface ReportAnalyze Generated Service Code Interface Report、およびStatic Code Metrics

8モデルから実行可能なプログラムをビルドします。

Simulink 環境内での統合コードのビルド

9実行可能なプログラムが予測どおり動作するか確認します。

検証およびテスト検証、テスト、および認定

統合手法の選択

再利用可能なハードウェアに依存しないアルゴリズム コードを Simulink 環境に統合するには、いくつかの手法があります。一部の手法では、外部コードを直接統合します。外部コードを Simulink または Stateflow® モデリング要素に変換する方法もあります。どの統合手法を選択するかは、以下によって決まります。

  • 外部コードのプログラミング言語 — MATLAB®、C、C++ または Fortran

  • プログラミング言語の経験と嗜好

  • パフォーマンス要件

  • アルゴリズムが連続時間のダイナミクスをモデル化するか、または離散時間および連続時間を使用するアプリケーションにアルゴリズムを統合しているか

  • モデルベース デザインを活用するかどうか

  • コード ジェネレーターで生成されるコードに対して必要な制御のレベル

再利用可能なアルゴリズムの統合手法を選択するには、外部コードのプログラミング言語と一致するサブセクションを参照してください。

外部 MATLAB コードの統合手法

外部 MATLAB コードを Simulink 環境に統合する手法は複数あります。次の表を使用して、アプリケーションに最適な統合手法を選択できます。

条件または要件アクション詳細
  • 外部コードは MATLAB コード生成サブセットに従う

  • MATLAB コードを Simulink モデルから呼び出す

MATLAB Function ブロックをモデルに追加します。MATLAB コードをそのブロックに組み込みます。
  • 外部コードは MATLAB コード生成サブセットに従う

  • MATLAB コードを Simulink モデルから呼び出す

  • 外部コードに、大規模なデータ ストリームを処理する反復的な計算が含まれる

MATLAB System ブロックをモデルに追加します。MATLAB コードを System object™ としてそのブロックに組み込みます。
  • 外部コードは MATLAB コード生成サブセットに従う

  • MATLAB コードを Simulink モデルから呼び出す

  • 外部コードに、ステート マシンおよびフロー チャートに基づく設計ロジックが含まれる

Stateflow チャートをモデルに追加します。MATLAB をアクション言語として使用して、チャートから外部コードを呼び出します。
並列計算に parfor 関数を使用する。MATLAB Function ブロックをモデルに追加します。MATLAB コードをそのブロックに組み込みます。
C または C++ によるプログラミングの経験があり、外部 MATLAB コードがコンパクトで、主に C または C++ 構成要素を使用している。MATLAB コードを C または C++ コードに手動で変換します。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++ コードに統合する、またはその反対を行う外部コードの言語を変更して、生成コードの言語選択を一致させます。生成コードに合わせるための外部コードのプログラミング言語の変更
  • モデルから単純な外部 C 関数を呼び出す。

  • 関数コードに状態は不要である。

  • コードの統合をカスタマイズしない。

  • Simulink Coverage™Simulink Test™、および Simulink Design Verifier™ と容易に統合する。

Simulink C Caller ブロックを使用します。

C Caller ブロックを使用した C コードの統合
  • Simulink ブロックから複数の外部 C または C++ 関数を呼び出すか、条件付きで関数を呼び出す。

  • 外部関数の呼び出しの前後にデータを前処理および後処理するコードを含める。

  • シミュレーションとコード生成に別のコードを指定する。

C Function ブロックを使用します。C Function ブロックを使用した外部 C/C++ コードの Simulink への統合
  • 外部 C/C++ アルゴリズムで、離散状態をもつ単純な動的システムをモデル化する。出力、開始、初期化条件、および終了のコードのために外部コードを呼び出す。

  • プログラミング経験が限定的である。ラピッド プロトタイピング用にコード ジェネレーターで生成されるコードを制御するために基本の柔軟性をもつ使いやすさが必要。

C Function ブロックを使用します。
  • 外部 C/C++ アルゴリズムで、離散状態をもつ単純な動的システムをモデル化する。状態を有効化、無効化、および更新するコードのために外部コードを呼び出す。

  • プログラミング経験が限定的である。ラピッド プロトタイピング用にコード ジェネレーターで生成されるコードを制御するために基本の柔軟性をもつ使いやすさが必要。

S-Function Builder を使用して、S-Function および TLC ビルドを生成します。必要に応じて、アプリケーション要件を満たすよう生成コードを手動で調整します (生成コードを変更する場合、S-Function と TLC ファイルを再生成すると、変更内容が失われます)。Build S-Functions Automatically Using S-Function Builder
  • 外部 C/C++ アルゴリズムで、連続状態をもつ単純な動的システムをモデル化する。

  • TLC ファイルを手動で記述しない。

  • プログラミング経験が限定的である。ラピッド プロトタイピング用にコード ジェネレーターで生成されるコードを制御するために基本の柔軟性をもつ使いやすさが必要。

S-Function Builder を使用して、S-Function および TLC ビルドを生成します。必要に応じて、アプリケーション要件を満たすよう生成コードを手動で調整します (生成コードを変更する場合、S-Function と TLC ファイルを再生成すると、変更内容が失われます)。Build S-Functions Automatically Using S-Function Builder
  • 外部 C/C++ アルゴリズムで、連続状態をもつ動的システムをモデル化する。

  • C/C++ プログラミングの経験がある。ラピッド プロトタイピング用にコード ジェネレーターによって生成されるコードを制御する。

S-Function と TLC ファイルを手動で作成します。
  • 通常コード ジェネレーターで生成される、model_stepmodel_initializemodel_terminate などのコードよりも多くのエントリポイント関数がアプリケーションに必要。

    コード ジェネレーターで生成するコードを制御する最大限の柔軟性が必要。

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 コードを統合するには、以下を行います。

  1. S-Function と対応する TLC ファイルを作成します。

  2. S-Function をモデルに追加します。

  3. 必要に応じて、サポート ファイルと制御モデルのコード生成およびビルドを Simulink 環境内に追加します。

詳細については、Simulink への Fortran コードの統合を参照してください。

参考

トピック