徽州骆驼 · 2023年09月13日

如何设计时序图——以APA自动泊车系统为例

时序图是阐明软件设计的利器,也是系统架构的必备武器。今天我们以APA自动泊车系统为例来聊聊如何设计符合绘制原则又通俗易懂的时序图。

1.时序图说明

序列图是一种 UML(统一建模语言)图,它说明了系统中对象之间随时间的交互,通常用于可视化消息流和软件系统中对象之间方法调用的顺序。

时序图展示对象之间交互的顺序,将交互行为建模为消息传递,通过描述消息是如何在对象间发送和接收的来动态展示对象之间的交互;相对于其他UML图,时序图更强调交互的时间顺序;可以直观的描述并发进程。

2.绘制原则

绘制原则在比较简单,但是如果想要细致的描述出真实的交互情况,还需要在细节处多加斟酌,以及对整体流程有清晰的把握。在最近绘制时序图的工作过程,我感觉到自己对系统的认识深入和清晰了许多,不求甚解的地方突然豁然开朗了。

1. 角色(Actor)

系统角色,可以是人、机器、其他系统、子系统;在时序图中用下图表示。

image.png

2. 对象(Object)和生命线(Lifeline)

对象:对象的左右顺序并不重要,但是为了作图清晰整洁,通常应遵循以下两个原则:把交互频繁的对象尽可能的靠拢;2.把初始化整个交互活动的对象放置在最左端。

生命线:在时序图中表示为从对象图标向下延伸的一条虚线,表示对象存在的时间。

image.png

3. 控制焦点(Focus of Control)

又称为激活期,表示时间段的符号,在这个时间段内对象将执行相应的操作。它可以被理解成C语言语义中一对花括号{ }中的内容;用小矩形表示。

4. 消息(Message)

同步消息(Synchronous Message):消息的发送者把控制传递给消息的接收者,然后停止活动,等待消息的接收者放弃或者返回控制。用来表示同步的意义.

异步消息(Asynchronous Message):消息发送者通过消息把信号传递给消息的接收者,然后继续自己的活动,不等待接受者返回消息或者控制。异步消息的接收者和发送者是并发工作的。

返回消息(Return Message):返回消息表示从过程调用返回。

5. 自关联消息

表示方法的自身调用或者一个对象内的一个方法调用另外一个方法。

image.png

6. 组合片段

组合片段用来解决交互执行的条件和方式,它允许在序列图中直接表示逻辑组件,用于通过指定条件或子进程的应用区域,为任何生命线的任何部分定义特殊条件和子进程。主要使用的组合片段名称及含义如下:

image.png

3.绘制建议

时序图最重要的是应该清晰、准确地表达系统的交互和行为。根据需要,最好与团队成员进行沟通和反馈,以确保时序图能够准确地传达设计意图,能够让开发人员没有误解。

以下是个人在绘制时序图时总结的一些心得体会:

  1. 确定目标:明确绘制时序图的目的是什么。是为了理解系统的交互流程,还是为了进行设计和调试等工作?这有助于确定所需的详细程度和关注的重点。
  2. 选择适当的颗粒度:根据上一条确定的目标和需求,选择适当的粒度来表示对象和消息。颗粒度太细可能导致时序图复杂难懂,而粒度太粗可能会丢失一些重要的细节。肯定的是,我们没办法传递所有的信息,需要根据时序图目的去选择描述的倾向性。
  3. 使用清晰的命名:为每个角色、对象和消息选择清晰、准确的命名,以确保时序图的可读性和理解性。避免使用模糊或不明确的术语,尽量使用业务领域相关的术语。
  4. 合理组织布局:在绘制时序图时,合理组织和布局对象、生命线和消息,使其易于理解。可以按照时间顺序排列对象和消息,并使用对齐和间距来提高可读性。
  5. 使用注释和说明:在时序图中使用注释和说明来提供额外的解释和上下文信息。这可以帮助读者更好地理解时序图,尤其是对于复杂的交互和控制流程。
  6. 简化和抽象:对于复杂的系统和交互,可以考虑使用简化和抽象的方式来绘制时序图,以突出重点和减少混乱。可以使用分层和嵌套的时序图,或者使用关键路径和关键消息进行突出。
  7. 使用工具支持:考虑使用专业的时序图绘制工具,如UML建模工具或在线绘图工具。这些工具提供了更多的功能和自动化支持,可以使绘制和编辑时序图更加高效和方便。

