Initialize Bus Signal in Simulink based on Struct from Matlab Workspace

Today I would like to share my experience of initializing a bus signal in Simulink based on a struct from the Matlab workspace. For me, the instructions in the documentation and on the internet were not so clear. I will therefore show an example of how this can be implemented. I use this appraoch for an extended Kalman filter (EKF) and unscented Kalman filter (UKF), where I need to initialize the initial states of the estimation algorithm.

Create Model and Estimation Data Struct in Matlab

First we will create two structures, the first to describe the model and the second to combine all important data for the estimation algorithm. Thereby the model struct is nested in the estimation struct. The function Simulink.Bus.createObject() creates a Simulink bus object based on a Matlab structure. According to my findings the created bus is always named slBus1 and stored in the base workspace. This leads to problems, especially when creating a bus within a function. For this purpose the created bus with the name slBus1 is copied into a new variable with the unique named estData_bus. Then the bus slBus1 is deleted from the base workspace to achieve a clear order. The example shown here can therefore also be called within a function.

% Create Model Struct
model_struct.mod_var1 = 2;
model_struct.mod_vec1 = [1, 2, 3];
model_struct.mod_array1 = eye(3,3);

% Create Estimation Data Struct
estData_struct.est_var1 = 5;
estData_struct.est_vec1 = 5 * [1, 2, 3];
estData_struct.est_array1 = 5 * eye(3,3);
estData_struct.model = model_struct;

% Create Estimation Data Bus for Simulink Model
estBusInfo = Simulink.Bus.createObject(estData_struct);
estData_bus = evalin('base', estBusInfo.busName);

% Delet created Bus from base workspace
evalin('base', 'clear slBus1' );

From the Matlab base workspace we open the Bus Editor where we find the created bus called estData_bus and a second bus called model. We can see that the structure of the first bus is equal to the created struct estData_struct. The model bus is only linked to the estimation bus. If we delete the bus with the name model it disappears from the estData_bus.

Simulink Bus Editor shows the generated Bus from the Matlab workspace

Create the Simulink Model

Next, we create the Simulink model that contains the estimation algorithm. As you can see below, the estimation algorithm is implemented as a Matlab function. Here it is only an example that adds the product of the input argument inputArg1 and model variable mod_var1 to the estimation variable est_var1. In my real application the Kalman filter code is placed here.

function [outputArg1, estData_out] = estAlgorithm(inputArg1, estData_in)
    model = estData_in.model;
    estData_out = estData_in;
    estData_out.est_var1 = estData_in.est_var1 + inputArg1 * model.mod_var1;
    outputArg1 = estData_out.est_var1;
end

The estimation algorithm is embedded in the Simulink top level model. The output estimation bus is feed back via a unit delay. The unit delay is initialized by the initialization function on top of the estimation algorithm.

Estimation Algorithm implementation in Simulink based on State feedback

The data type of the input estData_in and output estData_out of the estimation function must be specified as estData_bus. This is done in the Model Explorer as shown below.

Specifying the Data Type of the Estimation Algorithm according to generated Bus

Within the initialize function the state of the unit delay is set. The following Figure shows how the estData_struct from the workspace is used. Here too, it is important to specify the data type of the constant. In this example the variable est_var1 is overwritten with 10. In my application I overwrite the initial states of the measurement equation based on my first recorded data.

Initialization of Unit Delay based on Simulink Bus created from Matlab Struct

The next Figure shows the result of the simulation over 10 seconds. At the beginning ‘est_var1’ is initialized with 10 and the estimation algorithm immediately adds 1x2, resulting in 12. After every second another 2 is added to est_var1.

Result of the Estimation Algorithm after Initialization

Conclusions

The complete process of creating and initializing a bus in Simulink based on a structure from the Matlab workspace is tricky. Once you are on a certain level, you can make adjustments very quickly. In my application the estimation struct has several lookup tables and state space matrices. Since C code is generated from the model that will later run on an embedded system, different optimized data types are used in the estimation struct. The data types can easily be specified in the Matlab script. They are then also used for the Simulink bus.

Below you will find the complete files to reproduce the simulation:
Matlab File
Simulink File