Main Content

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

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

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

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

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

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

有关详细信息,请参阅创建层次结构来管理复杂系统

激活状态数据

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

Chart modeling a traffic signal, with states called Red, Yellow, and Green. The value of the symbol color indicates which state is active.

Stateflow 通过输出端口将激活状态数据提供给 Simulink 或将其作为局部数据提供给图。下表列出了可用的激活状态数据的不同模式。

活动模式数据类型描述
自身活动布尔该状态是否为激活?
子活动枚举哪个子状态被激活?
叶状态活动枚举哪个叶状态被激活?

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

  1. 选中创建监控输出复选框。

  2. 从下拉列表中选择一种活动模式。

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

  4. (可选)对于子状态或叶状态活动,输入激活状态数据类型的 Enum name

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

激活状态数据的示例

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

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

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

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

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

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

交通控制器子图的行为

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

Chart modeling a traffic signal. The chart uses active state data to indicate which state is active.

红灯

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

绿灯

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

黄灯

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

交通信号灯的时序

交通信号灯循环的时序通过几个参数来定义。要更改这些参数的值,请双击 Traffic Controller 图并在“模块参数”对话框中输入新值。

参数预设值描述
REDDELAY6 秒从红灯激活到控制器开始检查十字路口等待车辆之间的时间长度。这也是控制器发出绿灯请求后,交通信号灯可以变绿的最短时间。
MAXREDDELAY360 秒控制器在发出绿灯请求前检查车辆的最长时间。
GREENDELAY180 秒交通信号灯保持绿色的最长时间。
MINGREENDELAY120 秒交通信号灯保持绿色的最短时间。
YELLOWDELAY15 秒交通信号灯保持黄色的时间长度。

探索示例

  1. greenLightRequestedgreenLightLockedLight1Light2 启用记录。在符号窗格中,选择每个符号。然后,在属性检查器中的记录下,选择记录信号数据

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

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

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

Simulation Data Inspector showing the output of the chart.

要在仿真过程中跟踪图活动,可以使用仿真数据检查器中的缩放和光标按钮。例如,下表详细说明了仿真前 300 秒内的活动。

时间描述Light 1Light2greenLightRequestedgreenLightLocked
t = 0在仿真开始时,两个交通信号灯都为红色。RedRedfalsefalse
t = 66 秒后 (REDDELAY),两条街道上都有汽车在等待。两个交通信号灯都通过设置 greenLightRequested = true 来请求绿灯。RedRedtruefalse
t = 12

再经过 6 秒后 (REDDELAY):

  • 信号灯 1 变绿,设置 greenLightLocked = truegreenLightRequested = false

  • 信号灯 2 通过设置 greenLightRequested = true 来请求绿灯。

GreenRedfalse,然后 truetrue
t = 132

120 秒后 (MINGREENDELAY),信号灯 1 变黄。

YellowRedtruetrue
t = 147

15 秒后 (YELLOWDELAY):

  • 信号灯 1 变红,设置 greenLightLocked = false

  • 信号灯 2 变绿,设置 greenLightLocked = truegreenLightRequested = false

RedGreenfalsefalse,然后 true
t = 153

6 秒后 (REDDELAY),信号灯 1 通过设置 greenLightRequested = true 请求绿灯。

RedGreentruetrue
t = 267

信号灯 2 在持续 120 秒绿灯 (MINGREENDELAY) 后变黄。

RedYellowtruetrue
t = 282

15 秒后 (YELLOWDELAY):

  • 信号灯 2 变红,设置 greenLightLocked = false

  • 信号灯 1 变绿,设置 greenLightLocked = truegreenLightRequested = false

GreenRedfalsefalse,然后 true
t = 288

6 秒后 (REDDELAY),信号灯 2 通过设置 greenLightRequested = true 请求绿灯。

GreenRedtruetrue

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

相关主题