Main Content

外部コードの統合の例

このトピックでは、外部コードの統合のさまざまなシナリオについて説明します。

S-Function を使用した外部 C++ コードのモデルへの統合

この例は、S-Function を使用して C++ コードをモデルに統合する方法を示しています。

モデル例を開く

モデル例 CppSFunctionExternalCode を開きます。

open_system('CppSFunctionExternalCode');

C++ コンパイラの設定

1. MATLAB® コマンド ウィンドウで、次のコマンドを入力します。

mex -setup

2. プロンプトが表示されたら、開発用コンピューターにインストールされている C++ コンパイラを選択します。

C++ コードの統合

S-Function を使用して C++ コードをモデルに統合できます。

1. S-Function ソースを準備します。

  • sfun_cppcount_cpp.cpp を開きます。

  • sfun_cppcount_cpp.h を開きます。

2. Simulink Coder アプリまたは Embedded Coder アプリを開きます。

3. S-Function ソース ファイルおよびフォルダーを設定します。[モデル コンフィギュレーション パラメーター] ダイアログ ボックスを開き、[コード生成]、[カスタム コード] ペインに移動して、S-Function ソース ファイルと include フォルダーを追加します。

4. S-Function をインライン化して、生成されたコードで S-Function のオーバーヘッドを除去します。

sfun_cppcount_cpp.tlc を編集します。

C++ コード生成用のモデルの設定

モデル コンフィギュレーション パラメーター [言語]C++ に設定します。

コードの生成とレビュー

C++ コードを生成およびレビューします。

関連するトピック

コード生成のための Stateflow チャートへの外部 C コードおよび C++ コードの挿入

この例では、Stateflow® を使用して外部コードをモデルに統合する方法を示します。

モデルを開く

model='StateflowCustomCode';
open_system(model);

コードの統合

1. この例には、カスタム ヘッダー ファイル my_header.c およびカスタム ソース ファイル my_function.c が含まれています。

%Open files my_header.h and my_function.c
eval('edit my_header.h')
eval('edit my_function.c')

2. [モデル コンフィギュレーション パラメーター] ダイアログ ボックスの [シミュレーション ターゲット] ペインで、カスタム ソース ファイルとヘッダー ファイルを入力します。また、追加インクルード ディレクトリとソース ファイルを入力します。

この例では、カスタム ヘッダー ファイル my_header.c とソース ファイル my_function.c[シミュレーション ターゲット] ペインに入力します。

%Open Configuration Parameters dialog box
configSet = getActiveConfigSet(model);
openDialog(configSet);

3. コードを生成するには、[モデル コンフィギュレーション パラメーター] ダイアログ ボックスの [コード生成]、[カスタム コード] ペインで、同じカスタム ソース ファイルとヘッダー ファイルを入力します。また、同じ追加インクルード ディレクトリとソース ファイルを入力します。

この例では、カスタム ヘッダー ファイル my_header.c およびソース ファイル my_function.c[コード生成]、[カスタム コード] ペインに入力されます。

[モデル コンフィギュレーション パラメーター] ダイアログ ボックスの [コード生成]、[カスタム コード] ペインを開きます。

configSet = getActiveConfigSet(model);
openDialog(configSet);

コードの生成

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

Build Summary

Top model targets built:

Model                Action                        Rebuild Reason                                    
=====================================================================================================
StateflowCustomCode  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 20.098s

Stateflow からの C コードの呼び出し

Stateflow からカスタム C コード関数を呼び出すには、グラフィカル関数呼び出しと同じ構文 result = my_custom_function(in_args); を使用します。

構造体型の変数を呼び出すには、ドット表記 result = my_var.my_field; を使用します。

参考

カスタム コード ブロックとモデル コンフィギュレーション パラメーターを使用した外部 C コードの生成コードへの統合

この例では、カスタム コード ブロックとモデル コンフィギュレーション パラメーターを使用して生成コードに外部コードを配置する方法を示します。

1. モデル CustomCode を開きます。

open_system('CustomCode')

2. Simulink Coder アプリまたは Embedded Coder アプリを開きます。

3. [モデル コンフィギュレーション パラメーター] ダイアログ ボックスを開いて [カスタム コード] ペインに移動します。

4. [追加のソース コード] タブで、モデル コンフィギュレーション パラメーター [追加コード][初期化コード] の設定を確認します。

  • [追加コード] にはコメントを指定し、変数 GLOBAL_INT2 を -1 に設定します。

  • [初期化コード] は変数 GLOBAL_INT2 を 1 に初期化します。

5. ダイアログ ボックスを閉じます。

6. Model Source ブロックをダブルクリックします。ブロック パラメーター [Model Source の最上位] では、コード ジェネレーターが変数 GLOBAL_INT1 を宣言して生成ファイル CustomCode.c の先頭でその変数を 0 に設定することを指定します。

7. Triggered Subsystem Amplifier を開きます。サブシステムには System Outputs ブロックが含まれます。そのブロックで指定したコードを、コード ジェネレーターが、最も近い親 Atomic サブシステムの生成コード内に配置します。この場合、コードジェネレーターは Amplifier サブシステム用の生成コード内に外部コードを配置します。外部コードは次のようになります。

  • ポインター変数 *intPtr を宣言し、変数 GLOBAL_INT1 の値で初期化する。

  • 実行中はポインター変数を -1 に設定する。

  • 終了前にポインター変数を 0 にリセットする。

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

