Сгенерируйте сообщения C++ для связи между компонентами Simulink

Чтобы сгенерировать код С++, который поддерживает коммуникацию на основе сообщений между компонентами модели в окружение Simulink, используйте блоки Send и Receive Simulink Messages & Events Library. Чтобы настроить коммуникацию, используйте блок Queue (из той же библиотеки), чтобы задать параметры для емкости, политики сортировки (LIFO, FIFO и приоритет) и политики перезаписи (поведение, когда очередь превышает емкость). Можно сгенерировать код С++ для системных целевых файлов на основе GRT при помощи Simulink Coder или для системных целевых файлов на основе ERT при помощи Embedded Coder.

Сообщения являются эффективным методом связи для распределенных и сложных систем, которые могут быть смоделированы в Simulink. Чтобы лучше изучить поддержку сгенерированного кода для коммуникации на основе сообщений, поясняются следующие:

  • Как подготовить модели в Simulink для коммуникации на основе сообщений.

  • Как компоненты модели передают сообщения и как код реализует это поведение.

  • Как сгенерировать и изучить код С++ из заданной модели примера.

Как подготовить модели в Simulink для коммуникации на основе сообщений

В Simulink можно смоделировать коммуникацию на основе сообщений между компонентами модели с помощью следующих шагов:

  1. Создайте модель, которая содержит блок Send (ссылочная модель).

  2. Создайте модель, которая содержит блок Receive (ссылочная модель).

  3. Создайте модель с двумя блоками Model (верхняя модель).

    • Установите первый блок Model в модель, которая содержит блок Send (модель с шага 1).

    • Установите второй блок Model в модель, которая содержит блок Receive (модель с шага 2).

  4. Когда вы запускаете модель, очередь автоматически генерируется в верхней модели над линией сообщения. Очередь, явная или неявная, управляет сообщением. Можно использовать автоматически сгенерированную очередь или можно добавить блок Queue в верхнюю часть, чтобы явным образом задать параметры связи.

Как компоненты модели передают сообщения и как код реализует это поведение

Концептуально ссылка моделей передавать сообщения следующим образом:

  1. В модели, которая содержит блок Send, блок Send преобразует сигналы в сообщения.

  2. Верхняя модель, которая содержит очередь, управляет сообщениями в соответствии с параметрами, которые определяют емкость, порядок доставки и другие метрики качества обслуживания (QoS).

  3. В модели, которая содержит блок Receive, блок Receive преобразует сообщения назад в сигналы.

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

Сгенерированный код С++ реализует поведение сообщений следующим образом:

  1. На каждом контуре модели создается служба. Сервис содержит ссылку на модель верхней части и функцию точки входа, называемую служебной функцией, для использования ссылочными моделями для передачи сообщений с верхней частью моделью.

  2. Верхняя модель инициализирует каждую службу, чтобы создать соединение с каждой ссылочной моделью.

  3. Ссылочные модели вызывают сервисные функции, чтобы передать сообщения с верхней частью моделью.

Детали реализации этих шагов показаны в сгенерированный код примере.

Пример генерации кода С++

Этот пример генерирует и исследует код С++ из модели, представленной в Установлении Интерфейсов Отправки и Приема Сообщений Между Программными Компонентами.

Сгенерируйте код С++:

  1. Откройте модель.

  2. В галерее Apps нажмите Embedded Coder.

  3. Для каждой модели (верхняя часть и обе модели-ссылки) в диалоговом окне Параметров конфигурации установите эти параметры:

    • На панели «Генерация кода» задайте Language C++.

    • На панели «Интерфейс» задайте Code interface packaging C++ class.

    Сохраните модель.

  4. Сгенерируйте код. На вкладке C++ Code нажмите Build.

  5. Просмотрите сгенерированный код. На вкладке C++ Code нажмите View Code.

Исследуйте код С++:

  1. На каждом контуре модели создается служба. В C++ службы представлены как объекты, которые содержат образец верхней модели и сервисную функцию, которая ссылается на модели, вызывают передачу сообщений.

    1. Чтобы просмотреть создание сервисов, откройте файл верхней модели C++, MessageSendReceiveDefaultBufferModel.cpp. Просмотрите метод конструктора.

      Методы конструктора, ReceiveComponentRecvData(*this) и SendComponentSendData(*this)создайте объекты receive и send service соответственно путем взятия в качестве аргумента ссылки на образец верхней модели. Каждый объект сервиса сохраняет ссылку на верхнюю часть и определяет интерфейс сообщений (функции сервиса RecvData и SendData).

    2. Чтобы просмотреть классы услуг приема и отправки, откройте файл заголовка верхней модели, MessageSendReceiveDefaultBufferModel.h, и просмотрите следующий раздел.

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

    Метод конструктора, Receive_ComponentMDLOBJ0(get_ReceiveComponentRecvData()), передает ссылку на службу приема в модель, на которую ссылается прием. Метод конструктора, Send_ComponentMDLOBJ1(get_SendComponentSendData()), передает ссылку на службу отправки в модель отправки ссылок.

  3. Ссылочные модели вызывают сервисные функции, чтобы передать сообщения с верхней частью моделью. В C++ модели-ссылки активируют службу верхних моделей (общий предок, если в иерархии), чтобы отправлять или получать сообщения (в частности, модель-ссылка вызывает метод абстрактного обслуживания (RecvData или SendData) из интерфейса, созданного на шаге 2) .Абстрактные классы интерфейсов излучаются в общую папку. Реализация сервисных функций в каждом сервисе определяется в файле верхняя часть модели.

    1. Чтобы просмотреть класс абстрактного интерфейса для отправки сообщений, откройте из общей папки файл заголовка, SendData_real_T.h.

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

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

    4. Чтобы просмотреть класс абстрактного интерфейса для приема сообщений, откройте из общей папки файл заголовка, RecvData_real_T.h.

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

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

Факторы и ограничения

  • Поддержка кода С++ доступна для системных целевых файлов на основе GRT при помощи приложения Simulink Coder.

  • Поддержка кода С++ доступна для целевых файлов системы на основе ERT при помощи приложения Embedded Coder.

  • Чтобы сгенерировать код, модели верхнего уровня и модели-ссылки должны иметь один и тот же язык (C++) и выбранный системный целевой файл.

  • Управление прототипом функции (FPC) не может быть сконфигурировано для верхней модели, которая имеет корневые порты сообщений.

  • Внешние модели и модели вариантов не поддерживаются.

  • В симуляции SIL/PIL не поддерживаются.

Похожие темы