使用激活状态数据监视图的活动
如果 Stateflow® 图包含与图层次结构高度相关的数据,则可以使用激活状态数据来简化设计。通过启用激活状态数据,您可以:
避免手动更新反映图活动的数据。
在仿真数据检查器中记录并监视图活动。
使用图活动数据来控制其他子系统。
将图活动数据导出到其他 Simulink® 模块。
有关详细信息,请参阅创建层次结构来管理复杂系统。
激活状态数据
使用激活状态数据输出可以简化一些 Stateflow 图的设计。例如,在以下交通信号模型中,被激活的状态决定符号 color
的值。启用激活状态数据时,Stateflow 可以通过跟踪状态活动来提供交通信号的颜色。不再需要显式更新 color
,因此您可以删除此符号并简化图的设计。
Stateflow 通过输出端口将激活状态数据提供给 Simulink 或将其作为局部数据提供给图。下表列出了可用的激活状态数据的不同模式。
活动模式 | 数据类型 | 描述 |
---|---|---|
自身活动 | 布尔 | 该状态是否为激活? |
子活动 | 枚举 | 哪个子状态被激活? |
叶状态活动 | 枚举 | 哪个叶状态被激活? |
要启用激活状态数据,请选择一个要监控的状态。然后,在属性检查器中:
选中创建监控输出复选框。
从下拉列表中选择一种活动模式。
输入激活状态数据符号的数据名称。
(可选)对于子状态或叶状态活动,输入激活状态数据类型的 Enum name。
默认情况下,Stateflow 以输出数据形式报告状态活动。要将激活状态数据符号的作用域更改为局部数据,请使用符号窗格。
激活状态数据的示例
此示例使用激活状态数据为一对交通信号灯的控制器系统建模。
在 Traffic Controller 图中,两个并行的子图管理着控制交通信号灯的逻辑。这两个子图具有相同的层次结构,即包含三个子状态:Red
、Yellow
和 Green
。输出数据 Light1
和 Light2
对应于子图中的激活子状态。这些信号:
确定动画交通信号灯的阶段。
帮助统计在每个信号灯下等待的汽车数量。
驱动 Safety Assertion 子系统,确认两个交通信号灯永远不会同时呈绿色。
要查看 Traffic Controller 图中的子图,请点击图左下角的箭头。
交通控制器子图的行为
每个交通控制器循环遍历其子状态,从 Red
到 Green
到 Yellow
,然后再返回到 Red
。每个状态对应于交通信号灯循环中的一个阶段。输出信号 Light1
和 Light2
指示在任意给定时刻哪个状态被激活。
红灯
当 Red
状态被激活时,交通信号灯循环开始。经过短暂的延迟后,控制器检查在十字路口等待的汽车。如果检测到有至少一辆汽车或者经过了一定的时间,则控制器会将 greenLightRequest
设置为 true
,以此来请求绿灯。在发出请求后,控制器继续保持 Red
状态较短的一段时间,直到检测到另一个交通信号为红色,控制器才会将状态转移到 Green
。
绿灯
当 Green
状态被激活时,控制器会将 greenLightRequest
设置为 false
,以此来取消其绿灯请求。控制器将 greenLightLocked
设置为 true
,以防止另一个交通信号变绿。一段时间后,控制器会检查是否有来自另一个控制器的绿灯请求。如果它收到请求或经过了一定的时间,则控制器会转移到 Yellow
状态。
黄灯
在转移到 Red
状态之前,控制器将保持 Yellow
状态一定的时间。当 Yellow
状态变为非激活时,控制器会将 greenLightLocked
设置为 false
,指示另一个交通信号灯可以安全地变绿。然后开始下一个交通信号灯循环。
交通信号灯的时序
交通信号灯循环的时序通过几个参数来定义。要更改这些参数的值,请双击 Traffic Controller 图并在“模块参数”对话框中输入新值。
参数 | 预设值 | 描述 |
---|---|---|
REDDELAY | 6 秒 | 从红灯激活到控制器开始检查十字路口等待车辆之间的时间长度。这也是控制器发出绿灯请求后,交通信号灯可以变绿的最短时间。 |
MAXREDDELAY | 360 秒 | 控制器在发出绿灯请求前检查车辆的最长时间。 |
GREENDELAY | 180 秒 | 交通信号灯保持绿色的最长时间。 |
MINGREENDELAY | 120 秒 | 交通信号灯保持绿色的最短时间。 |
YELLOWDELAY | 15 秒 | 交通信号灯保持黄色的时间长度。 |
探索示例
对
greenLightRequested
、greenLightLocked
、Light1
和Light2
启用记录。在符号窗格中,选择每个符号。然后,在属性检查器中的记录下,选择记录信号数据。在仿真选项卡中,点击运行
。
在仿真选项卡中的 查看结果下,点击数据检查器
。
在仿真数据检查器中,将记录的信号显示在单独的坐标区中。布尔信号
greenLightRequested
和greenLightLocked
显示为数值 0 或 1。状态活动信号Light1
和Light2
显示为枚举数据,其值为Green
、Yellow
、Red
和None
。
要在仿真过程中跟踪图活动,可以使用仿真数据检查器中的缩放和光标按钮。例如,下表详细说明了仿真前 300 秒内的活动。
时间 | 描述 | Light 1 | Light2 | greenLightRequested | greenLightLocked |
---|---|---|---|---|---|
t = 0 | 在仿真开始时,两个交通信号灯都为红色。 | Red | Red | false | false |
t = 6 | 6 秒后 (REDDELAY ),两条街道上都有汽车在等待。两个交通信号灯都通过设置 greenLightRequested = true 来请求绿灯。 | Red | Red | true | false |
t = 12 | 再经过 6 秒后 (
| Green | Red | false ,然后 true | true |
t = 132 | 120 秒后 ( | Yellow | Red | true | true |
t = 147 | 15 秒后 (
| Red | Green | false | false ,然后 true |
t = 153 | 6 秒后 ( | Red | Green | true | true |
t = 267 | 信号灯 2 在持续 120 秒绿灯 ( | Red | Yellow | true | true |
t = 282 | 15 秒后 (
| Green | Red | false | false ,然后 true |
t = 288 | 6 秒后 ( | Green | Red | true | true |
重复循环,直到仿真于 t = 1000 秒处结束。