このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。
外部コードの統合の例
このトピックでは、外部コードの統合のさまざまなシナリオについて説明します。
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;
を使用します。
参考
カスタム コード設定のシミュレーション用構成 (Stateflow)
Stateflow チャート内のカスタム C++ コードへのアクセス (Stateflow)
カスタム コード ブロックとモデル コンフィギュレーション パラメーターを使用した外部 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);
参考