使用输出事件激活Simulink块

本文详细介绍了如何在Simulink中利用输出事件激活子系统,特别是边沿触发的输出事件。这些事件允许Stateflow图表与模型中的其他块通信。文章讨论了边沿触发器的激活方式、何时使用、如何定义以及示例,同时阐述了多次广播边沿触发输出事件的排队行为,展示了如何通过排队行为近似函数调用。

什么是输出事件?

输出事件是发生在Stateflow®图表中,但在图表外的Simulink®块中可见的事件。这种类型的事件允许图表将图表中发生的事件通知模型中的其他块。

您可以使用输出事件来激活同一模型中的其他块。您可以在图表中定义多个输出事件,其中每个输出事件映射到一个输出端口。
注意:输出事件必须是标量。

使用边沿触发器激活Simulink块

边沿触发的输出事件激活Simulink块以在模拟的当前时间步长期间执行。这种类型的输出事件只有当控制信号的变化起到触发作用时才起作用。

何时使用边沿触发的输出事件

当您的模型需要定期(或周期性)执行子系统时,使用边沿触发的输出事件来激活Simulink子系统。

如何定义边沿触发的输出事件

要定义边沿触发的输出事件:

1.将事件添加到状态流程图中,如定义事件中所述。

2.将事件的Scope属性设置为Output to Simulink。

对于您定义的每个输出事件,Stateflow块上都会显示一个输出端口。

3.将输出事件的Trigger属性设置为“Either Edge”。设置function call编译会报错。如下图所示
在这里插入图片描述
chart的action language选择为C语言。
在这里插入图片描述

注意:与边沿触发的输入事件不同,您不能指定上升或下降沿触发器。

使用边沿触发输出事件的示例

以下模型显示了如何使用边沿触发的输出事件定期激活触发的子系统。
在这里插入图片描述
该图表包含边缘触发的输出事件e1和local数据a,它们在模拟过程中在0和1之间切换。
下图是chart1内部构成。

在图表中,边沿触发的输出事件的Trigger属性始终为“Either Edge”。但是,Simulink触发的子系统可以具有上升、下降或任一边沿触发器。该模型显示了触发上升沿子系统和任一边沿子系统之间的差异。
在这里插入图片描述
输出结果如下图所示,第一条波形为双边沿触发,第二条波形为上升沿触发,第三条为输出事件波形。仿真时步长为0.1。代码中可以看到,事件计数超过0变为1时,e1事件就会翻转一次,正好四个步长,结果正确。在这里插入图片描述

在这里插入图片描述

多次广播边沿触发输出事件的排队行为

如果图表试图在单个时间步长内多次广播相同的边沿触发输出事件,则该图表在当前时间步长内仅调度其中一个广播。然而,该图表会将任何挂起的广播排队等待调度——也就是说,在连续的时间步长中一次一个。每当图表以连续的时间步长唤醒时,如果输出事件存在任何挂起的广播,则图表会向边缘触发的子系统发出执行信号。基于Simulink模型的块排序顺序,执行边沿触发子系统。

队列边沿触发的输出事件广播

在此模型中,图表调用方使用边沿触发的输出事件output_cmd来激活图表调用方。

在这里插入图片描述caller中的结构如下图所示,图表调用程序试图在一个时间步长内广播相同的边缘触发输出事件四次。

在这里插入图片描述

每次激活图表Callee时,输出数据y递增一。

在这里插入图片描述

输出结果如下图所示,此仿真步长改为1.

在这里插入图片描述

在t=1时,图表调用程序只调度四个输出事件中的一个。因此,图表Callee在该时间步骤中执行一次。但是,chart Caller将其他三个事件广播排队以备将来调度——也就是说,对于t=2、3和4,一次一个。每次Caller在连续的时间步中唤醒时,它都会激活Callee进行执行。因此,在t=1、2、3和4时,每个时间步长发生一次动作y++。在模拟过程中,Callee根据Simulink模型的块排序顺序执行。

多次广播函数调用输出事件的交错行为

如果图表试图在一个时间步长内多次广播同一函数调用输出事件,则图表会调度该时间步长内的所有广播。函数调用子系统的执行与函数调用启动器的执行交错,使得来自函数调用子子系统的输出在函数调用启动器中立即可用。

交错函数调用输出事件广播

在此模型中,图表调用方使用函数调用输出事件output_cmd来激活图表被调用方。
将上图模型的caller的输出事件触发模式改成function call,callee的输入事件也改为function call
在这里插入图片描述
在这里插入图片描述
然后会发现连接处的实线变为虚线。说明存在函数调用。运行一下仿真。

在这里插入图片描述
会发现波形从0一下子变为4。

在t=1时,图表调用程序调度所有四个输出事件。因此,图表Callee在该时间步长内执行四次。因此,动作y++也在该时间步长中发生四次。在模拟过程中,Callee的执行与Caller的执行交错进行,以便Callee的输出立即可用。
在这里插入图片描述

使用排队行为近似函数调用

当您不能使用函数调用输出事件时,例如HDL代码生成,您可以使用以下方法近似函数调用:

边沿触发的输出事件

启用的子系统

连续两次活动广播

注意:虽然您可以近似函数调用,但执行行为存在细微差异。函数调用子系统的执行发生在提供触发器的图表操作的执行过程中。但是,启用的子系统的执行发生在该图表操作的执行完成之后。

在以下模型中,图表调用程序使用边缘触发的输出事件output_cmd来激活启用的子系统。范围显示模拟过程中输出事件的值。

在这里插入图片描述

图表调用程序使用发送操作广播边缘触发的输出事件。
在这里插入图片描述

仿真时间是100个步长,步长为1s。最后看下波形

在这里插入图片描述
当模拟开始时,output_cmd的值为0。在t=20时,图表分派output_cmd。因为此值更改为1,所以启用的子系统将变为活动子系统,并在该时间步长内执行。因为没有发生其他事件广播,所以启用的子系统在每个时间步长都会继续执行,直到模拟结束。因此,显示块显示的最终值为100。

若要近似函数调用,请在同一操作中添加第二个事件广播 ,如下图所示。
在这里插入图片描述然后运行一下,看看波形。
在这里插入图片描述
当模拟开始时,output_cmd的值为0。在t=20时,图表分派output_cmd。因为此值更改为1,所以启用的子系统将变为活动子系统,并在该时间步长内执行。该图表还将第二个事件排队,以便在下一个时间步长进行调度。在t=21时,图表分派第二个输出事件,该事件将output_cmd的值更改为0。因此,启用的子系统停止执行,显示块显示最终值20。

连续边缘触发的输出事件的排队行为使您能够近似使用启用的子系统进行函数调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值