Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

C API を使用したモデルの信号と状態へのアクセス

この例は、モデルの信号や状態と相互作用するアプリケーション コードを書き始めるために役立ちます。モデルのパラメーターと相互作用するアプリケーション コードを書き始めるには、C API を使用したモデル パラメーターへのアクセスを参照してください。

C API を使用すると、モデルの信号、状態、ルートレベル入力/出力、およびパラメーターと対話する独自のアプリケーション コードを柔軟に作成できます。ターゲット ベースのアプリケーション コードは Simulink® Coder™ 生成コードを使用して実行可能プログラムにコンパイルされます。ターゲット ベースのアプリケーション コードは model_capi.c (または .cpp) で C API 構造体配列にアクセスします。ターゲット ベースのアプリケーション コードと対話するホスト ベースのコードがあるとします。または、ターゲット ベースのアプリケーション コードと対話するその他のターゲット ベースのコードがあるとします。matlabroot/rtw/c/src (開く) に配置されているファイル rtw_modelmap.h および rtw_capi.h はこれらの配列とメンバーの構造体にアクセスするためのマクロを提供します。

モデルのグローバル信号と状態をテキスト ファイルにログ記録するアプリケーションの例を次に示します。信号と状態のアドレスにアクセスする開始点として次のコードを示します。コードを拡張して信号の記録と監視、状態の記録と監視、またはその両方を実行できます。

この例では、次のマクロと関数インターフェイスを使用します。

  • rtmGetDataMapInfo マクロ

    リアルタイム モデル構造体の MMI (モデル マッピング情報) サブ構造体にアクセスします。次のマクロ呼び出しで、rtMmodel.c (または .cpp) でリアルタイム モデル構造体へのポインターです。

    rtwCAPI_ModelMappingInfo* mmi = &(rtmGetDataMapInfo(rtM).mmi);
  • rtmGetTPtr マクロ

    リアルタイム モデル構造体のタイミング サブ構造体から基本レートの絶対時間情報にアクセスします。次のマクロ呼び出しで、rtMmodel.c (または .cpp) でリアルタイム モデル構造体へのポインターです。

    rtmGetTPtr(rtM)
  • ファイル CAPIModel_datalog.h および CAPIModel_datalog.c 経由で提供されたカスタム関数 capi_StartLoggingcapi_UpdateLogging、および capi_TerminateLogging

    openExample('simulinkcoder/GnrtCAPIDataDefFileForExchngngDataWithTargSysExample')

    • capi_StartLogging は信号と状態の記録を初期化します。

    • capi_UpdateLogging は各タイム ステップで信号と状態の値を記録します。

    • capi_TerminateLogging は信号と状態の記録を終了し、記録値をテキスト ファイルに書き込みます。

    次の方法を使用して、これらのカスタム関数をモデルの生成コードに統合できます。

    • [モデル コンフィギュレーション パラメーター] ダイアログ ボックスの [カスタム コード]

    • Custom Code ライブラリ ブロック

    • TLC カスタム コード機能

    このチュートリアルでは、次に示すように、[モデル コンフィギュレーション パラメーター] ダイアログ ボックスの [カスタム コード] ペインと Custom Code ライブラリの System Outputs ブロックを使用して、model.c (または .cpp) にカスタム関数への呼び出しを挿入します。

    • capi_StartLogging は関数 model_initialize で呼び出されます。

    • capi_UpdateLogging は関数 model_step で呼び出されます。

    • capi_TerminateLogging は関数 model_terminate で呼び出されます。

model.c (実行順序を反映して再配置されている) から生成された次のコードの抜粋は、関数インターフェイスの使用方法を示しています。

void CAPIModel_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 CAPIModel_datalog.h
   */
  {
    rtwCAPI_ModelMappingInfo *MMI = &(rtmGetDataMapInfo(CAPIModel_M).mmi);
    printf("** Started state/signal logging via C API **\n");
    capi_StartLogging(MMI, MAX_DATA_POINTS);
  }
...
}
...
/* Model step function */
void CAPIModel_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 CAPIModel_datalog.h
   */
  {
    rtwCAPI_ModelMappingInfo *MMI = &(rtmGetDataMapInfo(CAPIModel_M).mmi);
    capi_UpdateLogging(MMI, rtmGetTPtr(CAPIModel_M));
  }
...
}
...
/* Model terminate function */
void CAPIModel_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 CAPIModel_datalog.h
   */
  {
    capi_TerminateLogging("CAPIModel_ModelLog.txt");
    printf("** Finished state/signal logging. Created CAPIModel_ModelLog.txt **\n");
  }
}

