MBSE建模學習之二:+-#~/^*都啥意思?詳細說說屬性
在MBSE的模型中,我們經(jīng)常看到屬性的定義中有“+-#~/^*”這些符號,它們可不是運算符,理解錯了要鬧笑話。請大家耐住性子看下去,只有理解了系統(tǒng)結(jié)構(gòu)建模中的“屬性”,才能記住這些符號的意義。
MBSE建模工作從哪里入手這個問題,往往都是剛開始對大家造成困惑的問題。如果從學習的角度,一般是從學習模型中各類元素的概念開始,先大概了解一遍MBSE模型中都有哪些元素、有什么用處、什么時候用。然后結(jié)合一個自己工作中的項目,把建模工作做一遍。如果按照正常的產(chǎn)品研發(fā)過程,一般按照“需求分析”—>“方案分析”—>“確定架構(gòu)”這個過程,可能會依次用到需求圖、用例圖、行為圖(活動圖、序列圖、狀態(tài)機圖)、包圖或模塊定義圖、內(nèi)部模塊圖、參數(shù)圖。但是我們拿來當作“作業(yè)”的項目,也可能已經(jīng)完成,也不妨直接從架構(gòu)建模開始,先把系統(tǒng)結(jié)構(gòu)模型化,然后逐步完善系統(tǒng)的行為模型、需求模型。這樣從簡到繁的過程,也許是更有效的學習方法。
在上一篇文章中,介紹了表示系統(tǒng)結(jié)構(gòu)(系統(tǒng)的整體架構(gòu),不是指機械結(jié)構(gòu),機械結(jié)構(gòu)是專業(yè)模型,用CAD軟件建模)模型的元素“模塊”(Block)。我們在系統(tǒng)模型中,多次提到“元素”(Element)這個術(shù)語,這個術(shù)語也是UML標準中的一個概念。在UML\SysML模型概念中,“元素”是最基本的概念,模型中的其它概念都是從“元素”繼承的,是所有模型概念的根(Root)。所以,我們把每個模型概念都統(tǒng)稱為“元素”。那么繼續(xù)說“模塊”。“模塊”代表我們設計的產(chǎn)品,以及任何層級的產(chǎn)品。當我們說明這個產(chǎn)品的時候,用它有什么“特征”(Feature,也是UML標準中的元素)來說明它。這個“特征”分兩大類,一類表示它的結(jié)構(gòu)的,稱為“結(jié)構(gòu)特征”(StructuralFeature);另一類稱為“行為特征”(BehavioralFeature)。“行為特征”可以理解為一個產(chǎn)品有什么功能,它是如何工作的。我們在后續(xù)的文章中繼續(xù)介紹“行為”這個概念,這里我們先說說“結(jié)構(gòu)特征”。
“屬性”(Property)是一種元素,它表示類的一個屬性(attribute),或者一個關(guān)聯(lián)(Association)的成員端(memberEnd);或者某些情況下同時都是。
先說說“Property”這個詞的翻譯,我們習慣把它翻譯為“屬性”,這個和“attribute”的翻譯相同。“attribute”不是UML中的一種元素,它只是普通的一個詞語;另外,“類”(Class)有“Attributes”這個屬性,也就是它的所有“Property”。所以UML類圖中,表示方框的“類”有分區(qū)的名稱是“attributes”。為了區(qū)分“Property”和“attribute”,有些書中把“Property”翻譯為“特性”。不過,在程序員中,已經(jīng)很習慣把“Property”稱為“屬性”。所以我們還是按習慣把“Property”翻譯為“屬性”。兩者區(qū)別不大。真要說相同和區(qū)別的話,如第一段中對“Property”的定義,就是當“Property”是一個類的“attribute”的時候,可以說兩者相同,指的是同一個概念;當“Property”僅僅是一個關(guān)聯(lián)關(guān)系兩端的成員(memberEnd)時,這時候不能叫“attribute”。
產(chǎn)品的組成是有層級關(guān)系的。結(jié)合產(chǎn)品的模型,“屬性”這個概念可以理解為下層產(chǎn)品的實例在上層產(chǎn)品實例中的名稱及其它定義。“屬性”可以指父級產(chǎn)品中具體的某一個下級產(chǎn)品,也可以指類型相同的一組產(chǎn)品。“屬性”的類型除了具體的產(chǎn)品,也可以只是一個數(shù)據(jù)類型。在SysML標準中,表示產(chǎn)品的“模塊”(Block)主要有四種類型的“屬性”。“部件”(parts)、“引用”(references)、“值屬性”(value properties)、“約束屬性”(constraint Properties)。“部件”的類型一定是另外一種“模塊”,而且聚合類型是“組合”;“引用”屬性的類型也必須是“模塊”,而且聚合類型是“共享”或無;“值屬性”的類型是“值類型”(ValueType);“約束屬性”的類型必須是“約束模塊”(ConstraintBlock)。
“屬性”(Property)的語法
“模塊”的各種“屬性”可以顯示在包圖或模塊定義圖中模塊節(jié)點的“分區(qū)”(Compartment)中,以一個字符串的形式。這個字符串表示了定義“屬性”的語法。“屬性”完整的語法如下:
<property> ::= [<visibility>][‘/’] <name> [‘:’ <prop-type>] [‘[‘ <multiplicity-range> ‘]’][‘=’ <default>] [‘{‘<prop-modifier > [‘,’ <prop-modifier >]*’}’]
用中文把上面的語法翻譯一下如下:
<屬性>定義為:[<可見性>] [‘/’] <名稱> [‘: ’<屬性類型>] [‘[‘ <多重性范圍> ‘] ’] [‘=’ <默認值>] [‘{‘<屬性修飾語>[‘, ’<屬性修飾語>]*’}’]
上面語法中各部分說明如下:
<visibility>:可見性,表示屬性可以被訪問的范圍。有四種:
+:表示屬性是公共的(public),可以被任何模塊的行為訪問。在SysML標準中所有屬性都是公共的,所以在SysML圖中一般是不顯示可見性的。但是“模塊”既可以表示一個具體的硬件產(chǎn)品,也可以表示一個軟件的模塊。當對軟件進行建模的時候,也還是可以使用“可見性”這個概念。
-:屬性是私有的(private),僅僅被所屬模塊的行為訪問;
#:屬性是受保護的(protected),僅僅對模塊及其子類中可見;
~:相同包內(nèi)可見(package),也就是同一個包中的模塊都可以訪問這個屬性。
‘/’:導出屬性的符號。導出的屬性,意思是這個屬性是其它屬性通過計算得到的。例如正方形的“面積”屬性是“長”、“寬”屬性相乘“導出”的屬性。導出屬性的值一定是“只讀”的,在模塊的實例中不能被其它行為方法修改。
<name>:屬性的名稱。名稱也可以為空。為空的時候,可以用它的類型表示這個屬性。
<prop-type>:屬性的類型,另外一個“模塊”、“值類型”或其它能作為類型(Type)的元素。類型也可以為空,表示可以是任何類型。
<multiplicity-range>:多重性。多重性是指一個屬性在模型中的數(shù)量范圍。它的表示方法是“[lowerValue..upperValue]”,翻譯一下,既“[下限值..上限值]”。例如“[0..1]”表示最少0個、最多1個;“[4..*]”最少4個、最多不限;“[2]”上限、下限都是2,既必須2個;“[*]”不限個數(shù),既0到多個。
=< default>:屬性的默認值;沒有賦過值的話,屬性就取這個值。可以沒有默認值。
<prop-modifier>:屬性的修飾語,可以理解為“屬性”的“屬性”。可能有多個修飾語,每個可能的是如下的值:
<prop-modifier>::= ‘readOnly’ | ‘union’ | ‘subsets’ <property-name> |’redefines’ <property-name>|‘ordered’ | ‘unordered’ | ‘unique’ | ‘nonunique’ | ‘seq’ | ‘sequence’|’id’|<prop-constraint>
‘readOnly’:表示屬性是只讀的。例如導出的屬性就是只讀的。
‘union’:表示屬性是另外的子集屬性的合集。
‘subsets’ <property-name>:表示這個屬性是另外一個集合屬性的子集。例如汽車“前輪”屬性是“輪子”屬性的子集,定義表示為“前輪:車輪{ subsets 輪子}”,表示2個前輪是汽車所有輪子屬性集合中的2個。
’redefines’ <property-name>:重定義了某個屬性。在上一篇文章中,我們介紹過“模塊”是一種可以“繼承”的“類”。作為“繼承類”的模塊自動擁有了“父類”的所有屬性,這些父類的屬性稱為“繼承”的屬性。在繼承的屬性前面用符號“^”標識。繼承的屬性是父類的屬性,不能直接修改它;如果要修改它的定義,必須新定義一個屬性“重定義”它。這里“redefines 父類屬性”就是這種意思。
‘ordered’:表示屬性是有順序的集合。
‘unordered’:表示屬性是沒有順序的集合。
‘unique’:表示是集合的屬性中,集合中每個成員都是唯一的。
‘nonunique’: 表示是集合的屬性中,集合中每個成員不一定是唯一的。
‘seq’或‘sequence’:表示屬性是一個有序的“袋”(bag)。換句話說,就是作為屬性的集合,集合中成員是有序的、但不唯一。集合的類型,“無序、唯一”稱為“組”(Set);“有序、唯一”稱為“有序組”(OrderedSet);“無序、不唯一”稱為“袋”(Bag);“有序、不唯一”就稱為“序列”(Sequence)。
‘id’:屬性是作為模塊的ID屬性,就是唯一標識模塊實例的屬性。例如“產(chǎn)品編號”。
<prop-constraint>:屬性的約束,一般用“{約束表達式}”來表示約束。
通過上面的語法解釋,再總結(jié)一下“+-#~/^*”這一串符號的意義:
“+-#~”:表示屬性的可見性,分表表示“公共的、私有的、受保護的、包內(nèi)可見”;
“/”:表示屬性是導出的;
“^”:表示屬性是繼承的;
“*”:表示屬性的多重性,顯示在屬性定義“名稱:類型”后面的“[]”中。
除了以上UML定義的屬性的基本的語法之外,SysML為屬性擴展了方向特征(DirectedFeature)。方向特征有三種取值:“prov | reqd | provreqd”,翻譯為“提供|需求|提供且需求”。可以為除了流屬性以為的其它屬性添加這個特征(流屬性也有方向特征,“進|出|進出”)。“提供”(prov)表示屬性由擁有這個屬性的模塊提供(寫入)屬性值、被別的模塊使用(讀取);“需求”(reqd)表示別的模塊提供(寫入)屬性值、當前這個模塊使用(讀取);“提供且需求”(provreqd)表示上面兩種要求都有。
屬性這么復雜的語法讓每個人記住、直接輸入是太難了一些。在MBSES軟件中,只是輸入基本的部分:“屬性名稱:類型[多重性]”。其它語法部分通過屬性框輸入。屬性的修飾語部分也可以通過屬性框設置是否顯示(對應模塊元素屬性框中“節(jié)點屬性”—“特征屬性”)。
另外,可以為屬性添加構(gòu)造型,增加額外的特征。例如,對于數(shù)據(jù)有分布特征的屬性添加“分布屬性”構(gòu)造型,為屬性增加分布參數(shù)。
下圖顯示了屬性定義的示例。在示例中,“顯示器”模塊有三個通過關(guān)聯(lián)關(guān)系生成的部件屬性(screen、power-supplying和driver)。“24寸顯示器”繼承了“顯示器”模塊,所以自動有這三個部件屬性。“顯示器”的“產(chǎn)品編號”屬性的類型是一個字符串,它表示產(chǎn)品的唯一編號,是產(chǎn)品的ID。“顯示面積”屬性是一個導出的屬性,因為當顯示器的“屏幕尺寸”和“顯示比例”確定之后,顯示面積就可以計算出來,所以不能再賦值。“24寸顯示器”是從“顯示器”繼承的產(chǎn)品,它繼承了顯示器的所有屬性(繼承屬性前面都有“^”符號,繼承的屬性在子類中不能編輯)。但是為了進一步定義“顯示尺寸”這個屬性,重新定義一個相同名稱的屬性,并重定義父類的“顯示尺寸”屬性。重定義父類的“屏幕尺寸”屬性后,為這個屬性添加了一個“正態(tài)”分布屬性構(gòu)造型,并設置構(gòu)造型的“均值”和“標準差”屬性值。
在模塊定義圖中(或包圖中),如上篇文章所講,“模塊”節(jié)點有20多種分區(qū),其中大部分是顯示各種屬性的。
除了在分區(qū)中顯示屬性之外,在關(guān)聯(lián)關(guān)系的兩端也會顯示屬性節(jié)點。一般情況下在一個圖中不需要同時顯示。
模型之間的關(guān)聯(lián)關(guān)系有三種,“引用關(guān)聯(lián)”、“共享關(guān)聯(lián)”和“組合關(guān)聯(lián)”。這三種關(guān)聯(lián)生成的屬性類型不同。“引用關(guān)聯(lián)”兩端的屬性都是“引用”屬性;“共享關(guān)聯(lián)”兩端的屬性也都是“引用”屬性,不過在關(guān)系末端(不是菱形箭頭的端)生成的引用屬性的聚合關(guān)系是“共享”;“組合關(guān)聯(lián)”在關(guān)系末端(不是實心菱形箭頭的端)生成的屬性是“組件”(part),聚合關(guān)系是“組合”。如果關(guān)聯(lián)是雙向的,則兩端都生成屬性;如果是單向的,僅僅在箭頭端生成屬性。這個屬性的類型,就是靠近關(guān)聯(lián)端的模塊。在這個關(guān)聯(lián)端屬性節(jié)點中,只是輸入屬性的名稱,不需要顯示類型。“共享關(guān)聯(lián)”和“組合關(guān)聯(lián)”在靠近菱形箭頭的這一端的屬性(雙向關(guān)聯(lián)時才會產(chǎn)生),默認的多重性是“[0..1]”,可以不顯示;另外一端的默認多重性是“[1]”,也可以不顯示。多重性是其它情況的話,都要輸入、顯示。
在下面這個圖中,顯示一個分區(qū)中的“值”屬性(“price”值屬性的值類型有一個單位“元”)、兩個關(guān)聯(lián)端的“部件”屬性。“hardDisk”屬性是一個“部件”屬性(由組合關(guān)聯(lián)產(chǎn)生),多重性是“[1..4]”(關(guān)聯(lián)端上的多重性不顯示[],如果不是默認值1,需要通過屬性框?qū)傩陨稀⑾孪薏艜@示)。“monitor”屬性是一個“引用”屬性,多重性是“[1..2]”。它表示計算機可以有1~2個顯示器(顯示器也可以同時連接其它計算機,所以可以建模為共享聚合關(guān)系。)
內(nèi)部模塊圖中的屬性
僅僅在模塊節(jié)點的分區(qū)中顯示屬性,只是顯示屬性本身的定義。模塊的結(jié)構(gòu)定義,更重要的是各個屬性之間的關(guān)系。內(nèi)部模塊圖的作用和意義就是顯示一個模塊的屬性之間的連接關(guān)系。
在內(nèi)部模塊圖中主要顯示三種類型的屬性:部件屬性、引用屬性和值屬性。部件屬性外框是實線,引用屬性是虛線,值屬性也是實線的方框。
方框中顯示屬性的定義。屬性的“可見性”和各種修飾語也可以通過屬性節(jié)點的屬性設置是否顯示。屬性的“多重性”一般是顯示在節(jié)點右上角。
在內(nèi)部模塊圖中的屬性節(jié)點,除了可以顯示對應類型的模塊的各種分區(qū)之外,還可能會顯示一個“初始值”(initialValues)分區(qū)。初始值表示這個類型的模塊在實例化的時候,作為類型的模塊的各個屬性優(yōu)先取的默認值,也就是說它會取代屬性定義的“默認值”。添加初始值可以通過屬性節(jié)點的右鍵菜單“添加”—“屬性值”。
在模塊的內(nèi)部模塊圖中中添加屬性,和在模塊定義圖中在模塊的分區(qū)中添加屬性效果是一樣的。在打開一個已有屬性的模塊的內(nèi)部模塊圖時(在模塊定義圖中,選擇模塊的右鍵菜單“打開內(nèi)部模塊圖”),如果這個模塊以前沒有內(nèi)部模塊圖,會自動新建一個內(nèi)部模塊圖,而且會顯示已有的部件屬性和引用屬性。如果在已有的內(nèi)部模塊圖顯示已有的屬性,可以把屬性元素從模型瀏覽器中拖拽到內(nèi)部模塊圖中;或者先建立一個屬性節(jié)點,然后通過屬性節(jié)點右鍵菜單“選擇已有屬性”來建立節(jié)點和已有屬性的關(guān)聯(lián)。
屬性節(jié)點可以顯示內(nèi)部模塊圖代表模塊的直接屬性,也可以顯示間接的下層屬性。顯示間接的下層屬性的時候,屬性名稱用“.”分隔的多層屬性名稱,表示間接屬性的關(guān)系。也可以直接通過嵌套的屬性節(jié)點顯示多層的屬性。下圖顯示“host:主機”屬性中“mainboard:主板”屬性的兩種方式:
內(nèi)部模塊圖主要還是為了表示屬性之間的連接關(guān)系。屬性之間的連接關(guān)系,用一個“連接器”(Connector)來表示。“連接器”可以僅僅表示兩個部件之間有一個關(guān)聯(lián)關(guān)系,也可以表示物理的“連接器”部件。連接器上可能還傳遞“項目流”。“項目流”是特定類型的信息流,它是一種關(guān)系元素。項目流可以單獨在模塊定義圖中定義,也可以在連接器上直接定義(通過連接器節(jié)點的右鍵菜單“選擇項目流”,在選擇窗口中直接增加項目流)。連接器和連接器上的項目流兩端的類型和方向都必須是相容的。
如下圖所示,主板通過一個“連接器”連接到顯示器。在連接器靠近顯示器這一端也有個“連接器端”的元素,它的“多重性”是1,表示連接器連接的顯示器是1個(雖然整個計算機可能有兩個顯示器,但是一條連線只能連接其中的一個顯示器)。在連接器中傳遞的“項目流”的類型是“顯示信號”,它的方向從主板到顯示器。“顯示信號”是一個元素類型為“信號”(Signal)的信號,在后面的圖中有定義。
上面是表示部件屬性“mainboard:主板”和部件屬性“monitor:顯示器”之間通過一個連接器連接關(guān)系的模型。我們可以繼續(xù)細化這個模型,其中有幾個點需要細化。兩個部件連接的標準是啥?通過什么接口連接?作為連接器的連線是否也需要在模型中體現(xiàn)?假設我們的需求是通過一條符合HDMI2.0標準的連接線連接主板和顯示器。為了表達上述建模要求,在主板和顯示器上分別增加一個“端口”(Port),端口的類型是一對共軛的接口模塊“HDMI2.0接口標準”。我把還增加“HDIM2.0標準線”關(guān)聯(lián)模塊,并作為“計算機”模塊中的一個連接器屬性。用到的這些類型定義在下面的包圖中。
添加接口和連接器類型的內(nèi)部模塊圖如下所示。在“mainboard:主板”屬性中增加一個端口,類型為接口模塊“HDMI2.0”;屬性“monitor:顯示器”中增加一個端口,類型為共軛接口模塊“~HDMI2.0”。連接器的類型可以選擇為關(guān)聯(lián)模塊“HDMI2.0線”,兩者的方向以及兩端的類型必須是相同或兼容的。
文章來源:智睿思維MBSE
工程師必備
- 項目客服
- 培訓客服
- 平臺客服
TOP




















