exponenta event banner

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

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

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

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

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

  • rtmGetDataMapInfo макрос

    Доступ к подструктуре данных отображения модели (MMI) структуры модели в реальном времени. В следующем вызове макроса: rtM является указателем на структуру модели в реальном времени в model.c (или .cpp):

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

    Доступ к информации абсолютного времени для базовой скорости из подструктуры синхронизации структуры модели в реальном времени. В следующем вызове макроса: rtM является указателем на структуру модели в реальном времени в model.c (или .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 завершает регистрацию сигнала и состояния и записывает записанные значения в текстовый файл.

    Эти пользовательские функции можно интегрировать в созданный код модели с помощью следующих методов.

    • Пользовательский код диалогового окна Параметры конфигурации модели (Model Configuration Parameters).

    • Блоки библиотеки пользовательского кода

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

    В этом учебном пособии используется панель Пользовательский код (Custom Code) диалогового окна Параметры конфигурации модели (Model Configuration Parameters) и блок Системные выходы (System Outputs) из библиотеки Пользовательский код (Custom Code library) для вставки вызовов пользовательских функций в model.c (или .cpp), следующим образом:

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

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

    • capi_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 для регистрации глобальных сигналов и состояний в модели в текстовом файле.

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

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

  3. Откройте диалоговое окно «Параметры конфигурации».

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

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

    1. Выберите параметры Generate C API для сигналов, Generate C API для состояний и Generate C API для параметров.

    2. При использовании ert.tlc системный целевой файл, выберите Поддержка комплексных номеров

    3. Выберите ведение журнала MAT-файла.

    4. Нажмите кнопку «Применить».

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

  6. Панель Пользовательский код (Custom Code) используется для встраивания пользовательского кода приложения в созданный код. Выберите панель Пользовательский код и щелкните Включить каталоги. Отображается поле Include directories input.

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

  8. В подпанели «Дополнительная информация о построении» щелкните Исходные файлы и введите rtwdemo_capi_datalog.c.

  9. В разделе Включить пользовательский код C в созданную вложенную область щелкните Исходный файл и введите или скопируйте и вставьте следующую инструкцию include:

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

      /* 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. В поле Завершить функцию введите или скопируйте и вставьте следующий код приложения:

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

    Нажмите кнопку «Применить».

  12. В окне команд MATLAB введите custcode для открытия библиотеки пользовательского кода кодера Simulink. На верхнем уровне rtwdemo_capi добавьте блок системных выходов.

  13. Дважды щелкните блок «Системные выходы», чтобы открыть диалоговое окно «Пользовательский код функции системных выходов». В поле 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 в коде приложения, чтобы отразить имя новой модели.

    Нажмите кнопку ОК.

  14. Очистить параметр конфигурации модели Только генерировать код.

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

  15. В окне команды 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 **
  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
    ...

Связанные темы