4.绘制工具推荐

磨刀不误砍柴工,在信息化时代,好的工具能够成倍的提高我们的工作效率,下面介绍常用的时序图绘制工具。

  1. Enterprise Architect:EA(Enterprise Architect)是一种功能强大的建模和设计工具,广泛用于软件开发、系统工程和业务流程建模等领域。
  2. Draw.io:Draw.io是一个在线绘图工具,提供了各种图表类型的绘制功能,包括时序图。它具有直观的用户界面和丰富的图形库,可以轻松绘制和编辑时序图。Draw.io还支持与Google Drive、Dropbox等云存储服务的集成,方便团队协作和文件共享。
  3. Microsoft Visio:Microsoft Visio是一种流行的商业绘图工具,具有丰富的图形库和模板,可用于创建各种图表和图形,包括时序图。Visio提供了直观的界面和强大的绘图功能,适用于较复杂的时序图绘制需求。
  4. Lucidchart:Lucidchart是另一种在线绘图工具,具有易用的界面和广泛的图形库。它支持时序图的绘制,提供了一系列交互元素和布局选项,方便绘制和调整时序图的结构和样式。Lucidchart还提供了与Google Drive、Slack等工具的集成,便于团队协作和分享。
  5. PlantUML:PlantUML是一种基于文本的绘图工具,可以通过简单的文本描述来生成各种UML图,包括时序图。它具有简单易用的语法,并支持多种输出格式,可以使用PlantUML在任何文本编辑器中编写时序图,并使用命令行或插件将其转换为图像。

详细说说我用过的两个工具,EA和Draw.io

EA就不用说了,在汽车行业内鼎鼎大名,我们见到大量的设计图都是出自EA,软件内置有专门的状态机绘制模块、软件部署、autosar、时序图等等,并且能够自动生成代码,用起来十分方便,还美观整洁。

但是由于专业版的收费原因,我供职的几家都没有买正版(流汗),只能自己在家用着玩玩,或者使用试用版,有30天免费试用(导出图片会有水印)。

image.png
EA提供的时序图模板

Draw.io最大的优点是其便捷性,可以在线绘制,并且拥有多种模板,联网自动更新,方便团队协作。可以上Github上下载应用程序,体验和在线版一模一样,完美实现无环境依赖的办公。

image.png
Draw.io提供的时序图模板

用APA自动泊车系统来举例,如何设计能够满足功能开发的时序图。

5.确定目标

在明确目标时首先强调,时序图没有优劣好坏高下之分,它的作用是帮助设计者传达出作者的设计理念,以便读者更够快速、无误的理解。

比如我们作为系统工程师,是对于系统整体最了解的人,是最清楚ADCU域内各模块之间数据交互的人;所以我们的设计的时序图,力图要将各模块之间的交互梳理清楚,让感知、融合、定位、规划、控制等模块的Owner能够清楚的知道,在什么时间下该模块需要与其他模块进行什么样的握手,而该模块内部的信号逻辑,则归属于该模块的负责人去设计。

好的,那么对于自动泊车系统来说,APA整体功能流程错综复杂,为避免时序图臃肿与繁琐导致的可读性下降;我们将APA功能分解为若干个功能过程,分别对每个过程中的时序进行逐一描述,将各过程拼接后能够得到清晰明白的功能时序。

6.选择合适的颗粒度

作为系统工程师,我们当然选择通过功能解构来分别绘制时序图。本文不对APA功能逻辑做详细介绍,那么熟悉APA的同学都知道,APA过程可以简单的分为车位搜索、选择车位、泊入泊出过程、中断恢复等,下图通过这种思路简单的做时序图分解。

image.png

于是我们知道了,需要分别设计“激活泊车功能”、“退出泊车功能”、“前台搜车位”、“后台搜车位”、“点击选择车位”、“自动泊车过程”、“泊车过程中断”等等时序图。

