Чтобы сгенерировать код С++, который поддерживает коммуникацию на основе сообщений между компонентами модели в окружение Simulink, используйте блоки Send и Receive Simulink Messages & Events Library. Чтобы настроить коммуникацию, используйте блок Queue (из той же библиотеки), чтобы задать параметры для емкости, политики сортировки (LIFO, FIFO и приоритет) и политики перезаписи (поведение, когда очередь превышает емкость). Можно сгенерировать код С++ для системных целевых файлов на основе GRT при помощи Simulink Coder или для системных целевых файлов на основе ERT при помощи Embedded Coder.
Сообщения являются эффективным методом связи для распределенных и сложных систем, которые могут быть смоделированы в Simulink. Чтобы лучше изучить поддержку сгенерированного кода для коммуникации на основе сообщений, поясняются следующие:
Как подготовить модели в Simulink для коммуникации на основе сообщений.
Как компоненты модели передают сообщения и как код реализует это поведение.
Как сгенерировать и изучить код С++ из заданной модели примера.
В Simulink можно смоделировать коммуникацию на основе сообщений между компонентами модели с помощью следующих шагов:
Создайте модель, которая содержит блок Send (ссылочная модель).
Создайте модель, которая содержит блок Receive (ссылочная модель).
Создайте модель с двумя блоками Model (верхняя модель).
Установите первый блок Model в модель, которая содержит блок Send (модель с шага 1).
Установите второй блок Model в модель, которая содержит блок Receive (модель с шага 2).
Когда вы запускаете модель, очередь автоматически генерируется в верхней модели над линией сообщения. Очередь, явная или неявная, управляет сообщением. Можно использовать автоматически сгенерированную очередь или можно добавить блок Queue в верхнюю часть, чтобы явным образом задать параметры связи.
Концептуально ссылка моделей передавать сообщения следующим образом:
В модели, которая содержит блок Send, блок Send преобразует сигналы в сообщения.
Верхняя модель, которая содержит очередь, управляет сообщениями в соответствии с параметрами, которые определяют емкость, порядок доставки и другие метрики качества обслуживания (QoS).
В модели, которая содержит блок Receive, блок Receive преобразует сообщения назад в сигналы.
В сгенерированном коде С++ верхняя часть облегчает соединение между моделями, на которые ссылаются отправка и прием, путем установления интерфейса набора, к которому модели-ссылки могут обращаться независимо друг от друга.
Сгенерированный код С++ реализует поведение сообщений следующим образом:
На каждом контуре модели создается служба. Сервис содержит ссылку на модель верхней части и функцию точки входа, называемую служебной функцией, для использования ссылочными моделями для передачи сообщений с верхней частью моделью.
Верхняя модель инициализирует каждую службу, чтобы создать соединение с каждой ссылочной моделью.
Ссылочные модели вызывают сервисные функции, чтобы передать сообщения с верхней частью моделью.
Детали реализации этих шагов показаны в сгенерированный код примере.
Этот пример генерирует и исследует код С++ из модели, представленной в Установлении Интерфейсов Отправки и Приема Сообщений Между Программными Компонентами.
Сгенерируйте код С++:
Откройте модель.
В галерее Apps нажмите Embedded Coder.
Для каждой модели (верхняя часть и обе модели-ссылки) в диалоговом окне Параметров конфигурации установите эти параметры:
На панели «Генерация кода» задайте Language C++
.
На панели «Интерфейс» задайте Code interface packaging C++ class
.
Сохраните модель.
Сгенерируйте код. На вкладке C++ Code нажмите Build.
Просмотрите сгенерированный код. На вкладке C++ Code нажмите View Code.
Исследуйте код С++:
На каждом контуре модели создается служба. В C++ службы представлены как объекты, которые содержат образец верхней модели и сервисную функцию, которая ссылается на модели, вызывают передачу сообщений.
Чтобы просмотреть создание сервисов, откройте файл верхней модели C++, MessageSendReceiveDefaultBufferModel.cpp
. Просмотрите метод конструктора.
Методы конструктора, ReceiveComponentRecvData(*this)
и SendComponentSendData(*this)
создайте объекты receive и send service соответственно путем взятия в качестве аргумента ссылки на образец верхней модели. Каждый объект сервиса сохраняет ссылку на верхнюю часть и определяет интерфейс сообщений (функции сервиса RecvData
и SendData
).
Чтобы просмотреть классы услуг приема и отправки, откройте файл заголовка верхней модели, MessageSendReceiveDefaultBufferModel.h
, и просмотрите следующий раздел.
Верхняя модель инициализирует каждую службу, чтобы создать соединение с каждой ссылочной моделью. Чтобы просмотреть инициализацию, откройте файл верхней модели C++, MessageSendReceiveDefaultBufferModel.cpp
. Просмотрите метод конструктора.
Метод конструктора, Receive_ComponentMDLOBJ0(get_ReceiveComponentRecvData())
, передает ссылку на службу приема в модель, на которую ссылается прием. Метод конструктора, Send_ComponentMDLOBJ1(get_SendComponentSendData())
, передает ссылку на службу отправки в модель отправки ссылок.
Ссылочные модели вызывают сервисные функции, чтобы передать сообщения с верхней частью моделью. В C++ модели-ссылки активируют службу верхних моделей (общий предок, если в иерархии), чтобы отправлять или получать сообщения (в частности, модель-ссылка вызывает метод абстрактного обслуживания (RecvData
или SendData
) из интерфейса, созданного на шаге 2) .Абстрактные классы интерфейсов излучаются в общую папку. Реализация сервисных функций в каждом сервисе определяется в файле верхняя часть модели.
Чтобы просмотреть класс абстрактного интерфейса для отправки сообщений, откройте из общей папки файл заголовка, SendData_real_T.h
.
Чтобы просмотреть реализацию сервисной функции для отправки сообщений, откройте файл верхней модели C++, MessageSendReceiveDefaultBufferModel.cpp
.
Чтобы просмотреть, как модель отправки ссылки вызывает функцию сервиса, откройте его файл C++, mSend.cpp
. В функции step модель вызывает функцию service для отправки сообщений в верхнюю модель и получает назад статус возврат.
Чтобы просмотреть класс абстрактного интерфейса для приема сообщений, откройте из общей папки файл заголовка, RecvData_real_T.h
.
Чтобы просмотреть реализацию сервисной функции для приема сообщений, откройте файл верхней модели C++, MessageSendReceiveDefaultBufferModel.cpp
.
Чтобы просмотреть, как модель receive referenced вызывает функцию сервиса, откройте его файл C++, mRecieve.cpp
. В функции step модель вызывает функцию service для приема сообщений и статуса от верхней модели.
Поддержка кода С++ доступна для системных целевых файлов на основе GRT при помощи приложения Simulink Coder.
Поддержка кода С++ доступна для целевых файлов системы на основе ERT при помощи приложения Embedded Coder.
Чтобы сгенерировать код, модели верхнего уровня и модели-ссылки должны иметь один и тот же язык (C++) и выбранный системный целевой файл.
Управление прототипом функции (FPC) не может быть сконфигурировано для верхней модели, которая имеет корневые порты сообщений.
Внешние модели и модели вариантов не поддерживаются.
В симуляции SIL/PIL не поддерживаются.