Чтобы создать код C++, поддерживающий обмен сообщениями между компонентами модели в среде Simulink, используйте блоки библиотеки сообщений и событий Simulink Send and Receive. Чтобы настроить связь, используйте блок Queue (из той же библиотеки) для установки параметров емкости, политики сортировки (LIFO, FIFO и приоритет) и политики перезаписи (поведение, когда очередь превышает емкость). Можно создать код C++ для целевых системных файлов на основе GRT с помощью Simulink Coder или для целевых системных файлов на основе ERT с помощью Embedded Coder.
Сообщения являются эффективным способом связи для распределенных и сложных систем, которые могут быть смоделированы в Simulink. Чтобы лучше понять сгенерированную поддержку кода для связи на основе сообщений, объясняется следующее:
Подготовка моделей в Simulink для обмена сообщениями.
Как компоненты модели передают сообщения и как код реализует это поведение.
Создание и проверка кода C++ из данной модели.
В Simulink можно моделировать обмен сообщениями между компонентами модели с помощью следующих шагов.
Создайте модель, содержащую блок отправки (ссылочная модель).
Создайте модель, содержащую блок получения (ссылочная модель).
Создайте модель с двумя блоками модели (верхняя модель).
Установите первый блок Model в модель, содержащую блок Send (модель с шага 1).
Установите второй блок Model в модель, содержащую блок Receive (модель из шага 2).
При запуске модели очередь автоматически создается в верхней модели над строкой сообщения. Явная или неявная очередь управляет передачей сообщений. Можно использовать автоматически созданную очередь или добавить блок «Очередь» в верхней модели для явного указания параметров связи.
Концептуально ссылочные модели передают сообщения следующим образом:
В модели, содержащей блок Send, блок Send преобразует сигналы в сообщения.
Верхняя модель, содержащая очередь, управляет сообщениями в соответствии с параметрами, определяющими емкость, порядок доставки и другие показатели качества обслуживания (QoS).
В модели, которая содержит блок приема, блок приема преобразует сообщения обратно в сигналы.
В сгенерированном коде C++ верхняя модель облегчает соединение между ссылочными моделями отправки и приема путем установления интерфейса набора, к которому ссылочные модели могут обращаться независимо друг от друга.
Сгенерированный код C++ реализует поведение сообщения следующим образом:
Служба создается на каждой границе модели. Служба содержит ссылку на верхнюю модель и функцию точки входа, называемую сервисной функцией, для ссылочных моделей, используемых для передачи сообщений с верхней моделью.
Верхняя модель инициализирует каждую службу для создания соединения с каждой ссылочной моделью.
Ссылочные модели вызывают сервисные функции для передачи сообщений с моделью верхнего уровня.
Подробная информация о реализации этих шагов показана в примере созданного кода.
В этом примере создается и проверяется код C++ из модели, представленной в разделе Установление интерфейсов отправки и получения сообщений между компонентами программного обеспечения.

Создать код C++:
Откройте модель.
В коллекции «Приложения» щелкните Встроенный кодер.
Для каждой модели (верхней и обеих ссылочных моделей) в диалоговом окне Параметры конфигурации (Configuration Parameters) задайте следующие параметры:
На панели «Создание кода» установите для параметра «Язык» значение C++.
На панели «Интерфейс» установите для параметра «Упаковка интерфейса кода» значение C++ class.
Сохраните модель.
Создать код. На вкладке Код C++ нажмите кнопку Создать.
Просмотр созданного кода. На вкладке Код C++ щелкните Просмотреть код.
Проверьте код C++:
Служба создается на каждой границе модели. В 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). Классы абстрактного интерфейса передаются в общую папку. Реализация сервисных функций в каждом сервисе определена в файле модели верхнего уровня C++.
Чтобы просмотреть класс абстрактного интерфейса для отправки сообщений, откройте из общей папки файл заголовка, SendData_real_T.h.

Для просмотра реализации сервисной функции отправки сообщений откройте файл модели верхнего уровня C++, MessageSendReceiveDefaultBufferModel.cpp.

Чтобы просмотреть способ вызова сервисной функции моделью отправки ссылки, откройте ее файл C++, mSend.cpp. В пошаговой функции модель вызывает сервисную функцию для отправки сообщений в верхнюю модель и получает обратно статус возврата.
![]()
Чтобы просмотреть класс абстрактного интерфейса для получения сообщений, откройте из общей папки файл заголовка, RecvData_real_T.h.

Для просмотра реализации сервисной функции для получения сообщений откройте файл модели верхнего уровня C++, MessageSendReceiveDefaultBufferModel.cpp.

Чтобы просмотреть, как модель, на которую ссылается получение, вызывает функцию службы, откройте ее файл C++, mRecieve.cpp. В пошаговой функции модель вызывает сервисную функцию для получения сообщений и статуса от верхней модели.

Поддержка кода C++ доступна для целевых системных файлов на основе GRT с помощью приложения Simulink Coder App.
Поддержка кода C++ доступна для целевых системных файлов на основе ERT с помощью приложения Embedded Coder App.
Для создания кода верхняя и ссылочная модели должны иметь один и тот же язык (C++) и выбранный системный целевой файл.
Управление прототипом функции (FPC) не может быть настроено для модели верхнего уровня, имеющей корневые порты сообщений.
Внешние модели и исполнительные модели не поддерживаются.
При моделировании SIL/PIL не поддерживается.