次の手順は、C API マクロと関数インターフェイスを使用してモデルのグローバル信号と状態をテキスト ファイルに記録する方法を示しています。

  1. MATLAB® コマンド ラインで「openExample('CAPIModel')」と入力します。

  2. [コンフィギュレーション パラメーター] ダイアログ ボックスを開きます。

  3. Embedded Coder® ソフトウェアのライセンスがあり、既定の grt.tlc ではなくシステム ターゲット ファイル ert.tlc を使用する場合は、モデル コンフィギュレーション パラメーター [システム ターゲット ファイル] の設定を変更します。参照モデル CAPIModelRefert.tlc も選択するようにしてください。

  4. 最上位モデルについて、以下のモデル コンフィギュレーション パラメーターの設定を確認します。

    1. パラメーター [信号用 C API の生成][状態用 C API の生成]、および [パラメーター用 C API の生成] をオンにします。

    2. システム ターゲット ファイル ert.tlc を使用している場合は、[サポート: 複素数] を選択します。

    3. [MAT ファイルのログ] を選択します。

    4. [適用] をクリックします。

    5. 最上位モデルで行った変更と一致するように、参照モデル CAPIModelRef のコンフィギュレーション パラメーター設定を更新します。

  5. [カスタム コード] ペインを使用して、生成されたコードにカスタム アプリケーション コードを組み込みます。[カスタム コード] ペインを選択します。[コード情報] タブで、[インクルード ディレクトリ] をクリックします。[インクルード ディレクトリ] 入力フィールドが表示されます。

  6. 同じタブで、[ソース ファイル] をクリックし、「CAPIModel_datalog.c」と入力します。

  7. [追加のソース コード] タブで、[追加コード] をクリックし、次の include ステートメントを入力するか、コピーして貼り付けます。

    #include "CAPIModel_datalog.h"
  8. 同じタブの [初期化コード] フィールドで、次のアプリケーション コードを入力するか、コピーして貼り付けます。

      /* C API Custom Logging Function: Start Signal and State logging via C API.
       * capi_StartLogging: Function prototype in CAPIModel_datalog.h
       */
      {
        rtwCAPI_ModelMappingInfo *MMI = &(rtmGetDataMapInfo(CAPIModel_M).mmi);
        printf("** Started state/signal logging via C API **\n");
        capi_StartLogging(MMI, MAX_DATA_POINTS);
      }

    メモ

    最上位モデル CAPIModel の名前を変更した場合、アプリケーション コード内の名前 CAPIModel_M を更新し、新しいモデル名を反映させます。

  9. 同じタブの [終了コード] フィールドで、次のアプリケーション コードを入力するか、コピーして貼り付けます。

      /* C API Custom Logging Function: Dump Signal and State buffers into a text file.
       * capi_TerminateLogging: Function prototype in CAPIModel_datalog.h
       */
      {
        capi_TerminateLogging("CAPIModel_ModelLog.txt");
        printf("** Finished state/signal logging. Created CAPIModel_ModelLog.txt **\n");
      }

    [適用] をクリックします。

  10. MATLAB コマンド ウィンドウで custcode と入力し、Simulink Coder Custom Code ライブラリを開きます。CAPIModel モデルの最上位レベルで System Outputs ブロックを追加します。

  11. 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 CAPIModel_datalog.h
       */
      {
        rtwCAPI_ModelMappingInfo *MMI = &(rtmGetDataMapInfo(CAPIModel_M).mmi);
        capi_UpdateLogging(MMI, rtmGetTPtr(CAPIModel_M));
      }

    最上位モデル CAPIModel の名前を変更した場合、アプリケーション コード内の名前 CAPIModel_M の 2 つの箇所を更新し、新しいモデル名を反映させます。

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

  12. モデル コンフィギュレーション パラメーター [コード生成のみ] をオフにします。

    モデルをビルドし、実行可能ファイルを生成します。たとえば、Windows® システムでは、ビルドは実行可能ファイル CAPIModel.exe を現在の作業フォルダーに生成します。

  13. MATLAB コマンド ウィンドウで、コマンド「!CAPIModel」を入力して実行可能ファイルを実行します。実行中、信号と状態は C API を使用して記録され、現在の作業フォルダーのテキスト ファイル CAPIModel_ModelLog.txt に書き込まれます。

    >> !CAPIModel
    
    ** 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 CAPIModel_ModelLog.txt **
  14. 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
    ...

関連するトピック