MathWorks应用工程师,博客介绍关于 Simulink 以及其它 MathWorks 的基于模型的设计工具。
几天前,我需要调试一个较大的模型,出现了下面这个错误:
在我这个模型里,这个代数环涉及到一百多个模块,信号遍布整个模型,还有总线结构,把问题变得很复杂,难以分析。
ashow(为什么不再需要它了!)
多年来,我一直使用 ashow 函数高亮显示代数环。以下是一个简单模型的示例:
然而,它不太好用,而且它只能高亮显示代数环的一部分。显然,它也无法高亮显示我现在需要解决的这个代数环。
这是因为,这里的代数环是定点信号,这就导致了类似“先有蛋还是先有鸡”的问题。。为了让 ashow 运行,它需要模型能编译。然而,该环是定点信号,Simulink 引擎知道它自己无法求解,于是在模型编译过程中报错,导致无法使用 ashow。
就在那时,我想起了一个相对较新,但经常忘记的函数:
Simulink.BlockDiagram.getAlgebraicLoops
如果你仔细阅读过代数环的相关文档页面,可能已经知道到,Simulink 提供了 Simulink.BlockDiagram.getAlgebraicLoops 函数,它是一种新的,且更有效的代数环高亮显示方法。
用上述同一示例,结果如下:
这个函数在 R2015a 中引入,并在 R2017b 中做了改进,能找到并高亮显示更多类型的代数环。在我的案例中,它已经能高亮显示涉及到定点信号的代数环。根据该环高亮提示,就可找出引入延迟模块并打断该环的最佳位置。
请注意以下几点:
以红色高亮显示的模块是我们称之为代数变量的模块。可以先尝试在这类模块的输出端添加一个入延迟模块(除非是连续信号,参见下列相关阅读)。
如果检测到该环是人为代数环,它将以虚线高亮显示,这表示应使用原子子系统或模型引用的 Minimize Algebraic Loop feature 勾选项来解决这个问题。
Simulink.BlockDiagram.getAlgebraicLoops 还会返回一个对象类型的返回值给出模型代数环的各种属性,其中包括所涉及模块的句柄,您可以酌情使用。
以下是高亮显示的代数环的定点模型示例:
全部0条评论
快来发表一下你的评论吧 !