交通信号灯示例的序列图仿真
这演示了如何仿真交通信号灯的 System Composer™ 架构模型,并验证模型仿真结果与模型序列图中的交互是否一致。示例模型使用了来自 Stateflow® 的模块。如果您没有 Stateflow 许可证,则可以打开和仿真模型,但只能进行基本更改,例如修改模块参数。
这个交通信号灯示例使用序列图描述了行人穿越十字路口的过程。
交通信号灯的变化周期为:红灯到绿灯,再到黄灯。
当行人过街按钮被按下时,如果交通信号灯为绿色,交通信号灯将从黄色变为红色,并保持该状态一段时间。
行人应在行人通行信号灯亮起时过马路。
打开模型。
model = systemcomposer.openModel("TLExample");
打开 架构视图库 查看序列图。
openViews(model);
仿真 Inhibit
序列图
打开 Inhibit
序列图。在“架构视图库”的视图浏览器中,选择 Inhibit
序列图。
您可以使用工具栏中的下一条消息按钮逐步进行序列图的仿真。
要仿真第一条消息,请点击工具栏中的下一条消息按钮。观察绿色复选标记,表示消息在执行过程中已通过验证。当消息事件
switchEvent
发生时,switch
生命线被激活。点击继续按钮,对图进行仿真。观察
Alt
片段第一个操作数的 消息上的绿色复选标记。由于inhibit
标志等于 0,因此Alt
片段的第一个操作数被激活。switch
生命线向controller
生命线发送消息,指示行人按下了过街按钮。然后,switch
生命线向lampController
生命线发送消息,请求停止交通,让行人穿越十字路口。
通过编程仿真 PressDetection
序列图
打开 PressDetection
序列图。在视图浏览器中,选择 PressDetection
序列图。
您可以使用 Simulink.SimulationInput
对象对 sim
函数进行编程仿真。ObservedSequenceDiagrams
模型配置参数指定要仿真的序列图。要指定要仿真的序列图,请为仿真设置 ObservedSequenceDiagrams
模型参数。
simIn = Simulink.SimulationInput("TLExample"); simIn = setModelParameter(simIn,ObservedSequenceDiagrams="PressDetection",... ObservedSequenceDiagramsOut="sequenceDiagramOutput"); simOut = sim(simIn);
ObservedSequenceDiagramsOut
是 simOut
中捕获的 Simulink.SimulationOutput
对象的属性。该对象包含以下属性:
Name
:正在仿真的序列图的名称。Completed
:仿真是否完成。NumErrors
:发现的错误数量,计算仿真后序列图中消息和持续时间约束旁边的红色感叹号的数量。红色标记表示消息触发条件已满足,但约束条件未满足。
为了方便使用,您可以将可选的 ObservedSequenceDiagramsOut
参数重命名为 sequenceDiagramOutput
或任何有效的 MATLAB® 变量名称。
sequenceDiagramOut = simOut.sequenceDiagramOutput
sequenceDiagramOut = struct with fields:
Name: 'PressDetection'
Completed: 1
NumErrors: 0
触发条件满足且约束条件满足的消息将变为绿色并带有复选标记。由于所有消息约束都满足,错误数为 0
。
当行人按下过马路按钮时,信号 sw
的值上升到 1
。当此操作发生时,poller
生命线将消息 switchEvent
发送给 switch
生命线。此操作会通知 switch
生命线有行人正在等待,以便 switch
生命线通知 controller
生命线。交通信号灯随后变为红色以停止交通,行人通行信号灯亮起。
使用 PedestrianCross
序列图进行仿真和错误检测
打开 PedestrianCross
序列图。在视图浏览器中,选择 PedestrianCross
序列图。
您可以使用工具栏中的运行按钮来仿真序列图。点击运行按钮,对图进行仿真。
观察消息上的绿色复选标记。您可以使用 序列查看器 来观察仿真事件在模型中发生的情况,因为序列图描述了预计会发生的情况。要打开“序列查看器”,在工具栏的仿真选项卡中,点击序列查看器选项。
查看 序列查看器 中与行人过马路消息相对应的消息事件。
在“序列查看器”中,您可以观察以下仿真事件:
行人过街按钮被按下了。
交通信号灯完成一个循环,从绿色 (
traffic(3)
) 到黄色 (traffic(2)
) 再到红色 (traffic(1)
)。行人过街信号灯通过将交通信号灯变为红色,允许行人过街。
交通信号灯变红后,人行横道信号灯变绿 (
trafficPed(3)
)。
您可以使用序列图来检测预期行为与观察到的行为之间的错误和不一致之处。在仿真序列图时,如果检测到错误,消息表达式或持续时间约束表达式将变为红色,并显示警告图标。
虽然 PedestrianCross
序列图按照预期进行了仿真,但您可以故意引入错误来观察这种行为。
返回
PedestrianCross
序列图。要编辑持续时间约束表达式,请双击表达式为
1 < t < 3sec
的持续时间约束。将表达式更改为
t < 1msec
,在序列图执行中引入错误。点击清除结果清除绿色复选标记,重置序列图执行。
点击运行再次仿真
PedestrianCross
序列图。
观察仿真过程中是否检测到与生命线 switch
到生命线 controller
的第一个消息的持续时间约束相关的错误。序列图指定的持续时间约束表达式 t < 1msec
未被模型执行满足,因此被检测为错误。
从 序列查看器, 中可以看出,switch
组件在 11.2sec
左右发送了 pedRequest
消息,而 controller
组件在 14.1sec
左右接收了该消息。根据模型执行中观察到的时间,使用表达式 t > 1msec
错误来设置持续时间约束。
您可以在整个设计过程中使用序列图来验证模型仿真结果与模型序列图中的交互是否一致。反复检查架构与相应的序列图之间的一致性。