Чтобы сгенерировать Код С++, который поддерживает связь сообщения между топ-моделями Simulink и внешними приложениями, используйте Библиотеку сообщений & Событий Simulink Send и блоки Receive. Генерация кода от топ-модели, чтобы упростить сообщения, переданные за пределами окружения Simulink, позволяет вашему смоделированному приложению связаться в распределенной системе, которая использует внешний сервис протокола сообщения, обычно называемый операционной системой или промежуточным программным обеспечением (например, DDS, ROS, SOMEIP или сообщения POSIX).
Топ-модели Simulink передают сообщения следующим образом:
Топ-модели содержат блоки сообщения, чтобы связаться вне окружения Simulink. Если топ-модель содержит блок Send, непосредственно соединенный с корневым блоком Outport, блок преобразует свои сигналы в сообщения и передает их вне окружения Simulink. Если топ-модель содержит блок Receive, непосредственно соединенный с корневым Inport блоком, блок преобразует полученные сообщения в сигналы.
Внешний протокол сообщения справляется с коммуникацией сообщения согласно своему собственному стандарту (политики, которые управляют способностью, порядком доставки и другим поведением качества сервиса (QoS)).
Чтобы сгенерировать сообщения C++, чтобы связаться между топ-моделями Simulink и операционной системой или промежуточным программным обеспечением, подготовьте свою модель, сгенерируйте код и интегрируйте тот код со своей выбранной операционной системой или промежуточное программное обеспечение.
Чтобы настроить вашу модель так, чтобы это могло передать сообщения с операционной системой или промежуточное программное обеспечение, сконфигурируйте модель как топ-модель, которая имеет по крайней мере один блок сообщения (блок Send, соединенный с корневым блоком Outport или блоком Receive, соединенным с корневым Inport блоком). Топ-модель может затем соединиться с вашей выбранной операционной системой или промежуточным программным обеспечением через блоки сообщения как показано:
В модели порты сообщения соединяются как показано:
Сгенерировать Код С++ из модели:
В галерее Apps нажмите Embedded Coder.
В диалоговом окне Configuration Parameters, установленном эти параметры:
В панели Code Generation, набор Language к C++
.
В панели Interface, набор Code interface packaging к C++ class
.
В панели Templates выберите Generate an example main program
.
Сгенерируйте код. На вкладке C++ Code нажмите Build.
Просмотрите сгенерированный код. На вкладке C++ Code нажмите View Code.
Чтобы интегрировать сгенерированный Код С++ из вашей модели с вашей выбранной операционной системой или промежуточного программного обеспечения используют рукописный код, чтобы реализовать, отправляют и получают классы сообщений и код приложения, который использует те классы, чтобы передать сообщения. В частности:
Если вы используете свое собственное основное, создаете конкретные подклассы из сгенерированных абстрактных классов, показанных в RecvData_<T>.h
и SendData<T>.h
. Если вы используете сгенерированный пример основная программа, конкретные подклассы предоставляются вам в файле.
Реализуйте функции класса SendData
и RecvData
вызывать в вашу выбранную операционную систему или промежуточное программное обеспечение, чтобы отправить и получить сообщения.
Создайте экземпляр своего реализованного, отправляют и получают классы сообщений (отправьте и получите объекты).
Создайте экземпляр класса модели при помощи экземпляров каждого класса сообщений (отправьте и получите объекты) в качестве аргументов в конструкторе модели.
Отправьте и получите сообщения как требуется вашим приложением. Вы, как ожидают, будете управлять временем жизни очередей сообщений. Требуется, что очереди находятся в состоянии, готовом принять сообщения до первого шага модели.
Объединяться:
Откройте сгенерированный пример основная программа (или создайте ваше собственное). Если вы используете сгенерированный пример основная программа, бетон разделяет на подклассы RecvData_real_T
и SendData_real_T
обеспечиваются в файле. Если вы создаете свое собственное основное, создаете конкретные подклассы в вашем коде приложения:
Чтобы получить сообщения, рука пишет, что реализация сгенерированного получает класс. Реализуйте функцию класса 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;
Чтобы отправить сообщения, рука пишет, что реализация сгенерированного отправляет класс. Реализуйте функцию класса 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);
Отправьте и получите сообщения как требуется вашим приложением и обеспечьте время жизни очереди сообщений.
Реализацию в качестве примера для 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) не может быть сконфигурировано для топ-модели, которая имеет корневые порты сообщения.