poster
2019-12-14, 20:13
我在Simulink上还有另一个问题:
可以在运行时暂停模拟吗?通过“单位延迟”建立好几个步骤后,我想在下一步完成之前暂停仿真(用于显示供用户查看的值)。之后-假设-单击模拟将继续执行一个步骤,然后重复该过程。最后,它应该具有某种调试功能。
我不太确定如何实现这一点。我猜模拟参数中的某处,但是在哪里以及如何?
回答:
据我所知,有三种方法可以解决这个问题。
方法1:完全不要暂停模拟。而是在适当的行上使用示波器,以提供足够的信息来了解模拟中发生的情况。
优点:您不会被执行的顺序和模拟的停顿所困扰,不会造成令人困惑的结果。
缺点:“同步”您脑中不同范围的行可能很棘手,尤其是如果并非所有行都执行每个模拟步骤时,尤其如此。 (这部分是由于示波器框图实际上是散点图,而实际上它们是步函数。
方法2:使用内置的Simulink调试器。 (别指望)。从所使用模型的“工具”>“ Simulink调试器”菜单选项中打开它。使用此工具,您可以在某些块上设置断点,一次执行一个块或两者的某种组合。
优点:可以精确控制仿真。
缺点:在实践中,我发现此工具使用起来很混乱,并且容易使Matlab崩溃。另外,请注意执行顺序。
方法3:在模拟执行顺序的开始处创建一个嵌入式Matlab函数。这是一个例子:
函数y = func(x); y = x;
在仿真开始时将此功能放在信号线之一上(强制执行顺序)。然后在y = x上放置一个调试点;线。现在,只要您的模拟达到这一行,模拟就会暂停,等待您单击Matlab编辑器中的“继续”按钮。
优点:可靠,容易。
缺点:请注意执行顺序。
执行顺序:
如果您不熟悉Simulink中的执行顺序,建议您从模型菜单中打开“格式>块显示>排序顺序”。这将在每个块上放置密码/字母代码,以某种方式指示模拟中块执行的顺序。根据您的型号和布局,这些数字/字母代码可能有意义,也可能没有意义。我不建议在常规操作中使用此“排序顺序”显示。相反,我建议学习和理解Simulink如何确定排序顺序/执行顺序。
要记住的重要一点是,调试点(使用Simulink调试器或嵌入式Matlab的天气)是执行顺序的一部分。这意味着当您到达调试点时,该点之后的块将不会更新其状态。这很有道理,但是可能令您感到惊讶的是,显示和作用域通常是更新状态的最后一部分,即使它们已连接到执行早期由块发出的信号线。即使这些显示和作用域位于(非原子的)子系统内部,并且您的调试点位于该子系统之外,也是如此。您可能会遇到以下情况:显示器或示波器上显示的值可能来自模拟的最后时间步。
您如何解决这个问题?将您所有的模拟都放在原子子系统内,包括显示和范围。然后将调试点放在此子系统之外。这将确保无论何时击中调试点,所有块(包括显示和范围)的状态都是一致的。
如果其中任何一个都没有道理,请告诉我。
更多&回答... (https://stackoverflow.com/questions/4919916)
可以在运行时暂停模拟吗?通过“单位延迟”建立好几个步骤后,我想在下一步完成之前暂停仿真(用于显示供用户查看的值)。之后-假设-单击模拟将继续执行一个步骤,然后重复该过程。最后,它应该具有某种调试功能。
我不太确定如何实现这一点。我猜模拟参数中的某处,但是在哪里以及如何?
回答:
据我所知,有三种方法可以解决这个问题。
方法1:完全不要暂停模拟。而是在适当的行上使用示波器,以提供足够的信息来了解模拟中发生的情况。
优点:您不会被执行的顺序和模拟的停顿所困扰,不会造成令人困惑的结果。
缺点:“同步”您脑中不同范围的行可能很棘手,尤其是如果并非所有行都执行每个模拟步骤时,尤其如此。 (这部分是由于示波器框图实际上是散点图,而实际上它们是步函数。
方法2:使用内置的Simulink调试器。 (别指望)。从所使用模型的“工具”>“ Simulink调试器”菜单选项中打开它。使用此工具,您可以在某些块上设置断点,一次执行一个块或两者的某种组合。
优点:可以精确控制仿真。
缺点:在实践中,我发现此工具使用起来很混乱,并且容易使Matlab崩溃。另外,请注意执行顺序。
方法3:在模拟执行顺序的开始处创建一个嵌入式Matlab函数。这是一个例子:
函数y = func(x); y = x;
在仿真开始时将此功能放在信号线之一上(强制执行顺序)。然后在y = x上放置一个调试点;线。现在,只要您的模拟达到这一行,模拟就会暂停,等待您单击Matlab编辑器中的“继续”按钮。
优点:可靠,容易。
缺点:请注意执行顺序。
执行顺序:
如果您不熟悉Simulink中的执行顺序,建议您从模型菜单中打开“格式>块显示>排序顺序”。这将在每个块上放置密码/字母代码,以某种方式指示模拟中块执行的顺序。根据您的型号和布局,这些数字/字母代码可能有意义,也可能没有意义。我不建议在常规操作中使用此“排序顺序”显示。相反,我建议学习和理解Simulink如何确定排序顺序/执行顺序。
要记住的重要一点是,调试点(使用Simulink调试器或嵌入式Matlab的天气)是执行顺序的一部分。这意味着当您到达调试点时,该点之后的块将不会更新其状态。这很有道理,但是可能令您感到惊讶的是,显示和作用域通常是更新状态的最后一部分,即使它们已连接到执行早期由块发出的信号线。即使这些显示和作用域位于(非原子的)子系统内部,并且您的调试点位于该子系统之外,也是如此。您可能会遇到以下情况:显示器或示波器上显示的值可能来自模拟的最后时间步。
您如何解决这个问题?将您所有的模拟都放在原子子系统内,包括显示和范围。然后将调试点放在此子系统之外。这将确保无论何时击中调试点,所有块(包括显示和范围)的状态都是一致的。
如果其中任何一个都没有道理,请告诉我。
更多&回答... (https://stackoverflow.com/questions/4919916)