王 強,周晨初,陸明珠,彭祺擘,葉曉平,劉玉生
(1.上海衛(wèi)星工程研究所,上海 201109;2.西安航天動力研究所,陜西 西安 710100;3.浙江大學(xué)CAD&CG國家重點實驗室,浙江 杭州 310058;4.中國航天員科研訓(xùn)練中心,北京,100094;5.麗水學(xué)院工學(xué)院,浙江 麗水 323000)
隨著當(dāng)今社會科學(xué)技術(shù)的飛速發(fā)展,復(fù)雜系統(tǒng)設(shè)計和驗證的難度日益增大,傳統(tǒng)基于文檔的系統(tǒng)工程已遠遠無法滿足需要,基于模型的系統(tǒng)工程(Model-Based System Engineering,MBSE)應(yīng)運而生,已經(jīng)受到學(xué)術(shù)界和工業(yè)界的廣泛關(guān)注[1-3],正成為復(fù)雜裝備系統(tǒng)設(shè)計與方案論證的不二之選[4-10]。SysML是MBSE建模實踐的標(biāo)準(zhǔn)語言[11],而活動圖是用來表達系統(tǒng)動態(tài)行為信息的3種核心SysML圖之一,用來表達隨著時間推移行為和事件的發(fā)生順序。目前國外的相關(guān)軟件工具有Cameo System Modeler[12]、Visual Paradigm for UML[13]、Sparx Systems Enterprise Architect[14];國內(nèi)的有內(nèi)蒙古大學(xué)的SysModeler[15]和浙江大學(xué)的M-Design[16-18]。近年來,Web化SysML工具得到了廣泛的重視,國外的GenMyModel團隊開發(fā)了一款Web版的在線UML建模平臺。ProcessOn[19]雖然是國內(nèi)團隊開發(fā)的專業(yè)作圖和協(xié)作平臺,但是ProcessOn只支持UML部分圖的繪圖功能,不支持SysML和UML建模功能。浙江大學(xué)MBSE團隊對桌面版軟件和Web技術(shù)進行充分調(diào)研之后,設(shè)計和實現(xiàn)了Web版的M-Design[12,20-21]。
筆者針對基于MBSE的圖形化系統(tǒng)工程建模軟件領(lǐng)域存在的開發(fā)工作量大、周期長、對SysML標(biāo)準(zhǔn)的支持和功能完整性不足等問題,采取了模型驅(qū)動開發(fā)(Model-Driven Development,MDD)的模式,提出了基于模型驅(qū)動架構(gòu)Sirius的SysML活動圖建模與仿真功能實現(xiàn)方法。
通過分析活動圖建模軟件的核心問題、Sirius框架提供的環(huán)境和工具,結(jié)合用戶的需求,本文設(shè)計并實現(xiàn)了基于Sirius的活動圖建模軟件,總體框架如圖1所示。
圖1 活動圖建模軟件總體架構(gòu)
在模型層面,在充分理解活動圖語法語義的基礎(chǔ)上使用Eclipse Ecore Tool定義M2層活動圖的抽象語法,用于創(chuàng)建M1層活動圖模型。在視圖層面,通過配置Styling元素規(guī)定圖形元素的外觀,用戶以Eclipse UI作為操作界面與模型層和視圖層交互。具體來說,用戶通過由屬性視圖說明(Properties View Description)定 義 的 屬 性 視 圖(Properties View)反映模型的屬性,并對屬性直接進行修改。用戶通過Tools元素定義的一系列的動作實現(xiàn)對圖形元素的創(chuàng)建、刪除、修改等操作。作為建模軟件的根基,模型和視圖通過Mapping元素實現(xiàn)二者的映射關(guān)系。
OMG定義的模型驅(qū)動架構(gòu)(Model-Driven Architecture,MDA),是一種實現(xiàn)內(nèi)聚模型驅(qū)動技術(shù)規(guī)范的重要方法和規(guī)劃。其中,UML、MOF和OMG其他相關(guān)規(guī)范通過模型創(chuàng)建與轉(zhuǎn)換在MDA中具有重要的作用。
根據(jù)MOF四層架構(gòu)理論,本文將活動圖建模功能在M3、M2、M1三層進行抽象。如圖2所示:最上層M3層是由Eclipse Modeling Project提供的元模型層——Ecore層,定義了基本的建模語言用來描述類(classes)、屬性(attributes)、數(shù)據(jù)類型(data types)和關(guān)系(relations);M3層下面的M2層定義了SysML活動圖抽象語法用于創(chuàng)建M1層活動圖模型。之所以本文沒有抽象出M0層,是因為活動圖建模軟件沒有實例層,系統(tǒng)模型的實例層通常指一個實際系統(tǒng)。
圖2 活動圖建模軟件抽象結(jié)構(gòu)
活動圖的抽象語法是使用UML活動圖元模型定義的,該元模型使用了MOF規(guī)范中可識別、受約束、用于構(gòu)建元模型的UML子集中的構(gòu)造方法[4]。其好處在于能確保UML模型能夠保存在MOF資源庫中,在MOF資源庫中用戶可以使用MOF特征對其進行操縱,并使用遵循MOF XMI映射規(guī)范的XML文件來進行交換。從而實現(xiàn)MOF和UML之間的融合,促進MDA內(nèi)部規(guī)范的一體化。
準(zhǔn)確定義活動圖的抽象語法主要解決了3個問題:(1)建模的正確性;(2)與外界打通,與XML格式進行交換;(3)準(zhǔn)確定義的元模型方便仿真操作語義的擴展。由于整個建模平臺都是對底層元模型進行可視化,因此需要導(dǎo)入或者自定義元模型,通??梢允褂肊clipse提供的Ecore Tools進行自定義元模型。
如圖3所示,活動圖的元模型可以分為5個部分:活動、控制節(jié)點、對象節(jié)點、可執(zhí)行節(jié)點、活動組。元模型作為整個建模軟件的根基,整個建模軟件需要始終保障用戶對模型的操作符合UML/SysML語法和語義約束,即提供模型正確性檢查。
圖3 活動圖抽象語法
1.3.1 SysML活動圖具體元素創(chuàng)建
基于Sirius進行SysML活動圖具體創(chuàng)建的優(yōu)勢在于:利用它提供的Viewpoint Specification Model(VSM),軟件開發(fā)人員可以正確地描述圖形編輯器的結(jié)構(gòu)、樣式和行為。為了將語義模型與模型的具體表現(xiàn)形式建立聯(lián)系,需要編輯VSM元素中的Mapping。Mapping是指用來標(biāo)識哪些語義模型元素應(yīng)該在表示中呈現(xiàn)和應(yīng)該以何種表現(xiàn)形式呈現(xiàn)映射關(guān)系。不同的表示提供了不同類型的映射。雖然映射存在于VSM里面,但在具體的表示中將生成新的實例?;谠P?,Sirius提出將以下4種表現(xiàn)形式進行可視化:
1)Node:不包含子對象的元素。
2)Border Node:在形態(tài)上可以附著在其他Container上用來表示某種關(guān)系。
3)Container:包含子對象的元素。
4)Relation:可視化兩個對象之間的關(guān)系的元素。
為了規(guī)定節(jié)點是如何在圖上展示的,需要聲明一個樣式(Style),如圖4所示。而對于7種控制節(jié)點,樣式也截然不同,為了達到根據(jù)模型元素判定樣式的目的,基于Sirius提供的Conditional Style組件和AQL語句來實現(xiàn)以模型元素為條件進行樣式判定,如圖5所示。
圖4 樣式選擇界面
圖5 Conditional Style組件
1.3.2 動態(tài)行為的定義
對于圖形元素,一般均要進行增刪改操作。筆者擬基于Sirius框架提供的工具(Tools)來實現(xiàn)。筆者以創(chuàng)建ControlNode中的InitialNode為例來說明如何運用一個創(chuàng)建新節(jié)點的工具。InitialNode創(chuàng)建工具的樹級層次的總覽,如圖6所示。
圖6 InitialNode創(chuàng)建工具總覽
首先通過對InitialNode的語義進行分析,根據(jù)UML2規(guī)范,InitialNode可以創(chuàng)建在Activity、StructuredActivityNode、ActivityPartition里面,對于不同的外層元素,需要采取不同的操作,從而使元素的創(chuàng)建符合語義;其次使用Sirius框架提供的If操作,它會在當(dāng)前上下文中計算條件表達式,當(dāng)結(jié)果為“真”的時候,才會執(zhí)行包含的子操作。例如當(dāng)外層元素的模型元素是uml.ActivityPartition的時候,將調(diào)用findParentActivity方法,遞歸尋找父級元素(圖7)并將上下文改為父級元素,繼續(xù)創(chuàng)建uml.InitialNode模型元素。
圖7 findParentActivity()代碼實現(xiàn)
這里如何保持語義一致性是一個關(guān)鍵問題。為此,將頂層元素的ownedNode屬性設(shè)置為當(dāng)前InitialNode,再通過Create Instance操作在用戶模型中添加一個新的模型元素而完成,其操作配置細節(jié)如圖8所示。
圖8 Create Instanc操作的配置細節(jié)
SysML模型仿真整體上可以分為3個范疇:模型執(zhí)行、模型調(diào)試和模型測試。模型執(zhí)行是其中的核心和基礎(chǔ)步驟。為了調(diào)試和測試模型,首先要使得模型變得可以執(zhí)行,也就是為模型定義操作語義。
1.3.1 節(jié)所述,定義SysML活動圖模型的目的并不是為了被執(zhí)行,所以缺乏完整的、精確的操作語義。操作語義包含2個部分:(1)運行時概念(runtime concepts):捕獲執(zhí)行模型的狀態(tài);(2)計算步驟(steps of computation):活動圖元素遵循的演繹規(guī)則,即可執(zhí)行模型是如何從一個狀態(tài)向另一個狀態(tài)轉(zhuǎn)換的。本節(jié)通過對元模型的抽象語法進行刪減和必要的擴展來定義正在執(zhí)行模型的狀態(tài)——運行時概念,并對其計算步驟進行設(shè)計。
圖9展現(xiàn)了活動圖的運行時概念。運行時概念用灰色表示,普通元類用白色表示。筆者將運行時概念分為以下4類:(1)活動節(jié)點之間的令牌流(token flow);(2)變量的當(dāng)前值;(3)活動圖的運行軌跡;(4)活動圖的輸入值。
圖9 運行時概念的抽象語法
當(dāng)所有被需要的控制令牌都能夠通過輸入控制流得到,則活動節(jié)點被執(zhí)行。當(dāng)活動節(jié)點執(zhí)行完成之后,控制令牌通過輸出控制流傳遞給接下來的節(jié)點。運行時概念令牌(Token)和其子類ControlToken、ForkedToken定義了在執(zhí)行過程中令牌如何被表示。因此,F(xiàn)orkedToken來源于ForkNode的執(zhí)行,將一個控制流分為多個并行流。令牌通常情況下歸屬于活動節(jié)點(作為ActivityNode的heldTokens引用),通過活動邊傳遞給后續(xù)節(jié)點(作為ActivityEdge的offers引用)。令牌傳遞的表示是由運行時概念Offer來定義。
活動的Variables由初始值進行初始化(作為Variable的InitialValue引用),如果變量的值發(fā)生改變則被設(shè)置為變量的當(dāng)前值(Variable的currentValue引用)。變量的當(dāng)前值會在活動執(zhí)行過程中隨著OpaqueAction的執(zhí)行而更新。為了能夠捕捉活動圖運行軌跡信息,定義運行時概念“Trace”用來維護執(zhí)行過的活動節(jié)點的有序列表(作為executedNodes引用)。
對于活動的輸入變量(Activity的inputs引用),定義運行時概念I(lǐng)nput和InputValue來表示活動的執(zhí)行需要處理的輸入值。
定義運行時概念是對活動圖元模型的擴展,例如新增屬性、引用擴展元模型中的元類或者在元模型中新增元類。在接下來的計算步驟設(shè)計中,將直接把運行時概念引入到活動圖元模型中。
活動圖的計算步驟設(shè)計流程如圖10所示,定義如下:
圖10 活動圖計算步驟設(shè)計的流程圖
1)變量初始化:活動接收輸入值(元類InputValue)根據(jù)輸入值初始化當(dāng)前值(Variable的currentValue引用),局部變量的當(dāng)前值也根據(jù)輸入值進行初始化(Variable的initialValue引用)。
2)將活動節(jié)點設(shè)為運行狀態(tài)(Running),該活動節(jié)點包含的所有節(jié)點都被設(shè)為運行狀態(tài)(Running)(ActivityNode的running屬性)。
3)執(zhí)行初始節(jié)點:活動的初始節(jié)點被設(shè)置為執(zhí)行狀態(tài)(Executed)。執(zhí)行初始節(jié)點包含以下幾個步驟:
a.創(chuàng)建一個控制令牌。
b.將該控制令牌傳遞給初始節(jié)點(ActivityNode的heldTokes引用)。
c.通過輸出控制流將該控制令牌傳遞給后續(xù)節(jié)點(ActivityEdge的offers引用)。每一個活動有且只有一個初始節(jié)點。
4)判定后續(xù)的激活節(jié)點:當(dāng)某個活動節(jié)點被設(shè)置為運行狀態(tài)且所有輸入控制流都提供令牌時,該節(jié)點被激活。如果是MergeNode,僅僅需要其中一個輸入控制流提供令牌,就可以被激活。
5)選擇和執(zhí)行激活節(jié)點:需要從所有激活節(jié)點中選擇一個執(zhí)行,執(zhí)行一個激活節(jié)點可以分為以下3步:
a.消費令牌。所有通過輸入控制流提供的令牌都被消費掉,對于輸入控制流來說,ActivityEdge的offers引用被置空。在消費控制令牌時,控制令牌從前序節(jié)點移除掉(ActivityNode的heldToken引用)。在消費ForkedToken時,F(xiàn)orkedToken的剩余提供令牌數(shù)減去1(remaining OfferCount),只有當(dāng)剩余提供令牌數(shù)等于零的時候(ForkedToken的每一個后續(xù)節(jié)點都處理完ForkedToken),F(xiàn)orkedToken才被移除掉。
b.執(zhí)行節(jié)點的行為。消費令牌之后,根據(jù)節(jié)點的類型,不同的節(jié)點行為將被執(zhí)行。在某些情況下,可能會產(chǎn)生新的控制令牌,添加給當(dāng)前節(jié)點(ActivityNode的heldTokes屬性),并通過節(jié)點的輸出控制流傳遞給后續(xù)節(jié)點。
c.記錄運行軌跡。執(zhí)行完的節(jié)點會被添加到活動維護的Trace引用中。
不同活動節(jié)點的行為語義定義如下:
a.OpequeActions:OpequeAction中定義的表達式將按照順序執(zhí)行。表達式的語義包括將定義的運算符運用到操作變量上,并將結(jié)果賦給當(dāng)前值變量。在執(zhí)行完所有的表達式之后,針對每一個輸出控制流都創(chuàng)建一個控制令牌,并傳遞給后續(xù)節(jié)點。
b.ForkNode:ForkNode針對每一個輸入令牌都會創(chuàng)建一個ForkedToken,F(xiàn)orkedToken的baseToken引用指向該輸入令牌;創(chuàng)建的ForkedToken都由輸出控制流傳遞給后續(xù)節(jié)點。
c.DecisionNode:DecisionNode會判斷輸出控制流的守衛(wèi)條件是否滿足,而輸入令牌會提供給守護條件滿足的邊。需要注意的是:只有一個守護條件能夠被滿足。
d.JoinNode和MergeNode:JoinNode和MergeNode會把輸入令牌提供給所有的輸出控制流。
e.ActivityFinalNode:ActivityFinalNode會終止包含它的活動的執(zhí)行,活動中所有節(jié)點都被設(shè)置為終止。
6)重復(fù)第四步和第五步直到終止,也就是沒有活動節(jié)點處于激發(fā)狀態(tài)。
研究目標(biāo)主要包括SysML活動圖建模與仿真操作的語義設(shè)計與實現(xiàn)。在建模方面,支持用戶通過該軟件,以圖形的形式與系統(tǒng)進行交互,最終完成活動圖的建模工作。本節(jié)將通過多個案例對提出的方法進行驗證。
首先以一個支付活動為樣例來驗證活動圖建模平臺的基礎(chǔ)功能和建模功能,該支付活動涵蓋了活動圖建模所需要的所有基本元素和功能。圖11是一個活動圖,它描述了用戶注冊銀行賬戶并完成支付的活動。圖中將該活動分為兩個子活動:用戶注冊活動和支付相關(guān)活動。賬號分為兩種:內(nèi)部賬號和外部(普通)賬號。內(nèi)部賬戶的支付流程更加復(fù)雜,需要經(jīng)理進行審批和提交。圖中使用了活動分區(qū)/泳道將兩個子活動分配到不同的結(jié)構(gòu):用戶和銀行。不同動作之間使用Pin、Pout作為輸入輸出,Pin接收控制流(ControlFlow),Pout輸出控制流。該支付活動定義了兩個變量:類型為Boolean的輸入變量internal和局部變量external。局部變量external初始化值為false。另外,活動包括:1個初始節(jié)點、1個決定節(jié)點、1個分支節(jié)點、1個集合節(jié)點、1個合并節(jié)點、1個活動終止節(jié)點、2個活動分區(qū)及由15個控制流邊連接的8個不透明動作。同時不透明動作register定義了一個表達式,external!=internal,決定節(jié)點的輸出邊定義了兩個變量作為守護條件。為驗證上述支付系統(tǒng)活動圖的正確性,筆者設(shè)計了單元測試,具體包括兩部分:針對外部賬戶和內(nèi)部賬戶 執(zhí)行路徑。部分單元測試代碼如圖12所示。
圖11 支付系統(tǒng)活動圖
圖12 部分單元測試代碼
最后進行運行,其測試結(jié)果如圖13所示。由圖13可知,仿真過程顯示其設(shè)計正確。
圖13 支付系統(tǒng)活動圖仿真測試結(jié)果
為了更充分地驗證本活動圖建模軟件對不同元素的支持,用圖14所示的活動圖進一步驗證。這是《SysML精粹》第六章執(zhí)行Hohmann轉(zhuǎn)換的活動。Hohmann轉(zhuǎn)換是將飛船從較低軌道送往較高軌道通常使用的方法。當(dāng)衛(wèi)星在兩個相同軌道面且軌道半徑比例相差不大的圓形軌道間時,Hohmann轉(zhuǎn)換是最省燃料的軌道轉(zhuǎn)換方式。
圖14 Hohmann轉(zhuǎn)換活動圖
利用本活動圖建模軟件對流式遙測活動進行建模,技術(shù)活動圖如圖15所示。該活動的關(guān)鍵在于合并節(jié)點。在該活動中,觸發(fā)Create Virtual Channel Frame活動的3個調(diào)用行為動作會并發(fā)執(zhí)行,它們彼此獨立輸出類型為Virtual Channel Frame的對象令牌,這些令牌將先后到達合并節(jié)點,每個令牌到達之后會立刻提供給輸出邊,并作為緊接動作的輸出。此動作將繼續(xù)輸出類型為Transfer Frame的單個令牌流。
圖15 流式遙測技術(shù)活動圖
筆者提出了基于Sirius框架的SysML活動圖建模和仿真的功能設(shè)計與實現(xiàn)方法,主要工作與創(chuàng)新如下:
1)提出了基于MDD的SysML活動圖建模與仿真功能開發(fā)方法。通過MOF四層結(jié)構(gòu)將活動圖進行不同級別的抽象,再通過映射方法將通用的活動圖元模型轉(zhuǎn)換成與實現(xiàn)技術(shù)特性相關(guān)的平臺特定模型,進而利用EMF生成可執(zhí)行代碼。該方法減少了軟件實現(xiàn)中的失誤,大大減輕了開發(fā)工作量,提高了開發(fā)效率。
2)提出了基于Sirius框架的活動圖建模、視圖以及建模與視圖之間交互等語義的實現(xiàn)方法,能完整支持活動圖語義的建模,滿足活動圖建模的基本要求。
3)設(shè)計并實現(xiàn)了一套活動圖操作語義,在保證仿真功能完備性的前提下,對活動圖元模型中無用的語義進行了刪減,保證了仿真引擎的輕量化。
下一步工作是對活動圖的高級建模功能,如支持多用戶協(xié)同操作與歷史版本管理、活動圖模型的測試與調(diào)試等,進行深入研究與開發(fā),真正實現(xiàn)MBSE工業(yè)軟件的國產(chǎn)替代。