Используйте API C для доступа к сигналам модели и состояниям

Этот пример помогает вам начать писать код приложения, чтобы взаимодействовать с сигналами модели и состояниями. Чтобы начать писать код приложения, чтобы взаимодействовать с параметрами модели, смотрите Использование C API к доступу к Параметрам модели.

API C предоставляет вам гибкость записи вашего собственного кода приложения, чтобы взаимодействовать с сигналами модели, состояниями, входными параметрами/выходными параметрами корневого уровня и параметрами. Ваш основанный на цели код приложения скомпилирован со сгенерированным кодом Simulink® Coder™ в исполняемый файл. Основанный на цели код приложения получает доступ к массивам структур API C в model_capi.c (или .cpp). У вас может быть основанный на хосте код, который взаимодействует с вашим основанным на цели кодом приложения. Или, у вас может быть другой основанный на цели код, который взаимодействует с вашим основанным на цели кодом приложения. Файлы rtw_modelmap.h и rtw_capi.h, расположенный в matlabroot/rtw/c/src (открытый), обеспечьте макросы для доступа к структурам в этих массивах и их членах.

Вот пример приложения, который регистрирует глобальные сигналы и состояния в модели к текстовому файлу. Этот код предназначается как начальная точка для доступа к сигналу и адресам состояния. Можно расширить код, чтобы выполнить логгирование сигнала и контроль, логгирование состояния и контроль или обоих.

Этот пример использует следующий макрос и функциональные интерфейсы:

  • rtmGetDataMapInfo макрос

    Доступы к подструктуре модели, сопоставляющей информацию (MMI) структуры модели реального времени. В следующем макро-вызове, rtM указатель на структуру модели реального времени в modelC (или .cpp):

    rtwCAPI_ModelMappingInfo* mmi = &(rtmGetDataMapInfo(rtM).mmi);
  • rtmGetTPtr макрос

    Доступы к абсолютной информации времени для базовой ставки от подструктуры синхронизации структуры модели реального времени. В следующем макро-вызове, rtM указатель на структуру модели реального времени в modelC (или .cpp):

    rtmGetTPtr(rtM)
  • Пользовательские функции capi_StartLogging, capi_UpdateLogging, и capi_TerminateLogging, если через файлы rtwdemo_capi_datalog.h и rtwdemo_capi_datalog.c. Эти файлы расположены в matlabroot/toolbox/rtw/rtwdemos открытый.

    • capi_StartLogging инициализирует сигнал и логгирование состояния.

    • capi_UpdateLogging регистрирует значение состояния и сигнала на каждом временном шаге.

    • capi_TerminateLogging отключает сигнал и логгирование состояния и пишет регистрируемые значения в текстовый файл.

    Можно интегрировать эти пользовательские функции в сгенерированный код для модели при помощи этих методов:

    • Custom Code диалогового окна Model Configuration Parameters.

    • Библиотечные блоки Пользовательского кода

    • Функции пользовательского кода TLC

    Этот пример использует панель Custom Code диалогового окна Model Configuration Parameters и блока System Outputs из библиотеки Custom Code, чтобы вставить вызовы пользовательских функций в modelC (или .cpp), можно следующим образом:

    • capi_StartLogging называется в model_initialize функция.

    • capi_UpdateLogging называется в modelшаг функция.

    • capi_TerminateLogging называется в model_terminate функция.

Следующие выборки сгенерированного кода от modelC (перестроенный, чтобы отразить их порядок выполнения), показывают, как функциональные интерфейсы используются.

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");
  }
}

Следующая процедура иллюстрирует, как можно использовать макрос API C и функционировать интерфейсы, чтобы регистрировать глобальные сигналы и состояния в модели к текстовому файлу.

  1. В командной строке MATLAB® введите rtwdemo_capi открыть модель в качестве примера.

  2. Сохраните топ-модель rtwdemo_capi и модель rtwdemo_capi_bot, на которую ссылаются, к той же перезаписываемой папке работы.

  3. Откройте диалоговое окно Configuration Parameters.

  4. Если вам лицензируют для программного обеспечения Embedded Coder®, и вы хотите использовать ert.tlc системный конечный файл вместо grt.tlc по умолчанию, измените настройки параметра конфигурации модели System target file. Убедитесь, что вы также выбираете ert.tlc для модели rtwdemo_capi_bot, на которую ссылаются,.

  5. Для топ-модели подтвердите эти настройки параметра конфигурации модели:

    1. Выберите параметры Generate C API for signals, Generate C API for states и Generate C API for parameters.

    2. Если вы используете ert.tlc системный конечный файл, выберите Support complex numbers

    3. Выберите MAT-file logging.

    4. Нажмите Apply.

    5. Обновите настройки параметра конфигурации в модели, на которую ссылаются, rtwdemo_capi_bot, чтобы совпадать с изменениями, вы сделали в топ-модели.

  6. Используйте панель Custom Code, чтобы встроить ваш код пользовательского приложения в сгенерированный код. Выберите панель Custom Code, и затем нажмите Include directories. Поле ввода Include directories отображено.

  7. В поле Include directories введите matlabroot/toolbox/rtw/rtwdemos, где matlabroot представляет корень вашей папки установки MATLAB. (Если вы задаете путь Windows®, который содержит пробел, поместите текст в двойных кавычках.)

  8. В подпанели Additional Build Information нажмите Source files и введите rtwdemo_capi_datalog.c.

  9. В подпанели Include custom C code in generated нажмите Source file и тип или скопируйте и вставьте следующее, включают оператор:

    #include "rtwdemo_capi_datalog.h"
  10. В поле Initialize function введите или скопируйте и вставьте следующий код приложения:

      /* 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 в коде приложения, чтобы отразить новое имя модели.

  11. В поле Terminate function введите или скопируйте и вставьте следующий код приложения:

      /* 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");
      }

    Нажмите Apply.

  12. В командном окне MATLAB введите custcode открыть библиотеку Simulink Coder Custom Code. В верхнем уровне rtwdemo_capi модель, добавляет блок System Outputs.

  13. Дважды кликните блок System Outputs, чтобы открыть диалоговое окно System Outputs Function Custom Code. В поле System Outputs Function Exit Code введите или скопируйте и вставьте следующий код приложения:

      /* 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 в коде приложения, чтобы отразить новое имя модели.

    Нажмите OK.

  14. Параметр конфигурации модели Clear Generate code only.

    Создайте модель и сгенерируйте исполняемую программу. Например, в системе Windows, сборка генерирует исполняемый файл rtwdemo_capi.exe в вашей текущей рабочей папке.

  15. В командном окне MATLAB введите команду !rtwdemo_capi запускать исполняемый файл. Во время выполнения сигналы и состояния регистрируются с помощью API C и затем пишутся в текстовый файл 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 **
  16. Исследуйте текстовый файл в редакторе 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
    ...

Похожие темы