我在 Simulink 上有另一个问题:
是否可以在运行时暂停模拟?通过“单元延迟”建立几个步骤后,我想在下一步完成之前暂停我的模拟(用于显示值供用户查看)。之后 - 比方说 - 单击模拟将继续执行一个步骤并重复该过程。最后,这应该具有某种调试功能。
我不是很确定如何实现这一点。我猜在模拟参数的某个地方,但是在哪里以及如何?
据我所知,您可以通过三种方式解决此问题。
方法一: 完全不要暂停模拟。而是在适当的行上使用范围来提供足够的信息来了解模拟中发生了什么。
优点:您不会被执行顺序和模拟暂停导致混乱的结果所困扰。
缺点:在你的脑海中“时间同步”不同范围的线可能很棘手,特别是如果不是所有的线都执行每个模拟步骤。(这部分是由于示波器块图显示为阶跃函数,而实际上它们是散点图。
方法 2: 使用内置的 Simulink 调试器。(不要抱太大希望)。从您正在使用的模型中的 Tool>Simulink Debugger 菜单选项打开它。此工具允许您在某些块上设置断点,一次执行一个块,或两者的某种组合。
优点:允许对模拟进行精细控制。
缺点:在实践中,我发现这个工具使用起来很混乱,并且容易导致 Matlab 崩溃。另外,要注意执行顺序。
方法 3: 在您的仿真执行顺序开始时创建一个嵌入式 Matlab 函数。这是一个例子:
函数 y=func(x); y=x;
在模拟开始时将此函数放在其中一条信号线上(以强制执行顺序)。然后在y=x上放一个调试点;线。现在,每当您的模拟达到这一行时,模拟就会暂停,等待您单击 Matlab 编辑器中的“继续”按钮。
优点:可靠,简单。
缺点:注意执行顺序。
执行顺序:
如果您不熟悉 Simulink 中的执行顺序,建议您从模型菜单中打开“Format>Block Displays>Sorted Order”。这将在每个块上放置神秘的数字/字母代码,以某种方式指示块在您的模拟中执行的顺序。根据您的型号和布局,这些数字/字母代码可能很有意义,也可能没有。我不建议在通常的实践中使用这种排序顺序显示。相反,我建议学习和理解 Simulink 如何确定排序顺序/执行顺序。
要记住的重要一点是调试点(使用 Simulink 调试器或嵌入式 Matlab 的天气)是执行顺序的一部分。这意味着当您到达调试点时,该点之后的块不会更新它们的状态。这很有意义,但可能会让您感到惊讶的是,显示器和示波器通常是更新状态的最后一些块,即使它们在执行早期连接到由块提供的信号线。即使这些显示器和范围在(非原子)子系统内部,并且您的调试点在该子系统之外也是如此。您最终可能会遇到显示器或示波器上显示的值可能来自模拟中的最后一个时间步的情况。
你如何解决这个问题?将您的所有模拟放在一个原子子系统中,包括显示器和范围。然后把你的调试点放在这个子系统之外。这将保证无论何时命中调试点,所有块(包括显示器和范围)的状态都是一致的。
如果其中任何一个没有意义,请告诉我。