Этот пример помогает вам начать писать код приложения, чтобы взаимодействовать с образцовыми сигналами и состояниями. Чтобы начать писать код приложения, чтобы взаимодействовать с параметрами модели, смотрите Использование 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
является указателем на структуру модели реального времени в
(или 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
отключает сигнал и журналирование состояния и пишет регистрируемые значения в текстовый файл.
Можно интегрировать эти пользовательские функции в сгенерированный типовой кодекс с помощью одного или нескольких следующих методов:
Code Generation> панель Custom Code диалогового окна Configuration Parameters
Блоки библиотеки Custom Code
Функции пользовательского кода TLC
Этот пример использует Code Generation> панель Custom Code и блок 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");
}
}
Следующая процедура иллюстрирует, как можно использовать макрос API C и функционировать интерфейсы, чтобы регистрировать глобальные сигналы и состояния в модели к текстовому файлу.
В командной строке MATLAB® введите
rtwdemo_capi
, чтобы открыть модель в качестве примера.
Сохраните топ-модель
rtwdemo_capi
и модель rtwdemo_capi_bot
, на которую ссылаются, к той же перезаписываемой папке работы.
Откройте диалоговое окно Configuration Parameters.
Если вам лицензируют для программного обеспечения Embedded Coder®, и вы хотите использовать системный конечный файл
ert.tlc
вместо grt.tlc
по умолчанию, перейдите к Code Generation, разделяют на области и используют параметр System target file, чтобы выбрать системную целевую мозаику ert.tlc
. Убедитесь, что вы также выбираете ert.tlc
для модели rtwdemo_capi_bot
, на которую ссылаются.
В топ-модели перейдите к Code Generation> панель Interface. Подтвердите эти образцовые настройки параметра конфигурации:
Выберите 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 "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 Custom Code. В верхнем уровне модели 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.
На панели Code Generation проверьте, что флажок Generate code only снимается.
Создайте модель и сгенерируйте исполняемую программу. Например, в системе Windows, сборка генерирует исполняемый файл
rtwdemo_capi.exe
в вашей текущей рабочей папке.
В Окне Команды 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 **
Исследуйте текстовый файл в редакторе 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
...
Похожие темы
- Как сгенерированный код обменивается данными со средой (Simulink Coder)
- Как сгенерированный код хранит внутренний сигнал, состояние и данные о параметре (Simulink Coder)