Simulin金宝appk上的Guy

金宝appSimulink &基于模型的设计

模拟软件的启动和关闭

本周,我们终于进入了初始化函数重置功能而且终止函数块。

作为起点,我建议看看这是我的同事Teresa Hubscher-Younger制作的关于初始化和终止函数的视频

模拟生成代码的启动和关闭

这篇关于导出函数模型的前一篇文章,我们已经看到了如何模拟配置为导出函数的模型:通过使用模型块。

在这个例子中,我们能够模拟代码运行一次的行为。换句话说,如果代码将在嵌入式控制器单元(ECU)上运行,则此模型模拟的是,当模拟开始时ECU启动,代码运行,当模拟结束时ECU关闭。

这很有趣,但是如果您想模拟一个更大的场景(ECU多次启动和关闭),该怎么办呢?这就是初始化函数而且终止函数都是为之设计的。

什么特蕾莎修女的例子Does是模拟一辆汽车在两种不同的情况下多次启动和关闭。当汽车运行时,我们增加一个计数器来跟踪发动机在其整个生命周期中运行了多长时间。在正常关机情况下,当钥匙关闭时,我们需要将总运行时间写入非易失性存储器,以便下次汽车启动时可以检索它。万一电池没电了,汽车也会关闭,但是在这种情况下,我们没有时间写入非易失性存储器。

让我们看看如何做到这一点!

启用初始化和终止事件

让我们从一个实现计数器的简单导出函数模型开始。

输出功能计数器模型

在R2016b中,您将注意到,当您引用一个模型设置来导出函数时,model块的对话框包含两个新选项。

模型参考对话框

当您启用这些时,模型块将显示两个新的端口,您可以连接函数调用信号。作为第一个简单的测试,让我们创建一个状态流图,在键打开或关闭时启动和关闭计数器:

带有初始化和终止端口的模型引用

如果我们查看结果,可以看到计数器在键打开时增加,在键关闭时停止。当键从关转到开时,计数器被重置。

带有初始化和终止端口的模型引用

自定义初始化和终止事件

如前所述,我们不希望计数器在每次关机时重置。为了保持计数器的值,我们可以使用初始化函数和终止函数块。在Terminate函数中,我们使用State Reader块获取当前计数器值,并将其存储到数据存储块中。类似地,在Initialize函数中,我们将读取数据存储块并使用它来初始化计数器。

带有初始化和终止端口的模型引用

现在,当我们查看结果时,计数器在关闭和重新启动后一直在增加。

带有初始化和终止端口的模型引用

重置功能

如前所述,我们还需要处理车辆因为电池电压过低而关闭的情况。这意味着我们不希望每次模型终止时都写入数据存储。

为此,我们可以将终止事件侦听器块中的事件类型从终止更改为重置给它起个有意义的名字。在这种情况下,由于模型不再具有终止函数块,当模拟控制触发终止事件时,将执行默认块终止函数。

重置功能

我们更新状态流调度器来覆盖两种关机情况:

带有初始化和终止端口的模型引用

注意,在上面的模型中,在模型引用参数对话框中,我们启用了“显示模型重置端口选项”。这给了我们额外的writeNVmem端口。

在查看结果时,我们现在可以看到,如果关机是由电池故障引起的,则计数器的值不会为下一次重新启动保留。

带有初始化和终止端口的模型引用

代码生成

现在我们有了一个行为符合预期的模拟,让我们看看如何配置代码生成。

在生成的代码中,写入非易失性内存很可能需要使用自定义代码或嵌入式目标提供的硬件服务来完成。为了解决这个问题,我们将使用函数调用器块和Simulink函数金宝app在之前的文章中强调过

简单地说,我们将导出函数模型中的数据存储块替换为函数调用方块。为了获得模拟行为,我们使用Simulink函数实现了与之前在初始化和终止函数中金宝app所实现的相同的逻辑,读取和写入数据存储块。

这是整体设计的样子:

导出函数模型生成的代码

如在这是之前的文章,对于代码生成,可以在导出函数模型的配置中指定函数writeEngineRunTimeNV而且readEngineRunTimeNV应该在连接时找到。

如果我们为Export Function模型生成代码,得到的代码如下所示:

导出函数模型生成的代码

现在轮到你了

请在下方留言,让我们知道你对这种语义的看法。

|

评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。