初入SysML之模块定义图

如果把系统工程看做一座山,那么基于SysML或UML的各种图就是从不同角度去看这座山所形成的“画”。“横看成岭侧成峰,远近高低各不同”,每幅“画”都能展现出其不同角度的“美”,但又无法完全画出每一棵树、每一朵花。

今天我们来画一下山的脉络——模块定义图。文绉绉的东西放后面,直接从实例说起吧。

比如台式机由主机、显示器、鼠标、键盘、音响等组成,用SysML怎么表示呢?

首先我们需要把它们都当做一个模块(block),然后各模块和台式机之间都有一个组合关联(连线的表现形式为连线加黑色菱形块)的关系,其中一个台式机有一对音响,即应该将连线的音响端的多重性设为2,其余都为1则可不进行特殊设置。

如果想将音响进行左右划分,还能像下面这样画。

对于台式机内部的模块来说,都和主机有着联系,比如主机可以让音响发出指定声音、在显示器上显示出画面;鼠标可以控制主机在显示器上鼠标的位置;键盘可以向主机输入字符。这些都可以算是一种引用,如下图(为了看起来清晰,这里另起了一个图),含箭头的为单向引用,不含箭头的为双向引用。

P.s.:这种关系其实也可以在主机的内部块中通过各自的属性进行表示。

介绍完台式机的内部模块大致分布与联系,接下来继续深入细化介绍台式机的内容,但整个台式机的内容实在是太多了,要完完全全的展现出来实在是篇幅有限,在这里我们挑选主机来继续细化。

那么我们继续思考下,主机是由什么组成?

如果是自己组装主机,我们需要准备的有:机箱、主板、cpu、风扇、内存条、硬盘、电源等。画出的Sysml图如下,其中的若干1..*表示一个主机可能会包括多个内存条、风扇和硬盘。

上图呈现的是一个通用的主机组成,而各模块的下面可能又有很多种细分。比如CPU可以分为英特尔和锐龙两大类,各自下面又有多种型号。这是CPU的一种细分(或者说是继承),所以互相之间应该是一种泛化关系(空心三角箭头),可以画出下面这个图(图中只是简单的拎出了几个型号)。

通过以上,我们可以来总结一下。

1.从总体上,模块定义图的表现形式为一个矩形框,左上角有一个五边型区域,记录着图类型、元素类型、元素名、图名,这也是SysML图的规范样式。其中模块定义图的图类型为 bdd;元素类型和元素名为所属命名空间的元素,例如CPU泛化图所属的命名空间(即所属元素)为CPU,CPU的类型为Block,故其左上角显示为bdd[Block]CPU[CPU泛化] 。

2.从模型元素上看,模块定义图的基本模型元素是Block(模块),它所表现的是模块间的结构组成及关系,这和UML类图相类似。

既然模块是模块定义图中最重要的部分,下面我们系统的介绍下模块。

模块是描述系统或元素结构的模块化单元。模块的属性总体可以分为两大类:结构属性和行为属性。结构属性包括值属性(值类型)、组成属性、引用属性、约束属性、端口。行为属性包括操作、接收。它们表示系统的状态和系统可能表现出的行为,在模块定义图中模块的图例可以通过各隔间来展示。

▲图源OMG Sysml1.6

组成属性放置在parts隔间,命名规则为:[]。当两个模块之间为组合关联时,默认会生成一个组合属性,其type为被组成部分。

例如在主机组成的图中,我们将CPU和主机进行了组合关联,此时主机便自动生成了一个组成属性。再对该属性命名成CPU并设置其多重性为1,在图中的表现将是“CPU:CPU[1]”(该画图工具在连线存在时不会显示组成属性)。

引用属性放置在references隔间,命名规则为 :[]。当两个模块之间为引用关联时,默认会生成一个引用属性,其type为被引用部分。

例如在主机引用的图中,我们将键盘和主机进行了双向的引用连接,键盘和主机便都自动生成了一个引用属性。因为没有设置多重性,在图中的表现为“主机:主机”和“键盘:键盘”(该画图工具在连线存在时不会显示引用属性)。

值属性、端口、约束属性和两个行为属性这次还没有用到,会在模块定义图和活动图中再做详细介绍。

模块之间的关系主要有四种(如果把引用关联和组合关联合一起可以认为是两种)。

1.引用关联,表示的是模块的实例之间可以存在的一种连接,以达到某种目的彼此访问。表现形式为一条实线,一端有箭头表示单向访问,两端都没有箭头表示双向访问。比如例子中键盘和主机的引用关系。

2.组合关联,表示结构上的分解。组合端的模块实例由一些组成部分模块的实例组合而成。表现形式为一条实线,且组合端有实心的菱形,在组成部分端有箭头表示从组合端可以对组成部分进行单向访问,如果没有箭头则表示双向访问。比如例子中主机和台式机之间的组合关系。

3.泛化表示两种元素之间的继承关系,“抽象”一点的超类型,“具体”为子类型。表现形式为一条实线,在超类型的一端带有空心的三角箭头。比如CPU和英特尔CPU之间的泛化关系。

4.依赖的一端为客户端,依赖于模型中的另一种元素——提供者。表示当提供者元素发生改变时,客户端元素可能也需要改变。表现形式为带箭头的虚线,箭头方向从客户端指向提供者。

到这里,对象征山脉络的模块定义图应该都有初步认识了吧。期待下次模块内部图再见。

由我司研制的SysModeler,是可视化的系统建模工具,支持UML、SysML、AADL等语言,并可以进行仿真和文档生成。对标产品有国外IBM公司的Rhapsody, NoMagic公司的MagicDraw等。

对于SysML中定义的动态图,如状态图和顺序图等,SysModeler可以生成相关的C语言或者Java语言代码。通过模型可以产生高质量的代码,这种代码既可以作为系统模型验证的代码,也可以作为生产系统上的代码。这些代码可以动态运行,并以可视化的方式显示运行结果来方便调试模型,例如基于状态图的断点设置、在顺序图上捕捉不同对象之间的消息映射等等。通过模型级和代码级联合调试、验证,能够直观地尽早发现系统的设计错误或缺陷,从而较早地确定或降低项目风险。


版权声明:本文为digi2020原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。