7.命名规则

另外描述的颗粒度应该选择为模块间的交互信号,如在设计初期该信号未定义,可以选择用语义性的信号进行描述,通俗易懂即可,最好前缀明确标注为什么类型的信号,如以太网、CAN、FR、或域内的交互信号。

比如用户按下激活泊车按键,这是一个以太网信号,以Eth为前缀,采用大驼峰命名法(个人习惯),描述为Eth_ApaBtn(1:EnterApa),括号内为该信号此时应该发送的值。

image.png

8.布局合理

整体布局方面,这个主要符合美观要求就好,一般我们设计模块交互图时,左边为输入,右边为输出。我们可以遵循这个原则,进行设计。

APA系统交互分为域外与域内,域外会与用户输入、DHU、底盘动力、转向等ECU进行交互,域内为各模块之间的交互。

我们将域内与域外的对象用不同颜色表示,从左边开始为原始输入,按照时间顺序排列对象和消息,并使用对齐和间距来提高可读性。

image.png

9.注释和说明

在时序图最左侧以Diagram Conventions的形式将对象进行说明。在时序图后通过文字对每一条跳转进行详细描述。

image.png

10.简化和抽象

避免繁杂与重复,巧用组合片段用来解决交互执行的条件和方式。比如Opt选项、Alt抉择、Loop循环等,能够帮助你节约大量时间,并且提高可读性,还显得很专业。

最喜欢这种偷懒又实用的技巧。

image.png

11.使用工具支持设计

由于作者是在家设计,使用的是试用版的EA,画面简洁漂亮,给EA的设计师点赞,也是花费无数心血完成的软件,无脑吹起来就好。不过个人感觉UML建模好像用的越来越少了,可能是个人局限性原因吧,画画图还是很好用的。

现在铺垫都已经做好了,接下来无脑进行功能逻辑描述就好了,以最基本的,我们刚刚分解的“激活自动泊车”功能时序图为例。

1.首先进行功能描述:

激活自动泊车功能:用户开启通过操作开启自动泊车功能,满足开启功能条件,状态机进行跳转并通知下游模块,进入自动泊车功能;不满足开启功能条件,APA返回DHU功能开启失败原因提示。

2.然后附上时序图:

image.png
该时序图为简单描述,仅作说明示意

3.进行注释说明:

1.用户点击中控软开关或语音开启自动泊车功能,DHU通过Flexray发送APA功能激活信号Flexray_BtnPush == 1:EnterAPA至ADCU;

2.ADCU MCU Flexray Transceiver接收信号并通过以太网传输给SOC;

3.SOC中的HMI Arbitration模块解析该信号并分发给下游ParkingModeManager模块;

4.SOC端Signal Service接收后转发APA_ActivationReq至HMI Arbitration模块;

5.HMI Arbitration模块将请求转发给Parking Mode Manager;

6.Parking Mode Manage收到激活信号后,根据泊入泊出策略,选择当前进入的泊入泊出模式,并发送给下游模块;

7.状态机进行状态跳转判断:

a)若当前为Mag_APAModSts==2: APA_Standby,成功进入Searching状态,Parking Mode Manage将APAModSts == 3: APA_SEARCHING状态发送给下游其他节点。 

b)若当前为Mag_APAModSts==1: APA_OFF,则无法开启APA功能,Parking Mode Manage将APAModSts == 1: APA_OFF状态发送给下游其他节点。

8.通过以太网返回APA状态Ethernet_apa_state以及文言提示Ethernet_AlarmInfo给DHU作为显示;

OK,如此便完成了一个简单的时序图设计。对于其余车位搜素、泊车过程等功能的时序图,照猫画虎继续完成即可,就不再一一展示了。

作者对于时序图设计也仅是初学作为个人总结,欢迎交流,如有错漏请大佬指正~

千里风尘一剑当,万山秋色送归航。

——《书草萍驿》王守仁

作者:荔枝喵喵
文章来源:喵星智能车

推荐阅读

更多汽车电子干货请关注汽车电子与软件专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。
推荐阅读
关注数
5713
内容数
453
汽车电子与软件行业的相关技术报道及解读。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息