Main Content

使用激活状态数据监视图的活动

如果 Stateflow® 图包含与图层次结构相关的数据,则可以使用激活状态数据来简化设计。通过启用激活状态数据,您可以:

  • 避免手动更新反映图活动的数据。

  • 在仿真数据检查器中记录并监视图活动。

  • 使用图活动数据来控制其他子系统。

  • 将图活动数据导出到其他 Simulink 模块。

例如,在以下交通信号模型中,被激活的状态决定输出信号 color 的值。您可以通过启用激活状态数据来简化图的设计。在本例中,Stateflow 图可以通过跟踪状态活动来提供交通信号的颜色,因此您不必显式更新 color 的值。

要启用激活状态数据,请选择一个要监控的状态。然后,在属性检查器中:

1.选择创建监控输出

2.选择以下活动类型之一:

  • Self activity - 指示状态是否激活的布尔值

  • Child activity - 指示哪个子状态被激活的枚举值

  • Leaf state activity - 指示哪个叶状态被激活的枚举值

3.输入激活状态数据符号的数据名称

4.(可选)对于 Child activityLeaf state activity,输入激活状态数据类型的枚举名称

默认情况下,Stateflow 图将状态活动作为输出数据报告给 Simulink 模型。要将激活状态数据符号的作用域更改为局部数据,请使用符号窗格。

交通信号控制器建模

此示例使用激活状态数据为一对交通信号灯的控制器系统建模。

Traffic Controller 图中,由两个平行的子图管理着控制交通信号灯的逻辑。这两个子图具有相同的层次结构,即包含三个子状态:RedYellowGreen。输出数据 Light1Light2 对应于子图中的激活子状态。这些信号:

  • 确定动画交通信号灯的阶段。

  • 帮助统计在每个信号灯下等待的汽车数量。

  • 驱动一个 Safety Assertion 子系统,确认两个交通信号灯永远不会同时呈绿色。

要查看 Traffic Controller 图中的子图,请点击图左下角的箭头。

每个交通控制器循环遍历其子状态,从 RedGreenYellow,然后再返回到 Red。每个状态对应于交通信号灯循环中的一个阶段。输出信号 Light1Light2 指示在任意给定时刻哪个状态被激活。

红灯

Red 状态被激活时,交通信号灯循环开始。经过短暂的延迟后,控制器检查在十字路口等待的汽车。如果检测到有至少一辆汽车或者经过了一定的时间,则控制器会将 greenLightRequest 设置为 true,以此来请求绿灯。在发出请求后,控制器继续保持 Red 状态较短的一段时间,直到检测到另一个交通信号为红色,控制器才会将状态转移到 Green

绿灯

Green 状态被激活时,控制器会将 greenLightRequest 设置为 false,以此来取消其绿灯请求。控制器将 greenLightLocked 设置为 true,以防止另一个交通信号变绿。在短暂延迟后,控制器会检查是否有来自另一个控制器的绿灯请求。如果它收到请求或经过了一定的时间,则控制器会转移到 Yellow 状态。

黄灯

Yellow 状态变为非激活时,控制器会将 greenLightLocked 设置为 false,指示另一个交通信号灯可以安全地变绿。在转移到 Red 状态之前,控制器将保持 Yellow 状态一定的时间。然后开始下一个交通信号灯循环。

交通信号灯的时序

交通信号灯循环的时序通过几个参数来定义。要更改交通信号灯的计时,请双击 Traffic Controller 图,并在对话框中输入以下参数的新值:

  • REDDELAY - 从红灯激活到控制器检查十字路口等待车辆之间的时间长度。此值也是控制器发出绿灯请求后,交通信号灯可以变绿的最短时间长度。默认值为 6 秒。

  • MAXREDDELAY - 控制器在发出绿灯请求前检查车辆的最长时间。默认值为 360 秒。

  • GREENDELAY - 交通信号灯保持绿色的最长时间。默认值为 180 秒。

  • MINGREENDELAY - 交通信号灯保持绿色的最短时间长度。默认值为 120 秒。

  • YELLOWDELAY - 交通信号灯保持黄色的时间长度。默认值为 15 秒。

探索示例

  1. 点击左下角的箭头打开图。

  2. 符号窗格中,选择 greenLightRequested。然后,在属性检查器中的记录下,选择记录信号数据

  3. greenLightLockedLight1Light2 重复上一步骤。

  4. 仿真选项卡中,点击运行

  5. 仿真选项卡中的查看结果下,点击数据检查器

  6. 在仿真数据检查器中,将记录的信号显示在单独的坐标区中。布尔信号 greenLightRequestedgreenLightLocked 显示为数值 0 或 1。状态活动信号 Light1Light2 为枚举数据,其值为 GreenYellowRedNone

要在仿真过程中跟踪图活动,可以使用仿真数据检查器中的缩放和光标按钮。例如,下面列出了仿真前 300 秒内的关键时刻:

  • $t = 0$ - 在仿真开始时,两个交通信号灯都为红色。Light1Light2RedgreenLightRequestedfalsegreenLightLockedfalse

  • $t = 6$ - 6 秒(REDDELAY 的默认值)后,两条街道上都有汽车在等待,因此两个交通信号灯都请求绿灯。Light1Light2 仍为 RedgreenLightRequestedtruegreenLightLockedfalse

  • $t = 12$ - 再过 6 秒(REDDELAY 的默认值)后,信号灯 1 变为绿色,取消绿灯请求,并将 greenLightLocked 设置为 true。然后,信号灯 2 请求绿灯。Light1GreenLight2RedgreenLightRequested 变为 false 然后为 truegreenLightLockedtrue

  • $t = 132$ - 120 秒(MINGREENDELAY 的默认值)后,信号灯 1 变为黄色。Light1YellowLight2RedgreenLightRequestedtruegreenLightLockedtrue

  • $t = 147$ - 15 秒(YELLOWDELAY 的默认值)后,信号灯 1 变为红色,并将 greenLightLocked 设置为 false。然后,信号灯 2 变为绿色,取消绿灯请求,并将 greenLightLocked 设置为 trueLight1RedLight2GreengreenLightRequestedfalsegreenLightLocked 变为 false 然后为 true

  • $t = 153$ - 6 秒(REDDELAY 的默认值)后,信号灯 1 请求绿灯。Light1RedLight2GreengreenLightRequestedtruegreenLightLockedtrue

  • $t = 267$ - 在信号灯 2 为绿色 120 秒(MINGREENDELAY 的默认值)后,信号灯 2 变为黄色。Light1RedLight2YellowgreenLightRequestedtruegreenLightLockedtrue

  • $t = 282$ - 15 秒(YELLOWDELAY 的默认值)后,信号灯 2 变为红色,并将 greenLightLocked 设置为 false。然后,信号灯 1 变为绿色,取消绿灯请求,并将 greenLightLocked 设置为 trueLight1GreenLight2RedgreenLightRequestedfalsegreenLightLocked 变为 false 然后为 true

  • $t = 288$ - 6 秒(REDDELAY 的默认值)后,信号灯 2 请求绿灯。Light1GreenLight2RedgreenLightRequestedtruegreenLightLockedtrue

重复循环,直到仿真于 $t = 1000$ 秒处结束。

相关主题