对于能够使用MATLAB GUI中止并行仿真的用例,我想在用户按下“停止”按钮后停止所有计划的仿真。
使用parsim
命令可一次提交所有模拟,因此,最可取的解决方案是回调GUI变量(App Designer)。
我已经考虑过但并未完全提供理想解决方案的方法:
parsim
使用Simulink.SimulationInput类作为输入来运行模拟,从而允许在每次模拟开始时修改preSimFcn
。除了到目前为止有意引发错误外,我还没有找到一种在初始化阶段“跳过”模拟的方法。谢谢您的帮助!
更新1 :使用preSimFcn
将终止时间设置为等于开始时间,可以大大减少仿真时间。但是,由于仍然要计算第一步,因此必须有一个更好的解决方案。
simin = simin.setModelParameter('StopTime',get_param(mdl,'StartTime'))
更新2 :故意抛出执行preSimFcn
的错误,例如将其设置为
simin = simin.setModelParameter('SimulationCommand','stop')
为我提供了迄今为止最短的终止时间。但是,它需要捕获并识别Simulink.SimulationOutput
对象的ErrorMessage
中的错误。由于这正是我要避免的“丑陋”实现,因此该问题仍然存在。
答案 0 :(得分:0)
如果您使用的是17b或更高版本,parsim将为“ RunInBackground”提供一个选项。它返回一个Future对象数组。
F = parsim(in, 'RunInBackground', 'on')
请注意,仅适用于并行仿真。 Simulink.Simulation.Future对象F提供了一个cancel方法,该方法将终止模拟。您可以使用fetchOutputs方法从模拟中获取输出。
F.cancel();