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

Чтобы сгенерировать код С, который поддерживает обмен сообщениями между компонентами модели в окружение Simulink, используйте блоки Simulink Messages & Events Library Send и Receive. Чтобы настроить коммуникацию, используйте блок 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 преобразует сообщения назад в сигналы.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    2. Чтобы просмотреть тип данных отправки сообщений, если тип данных является общедоступным (для примера, встроенных типов данных, импортированных типов шин или экспортированных типов шин с заданным типом данных), информация находится в общем заголовочном файле. Если тип данных не является общедоступным, информация находится в заголовочном файле модели, mSend.h. В данном примере просмотрите общедоступный тип данных путем открытия файла с общим заголовком SendData_real_T.h.

    3. Чтобы просмотреть службу для приема сообщений, откройте файл заголовка модели, на который ссылаются mReceive.h. Просмотрите распределение DWork.

    4. Чтобы просмотреть тип данных полученных сообщений, если тип данных является общедоступным (например, встроенные типы данных, импортированные типы шин или экспортированные типы шин с заданным типом данных), информация находится в файле общего заголовка. Если тип данных не является общедоступным, информация находится в заголовочном файле модели, mReceive.h. В данном примере просмотрите общедоступный тип данных путем открытия файла с общим заголовком RecvData_real_T.h.

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

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

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

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

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

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

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

    6. Чтобы просмотреть, как модель, на которую ссылается прием, вызывает функцию сервиса, откройте файл C для модели, mReceive.c. В функции step модель вызывает услугу, чтобы получить полезную нагрузку сообщения и статус возврата.

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

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

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

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

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

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

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

Похожие темы