使用序列图中的片段建模复杂交互
您可以使用与 System Composer™ 集成的序列图来描述系统行为,即组件在序列消息交换中的交互。
交互对消息激活施加了一个顺序。要指定消息的激活和排序,可以使用片段和操作数。片段在交互中将生命线和消息分组封装,允许指定复杂的交互模式。片段类型定义了消息的激活和排序,例如循环、可选和条件序列。操作数是片段或消息组中的一个区域。操作数的条件指定操作数内的消息是否执行。
本主题介绍如何使用片段和操作数来描述交通交叉路口控制系统组件之间的交互。
交叉路口控制系统示例
此交叉路口控制系统示例包含序列图和片段,用于描述交通交叉路口的交通信号灯序列。该模型描述了各种场景,展示了如何使用组合片段来指定消息的激活和排序。
打开包含序列图的架构模型。
model = systemcomposer.openModel("IntersectionControlSystemS");
要查看序列图,请打开 架构视图库。
interaction = model.getInteraction('SimpleSequence');
open(interaction)
描述控制系统内的交互
您可以使用生命线在序列图中表示架构模型中的每个组件。
IntersectionControlSystemS
架构模型的序列图中的生命线代表架构组件的实例。
LightSequencer
- 处理来自主干道和支路控制器的信号,并更改交通信号灯的颜色。MainStreetController
- 确定主干道上行人信号灯和交通信号灯应显示的颜色。MainHWInterface
- 检测主干道上行人过街按钮是否被按下SideStreetController
- 确定侧街的行人信号灯和交通信号灯应显示的颜色。SideHWInterface
- 检测侧街行人过街按钮是否被按下
添加消息
架构组件通过代表信息交换的端口和连接器相互连接。同样,在序列图中,生命线通过消息末端和消息连接在一起。每条消息描述一对事件。基于信号的消息描述信号写入和信号读取事件。基于消息的消息描述消息发送和消息接收事件。
有关生命线和消息的更多信息,请参阅描述与生命线和消息的交互。
使用片段指定消息执行逻辑
使用片段为交互中的消息组添加条件行为。
要将片段添加到序列图,请点击并拖动一组消息或其他片段。一个蓝色方框随即出现。要从可能的片段列表中进行选择,请在出现的省略号(…)上暂停。
选择要添加到序列图中的片段类型。片段类型指定消息在序列图中的执行顺序。支持以下片段:
Seq
片段
Seq
片段包含一个操作数,表示弱排序,它指定与没有片段的消息序列相同的排序约束。弱排序意味着每个生命线上的事件序列被严格遵守,但不同生命线之间的事件序列可能与操作数中显示的顺序不同。
在任何一条生命线上,任何事件都必须发生在该生命线上其直接上方的事件之后。如果来自同一生命线的消息发送或写入事件发生,则顺序由事件在生命线上的位置决定。
消息的发送或写入事件必须发生在相应的接收或读取事件之前。
如果两个不同的消息发送和接收事件或写入和读取事件发生在同一生命线上,则第一个消息可以在第二个消息发送之前或之后接收。
虽然 Seq
片段没有可视化表示,但 SimpleSequence
序列图是 Seq
片段的一个示例。SimpleSequence
交互指定了这一系列消息事件。
当
sensor
信号从低于1
上升到1
或以上值时,该信号被MainStreetController
生命线接收。MainStreetController
生命线向LightSequencer
生命线发送一条PedButtonMain
Simulink® 消息,后者控制交叉路口的交通信号灯。当
LightSequencer
生命线收到消息后,LightSequencer
生命线会向MainHWInterace
生命线发送消息,将行人信号灯变为红色,指示行人等待。
Strict
片段
Strict
片段包含一个操作数,表示严格的顺序。严格排序遵循 Seq 片段 中出现的弱排序,并附加了对操作数中事件顺序必须完全一致的约束。如果消息是从同一条生命线发送的,则按照消息在生命线上的位置确定发送顺序。消息按照操作数中的顺序接收,无论哪个生命线接收了消息。
StrictExample
交互中的 Strict
片段指定,在主街道的交通信号灯变为绿色之前,侧街道的交通信号灯应先变为红色。
如果没有严格的顺序,街道控制器执行任务的顺序将无法确定。如果所有消息都不需要严格排序,则可以使用 Seq 片段 来表示 Strict
片段中的部分消息。
Opt
片段
Opt
片段可能包含一个或多个操作数,并指示描述的消息事件可能会发生。每个操作数都有一个约束,用于确定消息组是否有效。
如果满足以下条件,则会发生 Opt
片段中的事件:
当前事件是操作数的一个有效初始事件。
操作数约束表达的条件评估为
true
。
在交叉口控制系统中,state
信号指示主路和辅路控制器的状态。如果控制器处于流动 (Green
) 状态(由值 2
表示),则 LightSequencer
生命线向控制器发出 Stop
命令。
OptExample
中的 Opt
片段指定了以下情况。
当交通顺畅 (Green
) 时,由 LightSequencer/mainState==2
条件指示:
LightSequencer
生命线向MainStreetController
生命线发送一个Stop
命令。mainState
信号降至1
,表示停止 (Yellow
) 状态。
Loop
片段
A Loop
片段包含一个操作数,该操作数带有表达式,描述操作数重复的最小次数(下限)和最大次数(上限)。上界可以是 *
,表示没有最大值。下限可以是 0
,表示操作数是可选的。默认设置为下限为 0
,上限为 *
。使用默认的下限和上限,Loop
片段根据仿真时间或架构模型的下限和上限重复一定次数。
如果满足以下条件,则 Loop
片段中的事件将重复发生:
当前事件是操作数的一个有效初始事件。
操作数约束表达的条件评估为
true
。迭代次数小于或等于上限。
您还可以对 Loop
片段操作数定义一个约束,以确定循环是否执行。当布尔表达式为 false
时,软件跳过循环。
LoopExample
交互中的 Loop
片段描述了主干道交通信号灯的默认灯光序列。
LightSequencer
生命线发出Go
命令。MainStreetController
生命线向MainHWInterface
生命线发送消息,将交通信号灯变为绿色。在循环中,
MainStreetController
生命线向MainHWInterface
生命线发送消息,以循环将交通信号灯从黄色变为红色再变为绿色。
循环片段的下限和上限分别是 0
和 *
的默认值,表明循环片段允许任何次数的迭代。
Alt
片段
Alt
片段与 Opt 片段 类似,但 Alt
片段有两个或多个操作数,每个操作数描述一个不同的消息顺序。
如果满足以下条件,则 Alt
片段中的每个操作数的事件都会发生:
当前事件是操作数的一个有效初始事件。
操作数约束表达的条件评估为
true
。
AltExample
交互中的 Alt
片段代表行人要求穿越主干道或小巷的备选场景。有关第一个操作数的描述,请参阅Seq 片段。
Par
片段
Par
(或平行)片段包含两个或多个操作数,表示事件可以并行发生。在 Par
片段中,操作数的顺序是强制执行的,但每个操作数中的消息顺序遵循弱排序。
ParExample
交互中的 Par
片段代表行人要求过马路,交叉路口的所有车辆都停下来的场景。
片段
Alt
表示主干道和侧街的行人通行信号均为红色。片段
Par
表示主干道和侧街的步行信号均为绿色,但这些消息的顺序无关紧要。
顺序不明确的消息
由于图中信号语义的性质,预测信号边缘与同一仿真步骤中发生的其他事件之间的顺序可能比较困难。信号边缘是指信号值通过由上升、下降或交叉关键字指示的阈值的位置。架构模型的更改可能会更改序列图所表示的信号事件的顺序。当一个信号边缘与另一个事件发生在同一仿真步时,两个消息都会被标记为 符号。您可以检查序列图和相应的架构模型,以发现潜在的歧义。
要指定这些消息可以在同一时间步内以任何顺序出现,请将每个消息放在一个 Par 片段 的单独操作数中。仿真将这些消息解释为以任意顺序发生。或者,修改底层系统的行为,使这些事件在不同的时间步长上发生。
另请参阅
工具
函数
对象
systemcomposer.arch.Model
|systemcomposer.interaction.Interaction
|systemcomposer.interaction.Fragment