交通信号灯示例的序列图仿真
这演示了如何仿真交通信号灯的 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 组件在 pedRequest 左右发送了 11.2sec 消息,而 controller 组件在 14.1sec 左右接收了该消息。根据模型执行中观察到的时间,使用表达式 t > 1msec 错误来设置持续时间约束。

您可以在整个设计过程中使用序列图来验证模型仿真结果与模型序列图中的交互是否一致。反复检查架构与相应的序列图之间的一致性。