SysML 内部块图(Internal Block Diagram)
SysML的内部块图(Internal Block Diagram, IBD)和块定义图(Block Definition Diagram,BDD)的关系非常密切。你可以在 IBD中显示各种元素来说明系统结构的各个方面,那会对BDD中表达的内容做补充。 IBD还有其独特的能力,它是建模工具箱中的重要部分。
1、目的
你创建IBD是为了指定单个模块的内部结构。和BDD—样,IBD是系统或者系统一个组成部分的静态(结构化)视图。和BDD不同的是,IBD不会显示模块,它会显示对模块的使用——也就是在IBD头部命名的模块的组成部分属性和引用属性。
在BDD中也可以显示组成部分属性和引用属性——或者是作为模块分隔框中的字符串,或者是作为关联一端的角色名称。但是IBD可以表达在BDD中无法表达的信息:组成部分属性和引用属性之间的连接;在连接之间 流动的事件、能量和数据的类型;以及通过连接提供和请求的服务。
IBD会表达模块的组成部分必须如何组合才能够创建有效实例。它还会显示模块的实例必须如何与外部实体(引用属性)连接,以在整体上创建系统的有效实例。
这是一种强大的功能。然而,了解SysML的局限性也很重要。SysML没有提供对系统的空间结构建模的方法。IBD可以对那些彼此相连的组成部分建模,但是无法对它们的形状或者彼此之间合适的空间建模。你可能需要使用(非SysML)计算机辅助设计(Computer Aided Design, CAD)工具来完成那个目标。
2、何时创建IBD
IBD和BDD互相补充,提供了模块的信息。BDD让你首先定义模块和它的属性。
然后你可以使用IBD来显示对那个模块的合法配置一模块属性之间特定的一系列连接。因为这种紧密的关系,你通常会在系统的生命周期中不同的时间点为各种利益相关者依次创建IBD和BDD。
3、对模块的回顾
我们会详细讨论能够在IBD中出现的元素和标识法的类型。然而,在那之前,让我们重新回顾一下模块这个主题。
你应该还记得,模块是出现在IBD中的模型元素的类型。然而,模块不能出现在IBD中,它们只在BDD中出现。图4.1中的BDD是大型BDD的节选。注意模块的名称以及它们之间的关系,你会在图4.2的IBD中再次看到那些模块的名称。
关键是:BDD和IBD提供了相互补充的模块视图。
4、IBD外框
内部模块图的图类型缩写是ibd。对于IBD,唯一允许的模型元素类型就是模块。 IBD的外框总是代表你在系统模型某处定义的模块。在外框之中,你可以显示模块的组成部分属性和引用属性,以及把它们连接在一起的连接器。
图4.2中的IBD的名称是“面向流的视图”。这幅IBD代表系统模型中的 Communication and Data Handling Subsystem模块。因此,模块是显示在图中的组成部分属性和引用属性的所有者。
5、BDD和IBD:相互补充的模块视图
图4.1 中的 BDD表示Communication and Data Handling Subsystem 模块有七个组成部分属性:demod、rx、ant、primaryComputer、backupComputer、mod 和 tx。它有 一个引用属性:eps。同样的8个属性也出现在图4.2的IBD中,这8个属性的名称、 类型和多重性在两幅图之间都是对应的。这样,这两幅图就表现了 Communication and Data Handling Subsystem模块一致而互补的视图。
图4.2中的IBD提供的信息大多数和图4.1中的BDD所提供的一样,但它还提供了一些BDD无法提供的额外信息:内部组成部分属性之间的特殊连接,以及它们与外部引用属性eps之间的连接。你使用属性之间的连接来表示那种组合关系。
除了属性之间的连接器之外,IBD还能够表示在属性之间流动的项目,以及属性能够通过那些连接器彼此调用的服务。你会在接下来的小节中看到这个IBD每个部分的详细信息。
6、组成部分属性
IBD中的组成部分属性和BDD中模块的组成部分分隔框中的组成部分属性有着相同的意义:它代表一种结构,位于在IBD头部显示名称的模块内部——也就是组成模块的结构。IBD中组成部分的标识法是带有实线边框的矩形。显示在矩形中的名称字符串的格式和BDD中模块的组成部分分隔框中显示的字符串相同:
<part name>: <type> [<multiplicity>]
可以选择在矩形的右上角显示组成部分属性的多重性,而不是在字符串末尾的方括号中显示。在图4.2中为了介绍显示了这两种标识法。然而,建议在日常工作中创建图时使用一种一致的标识法。
7、引用属性
IBD中的引用属性和BDD中模块的引用分隔框中的引用属性有着同样的意义: 它代表IBD头部显示的名称代表的模块外部的结构——也就是模块因为某种目的而需要的模块,或者是为了触发行为,或者是为了交换事件、能量和数据。IBD中引用属性的标识法是带有虚线边框的矩形。显示在矩形中的名称字符串和BDD中模块的引用分隔框中显示的字符串格式相同:
<reference name>: <type> [<multiplicity>]
和组成部分属性一样,你可以选择在矩形的右上角显示引用属性的多重性。
8、连接器
IBD中两个属性之间的连接器表示,那两个结构在正确组装且可操作的系统中, 拥有某种方式可以互相访问。你可以选择为一个连接器指定名称和类型,以传达更多关于连接那两个结构的媒介的额外信息。名称字符串的格式如下:
<connector name>: <type>
连接器的名称是可选的,并且是建模者定义的。类型也是可选的,但是,如果你选择指定一种类型,那么它必须是你在系统模型两个模块之间某处创建的关联的名称。关联必须连接同样的两个模块,而那两个模块会指定连接器两端的两个属性的类型。
图4.3中的IBD表示飞行计算机(它是通信和数据处理子系统的组成部分)和电子电力子系统(它是通信和数据处理子系统的引用)连接。连接器的名称是pcPower,类型是Power Cable。指定名称和类型会传达更多关于两个结构之间关联的信息。类型Power Cable与电子电力子系统模块和飞行计算机模块之间的关联相关,正如前面 图4.1中的BDD所示。
两个相互连接的属性可以都是组成部分属性、引用属性,或者一样一个。如果两 个相互连接的属性拥有兼容的端口——标准端口或者流端口——你就可以选择把连接器与那些端口连接,而不是直接与属性连接。这样做表示那些属性是在边界的特殊交互点处连接的。
如果你通过流端口连接两种属性,那么就可以通过那些端口传递能够在属性之间流动的事件、能量或者数据的类型。例如,在图4.4中,连接器通过边界上的非原子流端口连接了 eps引用属性和primaryComputer组成部分属性。这些非原子流端口都彼此兼容,因为他们的类型都由同样的流规格Housekeeping Data以及共扼的两个端口之一dataOut决定的(在它的类型之前有个波浪线)。共轭意味着 流规格中的流属性的方向和端口相反。
如果你通过标准端口连接两种属性,那么就可以传递一种属性在那些端口提供,另一种属性需要的服务。例如,在图4.5中,连接器会把eps组成部分属性和cdhs组成部分属性通过边界上的标准端口连接起来。这幅IBD表示电子电力子系统提供了 Power Generation接口,需要Status Reporting接口。相反,通信和数据处理子系统提供了Status Reporting接口,需要Power Generation接口。这些标准端口都是兼容的,那些结构可以在系统操作过程中通过这个连接器来交换服务。
你还可以在IBD的外框上显示端口。这样的端口代表IBD代表的模块(其名称在图的头部显示)边界上的交互点。为了表示复合模块的一个内部组成部分通过边界上的交互点与组合连接,你可以把边框上的端口和组成部分属性的一个端口连接起来。这种设计表示复合结构的一个实例可以为行为和项目流传递请求,或者是从外部客户端到那个内部组成部分,或者是从那个内部组成部分到外部的提供者。
图4.6中的IBD显示(DellSat-77卫星模块的)eps组成部分属性通过solarPanel标准端口与那个模块的边界相连。这幅图还显示,这些标准端口拥有请求接口 Light Source。这个模型表示卫星的电子电力子系统需要一个光源,它会通过卫星边界上的 两个太阳能板访问卫星的外部环境。
9、项目流
项目流代表在系统中两种结构之间流动的事件、能量或者数据的类型。IBD中项目流的标识法是实心的三角箭头,它位于连接两个流端口的连接器上(如图4.7所 示)。项目流的类型显示在连接器箭头旁边的标签上;标签必须包含系统模型中某处存在的模块、值类型或者信号的名称。
项目流代表的类型必须和连接器两端流端口的类型兼容。如果两端的流端口都是原子流端口,那么对于连接器上的项目流类型,那些端口的类型通常是唯一的。如果两端的流端口是非原子流端口,那么它们的类型会由流规格指定。流规格必须包含一个流属性,它的类型和方向要和连接器上的项目流相匹配。
图4.7中的IBD本质上和图4.4中的类似。然而,这个图传达了额外的信息: 在两个非原子流端口之间沿着连接器流动代表℃值的项目流,从eps引用属性流 向primaryComputer组成部分属性。这个项目流与这些非原子的流端口兼容,因为 Housekeeping Data流规格拥有类型℃的流属性,且方向与之相符合。
10、内嵌组成部分和引用
IBD提供了一种强大的功能:显示内嵌在其他属性中的属性。内嵌让你可以在单独视图中表示系统层级结构的多个层级。当看图者需要看到内嵌组成部分之间的关联时,这就很冇必要。(但是,我还是建议你谨慎地使用这种功能;IBD可能会很快变得不可读。)
图4.8提供了带有内嵌属性的IBD例子。在这幅图中,我选择关注组成部分属性为另一种属性所提供的服务。为了显示这一点,IBD显示了它们的标准端口,以及赋予那些端口的接口。这幅图把图4.2中所关注的转换到系统设计的另一个方面。 图4.2显示了流端口,以说明在属性之间流动的事物类型。
注意,可以在显示流端口的IBD中显示标准端口。但我更喜欢做的是,在不同的图中关注系统的两个不同方面。
图4.8中的IBD显示DellSat-77卫星模块拥有一个名为cdhs,类型为通信和数据处理子系统的组成部分属性。而cdhs组成部分属性拥有名为primaryComputer和 backupComputer的组成部分属性。
模型的这个视图和图4.2中显示的视图一致。那幅IBD代表通信和数据处理子系统模块,并显示了所有属性。相对而言,图4.8中的IBD忽略了 cdhs的不少部分,那些都不是这幅图的关注点所在(ant、tx、rx、mod和demod) 。然而,显示的两个部分都和图4.2中的信息一致。
10.1、点标识法
SysML没有限制在IBD中对属性可以进行多少层内嵌:唯一的限制是你的画布的维度,以及图的可读性。属性中的内嵌属性会占据图的很大空间。SysML为了克服空间限制,提供了另一种表达内嵌属性的标识法:点标识法。点标识法让你能够以字符串的形式简洁地表示结构化层级关系。图4.8中IBD顶部的属性就是一个例子。字符串 sensorPayload.xaxisSS: Star Sensor 表达了多项信息:
- 1)DellSat-77卫星模块拥有名为sensorPayload的组成部分属性
- 2)sensorPayload组成部分属性拥有名为x-axisSS的属性
- 3)x-axisSS属性的类型由名为Star Sensor的模块决定
- 4)x-axisSS的多重性是1..1 (默认值,因为没有显示任何多重性设置)
正因为内嵌可以有任意深度,所以点标识法的字符串也可以任意长。对于表示系统层级关系的大量信息以及不同层级上组成部分之间的关联,这是一种非常高效的方式。
但是点标识法(和内嵌方式相比)也有一些缺点。字符串sensorPayload.x-axisSS: Star Sensor不会表达以下信息:
- 1)决定组成部分sensorPayload类型的模块名称
- 2)组成部分属性sensorPayload的多重性
如果需要看到层级关系每个级别每个属性的类型和多重性,那么你就应该使用内嵌标识法,而不是点标识法。
10.2、连接内嵌属性
当你需要为内嵌属性添加连接器的时候,有两种选择:跨越封装内嵌属性的边界绘制连接器,或者在那个边界的端口处停止,并从指向内嵌属性的那个端口再绘制一条连接器。两种做法的例子如图4.8所示。
为了显示电子电力子系统和飞行计算机之间的关联,我首先创建了从eps边界上的标准端口到cdhs边界的标准端口的连接器。然后创建了从cdhs边界上的标准端口到两个内嵌组成部分属性的连接器。相对地,我创建了直接从x-axisSS属性到内嵌 的primaryComputer和backupComputer属性的连接器,在这个过程中跨越了 cdhs边界,从而显示了星球传感器和飞行计算机之间的关联。
决定是跨边界绘制连接器,还是在边界上的端口处停下,这应该基于对设计原则的理解。端口让你以模块化的方式指定模块,显示面向客户端的接口,它会隐藏模块的内部实现。这是面向对象中的封装原则。这是非常好的原则, 你可以在设计的默认模式下采纳它。
你跨边界绘制连接器的时候,就违背了封装原则。这样做也有很合理的原因 (例如,需要满足要求很高的实时嵌入式系统中的性能约束),但那种情况是例外,而不是规则。当你必须违背封装原则的时候,要让大家知道,并把理由记录在模型中。
11、小结
IBD表示了系统结构的一个重要方面:在构建的系统中存在的特殊部分,以及那些组成部分之间的关联。系统设计的这个方面很好地补充了你可以在BDD中表达的信息,所以你通常会依次创建这两种图。
IBD拥有一种独特的能力,它可以表示特定组成部分为另一部分提供的服务,以及能够通过它们的关联流动的事件、能量和数据。系统结构的这方面内容对于系统利益相关者而言非常有价值。