Run one step of a simulink model, switch to an m-file, calculate, switch back to the model, run model with new calculated data. (Step wise Simulink execution)

17 visualizaciones (últimos 30 días)
Hi there,
I have a Simulink model which is generating Data. This Data is the input for some calculation in Matlab. Not just a function, there is a lot of stuff (object oriented) done. The result of the calculation should be the input for the next step of the Simulink model. Now the simulation simulates one time stamp and sends the result to Matlab. Matlab does his calculation and sends the result back to Simulink, and so on.
My problem is, how to synchronize Matlab and Simulink? With "sim()" I can just run all the simulation and do some post processing after everything is finished. But I want to change some parameters during the simulation which will take effect to the results.
I found the "sldebug()" mode witch is doing the step wise execution of the model. But it enters a special debug mode where I can not execute some Matlab code.
Thanks a lot for your help! Kilian

Respuestas (3)

Kilian Lenz
Kilian Lenz el 11 de Feb. de 2016
After some time I found a solution. First you start Simulink from Matlab:
set_param('Test_Simulink_Model','SimulationCommand','start')
Then you can pause the simulation after a step of time with a pulse generator and a Matlab function block.
Inside of the block is writen
function fcn(u)
coder.extrinsic('bdroot')
coder.extrinsic('set_param')
if u > 0
set_param(bdroot,'SimulationCommand','pause')
end
end
In the Matlab skript you can now ask if the simulation is paused.
if(strcmp(get_param('Test_Simulink_Model','SimulationStatus'), 'paused'))
Now you are able to read the values from the output blocks. For that you have to get the data from the 'RuntimeObject' of the block.
%Get all Vehicle variables
rto_s_x = get_param('Test_Simulink_Model/Read CM Dict','RuntimeObject');
s_x = rto_s_x.OutputPort(1).Data;
To wirte back the data you just calculated use
set_param('Test_Simulink_Model/Gas','Value',int2str(gas));
and to continue the simulation use
set_param('Test_Simulink_Model','SimulationCommand','continue')
To give Simulink a littel bit of time to start again you have to pause the Matlabloop for a shortening
pause(0.01)
If everything is done you can stop Simulink with
set_param('Test_Simulink_Model','SimulationCommand','stop')
I hope this will help the next one doing the same.
Regards, Kilian
  1 comentario
Nitin Babu
Nitin Babu el 16 de Mzo. de 2023
In the pulse generator what should the data be? I need my system to run for 0.1s, pause, do some calcs in matlab, feed that back into simulink mode, and run for the next 0.1s and repeat?

Iniciar sesión para comentar.


Vaibhav Awale
Vaibhav Awale el 13 de En. de 2016
You can run the simulation for one time step using the sim() command. The resulting outputs can be again sent as an input for simulating the model again using sim() command. If you wish to change simulation parameters in between the runs, you can use "set_param" function to set the desired parameters from command window or MATLAB script.
I hope this helps.
Regards,
Vaibhav
  1 comentario
Roger Kassouf
Roger Kassouf el 29 de Jul. de 2021
@Vaibhav Awale, may you please share an example of this? I am confused on how one would do this when the internal block states are cleared between runs. Thank you.

Iniciar sesión para comentar.


krishna teja
krishna teja el 28 de Mzo. de 2020

Categorías

Más información sobre Naming Conventions en Help Center y File Exchange.

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by