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