以交互方式编写序列图
序列图描述了架构系统的操作行为。您可以在系统设计的早期阶段使用序列图来描述预期的模型行为作为交互。您可以在序列图中使用生命线、消息、片段和操作数来表示交互的元素。要了解如何创建序列图,请参阅创建新序列图。
本主题介绍如何编写序列图来描述行人穿越带交通信号灯的十字路口的场景。您将学习如何表示:
作为交互参与者的组件实例使用生命线。
基于信号和消息的消息通信。
更复杂的交互模式,例如使用循环片段和条件片段。
使用持续时间约束对消息事件之间的时间进行约束。
打开交通信号灯架构的序列图
此示例包含描述行人按照交通信号灯过马路的序列图。该模型描述了以下步骤:
交通信号灯的变化周期为:红灯到绿灯,再到黄灯。
当行人过街按钮被按下时,如果交通信号灯为绿色,交通信号灯将从黄色变为红色,并保持该状态一段时间。
行人应在行人通行信号灯亮起时过马路。
打开架构模型。
model = systemcomposer.openModel('TLExample');
打开 架构视图库 中的 Inhibit
序列图。
interaction = model.getInteraction("Inhibit");
open(interaction)
描述与生命线和消息的交互
架构模型中的每个组件都可以用带生命线的序列图来表示。
添加生命线
要开始指定组件交互,请在序列图中添加生命线。选择 组件 > 添加生命线。从出现的列表中,选择一个组件或子组件。或者,从模型组件的架构视图库窗格中,点击并拖动一个组件到序列图中。
Inhibit
序列图的生命线是来自 TLExample
架构的组件实例。
source
- 检测行人按下过街按钮poller
- 检查行人过街按钮是否已被按下switch
- 处理信号controller
- 确定行人信号灯和交通信号灯应显示的颜色。lampController
- 更改交通信号灯颜色
添加消息
架构组件通过代表信息交换的端口和连接器相互连接。同样,在序列图中,生命线通过消息末端和消息连接在一起。每条消息描述一对事件。基于信号的消息描述信号写入和信号读取事件。基于消息的消息描述消息发送和消息接收事件。
要在生命线之间添加消息,请点击并拖动连接一条生命线与另一条生命线的垂直虚线。
要表示消息的目的地端口,在 To 框中,选择或键入一个端口名称。
要表示消息的源端口,在 From 框中,选择或键入端口名称。
提示
架构的组件可连接到根架构端口,这些端口代表架构边界之外的信息交换。在序列图中,您可以将门连接到生命线。门表示架构层次结构的根。通过门,您可以描述架构与其环境之间的消息交换。
要将生命线中的消息添加到门,请点击并拖动一条生命线上的垂直虚线到门框区域。
在 Inhibit
序列图中,source
和 poller
生命线通过一条带空心箭头的实线交换消息。
在消息上使用消息标签来定义此信息交换的预期条件。编辑消息标签,请点击消息,然后双击出现的空白消息标签。
一个消息标签有一个触发条件 (trigger)、一个可选的保护条件 (guard) 和一个可选的约束条件 (constraint),其形式为 trigger[guard]{constraint}
。trigger
表示此消息的标识事件。guard
表示确定消息是否发生的附加条件。constraint
是当此消息发生时预期为 true 的表达式。
在信号事件中,触发器遵循以下格式:
direction(signal [+|-] value)
,它指定了带有方向和表达式的触发边沿。方向可以是:上升 - 边沿表达式从严格低于零上升到等于或大于零的值。
下降 - 边沿表达式从严格高于零开始下降。
交叉 - 上升或下降过零的边沿表达式。
在消息事件中,触发器的格式为
port
,指定输入消息端口的名称,代表消息的到达。消息标签上方括号内的保护条件是一个 MATLAB® 布尔表达式,是确定消息是否发生的附加条件。只有在软件检测到有效触发条件时,才会计算保护条件。在执行过程中,序列图会等待进入下一条消息,直到保护表达式计算结果为 true。
消息标签上大括号中的约束条件是一个 MATLAB 布尔表达式,指定了输入目标生命线的预期值。在执行过程中,对约束条件的计算决定了序列图对该消息显示通过还是失败。
基于信号的通信. source
和 poller
生命线之间的消息定义了此条件:rising(sw-1){sw==1}
。消息的触发器 rising(sw-1)
表示当 sw
信号的值从低于 1
上升到 1
或以上时,消息被触发。消息约束 {sw==1}
表示当 sw
不等于 1
时,消息无效。
在此示例中,当 sw
信号变为 1
时,表示行人过马路按钮已被按下,软件识别到向 poller
生命线发送的消息。
基于消息的通信. poller
和 switch
生命线之间的消息定义了此条件:switchEvent[switchEvent==1]
。消息的触发器 switchEvent
表示该消息是由通过端口 switchEvent
到达的消息触发的。消息的守卫 [switchEvent==1]
表示,为了使消息发生,switchEvent
的值必须为 1
。
在此示例中,当收到 switchEvent
消息事件且其值为 1
时,该消息出现。
使用片段和操作数建模复杂交互
片段在交互中将生命线和消息分组封装,允许指定复杂的交互模式。片段可定义循环和替代等排序逻辑。片段可以有一个或多个操作数。使用片段和操作数向一组消息添加条件行为。
要访问片段菜单:
要选择两条消息,请点击并拖动。
要访问操作栏,请将鼠标悬停在出现的省略号 (...) 上。
出现一个片段列表:
有关详细信息,请参阅使用序列图中的片段建模复杂交互。
添加条件片段
在 Inhibit
序列图中,Alt 片段 代表多个相互排斥的条件,在这些条件下,预计会发生不同组的消息,这类似于软件程序中的 IF-ELSEIF-THEN
子句。
alt 片段包含两个操作数,只有当约束条件为真时,操作数中的消息才能被执行。alt 片段中操作数的条件为:
switch/inhibit==0
该操作数的作用类似于一个
if
条件。当switch
的inhibit
标志为0
时,该操作数中的消息将被执行。该操作数表示行人过街由行走信号灯控制的场景。
当
inhibit
标志为0
时,软件将识别该消息为发往controller
生命线的消息,并验证pedRequest
消息。然后,当
switchPed
消息值为1
时,lampController
生命线允许行人过马路。
switch/inhibit==1
该操作数的作用类似于一个
elseif
条件。当switch
的inhibit
标志为1
时,消息执行。该操作数表示行人过街未受行走信号控制的情景。
当
inhibit
标志为1
时,switch
绕过controller
生命线,因此行人过街不会影响交通信号灯。当
switchPed
消息值为2
时,行人可按照黄色行人通行信号谨慎通行。
添加循环片段
在 PedestrianCross
序列图中,Loop 片段 代表可重复的操作数,它重复消息序列,直到达到最大迭代次数,类似于软件程序中的 FOR
循环。
循环片段包含一个操作数,如果第一个事件有效,则操作数中的消息将执行。没有指定上限或下限的循环片段根据仿真时间或架构模型的下限和上限重复一定次数。
作为一个无边界的循环片段,该片段根据仿真时间重复多次。此交互代表默认的灯光序列。
traffic[traffic == 1]
当
controller
生命线上的trafficColor
端口收到消息且traffic
值为1
时,软件会识别并验证发往lampController
生命线的消息。循环片段中的第一条消息表明交通信号灯为红色,由
[traffic == 1]
保护条件表示。trafficPed{trafficPed == 1}
当
controller
生命线上的pedColor
端口收到消息且trafficPed
值为3
时,软件会识别并验证发往lampController
生命线的消息。循环片段中的第二条消息表明行人通行信号为绿色,由
{trafficPed == 3}
约束表示。trafficPed[trafficPed == 1]
当
controller
生命线上的pedColor
端口收到消息且trafficPed
值为1
时,软件会识别并验证发往lampController
生命线的消息。循环片段中的第三条消息表明行人通行信号为红色,由
[trafficPed == 1]
保护表示。
使用持续时间约束指定消息事件之间的时序约束
自 R2025a 起
持续时间约束定义开始事件和结束事件之间的经过时间约束。持续时间约束有一个开始事件、一个结束事件和一个表达式。开始事件和结束事件代表事件的发生(如消息的结束),表达式定义了这些事件之间持续时间的限制。
要向序列图添加持续时间约束,请按住 Shift,然后用指针选择两个消息事件。您可以从以下选项中选择两个消息事件:
不同消息,用来定义消息事件之间的持续时间约束
同一消息,用来定义消息开始和结束之间的持续时间约束
双击表达式可编辑持续时间约束。
持续时间约束的时序语法
使用“小于”和“大于”等关系运算符来表达两个事件之间的时间长度约束。
持续时间约束的表达式包含:
表示观察持续时间的关键字。使用:
t
或duration
。一个关系运算符。使用:
>
、<
、>=
或<=
。一个时间值。
一个时间单位。使用:
sec
、msec
或usec
。
这些示例显示了持续时间约束表达式。
t < 15sec
,检查两个消息事件之间的持续时间是否小于15sec
。1usec < duration <= 3usec
,检查两个消息事件之间的持续时间是否大于1usec
且小于或等于3usec
。5msec >= t > 10msec
,检查两个消息事件之间的持续时间是否小于或等于5msec
或大于10msec
。
在 Inhibit
序列图中,表达式 t > 12msec
的持续时间约束位于 alt 片段中的两个消息事件之间。
持续时间约束表示两个消息事件之间的持续时间预计大于 12msec
。
在 PedestrianCross
序列图中,表达式 1sec < t < 3sec
的持续时间约束位于同一消息的两个消息事件之间。
持续时间约束表示消息开始和结束之间的持续时间预计大于 1sec
且小于 3sec
。
使用注解对序列图进行注解
注解描述序列图的元素。使用注解对序列图捕获的元素或工作流进行详细解释。
要创建注解,请双击画布。在出现的文本框中,输入注解文本。在 Inhibit
序列图中,alt 片段旁边的注解提供了该片段的简要含义。
编辑序列图的布局
自 R2025a 起
为了提高可读性,您可以编辑序列图的布局。
重新定位生命线、片段和消息 - 点击并拖动元素,调整其相对于其他元素的水平和垂直位置。
调整生命线的大小 - 点击生命线的边缘,然后拖动光标。
要根据元素中的内容调整生命线的大小,可以右键点击生命线,然后选择适应内容选项。
重新定位持续时间约束 - 点击并水平拖动持续时间约束以调整其位置。
添加操作数 - 在片段内右键点击,然后选择以下选项之一来修改操作数:Insert Operand Before、Insert Operand After 或 Delete。
提示
当您重新定位元素时,可以在拖动元素的同时按下 Ctrl 来加快移动速度。