【问题标题】:Simulink: Simulation in a debugging-like modeSimulink:类似调试模式下的仿真
【发布时间】:2011-02-07 09:55:40
【问题描述】:

我在 Simulink 上有另一个问题:

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

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

【问题讨论】:

    标签: debugging matlab simulink


    【解决方案1】:

    据我所知,您可以通过三种方式解决此问题。

    方法一:不要暂停模拟。而是在适当的行上使用范围来提供足够的信息来了解模拟中发生了什么。

    优点:您不会被执行顺序和模拟暂停导致混乱结果所困扰。

    缺点:在您的脑海中“时间同步”不同范围的行可能会很棘手,尤其是如果不是所有行都执行每个模拟步骤。 (这部分是因为示波器块图显示为阶梯函数,而实际上它们是散点图。

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

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

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

    方法 3: 在您的模拟执行顺序开始时创建一个嵌入式 Matlab 函数。这是一个例子:

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

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

    优点:可靠、简单。

    缺点:注意执行顺序。

    执行顺序:

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

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

    您如何解决这个问题?将您的所有模拟放在一个原子子系统中,包括显示器和范围。然后把你的调试点放在这个子系统之外。这将保证每当调试点被命中时,所有块(包括显示和范围)的状态都是一致的。

    如果其中任何一个没有意义,请告诉我。

    【讨论】:

    • 哇,感谢您非常详细的回答 :) 我想我必须尝试您的一些建议。我想我会用“启用的子系统”建立我的模拟,这样我就可以确定何时处理每个子系统。我想我必须测试一下,方法 2 还是 3 使用起来更舒服。唯一让我有点困惑的是,为什么方法 3 强制任何顺序,当我把这个函数放在每一行上时?为您的精彩回答竖起大拇指!
    • 您只需要为方法 3 创建一个块。我建议将其放在信号线上,以便您知道它何时运行。例如,您可以将它放在所有子系统之前和之外的一条线上。这样您就知道调试器块将首先运行。这样,当模拟暂停时,所有其他块都将在一致的时间步长处冻结。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-22
    相关资源
    最近更新 更多