How do I froce MATLAB to wait for Simulink simulation to be paused or stopped before resuming ?
27 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Hello,
I am currently facing a problem with MATLAB and Simulink. I have a MATLAB script that calls and opens a Simulink model.
I start my simulation using the command :
set_param(mdl,'SimulationCommand','start');
Then I enter a "for" loop that will pause the Simulink simulation, process the data , update the next time for pause and resume the simulation.
In my Simulink model, I have an assertion that will pause the simulation when a certain simulation time is reached as explained on that page :
with the callback :
set_param(mdl,'SimulationCommand','pause')
Once the simulation is paused I get the variables that are in a "To Workspace" block in my Simulink model, process them with another script or software and re-inject them as an input for my model. Then I update my assertion to pause at the next time step and finally I resume my simulation using the command :
set_param(mdl,'SimulationCommand','continue');
and go back to the first line of my loop.
The problem is :
It seems, that when I "continue" my simulation, that MATLAB doesn't wait for my simulation to be paused again before continuing to play the script. This is the reason why I have artificially added the following lines to be sure that my simulation is paused when i try to read data from it in the workspace :
while(~strcmp( get_param(mdl,'SimulationStatus') , 'paused'))
pause(0.01);
end
since the pause() function in MATLAB allows for Simulink simulation to keep running, the method actually works, but with a major issue :
The pause() function is limited to a minimum of 0.01 seconds, and this is way too long. To solve that problem i have been looking for codes that would pause MATLAB for a shorter amount of time (typically 1 millisecond would be very satisfactory for the application that I am running) but all the solutions I have found online, even if they manage quite accurately to stop MATLAB's execution for the desired amount of time, they also have the major inconvenience to stop Simulink's execution too ! That means that the "while" loop i use to wait for Simulink to compute and pause becomes actually an infinite loop.
That is why I am calling for help to the community today, if there is a better way to do the actions that i want to realise.
PS : Before someone suggests me to use the "Matlab function" block in Simulink, I tried it too but this method is not suitable for the application tha I am running.
Thanks in advance for your help,
Regards,
Philippe
0 comentarios
Respuestas (1)
Fangjun Jiang
el 17 de Mzo. de 2016
You are trying to constantly monitor the "SimulationStatus" of your model. That is not efficient.
I wonder, in the callback of your assertion block, after pausing the simulation, can you add another function call to process the data, re-set the parameter of the assertion block and resume the simulation? You can always add a flag in that function or check some conditions to decide when you want to stop the simulation thus finish the whole task.
0 comentarios
Ver también
Categorías
Más información sobre Simulink Functions 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!