9. 生成されたソース ファイル CustomCode.c のコードを調べます。ファイルの先頭、#include ステートメントの後に、次の宣言コードがあります。この例では、[追加コード] コンフィギュレーション パラメーターによる最初の宣言と Model Source ブロックによる 2 番目の宣言が指定されています。

int_T GLOBAL_INT2 = -1;

int_T GLOBAL_INT1 = 0;

サブシステム Amplifier の出力関数には次のコードが含まれています。外部コードが、ゲインを適用する生成コードと統合されているのがわかります。この例では、サブシステム Amplifier 内に System Output ブロックによるポインター変数の 3 行のコードが指定されています。

int_T *intPtr = &GLOBAL_INT1;

*intPtr = -1;

CustomCode_Y.Output = CustomCode_U.Input << 1;

*intPtr = 0;

次の代入がモデルの初期化エントリポイント関数に表示されます。この例では、[初期化コード] コンフィギュレーション パラメーターによるこの代入が指定されています。

GLOBAL_INT2 = 1;

カスタム コード ブロックとモデル コンフィギュレーション パラメーターを使用した外部 C コードの生成コードへの統合

この例では、カスタム コード ブロックとモデル コンフィギュレーション パラメーターを使用して生成コードに外部コードを配置する方法を示します。

1. モデル CustomCode を開きます。

open_system('CustomCode')

2. Simulink Coder アプリまたは Embedded Coder アプリを開きます。

3. [モデル コンフィギュレーション パラメーター] ダイアログ ボックスを開いて [カスタム コード] ペインに移動します。

4. [追加のソース コード] タブで、モデル コンフィギュレーション パラメーター [追加コード][初期化コード] の設定を確認します。

  • [追加コード] にはコメントを指定し、変数 GLOBAL_INT2 を -1 に設定します。

  • [初期化コード] は変数 GLOBAL_INT2 を 1 に初期化します。

5. ダイアログ ボックスを閉じます。

6. Model Source ブロックをダブルクリックします。ブロック パラメーター [Model Source の最上位] では、コード ジェネレーターが変数 GLOBAL_INT1 を宣言して生成ファイル CustomCode.c の先頭でその変数を 0 に設定することを指定します。

7. Triggered Subsystem Amplifier を開きます。サブシステムには System Outputs ブロックが含まれます。そのブロックで指定したコードを、コード ジェネレーターが、最も近い親 Atomic サブシステムの生成コード内に配置します。この場合、コードジェネレーターは Amplifier サブシステム用の生成コード内に外部コードを配置します。外部コードは次のようになります。

  • ポインター変数 *intPtr を宣言し、変数 GLOBAL_INT1 の値で初期化する。

  • 実行中はポインター変数を -1 に設定する。

  • 終了前にポインター変数を 0 にリセットする。

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

9. 生成されたソース ファイル CustomCode.c のコードを調べます。ファイルの先頭、#include ステートメントの後に、次の宣言コードがあります。この例では、[追加コード] コンフィギュレーション パラメーターによる最初の宣言と Model Source ブロックによる 2 番目の宣言が指定されています。

int_T GLOBAL_INT2 = -1;

int_T GLOBAL_INT1 = 0;

サブシステム Amplifier の出力関数には次のコードが含まれています。外部コードが、ゲインを適用する生成コードと統合されているのがわかります。この例では、サブシステム Amplifier 内に System Output ブロックによるポインター変数の 3 行のコードが指定されています。

int_T *intPtr = &GLOBAL_INT1;

*intPtr = -1;

CustomCode_Y.Output = CustomCode_U.Input << 1;

*intPtr = 0;

次の代入がモデルの初期化エントリポイント関数に表示されます。この例では、[初期化コード] コンフィギュレーション パラメーターによるこの代入が指定されています。

GLOBAL_INT2 = 1;

コード生成のための Stateflow チャートへの外部 C++ コードの挿入

この例では、Stateflow® を使用して外部 C++ コードをモデルに統合する方法を示します。

モデルを開く

model='CppStateflowExternalCode';
open_system(model);

C++ コンパイラをセットアップするには、コマンド ラインで mex -setup を入力します。

C++ コードの統合

1. C スタイルのラッパー関数またはアクセス マクロを C アクション言語から呼び出した各メソッドごとに作成します。

%Open example wrapper functions.
currentFolder = pwd;
filename=fullfile(currentFolder, 'custom_cpp_src', 'adder_cpp.cpp');
edit(filename);
clear filename;

filename=fullfile(currentFolder, 'custom_cpp_src', 'adder_cpp.h');
edit(filename);
clear filename;

2. [コンフィギュレーション パラメーター] ダイアログ ボックスの [コード生成]、[カスタム マクロ] ペインで、S-Function ソース ファイルと include ディレクトリを入力します。

%Open Configuration Parameters dialog box
configSet = getActiveConfigSet(model);
openDialog(configSet);

3. [コンフィギュレーション パラメーター] ダイアログ ボックスの [シミュレーション ターゲット]、[カスタム コード] ペインで、S-Function ソース ファイルとインクルード ディレクトリを入力します。

%Open Configuration Parameters dialog box
configSet = getActiveConfigSet(model);
openDialog(configSet);

C++ コードの生成

[コンフィギュレーション パラメーター] ダイアログ ボックスの [コード生成] ペインで、[言語]C++ に設定します。コードを生成するには、[ビルド] を選択します。

%Open Configuration Parameters dialog box
configSet = getActiveConfigSet(model);
openDialog(configSet);
clear model;

モデルを閉じる

close_system('CppStateflowExternalCode',0);

参考