Start Simulink simulation and wait for termination

43 次查看(过去 30 天)
Hi,
My Simulink simulations are governed by a large set of .m files and rather than starting the simulation on my own with Play button, I prefer to call an .m-file which sets up the environment and then starts the simulation.
I run my simulation with
set_param('main','SimulationCommand','start');
However, this call is non-blocking. Is there a good way to block the m-file until the simulation is completed?
I could use polling in a for loop (querying for the state over and over again) but this is clearly not considered a good solution.
I could use the "sim" command but I do not want this because I do not "see" Simulink running (including the states, simulation time etc)
Ideally there would be a "blocking" option to the "SimulationCommand" "start".
Another solution I could think of (not sure if this is supported by MATLAB?) to create an event and let the matlab script wait for an event to signal. The event is then signaled in the "StopFcn" callback. It's important that this solution does not rely on polling ...
Any creative ideas?
Thanks

采纳的回答

Babak
Babak 2021-9-9
编辑:Babak 2021-9-9
Here is a solution!
Running Simulink with sim command has its limitations compared to set_param and vice versa, and I understand why you might want to use set_param. If you call set_param(gcs, 'SimulationCommand', 'start') from an mfile, the code will initialize and run the current Simulink model. Then mfile will continue to run regardless of the Simulink simulation status.
Here is a scenario:
We want to pause the mfile. It should remain paused until, let us say, Simulink pauses with an Assertationblock. Then the mfile continues to run.
Solution:
We put these lines after set_param(gcs, 'SimulationCommand', 'start') in our m-file
%This is to create a java robot. we will use it in Simulink to write codes in the command line later.
robot = java.awt.Robot;
%This will initiate the Debugging mode. mfile will be paused until we exit the debugging mode
keyboard
Now the mfile will be paused. We want to exit the debugging mode when the Simulink finishes. We can exit the debugging mode by clicking on the respective button in the Editor tab or by writing dbcont in the command line. Of course, we want to automize it. If we put dbcont in callbacks of our Simulink model, we will get an error because the Simulink model is not in the debugging mode, but our mfile is. Here is where the robot comes in handy! We will let the robot write the code in the command line for us!
We put these lines in the assertation block parameters:
commandwindow; set_param(gcs, 'SimulationCommand', 'pause')
We put these lines in the PauseFcn callback of our model :
robot.keyPress (java.awt.event.KeyEvent.VK_D);
robot.keyRelease (java.awt.event.KeyEvent.VK_D);
robot.keyPress (java.awt.event.KeyEvent.VK_B);
robot.keyRelease (java.awt.event.KeyEvent.VK_B);
robot.keyPress (java.awt.event.KeyEvent.VK_C);
robot.keyRelease (java.awt.event.KeyEvent.VK_C);
robot.keyPress (java.awt.event.KeyEvent.VK_O);
robot.keyRelease (java.awt.event.KeyEvent.VK_O);
robot.keyPress (java.awt.event.KeyEvent.VK_N);
robot.keyRelease (java.awt.event.KeyEvent.VK_N);
robot.keyPress (java.awt.event.KeyEvent.VK_T);
robot.keyRelease (java.awt.event.KeyEvent.VK_T);
robot.keyPress (java.awt.event.KeyEvent.VK_ENTER);
robot.keyRelease (java.awt.event.KeyEvent.VK_ENTER);
when the assertation fails, commandwindow command will put the cursor in the command line. set_param(gcs, 'SimulationCommand', 'pause') command will pause our Simulink model and call the PauseFcn callback of the Simulink model, and the codes in the PauseFcn will run. The code block in the PauseFcn will call the java robot, which will write dbcont command in the command line and press enter for us!
!!!!!!!!!!!!!!!!!!!!! Important to note: This code depends on the keystrokes of your keyboard and the placement of the cursor! If let us say you press a key while the Simulink is paused and the robot is typing, it will interfere with the operation!!!!!!!!!!!!!!!!!!!!!!!!

更多回答(2 个)

Sviatoslav Klos
Sviatoslav Klos 2018-8-29
As I see you just need to stop simulation that you start from .m file? Here is the URL with some tutorials (https://www.mathworks.com/help/simulink/ug/control-simulations-programmatically.html). Maybe you can just type set_param('main','SimulationCommand','stop').
If you need smth not I mentioned above maybe 'stop sim' block in Simulink library would be helpful.

Daniel H
Daniel H 2018-9-3
I am aware that I can issue the stop command using set_param but my point is that this command is not blocking - it returns immideately. So if I run SimulationCommand start, how do I know when it is done?
In any case, thank you for taking the time to respond.

类别

Help CenterFile Exchange 中查找有关 Simulation 的更多信息

Community Treasure Hunt

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

Start Hunting!

Translated by