Main Content

Generate C++ Messages to Communicate Data Between Simulink Components

To generate C++ code that supports message-based communication between model components in the Simulink environment, use the Simulink Messages & Events Library blocks Send and Receive. To customize the communication, use the Queue block (from the same library) to set parameters for capacity, sorting policy (LIFO, FIFO, and priority), and overwriting policy (behavior when the queue exceeds capacity). You can generate C++ code for GRT-based system target files by using Simulink Coder or for ERT-based system target files by using Embedded Coder.

Messages are an effective communication technique for distributed and complex systems that you can model within Simulink.

How to Prepare Models in Simulink for Message-Based Communication

In Simulink, model message-based communication between model components:

  1. Create a model that contains a Send block (referenced model).

  2. Create a model that contains a Receive block (referenced model).

  3. Create a model that has two Model blocks (top model).

    • Set the first Model block to the model that contains the Send block (model from step 1).

    • Set the second Model block to the model that contains the Receive block (model from step 2).

  4. When you run the model, a queue generates in the top model above the message line. A queue, explicit or implicit, controls the message communication. You can use the generated queue or you can add a Queue block in the top model to explicitly specify communication parameters.

How Model Components Pass Messages and How the Code Implements the Behavior

Referenced models pass messages:

  1. In the model that contains the Send block, the Send block converts signals into messages.

  2. The top model that contains the queue manages messages according to parameters that define capacity, order of delivery, and other quality of service (QoS) metrics.

  3. In the model that contains the Receive block, the Receive block converts messages back to signals.

In the generated C++ code, the top model facilitates the connection between the send and receive referenced models by establishing a set interface that the referenced models can access independently of one another.

The generated C++ code implements message behavior:

  1. A service is created at each model boundary. A service contains a reference to the top model and an entry point function, referred to as a service function, for referenced models to use to pass messages to the top model.

  2. The top model initializes each service to create a connection to each referenced model.

  3. The referenced models invoke service functions to pass messages to the top model.

C++ Code Generation Example

This example generates and examines C++ code from the model provided in Establish Message Send and Receive Interfaces Between Software Components.

Example model for generating and examining C++ code that passes messages

Generate C++ Code:

  1. Open the model.

  2. In the Apps gallery, click Embedded Coder.

  3. For each model (top and both referenced models), in the Configuration Parameters dialog box, set these parameters:

    • In the Code Generation pane, set Language to C++.

    • In the Interface pane, set Code interface packaging to C++ class.

    Save the model.

  4. Generate code. On the C++ Code tab, click Build.

  5. View the generated code. On the C++ Code tab, click View Code.

Examine C++ Code:

  1. A service is created at each model boundary. In C++, services are represented as objects that hold an instance of the top model and a service function that referenced models invoke to pass messages.

    1. To view the creation of the services, open the top model C++ file MessageSendReceiveDefaultBufferModel.cpp. View the constructor method.

      Example code for constructor method

      The constructor methods, ReceiveComponentRecvData(*this) and SendComponentSendData(*this), create the receive and send service objects respectively by taking as an argument a reference to the instance of the top model. Each service object saves a reference to the top model and defines the message interface (the service functions RecvData and SendData).

    2. To view the receive and send service classes, open the top model header file MessageSendReceiveDefaultBufferModel.h, and view the following section.

      Example code for the receive and send classes

  2. The top model initializes each service to create a connection to each referenced model. To view the initialization, open the top model C++ file MessageSendReceiveDefaultBufferModel.cpp. View the constructor method.

    Example code for the constructor method

    The constructor method Receive_ComponentMDLOBJ0(get_ReceiveComponentRecvData()), passes a reference to the receive service to the receive referenced model. The constructor method, Send_ComponentMDLOBJ1(get_SendComponentSendData()), passes a reference to the send service to the send referenced model.

  3. The referenced models invoke service functions to pass messages to the top model. In C++, referenced models invoke the top model (common ancestor, if in a hierarchy) service functions to send or receive messages (specifically, a referenced model invokes the abstract service method (RecvData or SendData) from the interface created in step 2).The abstract interface classes are emitted to a shared folder. The implementation of the service functions in each service is defined in the top model C++ file.

    1. To view the abstract interface class to send messages, open from the shared folder the header file SendData_real_T.h.

      Example code for the abstract interface class that sends messages

    2. To view the implementation of the service function to send messages, open the top model C++ file MessageSendReceiveDefaultBufferModel.cpp.

      Example code that shows the implementation of the service function that sends messages

    3. To view how the send referenced model invokes the service function, open its C++ file mSend.cpp. In the step function, the model invokes the service function to send messages to the top model and receives back a return status.

      Example code for step function that invokes the service function that sends messages to the top model and receives back a return status

    4. To view the abstract interface class to receive messages, open from the shared folder the header file RecvData_real_T.h.

      Example code for the abstract interface class that receives messages

    5. To view the implementation of the service function to receive messages, open top model C++ file MessageSendReceiveDefaultBufferModel.cpp.

      Example code that shows the implementation of the service function that receives messages

    6. To view how the receive referenced model invokes the service function, open its C++ file mRecieve.cpp. In the step function, the model invokes the service function to receive messages and a status from the top model.

      Example code that shows how the receive referenced model invokes the service function

Considerations and Limitations

  • C++ code support is available for GRT-based system target files by using the Simulink Coder App.

  • C++ code support is available for ERT-based system target files by using the Embedded Coder App.

  • To generate code, for top and referenced models. select the same language (C++) and the same system target file.

  • You cannot configure function prototype control (FPC) for a top model that has root message ports.

  • External models and variant models are not supported.

  • Software-in-the-loop (SIL) and processor-in-the-loop (PIL) simulations are not supported.