C API を使用したモデルの信号と状態へのアクセス
この例は、モデルの信号や状態と相互作用するアプリケーション コードを書き始めるために役立ちます。モデルのパラメーターと相互作用するアプリケーション コードを書き始めるには、C API を使用したモデル パラメーターへのアクセスを参照してください。
C API を使用すると、モデルの信号、状態、ルートレベル入力/出力、およびパラメーターと対話する独自のアプリケーション コードを柔軟に作成できます。ターゲット ベースのアプリケーション コードは Simulink® Coder™ 生成コードを使用して実行可能プログラムにコンパイルされます。ターゲット ベースのアプリケーション コードは
(または model
_capi.c.cpp
) で C API 構造体配列にアクセスします。ターゲット ベースのアプリケーション コードと対話するホスト ベースのコードがあるとします。または、ターゲット ベースのアプリケーション コードと対話するその他のターゲット ベースのコードがあるとします。
(開く) に配置されているファイル matlabroot
/rtw/c/srcrtw_modelmap.h
および rtw_capi.h
はこれらの配列とメンバーの構造体にアクセスするためのマクロを提供します。
モデルのグローバル信号と状態をテキスト ファイルにログ記録するアプリケーションの例を次に示します。信号と状態のアドレスにアクセスする開始点として次のコードを示します。コードを拡張して信号の記録と監視、状態の記録と監視、またはその両方を実行できます。
この例では、次のマクロと関数インターフェイスを使用します。
rtmGetDataMapInfo
マクロリアルタイム モデル構造体の MMI (モデル マッピング情報) サブ構造体にアクセスします。次のマクロ呼び出しで、
rtM
は
(またはmodel
.c.cpp
) でリアルタイム モデル構造体へのポインターです。rtwCAPI_ModelMappingInfo* mmi = &(rtmGetDataMapInfo(rtM).mmi);
rtmGetTPtr
マクロリアルタイム モデル構造体のタイミング サブ構造体から基本レートの絶対時間情報にアクセスします。次のマクロ呼び出しで、
rtM
は
(またはmodel
.c.cpp
) でリアルタイム モデル構造体へのポインターです。rtmGetTPtr(rtM)
ファイル
rtwdemo_capi_datalog.h
およびrtwdemo_capi_datalog.c
経由で提供されたカスタム関数capi_StartLogging
、capi_UpdateLogging
、およびcapi_TerminateLogging
。これらのファイルは
(開く) に配置されています。matlabroot
/toolbox/rtw/rtwdemoscapi_StartLogging
は信号と状態の記録を初期化します。capi_UpdateLogging
は各タイム ステップで信号と状態の値を記録します。capi_TerminateLogging
は信号と状態の記録を終了し、記録値をテキスト ファイルに書き込みます。
次の方法を使用して、これらのカスタム関数をモデルの生成コードに統合できます。
[モデル コンフィギュレーション パラメーター] ダイアログ ボックスの [カスタム コード]
Custom Code ライブラリ ブロック
TLC カスタム コード機能
このチュートリアルでは、次に示すように、[モデル コンフィギュレーション パラメーター] ダイアログ ボックスの [カスタム コード] ペインと Custom Code ライブラリの System Outputs ブロックを使用して、
(またはmodel
.c.cpp
) にカスタム関数への呼び出しを挿入します。capi_StartLogging
は関数
で呼び出されます。model
_initializecapi_UpdateLogging
は関数
で呼び出されます。model
_stepcapi_TerminateLogging
は関数
で呼び出されます。model
_terminate
(実行順序を反映して再配置されている) から生成された次のコードの抜粋は、関数インターフェイスの使用方法を示しています。model
.c
void rtwdemo_capi_initialize(void) { ... /* user code (Initialize function Body) */ /* C API Custom Logging Function: Start Signal and State logging via C API. * capi_StartLogging: Function prototype in rtwdemo_capi_datalog.h */ { rtwCAPI_ModelMappingInfo *MMI = &(rtmGetDataMapInfo(rtwdemo_capi_M).mmi); printf("** Started state/signal logging via C API **\n"); capi_StartLogging(MMI, MAX_DATA_POINTS); } ... } ... /* Model step function */ void rtwdemo_capi_step(void) { ... /* user code (Output function Trailer) */ /* System '<Root>' */ /* C API Custom Logging Function: Update Signal and State logging buffers. * capi_UpdateLogging: Function prototype in rtwdemo_capi_datalog.h */ { rtwCAPI_ModelMappingInfo *MMI = &(rtmGetDataMapInfo(rtwdemo_capi_M).mmi); capi_UpdateLogging(MMI, rtmGetTPtr(rtwdemo_capi_M)); } ... } ... /* Model terminate function */ void rtwdemo_capi_terminate(void) { /* user code (Terminate function Body) */ /* C API Custom Logging Function: Dump Signal and State buffers into a text file. * capi_TerminateLogging: Function prototype in rtwdemo_capi_datalog.h */ { capi_TerminateLogging("rtwdemo_capi_ModelLog.txt"); printf("** Finished state/signal logging. Created rtwdemo_capi_ModelLog.txt **\n"); } }
次の手順は、C API マクロと関数インターフェイスを使用してモデルのグローバル信号と状態をテキスト ファイルに記録する方法を示しています。
MATLAB® コマンド ラインで
rtwdemo_capi
と入力してモデル例を開きます。最上位モデル
rtwdemo_capi
と参照モデルrtwdemo_capi_bot
を書き込み可能な同じ作業フォルダーに保存します。[コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。
Embedded Coder® ソフトウェアのライセンスがあり、既定の
grt.tlc
ではなくシステム ターゲット ファイルert.tlc
を使用する場合は、モデル コンフィギュレーション パラメーター [システム ターゲット ファイル] の設定を変更します。参照モデルrtwdemo_capi_bot
のert.tlc
も選択するようにしてください。最上位モデルについて、以下のモデル コンフィギュレーション パラメーターの設定を確認します。
パラメーター [信号用 C API の生成]、[状態用 C API の生成]、および [パラメーター用 C API の生成] をオンにします。
システム ターゲット ファイル
ert.tlc
を使用している場合は、[サポート: 複素数] を選択します。[MAT ファイルのログ] を選択します。
[適用] をクリックします。
最上位モデルで行った変更と一致するように、参照モデル
rtwdemo_capi_bot
のコンフィギュレーション パラメーター設定を更新します。
[カスタム コード] ペインを使用して、生成されたコードにカスタム アプリケーション コードを組み込みます。[カスタム コード] ペインを選択します。[コード情報] タブで、[インクルード ディレクトリ] をクリックします。[インクルード ディレクトリ] 入力フィールドが表示されます。
[インクルード ディレクトリ] フィールドで
と入力します。ここで、matlabroot
/toolbox/rtw/rtwdemos
は MATLAB インストール フォルダーのルートを表します。(空白を含む Windows® パスを指定している場合、文字列を二重引用符で囲んでください)。matlabroot
同じタブで、[ソース ファイル] をクリックし、「
rtwdemo_capi_datalog.c
」と入力します。[追加のソース コード] タブで、[追加コード] をクリックし、次の include ステートメントを入力するか、コピーして貼り付けます。
#include "rtwdemo_capi_datalog.h"
同じタブの [初期化コード] フィールドで、次のアプリケーション コードを入力するか、コピーして貼り付けます。
/* C API Custom Logging Function: Start Signal and State logging via C API. * capi_StartLogging: Function prototype in rtwdemo_capi_datalog.h */ { rtwCAPI_ModelMappingInfo *MMI = &(rtmGetDataMapInfo(rtwdemo_capi_M).mmi); printf("** Started state/signal logging via C API **\n"); capi_StartLogging(MMI, MAX_DATA_POINTS); }
メモ
最上位モデル
rtwdemo_capi
の名前を変更した場合、アプリケーション コード内の名前rtwdemo_capi_M
を更新し、新しいモデル名を反映させます。同じタブの [終了コード] フィールドで、次のアプリケーション コードを入力するか、コピーして貼り付けます。
/* C API Custom Logging Function: Dump Signal and State buffers into a text file. * capi_TerminateLogging: Function prototype in rtwdemo_capi_datalog.h */ { capi_TerminateLogging("rtwdemo_capi_ModelLog.txt"); printf("** Finished state/signal logging. Created rtwdemo_capi_ModelLog.txt **\n"); }
[適用] をクリックします。
MATLAB コマンド ウィンドウで
custcode
と入力し、Simulink Coder Custom Code ライブラリを開きます。rtwdemo_capi
モデルの最上位レベルで System Outputs ブロックを追加します。System Outputs ブロックをダブル クリックして、[System Outputs Function Custom Code] ダイアログ ボックスを開きます。[System Outputs Function 終了コード] フィールドで次のアプリケーション コードを入力するか、コピー アンド ペーストします。
/* C API Custom Logging Function: Update Signal and State logging buffers. * capi_UpdateLogging: Function prototype in rtwdemo_capi_datalog.h */ { rtwCAPI_ModelMappingInfo *MMI = &(rtmGetDataMapInfo(rtwdemo_capi_M).mmi); capi_UpdateLogging(MMI, rtmGetTPtr(rtwdemo_capi_M)); }
最上位モデル
rtwdemo_capi
の名前を変更した場合、アプリケーション コード内の名前rtwdemo_capi_M
の 2 つの箇所を更新し、新しいモデル名を反映させます。[OK] をクリックします。
モデル コンフィギュレーション パラメーター [コード生成のみ] をオフにします。
モデルをビルドし、実行可能ファイルを生成します。たとえば、Windows システムでは、ビルドは実行可能ファイル
rtwdemo_capi.exe
を現在の作業フォルダーに生成します。MATLAB コマンド ウィンドウでコマンド
!rtwdemo_capi
を入力して実行可能ファイルを実行します。実行中、信号と状態は C API を使用して記録され、現在の作業フォルダーのテキスト ファイルrtwdemo_capi_ModelLog.txt
に書き込まれます。>> !rtwdemo_capi ** starting the model ** ** Started state/signal logging via C API ** ** Logging 2 signal(s) and 1 state(s). In this demo, only scalar named signals/states are logged ** ** Finished state/signal logging. Created rtwdemo_capi_ModelLog.txt **
MATLAB エディターまたは他のテキスト エディターのテキスト ファイルを検証します。信号と状態の記録出力のコードの抜粋を次に示します。
******** Signal Log File ******** Number of Signals Logged: 2 Number of points (time steps) logged: 51 Time bot_sig1 (Referenced Model) top_sig1 0 70 4 0.2 70 4 0.4 70 4 0.6 70 4 0.8 70 4 1 70 4 1.2 70 4 1.4 70 4 1.6 70 4 1.8 70 4 2 70 4 ... ******** State Log File ******** Number of States Logged: 1 Number of points (time steps) logged: 51 Time bot_state (Referenced Model) 0 0 0.2 70 0.4 35 0.6 52.5 0.8 43.75 1 48.13 1.2 45.94 1.4 47.03 1.6 46.48 1.8 46.76 2 46.62 ...