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

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

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

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

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

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

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

Чтобы настроить вашу модель так, чтобы это могло передать сообщения с операционной системой или промежуточное программное обеспечение, сконфигурируйте модель как топ-модель, которая имеет по крайней мере один блок сообщения (блок Send, соединенный с корневым блоком Outport или блоком Receive, соединенным с корневым блоком Inport). Топ-модель может затем соединиться с вашей выбранной операционной системой или промежуточным программным обеспечением через блоки сообщения как показано:

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

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

Сгенерировать Код С++ из модели:

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

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

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

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

    • В панели Templates выберите Generate an example main program.

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

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

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

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

  1. Если вы используете свое собственное основное, создаете конкретные подклассы из сгенерированных абстрактных классов, показанных в RecvData_<T>.h и SendData<T>.h. Если вы используете сгенерированный пример основная программа, конкретные подклассы предоставляются вам в файле.

  2. Реализуйте функции класса SendData и RecvData вызывать в вашу выбранную операционную систему или промежуточное программное обеспечение, чтобы отправить и получить сообщения.

  3. Создайте экземпляр своего реализованного, отправляют и получают классы сообщений (отправьте и получите объекты).

  4. Создайте экземпляр класса модели при помощи экземпляров каждого класса сообщений (отправьте и получите объекты) в качестве аргументов в конструкторе модели.

  5. Отправьте и получите сообщения как требуется вашим приложением. Вы, как ожидают, будете управлять временем жизни очередей сообщений. Требуется, что очереди находятся в состоянии, готовом принять сообщения до первого шага модели.

Объединяться:

  1. Откройте сгенерированный пример основная программа (или создайте ваше собственное). Если вы используете сгенерированный пример основная программа, бетон разделяет на подклассы RecvData_real_T и SendData_real_T обеспечиваются в файле. Если вы создаете свое собственное основное, создаете конкретные подклассы в вашем коде приложения:

  2. Чтобы получить сообщения, рука пишет, что реализация сгенерированного получает класс. Реализуйте функцию класса RecvData вызывать в вашу выбранную операционную систему или промежуточное программное обеспечение, чтобы получить сообщения.

    Реализацию в качестве примера для POSIX показывают:

    class mHMIHandlerRecvData_real_T: public RecvData_real_T {
        public:
        void RecvData(real_T* data, int32_T length, int32_T* status)
        {
            // Use POSIX API mq_receive to receive messages
            unsigned int priority = 1;
            *status = mq_receive(msgQueue, (char *)data, length, &priority);
        }
    };
    

    Создайте получить объект.

    static mHMIHandlerRecvData_real_T InMsgRecvData_arg;
    
  3. Чтобы отправить сообщения, рука пишет, что реализация сгенерированного отправляет класс. Реализуйте функцию класса SendData вызывать в вашу выбранную операционную систему или промежуточное программное обеспечение, чтобы отправить сообщения.

    Реализацию в качестве примера для POSIX показывают:

    class mHMIHandlerSendData_real_T : public SendData_real_T {
        public:
        void SendData(const real_T* data, int32_T length, int32_T* status)
        {
            // Use the POSIX API mq_send to send messages
            unsigned int priority = 1;
            *status = mq_send(msgQueue, (char*)data, length, priority);
        }
    };
    

    Создайте отправить объект.

    static mHMIHandlerSendData_real_T OutMesgSendData_arg;
    

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

    static mHMIHandler mHMI_Obj(InMsgRecvData_arg, OutMsgSendData_arg);
    
  4. Отправьте и получите сообщения как требуется вашим приложением и обеспечьте время жизни очереди сообщений.

    Реализацию в качестве примера для POSIX показывают:

    int_T main(int_T argc, const char *argv[])
    {
        // Unused arguments
        (void)(argc);
        (void)(argv);
    
        //Initialize model
        mHMI_obj.initialize();     
    
        // Open POSIX queue
         mqd_t msgQueue = mq_open("/PosixMQ_Example", O_RDONLY);
         if (msgQueue == -1)
         {
             printf("mq_open failed\n");
             exit(1);
         }     
    
        // Send and Receive messages
         while (rtmGetErrorStatus(mHMI_Obj.getRTM()) == (NULL)) {
             //perform application tasks here.
             rt_OneStep();
         }   
    
        // Close POSIX queue
         mq_close(msgQueue);     
    
        // Terminate model
         mHMI_Obj.terminat():
         return 0;
     }

Для более комплексного примера интегрирования POSIX смотрите Использование Рукописный Код, чтобы Интегрировать сообщения C++ с POSIX

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

  • Рукописный код является единственным поддерживаемым методом интегрирования.

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

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

Похожие темы