系统建模语言(SysML)有两个基本方面,类似于人类用于交流的自然语言中的两个重要语法范畴,即名词和动词。在SysML中,这两个方面分别是结构化构造和行为构造;其中结构化构造相当于自然语言中的名词,行为构造则相当于动词。
我们在之前的话题中提到了语言的结构性方面,讨论了包和模块。现在我们将关注主要的行为图,即活动图。还有许多其他行为图,行为确实可以在结构图中以操作的形式看到,也可以通过直接分配给某个区块的行为来看。
对于初次接触SysML并第一次看到活动图的初学者来说,可能会联想到流程图。但他们很快就会发现,活动图的语法和语义远超流程图的范畴。活动图在形式上基于一种名为“Petri Nets”的数学分支,并采用一组标记(token)系统来表示动作的执行顺序以及在系统中流动的各类元素。这些流动的元素可以是信息项、物理实体,甚至是控制信号。我们将通过这一标记系统来阐明活动图的工作原理。
该图描述了车辆的加速过程,展示了活动图中常见的许多元素。在后续主题中您会发现,这是一种表达力很强的图,如果精心设计,能够严谨地传达大量信息。
事实上,活动图的语法是所有SysML图中最为丰富的之一。再加上Enterprise Architect提供的丰富且高效的机制和工具,用于处理这些图,模型设计师表达自我的机会大大增加,使得活动图成为系统建模中最灵活但同时也最具挑战性的部分之一。
SysML活动图基于同名的UML图,但在两个方面增加了额外的语义:
尽管该图示可能基于我们自然语言中动词序列化机制(即由名词连接的动词串),但如前所述,其形式上的起源可追溯到数学的一个分支——Petri Nets和令牌流。建模者必须理解语言中的令牌流特性,并学会可视化那些在对象流中流动、在缓冲区中暂存,并由其他语言机制控制以决定动作之间如何流转的无形元素。若缺乏这种理解,将很难解读活动图,包括动作序列的控制方式、输入的消耗过程以及输出的生成过程。
活动图与流程图或过程图等其他类似图之间的显著区别在于,它能够建立这些行为元素与结构元素之间的关系。
系统工程学科的一个基本方面,是能够将功能与形式分离,同时又能建立两者之间的映射关系,从而揭示出架构与设计这两个核心组成部分之间的连接点。复杂系统工程问题的经验证据证明,这种方法可以带来深远的好处。
Enterprise Architect提供了丰富的工具集来处理这些关系,不仅能够以活动和操作的形式将系统行为分配给模块,还能将这些元素与模块所拥有的行为特征(如操作)进行关联。
13.1 动作:基本的行为构建模块
动作是连接在一起以描述活动、子系统、系统或其部分行为的行为原子。实际上,活动由一组动作组成,这些动作协同工作,将输入到活动中的项目(token)转换为活动输出的项目(token)。序列中的第一个动作会从所属活动的输入参数节点接收输入,而序列中的最后一个动作则将输出放置到活动的输出参数节点之一。动作本身有输入和输出设备,称为引脚——动作会在其输入引脚接收令牌,执行工作,并将生成的令牌放置在输出引脚上。
Enterprise Architect 对动作及其输入输出建模提供了丰富的支持,用户界面的各个部分在处理这些基本行为构建模块时都可以使用。工具箱中有多种不同的动作类型。
工程师可以直接从工具箱中添加动作,但更常见的是从已定义的层级结构中的现有活动创建动作,详见“创建活动层级”主题。为此,活动不是从工具箱中拖出,而是从浏览器窗口中拖入打开的活动图中作为调用——这实际上是基于该活动创建一个动作并将其放置在图中。
集成的属性窗口可方便地操作动作及其引脚。工程师可以为动作及其引脚指定一系列属性,包括引脚名称、类型、多重性、方向等更多选项。属性窗口可固定在某一位置或漂浮显示,甚至可拖拽到不同的显示器上;当在浏览器窗口或图中选择元素时,即可查看、创建或修改其属性。
创建图时,添加的元素会自动插入到浏览器窗口中,使工程师能够查看活动、动作、引脚及其他元素的结构视图。即使图未打开,也可以在浏览器窗口中选择这些元素,并直接在属性窗口中进行编辑。
图中的引脚标签中会显示若干属性,包括名称、类型和多重性。多重性同时指定下限和上限:下限指定了在特定执行动作时,该引脚允许消耗或创建的令牌数量的最小值,而上限则指定了该引脚上消耗或创建的令牌的最大数量。
在操作动作时,还有多种窗口可供使用,其中包括“可追溯性窗口”,它能显示元素之间的关联关系,无论这些元素位于模型库的哪个位置;同时还能展示其结构特征,例如引脚和参数。
13.2 活动图介绍
活动图是一种用于展示描述模块或其他结构元素行为的动作序列的图。动作通过控制流进行排序,并可包含输入和输出引脚,这些引脚作为从一个动作流向另一个动作(或来自控制节点或缓冲节点)的项目缓冲区。动作所执行的工作会消耗或产生这些物品。这些物品可以是物质、能量或信息,具体取决于系统及所描述的活动。
创建活动图
活动图可以从用户界面的多个位置创建,例如:
我们将使用设计功能区来创建一个活动图。首先,选择在浏览器中要创建活动图的位置。与所有图一样,该位置可以是包或元素,但通常将活动图插入到包中。在浏览器中选定包的位置后,选择功能区选项:
设计 > 图 > 添加图
选择此选项将打开“模型构建器”对话框中的“图构建器”标签页,可以在其中更改图名称(默认为在浏览器中选定的包或元素的名称)。当选择SysML视图并指定SysML版本后,系统将显示一系列图类型,您可以从中选择活动图。点击“创建图”按钮后,系统将在浏览器中选定的位置创建一个新的活动图。图画布将被打开,您可开始添加描述系统向用户提供的价值的元素和连接器。Enterprise Architect 还会显示工具箱中的“活动”页面,其中包含由SysML规范定义的、适用于构建活动图的元素和关系。根据需要,您还可以打开任意数量的其他工具箱页面,此外,通用元素和通用关系工具箱页面始终可用。
活动图中使用的主要元素和连接器包括:
元素
连接器
这些图中还可以使用许多其他元素和连接器,它们对于更高级的建模非常重要;随着建模人员经验的增加,或在描述或设计系统行为的更复杂部分时,可能需要使用其中一些。这些包括活动参数、合并、中央缓冲节点、区域、分叉与汇合、决策和合并。
可以通过将工具箱中的元素拖放到图画布上来向图中添加元素。通常建议从一个初始元素和一个或多个最终元素开始,这些元素应被适当命名,以描述活动的起始方式以及可能存在的多种结束方式。如果这些元素的名称留空,或使用诸如“开始”或“结束”之类的普通词汇,则无法帮助读者明确所建模的是哪个系统或系统的哪一部分,反而可能导致对图的误解。当这些节点被添加并正确放置在图中后,就可以添加动作节点和对象节点。动作之间可通过控制流关系进行连接,从而定义动作执行的顺序。
一旦创建了基本的图,并且随着对领域和系统行为的了解不断加深,就可以使用附加的元素和关系来构建或完善该图,包括:
如前所述,活动图具有丰富的语言工具,工程师应鼓励使用这些工具以使系统描述更加丰富。但需谨慎注意,确保这些语言机制能够被目标受众所理解。
13.3 创建活动层次结构
系统建模语言和企业架构师的新手可能会惊讶地发现,活动图中使用的不是活动,而是动作。作为动作分类器的活动通常在模块定义图中可视化。这听起来可能有些反直觉,但当你理解动作是系统行为的基本单元时,这就更合理了。活动是分类器,因此可以像模块元素一样参与广泛的结构关系,这也是为什么像用组合标记的关联这样的关系可以在活动之间使用。
在此图中,采用了一种分解结构,通过组合关系将一个活动细分为若干更具体的子活动。有许多关系被组合在一起,使图表更具吸引力,采用图菜单中可选的灵活线条样式之一。
13.4 使用控制流指定动作顺序
动作在活动的上下文中执行,而动作的执行顺序主要由称为控制流(Control Flows)的特殊连接器来控制。这些连接器是连接动作之间的有向线,本质上充当控制令牌的通道,使令牌能够沿箭头方向从一个动作流向下一个动作。在所有输入的控制流都接收到令牌之前,动作无法开始执行;一旦接收完成并执行动作后,就会在输出控制流上放置一个令牌,这意味着该令牌将被传递到序列中的下一个动作。控制流关系可通过“图表工具箱”中的“活动”页面获取。
还有控制节点,可用于与控制流配合使用,通过分叉(Forks)、合并(Joins)、决策(Decisions)和汇合(Merges)来协调控制流的执行方式。共有三种专用节点:初始节点、最终节点和流程最终节点,分别作为流程的开始和结束点。最终节点(正式名称为活动最终节点)用于表示当令牌到达时,整个活动将终止;而流程最终节点则会消耗传入的令牌,但不会对包含的活动产生任何影响。
中断正常流程
在活动执行过程中,建模者有时需要指定一种方式来终止活动的某一部分行为。例如,在实际场景中,用户可能已经使用机器功能(如校准离心机)进行了一部分动作,然后决定终止校准过程中的某个特定阶段。这种场景可以通过界面上的“取消”按钮实现。SysML允许通过“可中断区域”和“中断边”来建模此类情况。该符号允许绘制可中断区域,包含多个元素,如动作和其他节点。通常,当异常发生时,活动内会触发一个事件,并由接受信号动作接收;该元素没有输入控制流,只有一个输出中断边缘,针对位于区域外的行动。
在该图中,工程师已对离心机进行速度校准的流程进行了建模。离心机校准过程可能因多种原因中断,例如离心机出现不稳定情况,或操作员被调去执行其他任务。通过使用“接受事件动作”来表示该活动具备在指定区域内监听所需中断的机制。随后,特殊的“中断流”连接器将目标定位到区域之外的动作,用于关闭离心机;最终,这一流程会终止校准活动。
13.5 用对象流指定项流
活动及其所包含的动作通常通过处理到达输入节点的项目来完成工作,当工作完成后,再将生成的项目放置到输出节点上。如前所述,SysML中的活动建模基于一种称为“Petri Nets”的数学分支,该分支关注离散状态事件系统。到达输入结构的项目必须以有序且系统的方式,经过由活动及其内部动作构成的图。这种传递过程由对象流实现,对象流充当从一个节点向另一个节点输送标记的通道。这些标记代表多种不同类型的“事物”,包括信息、结构或物理实体(如固体、液体和气体)。因此,项目在活动中传递的方式包含两个重要部分:作为令牌起点和终点的节点,以及用于传输项目的连接器(通道)。
Enterprise Architect 完全支持对这些流程进行建模,当创建或打开一个图以进行编辑时,工具箱中将包含如图所示的对象节点:
它还包含一个部分,列出了可用于连接节点的对象流关系,从而为令牌从一个节点流向另一个节点提供通道。
协调令牌流
在建模复杂系统时,通常需要为令牌流创建更复杂的路径(通道),例如通过分叉和合并路径,使令牌能够同时发送到多个对象节点以实现并行处理,或根据某些条件将令牌引导至特定路径。这些控制节点用于控制流程,并在图工具箱的页面中集中显示。
Enterprise Architect 允许对连接器进行操作,以创建所需的任何路径。这可以通过使用连接器上下文菜单中的线条样式来实现;其中最灵活的是自定义样式,但还有其他几种非常实用的样式。建模者还可以将连接器的端点固定到源或目标元素的特定位置。
传输中的令牌存储
在执行某项活动时,有时需要将令牌存储比活动参数和操作引脚所能支持的更长时间。通常情况下,多个动作需要访问一组令牌流——这些令牌可以被存储在中央缓冲区中,并提供给需要它们的节点使用。中央缓冲区接收所有进入的令牌流,然后将令牌提供给下游节点;一旦令牌被接收,便会从缓冲区中移除。
中央缓冲区可通过将“中央缓冲区”图标从工具箱拖拽到打开的活动图中创建;然后可使用对象流将其连接到其他对象节点。
因此,在活动执行过程中,中央缓冲区可根据令牌的消耗情况而被填满或清空。另一种类型的节点是数据存储器,它是中央缓冲区的一种特殊形式,当下游动作消耗令牌时,会将副本复制并重新存储回缓冲区中。这使得数据存储器看起来像是一个永久性存储空间——但仅在活动执行期间有效。
可以通过将“数据存储”图标从工具箱拖拽到打开的活动图中来创建数据存储;然后使用对象流将其连接到其他对象节点。
13.6 使用参数和引脚对输入和输出建模
活动及其构成的动作是系统的执行力量;而诸如模块和部件等结构元素定义了系统的结构或形态,活动则定义了系统的功能运作。当一个活动正在执行时,我们看到结构元素被调用以实现某种系统行为。系统所完成的大部分工作以及定义这些工作的行为,都依赖于执行活动所消耗的系统输入,从而产生输出。
不同系统之间的输入和输出差异很大,可能包括控制信号、材料、光、流体、能量、数值和信息等。这些输入和输出被称为参数,它们具有类型,并且可以有多重性。通过定义类型,可确保活动明确指明其期望接收的“事物”种类(类型)。例如,如果蒸馏器的一个输入参数被定义为液体类型,甚至更具体地定义为含污染物的液体,那么当该参数接收到气体或整数值作为输入时,该活动将被视为结构不完整。参数的类型可以是预先定义的一组任意类型,从简单的整数到复杂的结构体均可。输入和输出可通过一个模块进行类型化,从而形成清晰定义的结构元素——例如,在超市收银台的自助扫描系统中传递的杂货商品。此外,参数还可定义其他属性,如流式传输或非流式传输、多重性和方向性。当参数持续接收数据流时,例如流体、通信信号或音频、视频流等信息信号,通常使用流式传输。多重性定义了输入参数所消耗或输出参数所产生的令牌数量的上下限。而方向则定义参数是接收输入(in)、产生输出(out),还是同时兼具两者(inout)。
当活动以调用形式放置在活动图中时,它们由动作(Actions)表示,而活动所拥有的任何参数则作为这些动作上的引脚(Pins)进行建模。引脚从输入的对象流中接收令牌,所属的动作执行其操作,并将指定数量的令牌放置到输出引脚上。引脚可以具有简单类型,如整数,也可以是复杂结构,例如矩阵,甚至可以是模块(Block),如视频流。多重性用于指定上下限,定义了允许到达或离开某个特定引脚的令牌的最小和最大数量。该未完成的示意图展示了一个带有输入和输出引脚的动作,以及令牌沿对象流从所属活动的输入参数传递的过程。
参数和引脚统称为交互点,表示它们是元素与其环境相互作用的位置;可通过多功能的“特征”窗口选择将这些点包含在图表中。
Enterprise Architect允许你创建一个图,其中将主活动作为包含在图中的其他活动的容器。在此图中,主活动所定义的活动参数以引脚的形式表示在作为活动调用而包含的动作边界上。该图显示了一个具有两个输入参数和一个输出参数的活动。以令牌形式存在的输入可以在图中被追踪,当它们到达引脚时即可识别。一旦动作完成其工作,令牌就会被放置到输出引脚上。控制流展示了所包含动作的执行顺序。请注意,使用了分叉(Fork)和合并(Join)来表示两个动作可以并行执行。此外,多个引脚被定义为流,这在图中通过引脚的实线颜色加以标识。
13.7 通过仿真可视化活动
您模型中的任何SysML活动图都可以使用内置的动态模型仿真器进行仿真。这为可视化图提供了直观有效的方式,也便于向用户及工程团队成员进行演示或讲解。
使用模型仿真器,您可以对包含行为的概念模型设计进行执行仿真。启动仿真时,系统会分析当前的模型包,并生成一个动态的仿真进程来执行该模型。由于仿真器直接分析和处理UML结构,因此无需生成中间代码或编译仿真“可执行文件”。这使得仿真环境非常快速且灵活,能够迅速进行修改并测试。
仿真窗口
仿真窗口是启动、停止和逐步执行仿真的主界面。在运行过程中,它会显示当前执行步骤的相关输出及其他重要信息。
请注意工具栏下方的文本输入框,这是控制台输入区域——您可以在此输入简单的 JavaScript 命令,例如:this.count = 4;以动态地将名为 'count' 的仿真变量设置为 4。通过这种方式,您可以在运行时动态影响仿真过程。
断点与事件窗口
仿真过程还使用“断点与标记”窗口中的“仿真断点”选项卡(“仿真 > 动态仿真> 断点”)。在此处,您可以为仿真中的特定元素和消息设置执行断点。
仿真事件窗口
“仿真> 动态仿真> 事件”中的仿真事件窗口提供了管理并执行触发器的工具。触发器用于控制状态机转换的执行。
13.8 分配及其他关系
系统工程中的一个基本方面或学科,就是将结构元素与行为元素联系起来。随着模型的发展,这两个重要方面会逐渐交织在一起。然而,当多名工程师开始着手定义系统时,往往很难确切说明行为与结构之间如何关联。在这种情况下,分配关系(Allocation relationship)尤为有用。它可作为展示行为元素与结构元素之间关系的手段,从而为后续更严谨的建模提供依据,随着模型中所描述的概念变得更加明确,这种建模也将逐步完善。
Enterprise Architect 还支持多种其他方式来表示分配关系,包括在行为或结构元素中作为分隔区。
任何允许设置隔间的元素均可配置为隐藏或显示任意数量的可用隔间。分隔区列表针对特定元素,且具有动态性,意味着只有当该元素参与一个或多个指定类型的关系且该关系在包含图中不可见时,分隔区才会显示。同样的选项也可用于显示元素的其他结构或语义方面,如图中所示。
也可以通过标注符号来显示关系,即在元素上添加注释,显示关系名称以及相关元素的详细信息。该图示展示了活动的标注方式,表明其分配的模块。为此,工程师必须:
此标注符号可用于任何类型的SysML元素或关系,是向某些受众展示关系的一种有效方式。