時序圖是闡明軟件設計的利器,也是系統架構的必備武器。今天我們以APA自動泊車系統為例來聊聊如何設計符合繪制原則又通俗易懂的時序圖。
1.時序圖說明
序列圖是一種 UML(統一建模語言)圖,它說明了系統中對象之間隨時間的交互,通常用于可視化消息流和軟件系統中對象之間方法調用的順序。
時序圖展示對象之間交互的順序,將交互行為建模為消息傳遞,通過描述消息是如何在對象間發送和接收的來動態展示對象之間的交互;相對于其他UML圖,時序圖更強調交互的時間順序;可以直觀的描述并發進程。
2.繪制原則
繪制原則在比較簡單,但是如果想要細致的描述出真實的交互情況,還需要在細節處多加斟酌,以及對整體流程有清晰的把握。在最近繪制時序圖的工作過程,我感覺到自己對系統的認識深入和清晰了許多,不求甚解的地方突然豁然開朗了。
1. 角色(Actor)
系統角色,可以是人、機器、其他系統、子系統;在時序圖中用下圖表示。
2. 對象(Object)和生命線(Lifeline)
對象:對象的左右順序并不重要,但是為了作圖清晰整潔,通常應遵循以下兩個原則:把交互頻繁的對象盡可能的靠攏;2.把初始化整個交互活動的對象放置在最左端。
生命線:在時序圖中表示為從對象圖標向下延伸的一條虛線,表示對象存在的時間。
3. 控制焦點(Focus of Control)
又稱為激活期,表示時間段的符號,在這個時間段內對象將執行相應的操作。它可以被理解成C語言語義中一對花括號{ }中的內容;用小矩形表示。
4. 消息(Message)
同步消息(Synchronous Message):消息的發送者把控制傳遞給消息的接收者,然后停止活動,等待消息的接收者放棄或者返回控制。用來表示同步的意義.
異步消息(Asynchronous Message):消息發送者通過消息把信號傳遞給消息的接收者,然后繼續自己的活動,不等待接受者返回消息或者控制。異步消息的接收者和發送者是并發工作的。
返回消息(Return Message):返回消息表示從過程調用返回。
5. 自關聯消息
表示方法的自身調用或者一個對象內的一個方法調用另外一個方法。
6. 組合片段
組合片段用來解決交互執行的條件和方式,它允許在序列圖中直接表示邏輯組件,用于通過指定條件或子進程的應用區域,為任何生命線的任何部分定義特殊條件和子進程。主要使用的組合片段名稱及含義如下:
3.繪制建議
時序圖最重要的是應該清晰、準確地表達系統的交互和行為。根據需要,最好與團隊成員進行溝通和反饋,以確保時序圖能夠準確地傳達設計意圖,能夠讓開發人員沒有誤解。
以下是個人在繪制時序圖時總結的一些心得體會:
- 確定目標 :明確繪制時序圖的目的是什么。是為了理解系統的交互流程,還是為了進行設計和調試等工作?這有助于確定所需的詳細程度和關注的重點。
- 選擇適當的顆粒度 :根據上一條確定的目標和需求,選擇適當的粒度來表示對象和消息。顆粒度太細可能導致時序圖復雜難懂,而粒度太粗可能會丟失一些重要的細節。肯定的是,我們沒辦法傳遞所有的信息,需要根據時序圖目的去選擇描述的傾向性。
- 使用清晰的命名 :為每個角色、對象和消息選擇清晰、準確的命名,以確保時序圖的可讀性和理解性。避免使用模糊或不明確的術語,盡量使用業務領域相關的術語。
- 合理組織布局 :在繪制時序圖時,合理組織和布局對象、生命線和消息,使其易于理解。可以按照時間順序排列對象和消息,并使用對齊和間距來提高可讀性。
- 使用注釋和說明 :在時序圖中使用注釋和說明來提供額外的解釋和上下文信息。這可以幫助讀者更好地理解時序圖,尤其是對于復雜的交互和控制流程。
- 簡化和抽象 :對于復雜的系統和交互,可以考慮使用簡化和抽象的方式來繪制時序圖,以突出重點和減少混亂。可以使用分層和嵌套的時序圖,或者使用關鍵路徑和關鍵消息進行突出。
- 使用工具支持 :考慮使用專業的時序圖繪制工具,如UML建模工具或在線繪圖工具。這些工具提供了更多的功能和自動化支持,可以使繪制和編輯時序圖更加高效和方便。
4.繪制工具推薦
磨刀不誤砍柴工,在信息化時代,好的工具能夠成倍的提高我們的工作效率,下面介紹常用的時序圖繪制工具。
- Enterprise Architect :EA(Enterprise Architect)是一種功能強大的建模和設計工具,廣泛用于軟件開發、系統工程和業務流程建模等領域。
- Draw.io :Draw.io是一個在線繪圖工具,提供了各種圖表類型的繪制功能,包括時序圖。它具有直觀的用戶界面和豐富的圖形庫,可以輕松繪制和編輯時序圖。Draw.io還支持與Google Drive、Dropbox等云存儲服務的集成,方便團隊協作和文件共享。
- Microsoft Visio :Microsoft Visio是一種流行的商業繪圖工具,具有豐富的圖形庫和模板,可用于創建各種圖表和圖形,包括時序圖。Visio提供了直觀的界面和強大的繪圖功能,適用于較復雜的時序圖繪制需求。
- Lucidchart :Lucidchart是另一種在線繪圖工具,具有易用的界面和廣泛的圖形庫。它支持時序圖的繪制,提供了一系列交互元素和布局選項,方便繪制和調整時序圖的結構和樣式。Lucidchart還提供了與Google Drive、Slack等工具的集成,便于團隊協作和分享。
- PlantUML :PlantUML是一種基于文本的繪圖工具,可以通過簡單的文本描述來生成各種UML圖,包括時序圖。它具有簡單易用的語法,并支持多種輸出格式,可以使用PlantUML在任何文本編輯器中編寫時序圖,并使用命令行或插件將其轉換為圖像。
詳細說說我用過的兩個工具,EA和Draw.io :
EA就不用說了,在汽車行業內鼎鼎大名,我們見到大量的設計圖都是出自EA,軟件內置有專門的狀態機繪制模塊、軟件部署、autosar、時序圖等等,并且能夠自動生成代碼,用起來十分方便,還美觀整潔。
但是由于專業版的收費原因,我供職的幾家都沒有買正版(流汗),只能自己在家用著玩玩,或者使用試用版,有30天免費試用(導出圖片會有水印)。
EA提供的時序圖模板
Draw.io最大的優點是其便捷性,可以在線繪制,并且擁有多種模板,聯網自動更新,方便團隊協作。可以上Github上下載應用程序,體驗和在線版一模一樣,完美實現無環境依賴的辦公。
Draw.io提供的時序圖模板
用APA自動泊車系統來舉例,如何設計能夠滿足功能開發的時序圖。
5.確定目標
在明確目標時首先強調,時序圖沒有優劣好壞高下之分,它的作用是幫助設計者傳達出作者的設計理念,以便讀者更夠快速、無誤的理解。
比如我們作為系統工程師,是對于系統整體最了解的人,是最清楚ADCU域內各模塊之間數據交互的人;所以我們的設計的時序圖,力圖要將各模塊之間的交互梳理清楚,讓感知、融合、定位、規劃、控制等模塊的Owner能夠清楚的知道,在什么時間下該模塊需要與其他模塊進行什么樣的握手,而該模塊內部的信號邏輯,則歸屬于該模塊的負責人去設計。
好的,那么對于自動泊車系統來說,APA整體功能流程錯綜復雜,為避免時序圖臃腫與繁瑣導致的可讀性下降;我們將APA功能分解為若干個功能過程,分別對每個過程中的時序進行逐一描述,將各過程拼接后能夠得到清晰明白的功能時序。
6.選擇合適的顆粒度
作為系統工程師,我們當然選擇 通過功能解構來分別繪制時序圖 。本文不對APA功能邏輯做詳細介紹,那么熟悉APA的同學都知道,APA過程可以簡單的分為車位搜索、選擇車位、泊入泊出過程、中斷恢復等,下圖通過這種思路簡單的做時序圖分解。
于是我們知道了,需要分別設計“激活泊車功能”、“退出泊車功能”、“前臺搜車位”、“后臺搜車位”、“點擊選擇車位”、“自動泊車過程”、“泊車過程中斷”等等時序圖。
7.命名規則
另外描述的顆粒度應該選擇為模塊間的交互信號,如在設計初期該信號未定義,可以選擇用語義性的信號進行描述,通俗易懂即可,最好前綴明確標注為什么類型的信號,如以太網、CAN、FR、或域內的交互信號。
比如用戶按下激活泊車按鍵,這是一個以太網信號,以Eth為前綴,采用大駝峰命名法(個人習慣),描述為Eth_ApaBtn(1:EnterApa),括號內為該信號此時應該發送的值。
8.布局合理
整體布局方面,這個主要符合美觀要求就好,一般我們設計模塊交互圖時,左邊為輸入,右邊為輸出。我們可以遵循這個原則,進行設計。
APA系統交互分為域外與域內,域外會與用戶輸入、DHU、底盤動力、轉向等ECU進行交互,域內為各模塊之間的交互。
我們將域內與域外的對象用不同顏色表示,從左邊開始為原始輸入,按照時間順序排列對象和消息,并使用對齊和間距來提高可讀性。
9.注釋和說明
在時序圖最左側以Diagram Conventions的形式將對象進行說明。在時序圖后通過文字對每一條跳轉進行詳細描述。
10.簡化和抽象
避免繁雜與重復,巧用組合片段用來解決交互執行的條件和方式。 比如Opt選項、Alt抉擇、Loop循環等,能夠幫助你節約大量時間,并且提高可讀性,還顯得很專業。
最喜歡這種偷懶又實用的技巧。
11.使用工具支持設計
由于作者是在家設計,使用的是試用版的EA,畫面簡潔漂亮,給EA的設計師點贊,也是花費無數心血完成的軟件,無腦吹起來就好。不過個人感覺UML建模好像用的越來越少了,可能是個人局限性原因吧,畫畫圖還是很好用的。
現在鋪墊都已經做好了,接下來無腦進行功能邏輯描述就好了,以最基本的,我們剛剛分解的“激活自動泊車”功能時序圖為例。
1.首先進行功能描述:
激活自動泊車功能:用戶開啟通過操作開啟自動泊車功能,滿足開啟功能條件,狀態機進行跳轉并通知下游模塊,進入自動泊車功能;不滿足開啟功能條件,APA返回DHU功能開啟失敗原因提示。
2.然后附上時序圖:
該時序圖為簡單描述,僅作說明示意
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,如此便完成了一個簡單的時序圖設計。對于其余車位搜素、泊車過程等功能的時序圖,照貓畫虎繼續完成即可,就不再一一展示了。
-
以太網
+關注
關注
40文章
5385瀏覽量
171160 -
CAN總線
+關注
關注
145文章
1937瀏覽量
130639 -
自動泊車系統
+關注
關注
0文章
18瀏覽量
9040 -
MCU控制器
+關注
關注
0文章
27瀏覽量
6874 -
UML技術
+關注
關注
0文章
5瀏覽量
1368
發布評論請先 登錄
相關推薦
評論