# 状态机事件使用教程


事件机制是用于触发状态转换、函数调用或激活状态的一种信号。

在 Sysblock 环境中,事件机制用于触发状态转换、函数调用或激活状态的一种信号。事件可以在状态机内部或外部产生,用于协调和同步不同状态或模块之间的行为。Sysblock 中的事件机制分为无向广播事件(输出无向事件)和定向广播事件,它们在使用流程和应用场景上有所不同。

# 事件类型

  • 无向广播事件

    无向广播事件是一种可以在整个 Chart 模块中被多个状态感知到的事件,它是全局广播,所有监听该事件的 State 都会做出响应。

  • 定向广播事件

    定向广播事件通常是在状态机的特定状态或子系统之间有明确路径传递的事件,它们的传播是定向的,只触发特定 State 或 Chart 的反应。

# 输出广播事件

  • 输出无向广播事件

    • 在状态机变量窗口内中,将事件的类型设置为 Output(输出),这意味着该事件会被发送到父级 Chart 或其他连接到该 Chart 的模块。
    • 当输出无向广播事件被触发时,Sysblock 会广播这个事件到所有相关模块,所有监听这个事件的状态和模块都会响应。
  • 输出定向广播事件

    • 在状态或图函数内部,可以使用send(eventName,targetState)的语法将事件定向发送到一个特定的目标状态。
    • 定向广播事件用于精确控制事件传播的范围,只触发目标状态或子系统的行为。

# 使用案例

# 创建事件

参考示例模型

  1. 在 Sysblock 环境的 Chart 模块内,进行状态机变量编辑,参考状态机变量设置

  2. 如上图所示,状态机变量窗口内,将变量范围设置为 Output(输出),并设置该变量的名称,即可在后续流程内使用该变量。

# 使用流程

  1. 打开如下状态机模型。

  2. 返回模型首页,双击进入 Chart 模块进入状态机内部,编辑状态机变量。

在 Sysblock 的状态机建模中,事件的发送需要采用 send() 语句,本案例中事件名称为event,则采用语句send(event)

  1. 仿真设置界面,仿真事件设置为 4 秒,并切换至输出栏,勾选存储事件时刻的变量值,单击确定

  2. 仿真结束后,在结果查看器内勾选outportSineWave->y端口,并选择曲线双游标

  3. 移动曲线游标至下图时刻,观察输出的值。
    SineWave提供一个周期为 2 的正弦波,模型采样步长为 0.1 秒。当触发x > 0.5的转移条件时,状态机发送事件,触发子系统通过事件触发运行内部的累加算法。

# 注意事项

  • 避免事件竞争:在设计复杂系统时,可能会出现多个事件同时触发的情况,这会导致状态转换竞争和不确定性。建议在设计过程中尽量避免这种情况或使用优先级机制。
  • 事件作用域管理:确保事件的作用域定义正确。局部事件(Local Event)只能在当前状态图中有效,而全局事件可以传播到其他模块中。
  • 定向广播性能优化:由于定向广播只影响特定的状态或模块,它们在大规模系统中可以减少不必须要的计算,提高仿真效率。