Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Debugging Simulink:在类似调试的模式下进行模拟_Debugging_Matlab_Simulink - Fatal编程技术网

Debugging Simulink:在类似调试的模式下进行模拟

Debugging Simulink:在类似调试的模式下进行模拟,debugging,matlab,simulink,Debugging,Matlab,Simulink,我在Simulink上还有一个问题: 是否可以在模拟运行时暂停模拟?在通过“单位延迟”建立了几个步骤之后,我想在下一步完成之前暂停模拟(用于显示值供用户查看)。比如说,点击后,模拟将继续进行一步,并重复该过程。 最后,它应该具有某种调试功能 我不太确定如何实现这一点。我猜在模拟参数中的某个地方,但是在哪里以及如何进行?我知道有三种方法可以实现这一点 方法1:完全不要暂停模拟。相反,在适当的行上使用范围来提供足够的信息,以了解模拟中发生了什么 优点:不会因为执行顺序和模拟暂停而导致混乱的结果 缺点

我在Simulink上还有一个问题:

是否可以在模拟运行时暂停模拟?在通过“单位延迟”建立了几个步骤之后,我想在下一步完成之前暂停模拟(用于显示值供用户查看)。比如说,点击后,模拟将继续进行一步,并重复该过程。 最后,它应该具有某种调试功能


我不太确定如何实现这一点。我猜在模拟参数中的某个地方,但是在哪里以及如何进行?

我知道有三种方法可以实现这一点

方法1:完全不要暂停模拟。相反,在适当的行上使用范围来提供足够的信息,以了解模拟中发生了什么

优点:不会因为执行顺序和模拟暂停而导致混乱的结果

缺点:在你的头脑中“时间同步”不同范围的线是很棘手的,特别是如果不是所有的线都执行每个模拟步骤的话。(这部分是因为范围块图显示为阶跃函数,而实际上它们是散点图

方法2:使用内置的Simulink调试器。(不要抱太大希望)。从您使用的模型中的“工具”>“Simulink调试器”菜单选项打开此选项。此工具允许您在某些块上设置断点、一次执行一个块或两个块的某种组合

优点:允许对模拟进行精细控制

缺点:在实践中,我发现这个工具使用起来很混乱,并且容易使Matlab崩溃。另外,要注意执行顺序

方法3:在模拟执行顺序的开始处创建一个嵌入式Matlab函数。以下是一个示例:

函数y=func(x); y=x

在模拟开始时,将此函数放在其中一条信号线上(以强制执行顺序)。然后在y=x;线上放置调试点。现在,每当模拟到达这一行时,模拟将暂停,等待您单击Matlab编辑器中的“继续”按钮

优点:可靠、简单

缺点:对执行顺序要谨慎

执行顺序:

如果您不熟悉Simulink中的执行顺序,我建议您启用“格式>块显示>排序顺序”从模型菜单。这将在每个块上放置神秘的数字/字母代码,以某种方式指示块在模拟中的执行顺序。根据您的模型和布局,这些数字/字母代码可能有很多意义,也可能没有。我不建议在常规做法中使用此排序顺序显示。相反,我建议学习和理解Simulink如何确定排序顺序/执行顺序

需要记住的重要一点是调试点(使用Simulink调试器或嵌入式Matlab的天气)是执行顺序的一部分。这意味着,当您到达调试点时,该点之后的块将不会更新其状态。这很有意义,但可能让您惊讶的是,显示和作用域通常是更新状态的最后一个块,即使它们连接到由块来源的信号线在执行的早期。即使这些显示和作用域位于(非原子)子系统内部,并且调试点位于该子系统外部,也会出现这种情况。最终,显示或作用域上显示的值可能来自模拟中的最后一个时间步

如何解决此问题?将所有模拟放在原子子系统内,包括显示器和作用域。然后将调试点放在该子系统外。这将确保每当达到调试点时,所有块(包括显示器和作用域)的状态都是一致的


如果有任何不合理的地方,请告诉我。

哇,谢谢你的详细回答:)我想我得试试你的一些建议。我想我将用“启用的子系统”建立我的模拟,这样我就可以确定每个子系统何时被处理。我想我必须测试一下,方法2或3是否更适合使用。唯一让我有点困惑的是,当我在每一行上删除这个函数时,为什么方法3强制执行任何命令?竖起大拇指,你的回答真棒!您只需要为方法3创建一个块。我建议把它放在信号线上,这样你就能知道它什么时候运行。例如,您可以将其放置在所有子系统之前和外部的一条线上。这样您就知道调试器块将首先运行。这样,当模拟暂停时,所有其他块将在一致的时间步长上冻结。