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

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

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

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

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

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

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

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

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

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

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

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

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

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

Чтобы просмотреть пример этого проекта, смотрите, что модель, предоставленная в, Устанавливает сообщение, Отправляют и Получают Интерфейсы Между Компонентами программного обеспечения (Simulink).

Как Передача Компонентов модели обменивается сообщениями и Как Реализации Кода это Поведение

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

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

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

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

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

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

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

  2. Топ-модель инициализирует каждый сервис создать связь с каждой моделью, на которую ссылаются.

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

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

C++ и примеры генерации кода C

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

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

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

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

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

  3. Для каждой модели (верхняя часть и обе модели, на которые ссылаются), в диалоговом окне Configuration Parameters, устанавливает эти параметры:

    • В панели Генерации кода, набор 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), создайте получение и отправьте объекты службы соответственно путем взятия в качестве аргумента ссылки на экземпляр топ-модели. Каждый объект службы сохраняет ссылку на топ-модель и задает интерфейс сообщения (служебные функции RecvData и SendData).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  3. Для каждой модели (верхняя часть и обе модели, на которые ссылаются), в диалоговом окне Configuration Parameters, в панели Генерации кода, устанавливает 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. Чтобы просмотреть реализацию служебной функции, чтобы отправить сообщения, откройте файл топ-модели К, MessageSendReceiveDefaultBufferModel.c.

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

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

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

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

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

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

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

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

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

  • Внешние модели и различные модели не поддержаны.

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

Похожие темы