Сгенерируйте код С++ от топ-моделей для основанной на сообщении коммуникации при помощи внешних протоколов сообщения

Чтобы сгенерировать Код С++, который поддерживает основанную на сообщении связь между топ-моделями Simulink и внешними приложениями, используйте Библиотеку сообщений & Событий Simulink Send и блоки Receive.

Генерация кода от топ-модели, чтобы упростить передачу сообщений за пределами окружения Simulink позволяет вашему смоделированному приложению связываться в распределенной системе, которая использует внешний сервис протокола сообщения (например, DDS, ROS, SOMEIP или сообщения POSIX).

Топ-модели Simulink передают сообщения следующим образом:

  1. Топ-модели содержат блоки сообщения, чтобы связаться вне окружения Simulink. Если топ-модель содержит блок Send, непосредственно соединенный с корневым блоком выходного порта, блок преобразует свои сигналы в сообщения и передает их вне окружения Simulink. Если топ-модель содержит блок Receive, непосредственно соединенный с корневым блоком импорта, блок преобразует полученные сообщения в сигналы.

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

Чтобы изучить, как интегрировать топ-модель с внешним протоколом сообщения, эта тема покрытия, как подготовить топ-модель, сгенерируйте код и интегрируйте тот код с внешним протоколом.

Подготовьте топ-модель

Чтобы сгенерировать Код С++ от топ-модели, которая может объединяться с внешним протоколом сообщения, готовят топ-модель, использующую эти шаги:

  1. Проверьте, что топ-модель содержит один или несколько блоков сообщения (например, блок Send, соединенный с корневым блоком выходного порта или блоком Receive, соединенным с корневым блоком импорта).

  2. В диалоговом окне Configuration Parameters, установленном эти параметры:

    • В панели Code Generation, набор System target file к ert.tlc.

    • В панели Code Generation, набор language к C++.

    • В панели Interface, набор Coder interface packaging к C++ class.

    • Выберите generate an example main флажок.

Концептуальный пример того, как топ-модель, HMI, объединяется с внешним сервисом протокола сообщения, Промежуточное программное обеспечение (например, POSIX), показывают:

В модели HMI порты сообщения соединяются как показано.

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

Сгенерировать Код С++ от вашей топ-модели:

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

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

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

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

Интегрируйте код

Сгенерированный Код С++ предоставляет сервисные классы, чтобы отправить и получить сообщения и демонстрационное основное, которое вы, как ожидают, будете программировать с логикой, чтобы интегрировать сгенерированный Код С++ с вашим целевым внешним сервисом протокола сообщения.

Генерация кода С++ обеспечивает эти файлы:

  • Сгенерированный сервисный класс, чтобы отправить сообщения, SendData_real_T.h.

  • Сгенерированный сервисный класс, чтобы получить сообщения, RecvData_real_T.h.

  • Основной файл с сервисными методами класса, которые вы, как ожидают, будете программировать с логикой, чтобы объединяться с вашим внешним сервисом протокола сообщения.

    Основной файл задает и затем инстанцирует отправления, и получите сервисные классы. Конструктор топ-модели затем создает экземпляр топ-модели путем передачи в ссылке на каждый сервисный класс.

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

Пример того, как реализовать логику для демонстрационного основного файла, чтобы интегрировать сгенерированный код с сообщениями POSIX, следующий:

void sendData_real_T(const real_T* data, int32_T length, int32_T* status)
{
//This is an example of a message send service function
  struct mq_attr attr;
  attr.mq_maxmsg = 1024;
  attr.mq_msgsize = length;
  mqd_t msgQueue = mq_open("/PosixMQ_Example", O_CREAT | O_WRONLY, 0664, NULL);
  if (msgQueue == -1) 
  {
    printf("mq_open failed");
    exit(1);
  }
  
  printf("Sending %f\n", *data);
  mq_send(msgQueue, (char*)data, length, 1);
  mq_close(msgQueue);
}

class mHMIHandlerSendData_real_T : public SendData_real_T 
{
  public:
    void SendData(const real_T* data, int32_T* length, int32_T* status) 
    {
      sendData_real_T(data, length, status);
    }
};
static mHMIHandlerSendData_real_T OutMsgSendData_arg;

void RecvData_real_T(real_T* data, int32_T length, int32_T* status) 
{
//This is an example of a receive service function
  mqd_t msgQueue = mq_open("/PosixMQ_Example, O_RDONLY);
  if (msgQueue == -1) 
  {
    printf("mq_open failed");
    exit(1);
  }

  struct mq_attr attr;
  mq_getattr(msgQueue, &attr);
  *status = mq_receive(msgQueue, (char *)data, attr.mq_msgsize, &priority);
  printf("Received %f", *data);
  mq_close(msgQueue);
}

class mHMIHandlerRecvData_real_T: public RecvData_real_T 
{
  public:
    {
      RecvData_real_T(data, length, status);
    }
};
static mHMIHandlerRecvData_real_T InMsgRecvData_arg;

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

  • Поддержка генерации кода интеграции топ-модели с внешними протоколами сообщения доступна на C++.

  • Параметр Generate a sample main должен быть выбран, приложения, которые требуют статического основного, не поддержан.

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

Похожие темы