Main Content

シミュレーションおよびコード生成のための再利用可能な外部アルゴリズム コードの呼び出し

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

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

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

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

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

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

  • ユーティリティ関数

  • ルックアップ テーブル

  • デジタル フィルター

  • 特殊な積分器

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

ワークフロー

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

タスクアクション詳細
1外部コードの特性と統合要件の評価を確認します。外部コード統合ワークフローの選択
2外部コードのプログラミング言語に基づいて、外部コードを Simulink モデルに追加する統合アプローチを選択します。統合方法の選択
3モデルをシミュレーションして、アルゴリズムの動作とパフォーマンスを検証します。シミュレーション
4コード生成用のモデル データの表示を定義します。コード インターフェイスの設定および外部 C/C++ コードと Simulink モデルまたは生成コード間のデータ交換
5コードを生成するためにモデルを設定します。モデル コンフィギュレーション セットのカスタマイズ
6コードとコード生成レポートを生成します。コード生成
7生成コード インターフェイスと静的コード メトリクスを確認します。Analyze the Generated Code Interfaceおよび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 Coder™Simulink Coder、および Embedded Coder® に使用できるインターフェイス データ型に使用する。parfor を使用するには、Parallel Computing Toolbox™ がインストールされていなければなりません。ソフトウェアを使用して C コードを生成します。次に、生成したコードを外部 C コードとして呼び出します。
C または C++ によるプログラミングの経験があり、外部 MATLAB コードがコンパクトで、主に C または C++ 構造体を使用している。MATLAB コードを C または C++ コードに手動で変換します。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 ブロックに統合する。

  • 関数ではグローバル/静的変数の読み込みまたは書き込みを行わない。

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

C で記述されたシンプルなアルゴリズムの場合は、Simulink C Caller ブロックの使用を検討してください。

C Caller ブロックを使用した C コードの統合
  • カスタム機能をモデル化する既存の C コードがある。Simulink ブロックから複数の C 関数を呼び出すか、C 関数を条件付きで呼び出す。

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

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

C Function ブロックをモデルに追加します。MATLAB Function ブロックを使用した C コードの統合
  • アルゴリズムは、シミュレーションおよびラピッド プロトタイピング用に離散状態および連続状態のダイナミクスをモデル化しなければならない。

  • 外部コードに固定小数点インターフェイスが必要。

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

S-Function Builder を使用して、S-Function および TLC ビルドを生成します。必要に応じて、アプリケーション要件を満たすよう生成コードを手動で調整します (生成コードを変更する場合、S-Function と TLC ファイルを再生成すると、変更内容が失われます)。
  • 離散時間アプリケーション用に外部コードをシミュレートおよび生成する。生成コードの最適化は必須。

  • コード ジェネレーターで生成されるコードの制御について中程度の柔軟性をもつ使いやすさが必要。

  • C または C++ プログラミング経験があるが、コードをモデルに追加するファイルを生成する方法を選択する。

レガシ コード ツールを使用して S-Function と TLC ファイルを生成します。必要に応じて、アプリケーション要件を満たすよう生成コードを手動で調整します (生成コードを変更する場合、S-Function と TLC ファイルを再生成すると、変更内容が失われます)。

  • 通常コード ジェネレーターで生成される、model_stepmodel_initializemodel_terminate などのコードよりも多くのエントリポイント関数がアプリケーションに必要。

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

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

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

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

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

C/C++ S-Function の基礎Fortran コードを使用したアルゴリズムの実装S-Function とコード生成およびFortran S-Function Examplesを参照してください。

Stateflow チャートへの外部コードの挿入

ライブラリ チャート用の外部コードの統合

コード生成用の Stateflow ライブラリ チャートのみに適用される外部コードを統合するには、チャートをメイン モデルに提供するライブラリ モデルごとに以下の手順を実行します。次に、コードを生成します。

  1. Stateflow エディターで、[モデル コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。パラメーター [ローカルなカスタム コード設定を使用 (メイン モデルから継承しません)] を選択します。

    ライブラリ モデルはコード生成中に独自のカスタム コード設定を保持します。

  2. サブペインで、カスタム コードを指定します。

    カスタム コードへの相対パスの指定 (Stateflow)のガイドラインに従ってください。

    シミュレーションのカスタム コード設定を指定した場合、この設定をコード生成に適用することができます。同じ情報を再び入力せずにすむように、[シミュレーション ターゲットと同じカスタム コードの設定を使用] チェック ボックスをオンにします。

  3. [OK] をクリックします。

ライブラリ モデルごとにこれらの手順を完了してから、コードを生成します。

すべてのチャート用の外部コードの統合

コード生成用のチャートすべてに適用される外部コードを統合するには、以下を行います。

  1. メイン モデルのコード生成用のカスタム コード オプションを指定します。

    1. [モデル コンフィギュレーション パラメーター] ダイアログ ボックスで、[コード生成][カスタム コード] を選択します。

    2. カスタム コード テキスト フィールドで、カスタム コードを指定します。

      カスタム コードへの相対パスの指定 (Stateflow)のガイドラインに従ってください。

      シミュレーションのカスタム コード設定を指定した場合、この設定をコード生成に適用することができます。同じ情報を再び入力せずにすむように、[シミュレーション ターゲットと同じカスタム コードの設定を使用] チェック ボックスをオンにします。

  2. チャートをメイン モデルに提供する各ライブラリ モデルのコード生成を設定します。Stateflow エディターで、[モデル コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。パラメーター [ローカルなカスタム コード設定を使用 (メイン モデルから継承しません)] をオフにします。ライブラリ チャートはメイン モデルのカスタム コード設定を継承します。[OK] をクリックします。

  3. コードを生成します。

関連するトピック