锁还是不锁?
昨天我向一个同事解释了import block选项的效果锁存输入用于函数调用子系统输出的反馈信号.我想在这里分享一下会很有趣。
这个问题
在接下来的模型内,calib函数调用子系统,数信号连接到一个单位延迟块。
当记录数据时,我们可以看到单位延时的输入和输出是相同的,就好像信号没有被延时一样!
尽管这看起来很奇怪,但这种行为是意料之中的。让我们看看这是为什么。
仿真循环
要理解正在发生的事情,首先需要熟悉块方法在模拟循环中执行的顺序。为了真正理解模拟循环,我推荐以下文档页面:
- 首先,您需要知道块的方程是以多个形式实现的块的方法:输出、更新、衍生等。
- 以下是这些方法被调用顺序的概述:S-Functions如何工作
- 获取所有可用block方法的完整细节:金宝app与C - s -函数的Simulink引擎交互
在我们的例子中,我们有一个固定步长和离散的模型,所以模拟循环非常简单,如下所示:
重要的是要理解Simulink执行金宝app输出方法,然后更新方法。
的执行顺序
我们需要知道的第二件事是块执行的顺序。为此,我们显示块顺序.
当您显示排序后的顺序时,您可以看到块上显示的红色数字。第一个数字是系统的编号,因此这个模型中的函数调用子系统是系统编号3。第二个数字是块在这个系统中的顺序。在本例中,增益是第一项(3:0),单位延迟秒(3:1),第三个柜台(3:2)等。
门闩的效果
为了看到锁存的效果,我为这个模型生成了代码,并添加了注释来强调这样一个事实,即当输出被写入时,反馈循环会导致输入信号立即发生变化:
这种反馈循环打破了Output-Update逻辑所基于的假设……并且会使结果难以解释。这就是为什么Latch是可用的。
使用锁存器,在步骤开始时复制输入信号,并将此复制用于计算:
结论
总之,我们可以说,引入门闩更安全,但需要额外的复制成本。如果您知道函数调用子系统可能涉及到直接反馈循环,请使用import Latching以避免意外情况。
现在轮到你了
您是否锁定了函数调用子系统的输入?让我们知道原因这里的评论.
评论
要留下评论,请点击在这里登录到您的MathWorks帐户或创建一个新帐户。