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.
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
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
We can see that the structure of the first bus is equal to the created struct
The model bus is only linked to the estimation bus.
If we delete the bus with the name
model it disappears from the
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
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.
The data type of the input
estData_in and output
estData_out of the estimation function must be specified as
This is done in the Model Explorer as shown below.
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.
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
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.