Этот пример помогает вам начать запись кода приложения для взаимодействия с сигналами модели и состояниями. Чтобы начать запись кода приложения для взаимодействия с параметрами модели, смотрите Использование 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
завершает логгирование сигнала и состояния и записывает записанные значения в текстовый файл.
Можно интегрировать эти пользовательские функции в сгенерированный код для модели с помощью следующих методов:
Custom Code диалогового окна Параметры конфигурации модели (Model Configuration Parameters).
Настраиваемые библиотечные блоки кода
Функции пользовательского кода TLC
Это руководство использует панель Custom Code диалогового окна Model Параметры Конфигурации и блок System Outputs из библиотеки Custom Code, чтобы вставить вызовы пользовательских функций в
(или 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
, измените настройку параметра конфигурации <reservedrangesplaceholder1> модели. Убедитесь, что вы также выбрали ert.tlc
для ссылок на модель rtwdemo_capi_bot
.
Для верхней модели подтвердите эти настройки параметра конфигурации модели:
Выберите параметры Generate C API for signals, Generate C API for states и Generate C API for parameters.
Если вы используете ert.tlc
системный целевой файл, выберите Support complex numbers
Выберите MAT-file logging.
Нажмите Apply.
Обновите настройки параметров конфигурации в ссылочной модели, rtwdemo_capi_bot
, для соответствия изменениям, сделанным в верхней модели.
Используйте панель Custom Code, чтобы встраивать пользовательский код приложения в сгенерированный код. Выберите панель Custom Code и нажмите Include directories. Отображается Include directories входное поле.
В поле Include directories введите
, где matlabroot
/ toolbox/rtw/rtwdemos
представляет корень установочной папки MATLAB. (Если вы задаете Windows® путь, содержащий пространство, поместите текст в двойные кавычки.)matlabroot
В подпанели Additional Build Information щелкните Source files и введите rtwdemo_capi_datalog.c
.
В подпанели Include custom C code in generated щелкните Source file, введите или скопируйте и вставьте следующий оператора include:
#include "rtwdemo_capi_datalog.h"
В поле 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
в коде приложения, чтобы отразить новое имя модели.
В поле 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.
В Командном Окне MATLAB введите custcode
чтобы открыть библиотеку пользовательского кода Simulink Coder. На верхнем уровне rtwdemo_capi
модель, добавить блок System Outputs.
Дважды кликните блок 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.
Очистите Generate code only параметра конфигурации модели.
Создайте модель и сгенерируйте исполняемую программу. Например, в системе 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 ...