Чтобы сгенерировать код С, который поддерживает обмен сообщениями между компонентами модели в окружение Simulink, используйте блоки Simulink Messages & Events Library Send и Receive. Чтобы настроить коммуникацию, используйте блок 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 преобразует сообщения назад в сигналы.
В сгенерированном коде C верхняя часть облегчает соединение между моделями отправки и приема ссылок путем установления интерфейса набора, к которому модели-ссылки могут обращаться независимо друг от друга.
Сгенерированный код C реализует поведение сообщений следующим образом:
На каждом контуре модели создается служба. Сервис содержит ссылку на модель верхней части и функцию точки входа, называемую служебной функцией, для использования ссылочными моделями для передачи сообщений с верхней частью моделью.
Верхняя модель инициализирует каждую службу, чтобы создать соединение с каждой ссылочной моделью.
Ссылочные модели вызывают сервисные функции, чтобы передать сообщения с верхней частью моделью.
Детали реализации этих шагов показаны в сгенерированный код примере.
Этот пример генерирует и исследует код С из модели, представленной в Установлении Интерфейсов Отправки и Приема Сообщений Между Программными Компонентами.
Сгенерируйте код С:
Откройте модель.
В галерее Apps нажмите Embedded Coder.
Для каждой модели (верхней части и обеих ссылочных моделей) в диалоговом окне Параметров конфигурации, на панели Генерации кода, установите Language C
и сохраните модель.
Сгенерируйте код. На вкладке C Code нажмите Build.
Просмотрите сгенерированный код. На вкладке C Code нажмите View Code.
Исследуйте код С:
На каждом контуре модели создается служба. В C модели-ссылки представляют службы как DWork. Сервис предоставляет указатель на образец верхней модели и сервисную функцию, которая ссылается на модели, вызывающие передачу сообщений.
Чтобы просмотреть службу для отправки сообщений, откройте файл заголовка модели, на который ссылаются mSend.h
. Просмотрите распределение DWork.
Чтобы просмотреть тип данных отправки сообщений, если тип данных является общедоступным (для примера, встроенных типов данных, импортированных типов шин или экспортированных типов шин с заданным типом данных), информация находится в общем заголовочном файле. Если тип данных не является общедоступным, информация находится в заголовочном файле модели, mSend.h
. В данном примере просмотрите общедоступный тип данных путем открытия файла с общим заголовком SendData_real_T.h
.
Чтобы просмотреть службу для приема сообщений, откройте файл заголовка модели, на который ссылаются mReceive.h
. Просмотрите распределение DWork.
Чтобы просмотреть тип данных полученных сообщений, если тип данных является общедоступным (например, встроенные типы данных, импортированные типы шин или экспортированные типы шин с заданным типом данных), информация находится в файле общего заголовка. Если тип данных не является общедоступным, информация находится в заголовочном файле модели, mReceive.h
. В данном примере просмотрите общедоступный тип данных путем открытия файла с общим заголовком RecvData_real_T.h
.
Верхняя модель инициализирует каждую службу, чтобы создать соединение с каждой ссылочной моделью. В C верхняя модель инициализирует каждую ссылочную модель DWork. Чтобы просмотреть инициализацию, откройте файл верхняя часть модели, MessageSendReceiveDefaultBufferModel.c
.
Ссылочные модели вызывают сервисные функции, чтобы передать сообщения с верхней частью моделью. В C модель-ссылка вызывает служебную функцию, выдавая указатель на служебную функцию и передавая указатель на образец верхней модели. Можно просмотреть прототипы сервисных функций в заголовочном файле верхней модели, и можно просмотреть ссылочные вызовы модели этих сервисных функций в ссылочных файлах модели C.
Чтобы просмотреть прототип сервисной функции для отправки сообщений, откройте заголовочный файл верхней модели, MessageSendReceiveDefaultBufferModel.h
.
Чтобы просмотреть реализацию сервисной функции для отправки сообщений, откройте верхний файл модели C, MessageSendReceiveDefaultBufferModel.c
.
Чтобы просмотреть, как модель отправки ссылок вызывает функцию сервиса, откройте файл C для модели, mSend.c
. В функции step модель вызывает сервис, чтобы отправить данные образца и сообщение в верхнюю модель и получает назад статус возврата.
Чтобы просмотреть прототип сервисной функции для приема сообщений, откройте заголовочный файл верхней модели, MessageSendReceiveDefaultBufferModel.h
.
Чтобы просмотреть реализацию сервисной функции для приема сообщений, откройте верхний файл модели C, MessageSendReceiveDefaultBufferModel.c
.
Чтобы просмотреть, как модель, на которую ссылается прием, вызывает функцию сервиса, откройте файл C для модели, mReceive.c
. В функции step модель вызывает услугу, чтобы получить полезную нагрузку сообщения и статус возврата.
Поддержка кода С доступна для системных целевых файлов на основе GRT при помощи приложения Simulink Coder.
Поддержка кода С доступна для целевых файлов системы на основе ERT при помощи приложения Embedded Coder App.
Чтобы сгенерировать код, модели верхнего уровня и модели-ссылки должны иметь один и тот же язык (C) и выбранный системный целевой файл.
Управление прототипом функции (FPC) не может быть сконфигурировано для верхней модели, которая имеет корневые порты сообщений.
Внешние модели и модели вариантов не поддерживаются.
В симуляции SIL/PIL не поддерживаются.