Чтобы сгенерировать Код С++, который поддерживает основанную на сообщении связь между топ-моделями Simulink и внешними приложениями, используйте Библиотеку сообщений & Событий Simulink Send и блоки Receive.
Генерация кода от топ-модели, чтобы упростить передачу сообщений за пределами окружения Simulink позволяет вашему смоделированному приложению связываться в распределенной системе, которая использует внешний сервис протокола сообщения (например, DDS, ROS, SOMEIP или сообщения POSIX).
Топ-модели Simulink передают сообщения следующим образом:
Топ-модели содержат блоки сообщения, чтобы связаться вне окружения Simulink. Если топ-модель содержит блок Send, непосредственно соединенный с корневым блоком выходного порта, блок преобразует свои сигналы в сообщения и передает их вне окружения Simulink. Если топ-модель содержит блок Receive, непосредственно соединенный с корневым блоком импорта, блок преобразует полученные сообщения в сигналы.
Внешний протокол сообщения справляется с коммуникацией сообщения согласно своему собственному стандарту (политики, которые управляют способностью, порядком доставки и другим поведением качества сервиса (QoS)).
Чтобы изучить, как интегрировать топ-модель с внешним протоколом сообщения, эта тема покрытия, как подготовить топ-модель, сгенерируйте код и интегрируйте тот код с внешним протоколом.
Чтобы сгенерировать Код С++ от топ-модели, которая может объединяться с внешним протоколом сообщения, готовят топ-модель, использующую эти шаги:
Проверьте, что топ-модель содержит один или несколько блоков сообщения (например, блок Send, соединенный с корневым блоком выходного порта или блоком Receive, соединенным с корневым блоком импорта).
В диалоговом окне Configuration Parameters, установленном эти параметры:
В панели Code Generation, набор System target file к ert.tlc
.
В панели Code Generation, набор language к C++
.
В панели Interface, набор Coder interface packaging к C++ class
.
Выберите generate an example main
флажок.
Концептуальный пример того, как топ-модель, HMI, объединяется с внешним сервисом протокола сообщения, Промежуточное программное обеспечение (например, POSIX), показывают:
В модели HMI порты сообщения соединяются как показано.
Сгенерировать Код С++ от вашей топ-модели:
Откройте свою модель.
В галерее Apps нажмите Embedded Coder.
Сгенерируйте код. На вкладке C++ Code нажмите Build.
Просмотрите сгенерированный код. На вкладке C++ Code нажмите View Code.
Сгенерированный Код С++ предоставляет сервисные классы, чтобы отправить и получить сообщения и демонстрационное основное, которое вы, как ожидают, будете программировать с логикой, чтобы интегрировать сгенерированный Код С++ с вашим целевым внешним сервисом протокола сообщения.
Генерация кода С++ обеспечивает эти файлы:
Сгенерированный сервисный класс, чтобы отправить сообщения, SendData_real_T.h
.
Сгенерированный сервисный класс, чтобы получить сообщения, RecvData_real_T.h
.
Основной файл с сервисными методами класса, которые вы, как ожидают, будете программировать с логикой, чтобы объединяться с вашим внешним сервисом протокола сообщения.
Основной файл задает и затем инстанцирует отправления, и получите сервисные классы. Конструктор топ-модели затем создает экземпляр топ-модели путем передачи в ссылке на каждый сервисный класс.
Пример интеграции кода:
Пример того, как реализовать логику для демонстрационного основного файла, чтобы интегрировать сгенерированный код с сообщениями POSIX, следующий:
void sendData_real_T(const real_T* data, int32_T length, int32_T* status) { //This is an example of a message send service function struct mq_attr attr; attr.mq_maxmsg = 1024; attr.mq_msgsize = length; mqd_t msgQueue = mq_open("/PosixMQ_Example", O_CREAT | O_WRONLY, 0664, NULL); if (msgQueue == -1) { printf("mq_open failed"); exit(1); } printf("Sending %f\n", *data); mq_send(msgQueue, (char*)data, length, 1); mq_close(msgQueue); } class mHMIHandlerSendData_real_T : public SendData_real_T { public: void SendData(const real_T* data, int32_T* length, int32_T* status) { sendData_real_T(data, length, status); } }; static mHMIHandlerSendData_real_T OutMsgSendData_arg; void RecvData_real_T(real_T* data, int32_T length, int32_T* status) { //This is an example of a receive service function mqd_t msgQueue = mq_open("/PosixMQ_Example, O_RDONLY); if (msgQueue == -1) { printf("mq_open failed"); exit(1); } struct mq_attr attr; mq_getattr(msgQueue, &attr); *status = mq_receive(msgQueue, (char *)data, attr.mq_msgsize, &priority); printf("Received %f", *data); mq_close(msgQueue); } class mHMIHandlerRecvData_real_T: public RecvData_real_T { public: { RecvData_real_T(data, length, status); } }; static mHMIHandlerRecvData_real_T InMsgRecvData_arg;
Поддержка генерации кода интеграции топ-модели с внешними протоколами сообщения доступна на C++.
Параметр Generate a sample main должен быть выбран, приложения, которые требуют статического основного, не поддержан.
Управление прототипом функции (FPC) не может быть сконфигурировано для топ-модели, которая имеет корневые порты сообщения.