Main Content

通过发送输出事件激活 Simulink 模块

输出事件是在 Stateflow® 图中发生但在 Stateflow 图之外的 Simulink® 模块中可见的事件。这种类型的事件支持 Stateflow 图将该图中发生的事件通知给其他模块。要定义输出事件,请执行以下操作:

  1. 向 Stateflow 图添加一个事件,如定义图中的事件中所述。

  2. 将事件的作用域属性设为输出到 Simulink。对于定义的每个输出事件,Stateflow 模块上会出现一个输出端口。

  3. 输出事件可以通过更改控制信号(边沿触发器)或对 Simulink 模块进行函数调用来激活模型中的其他模块。

    • 要指定边沿触发输出事件,请将触发器属性设置为任一沿

    • 要指定函数调用输出事件,请将触发器属性设置为函数调用

有关详细信息,请参阅通过广播事件同步模型组件

广播输出事件

要将输出事件从一个图广播到另一个图,请使用运算符 send。输出事件广播的格式是

send(event_name)
其中 event_name 是输出事件。

使用边沿触发器激活 Simulink 模块

事件触发的输出事件会激活 Simulink 模块在仿真的当前时间步内执行。使用此类型的输出事件时,控制信号的变化充当触发器。有关详细信息,请参阅使用触发子系统 (Simulink)

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

当模型要求 Simulink 子系统按一定的规律或周期执行时,请使用边沿触发输出事件来激活子系统。例如,以下模型使用边沿触发输出事件以固定时间间隔激活两个触发子系统。

其中的图包含边沿触发输出事件 e1,它在仿真期间会在 0 和 1 之间交替。

在 Stateflow 图中,边沿触发输出事件的触发器属性始终为 Either Edge。Simulink 触发子系统可以有 RisingFallingEither 边沿触发器。该模型显示触发 Either 边沿子系统和触发 Rising 边沿子系统之间的区别:

  • 输出事件在每次广播时都触发 Either 边沿子系统。当事件信号从 0 切换到 1 或从 1 切换到 0 时,会发生触发。

  • 输出事件每隔一个广播触发 Rising 边沿子系统。仅当事件信号从 0 切换到 1 时,才会发生触发。

多个边沿触发输出事件的排队行为

对于每个时间步,图仅调度边沿触发输出事件的一个广播。当单个时间步中存在多个广播时,图将调度一个广播并让其余广播排队,以在后续时间步中进行调度。例如,在以下模型中,Caller 图使用边沿触发输出事件 output_cmd 激活 Callee 图。

Caller 图尝试在单个时间步内将同一边沿触发输出事件广播四次。

每次激活 Callee 图,输出数据 y 都会递增 1。

仿真模型时,在时间 t= 1 时,Caller 图将调度四个输出事件之一。Callee 图在该时间步中执行一次。Caller 图让其他三个事件广播排队,以便将来在 t = 2、t = 3 和 t = 4 时调度。因此,y 的值在时间 t = 1、t = 2、t = 3 和 t = 4 时都会递增 1。

使用函数调用激活 Simulink 模块

函数调用输出事件会激活 Simulink 模块,使其在仿真的当前时间步内执行。这种类型的输出事件只对可以使用函数调用触发的模块有效。有关详细信息,请参阅使用函数调用子系统 (Simulink)

何时使用函数调用输出事件

当模型需要在与函数调用相同的时间步中访问来自 Simulink 模块的输出数据时,可以使用函数调用输出事件来激活该模块。例如,此模型包含两个函数调用输出事件:

  • 在 Edge to Function 图中,输出事件 call 激活 Looping Scheduler 图。

  • 在 Looping Scheduler 图中,输出事件 A1 激活 Simulink 子系统。

多个函数调用输出事件的交叉行为

当单个时间步中存在某一函数调用输出事件的多个广播时,Stateflow 图会在该时间步内调度所有广播。函数调用子系统的执行与图的执行交叉进行,因此函数调用子系统的输出可立即在图中使用。例如,在以下模型中,Caller 图使用函数调用输出事件 output_cmd 激活 Callee 图。

Caller 图尝试在单个时间步内将同一函数调用输出事件广播四次。

每次激活 Callee 图,输出数据 y 都会递增 1。

仿真模型时,Caller 图会在时间 t= 1 时调度所有四个输出事件。在该时间步期间,Callee 图执行四次。Callee 图的执行与 Caller 图的执行交叉进行,以便 Callee 图的输出可立即使用。结果,| y | 的值在时间 t = 1 时从 0 增加到 4。

使用边沿触发事件模拟函数调用

如果无法使用函数调用输出事件(例如对于 HDL 代码生成),则可以使用以下各项来模拟函数调用:

  • 边沿触发输出事件

  • 使能子系统

  • 两个连续事件广播

您可以利用连续边沿触发输出事件的排队行为并借助使能子系统模拟函数调用。

例如,在以下模型中,边沿触发输出事件 output_cmd 激活使能子系统。

Caller 图使用 send 运算符广播边沿触发输出事件。

仿真开始时,触发信号的值为 0。在时间 t = 20 时,图将调度 output_cmd,从而将触发信号的值更改为 1。使能子系统变为激活状态,并在该时间步期间执行。由于未发生其他事件广播,使能子系统将在每个时间步继续执行,直到仿真在 t= 40 时结束。Display 模块显示最终值为 40。

要模拟函数调用,可在同一动作中添加另一个事件广播。

仿真开始时,触发信号的值为 0。在时间 t = 20 时,图将调度 output_cmd,从而将触发信号的值更改为 1。使能子系统变为激活状态,并在该时间步期间执行。Stateflow 图会让第二个事件排队等待在下一时间步中调度。在时间 t= 21 时,Stateflow 图会调度第二个输出事件,这会将触发信号的值改回为 0。使能子系统会停止执行,Display 模块显示最终值为 20。

虽然您可以模拟函数调用,但执行行为存在细微差异。函数调用子系统在提供触发器的 Stateflow 图动作执行期间执行。使能子系统则在 Stateflow 图动作执行完成之后执行。

将输出事件与输出端口相关联

在图中定义输出事件时,输出事件端口将显示在图模块的右侧。输出事件必须是标量,但您可以在一个图中定义多个输出事件。输出事件的端口属性指定输出端口的位置。

默认情况下,端口值按添加输出事件的顺序显示。您可以通过修改事件的端口属性来更改以上分配。更改输出事件的端口属性时,其余输出事件的端口值会自动重新编号。

另请参阅

相关主题