Этот пример поможет начать писать код приложения для взаимодействия с модельными сигналами и состояниями. Чтобы начать писать код приложения для взаимодействия с параметрами модели, см. раздел Использование C API для доступа к параметрам модели.
C API обеспечивает гибкость написания собственного кода приложения для взаимодействия с модельными сигналами, состояниями, входами/выходами корневого уровня и параметрами. Код приложения на основе целевого приложения компилируется с кодом, созданным Simulink ® Coder™, в исполняемый файл. Целевой код приложения обращается к массивам структуры C API в (или model_capi.c.cpp). Возможно, имеется код на основе хоста, взаимодействующий с кодом приложения на основе целевого объекта. Кроме того, можно использовать другой код на основе целевого объекта, который взаимодействует с кодом приложения на основе целевого объекта. Файлы rtw_modelmap.h и rtw_capi.h, расположен в (open), предоставьте макросы для доступа к структурам в этих массивах и их членам.matlabroot/rtw/c/src
Вот пример приложения, которое регистрирует глобальные сигналы и состояния в модели в текстовом файле. Этот код предназначен в качестве отправной точки для доступа к адресам сигналов и состояний. Код можно расширить для выполнения регистрации и мониторинга сигналов, регистрации и мониторинга состояния или и того, и другого.
В этом примере используются следующие интерфейсы макросов и функций:
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 для регистрации глобальных сигналов и состояний в модели в текстовом файле.
В командной строке MATLAB ® введитеrtwdemo_capi для открытия примерной модели.
Сохранить верхнюю модель rtwdemo_capi и ссылочная модель rtwdemo_capi_bot в ту же записываемую рабочую папку.
Откройте диалоговое окно «Параметры конфигурации».
Если вы имеете лицензию на ПО Embedded Coder ® и хотите использовать ert.tlc системный целевой файл вместо файла по умолчанию grt.tlcизмените настройку параметра конфигурации модели System target file. Убедитесь, что вы также выбрали ert.tlc для ссылочной модели rtwdemo_capi_bot.
Для модели верхнего уровня подтвердите следующие настройки параметров конфигурации модели:
Выберите параметры Generate C API для сигналов, Generate C API для состояний и Generate C API для параметров.
При использовании ert.tlc системный целевой файл, выберите Поддержка комплексных номеров
Выберите ведение журнала MAT-файла.
Нажмите кнопку «Применить».
Обновить настройки параметров конфигурации в ссылочной модели, rtwdemo_capi_bot, чтобы соответствовать изменениям, сделанным в верхней модели.
Панель Пользовательский код (Custom Code) используется для встраивания пользовательского кода приложения в созданный код. Выберите панель Пользовательский код и щелкните Включить каталоги. Отображается поле Include directories input.
В поле Включить каталоги введите , где matlabroot/toolbox/rtw/rtwdemos представляет корень папки установки MATLAB. (Если указан путь Windows ®, содержащий пробел, поместите текст в двойные кавычки.)matlabroot
В подпанели «Дополнительная информация о построении» щелкните Исходные файлы и введите rtwdemo_capi_datalog.c.

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