第六章 Sysml之活动图

目录

活动图

1 活动图简介

2 活动图外框

3 令牌流

4 基本动作

5 对象节点

5.1 普遍的对象节点

5.3 栓

5.4 活动参数

5.5 流与非流

6 边

6.1 边的介绍

6.2 对象流

6.3 控制流

7 动作详述

7.1 动作开始时机

7.2 调用行为动作

7.3 发送信号动作

7.4 接受事件动作

7.5 等待时间动作

8 控制节点

基本介绍

8.1 初始节点

8.2 流最终节点和活动最终节点

8.3 决定节点

8.4 合并节点

8.5 分支节点

8.6 集合节点

9 活动分区


活动图

1 活动图简介

活动图有以下特点:

  1. 活动图可以表示各种各样的活动,甚至可以描述复杂的行为
  2. 对象节点可以通过活动对事件、能力和数据的流建模,使用控制节点可以掌控活动的执行
  3. 活动分区可以为系统结构分配系统行为
  4. 活动图是一种行为图,它是系统的一种动态视图,说明随着时间的推移行为和事件的发生序列
  5. 活动图可以表达复杂的控制逻辑,这要比序列图和状态机图更强
  6. 活动图是唯一能够说明连续系统行为的图

创建活动图的时机:捕获系统及其执行者期望的行为

2 活动图外框

活动图的类型缩写是act。其中唯一允许使用的模型元素类型是活动。活动图的外框表示建模者在系统模型某处定义的单个活动。活动本身是一种模型元素,是一种行为,是一种命名空间。

如下图所示,活动图的外框代表名为执行Hohmann转换的活动,这个图的名称是“用例说明书 ”

3 令牌流

令牌可以在活动图之间移动,跨越边缘,从一个节点到另一个节点。可以有多个令牌流动通过活动的一次执行。每个令牌都基于其本身的类型和状态,定义活动的动作和控制逻辑以及在活动执行过程中发生的事件,不依赖其他令牌进行移动。

令牌的两种类型:

  1. 对象令牌代表的是在活动中流动的事件、能量或者数据的实例。一个对象令牌代表建模者在模型层级关系中某处创建的模块、值类型或者信号的实例(以定义事件、能量或者数据的类型)
  2. 控制令牌只表示活动的哪个动作在活动执行的特定时刻处于启用状态。

4 基本动作

动作是一种可以存在于活动之中的节点,它是为活动基本的功能单元建模的节点。一个动作代表某种类型的处理或者转换,它会在系统操作过程中活动被执行的时候发生。

动作的注意点:

  • “基本“”动作的标识法是圆角矩形,还存在特殊类型的动作
  • 建议把动作写成一个短语,由有力、无歧义的动词开始。同时应该避免把多个动词放在一个动作中,而应该把它分解成多个动作。例如,不要写“验证并保存命令”,而应该创建两个连续的动作:“验证命令”和“保存命令”。

动作可以用两种方式表示:

  1. 自然语言,如英语
  2. 正式的编程语言,如c语言。这种情况叫做不透明表达式,包含两部分:花括号指定语言,花括号后指定主体

如图所示,使用自然语言表达的动作

如图所示,使用c语言表达的动作

5 对象节点

5.1 普遍的对象节点

对象节点是另一种能够存在于活动之中的节点,它会对对象令牌通过活动的流建模(其中对象令牌代表的是事件、能量或者数据的实例)。对象节点常出现在两个动作之间,以表示第一个动作会产出对象令牌作为输出,第二个动作会将这些对象令牌作为输入。

对象节点的标识法是一个矩形。显示在对象节点中的名称字符串会按照以下格式:

“<object node name> : <type>[<multiplicity>]”

  • 对象节点名称(object node name)是建模者定义的
  • 类型(type)必须与建模者在模型层级关系中某处定义的模块,值类型或者信号的名称匹配,它会指定对象节点能够持有的对象令牌类型。
  • 多重性(multiplicity)会指定在活动的执行过程中的特定时刻对象节点能够持有多少个对象令牌,默认多重性为1…1

如下图所示,显示了名为currentAltitude的对象节点,它持有代表值类型km的实例的对象令牌。第一个活动产出一个对象令牌作为输出,第二个动作则需要一个对象令牌作为输入

对象节点可以显示分隔框来显示持有的对象令牌的内部属性,原始值类型km则不需要(没有内部属性)

5.3 栓

**栓(pin)**是一种特殊类型的对象节点。可以把栓附加到动作上,表示动作的输入或输出

栓的标识法是附着在动作外边界上的小方块,在方块内部显示一个箭头(箭头是可选的),以指定栓代表的是输入还是输出。

如下图所示,栓的名称字符串格式和对象节点一样,但它会显示在栓的附近,而不是显示在栓中,栓标识法无法显示分隔框,但这种标识法更节省空间。

栓的意义和对象节点一样,即该图等价于下述视图

如下图所示:SysML要求当栓的多重性下限是零的时候,(在名称前)使用<<optional>>元类型。

5.4 活动参数

活动参数是另一种特殊类型的对象节点。可以把它附加到活动图的外框上,从总体上表示活动的一种输入或者输出。活动参数的标识法是横跨在活动图外框上的矩形。

一种约定俗成的建模方法:

  • 输入活动参数放在外框的顶部或者左边
  • 输出活动参数放在底部或者右边

活动参数的名称字符串的格式和对象节点(以及栓)相同,如下图所示:

5.5 流与非流

非流(nonstreaming)的行为:动作和活动只有在执行的时候才会消费它们的输入对象令牌,只有在完成执行的时候它们才会交付输出对象令牌。

如下图所示,带有一个非流的输入框和非流的输出框,其过程如下:

  1. 类型为传输命令的对象令牌到达输入栓currentCommand
  2. 动作vc开始执行,并消费对象令牌
  3. vc执行时,内部生成类型为Boolean的对象令牌
  4. vc执行完成后,发送到输出框isCommandValid中

流(streaming)行为:动作和活动会在行为持续执行的时候接受输入和产生输出。可以在栓或者活动参数的名称字符串后面指定[stream],从而为流行为建模。

  • 到达流输入栓的对象令牌会马上为动作所用,即便它由于之前到达的对象令牌已经开始执行

如下图所示,当ma执行时,会在内部生成一个类型为km的对象令牌并发送到输出栓上,即便ma正在执行

6 边

6.1 边的介绍

活动可以包含两种一般类型的元素:节点和边。节点包括:动作和对象节点,边:对象流和控制流。

6.2 对象流

对象流是一种边,它会传输对象令牌。使用对象流,可以表示事件、能量或者数据的实例通过活动,在系统操作过程中活动执行的时候,从一个节点向另一个节点流动。

  • 对象流的标识法是带有箭头的实线,对象流一般会把两个对象节点连接在一起

如下图所示,有七个对象流示例,表示这个活动部分中的动作需要对象作为输入,并产出对象作为输出

必须确保对象流两端的对象节点拥有兼容的类型,在尾端作为输出产生的对象令牌必须可以作为箭头端的输入被接受。可以以下面两种方式之一来满足这种约束:

  1. 类型可以是相同的
  2. 上游的类型可以是下游类型的子类型

如下图所示,Transfer Command是Command的子类型,动作vc需要Command类型的输入,因此可以接受Transfer Command

6.3 控制流

控制流是一种传递控制令牌的边。控制令牌的到达可以启动等待它的动作。当一个动作完成时,它就会在输出的控制流中提供控制令牌,那会启动序列中的下一个动作。

控制流用两种标识法:

  1. 带有箭头的虚线(建议这种方法,以此区分对象流和控制流)
  2. 带有箭头的实线

如下图所示,有七个控制流的示例,有四个动作(之后会讲特定的动作类型)。当一个动作完成时,它就会在输出的控制流中提供控制令牌,那会启动序列中的下一个动作。

7 动作详述

7.1 动作开始时机

动作启动需要满足三个条件:

  1. 拥有动作的活动正在执行
  2. 在所有输入的控制流上都有控制令牌到达
  3. 在所有输入的对象流上都有足够数量的对象令牌到达,以满足相应输入栓的最低多重性

如下图所示:

  • 动作ma有一个输入的控制流和对象流,对象流最低多重性是0,因此当输入的控制流有控制令牌就可以启动
  • 动作vc有一个输入的控制流和对象流,由于输入栓没有显示多重性,故默认为1..1,因此需要控制令牌和对象令牌都到输入边才可以启动
  • 动作rs有一个输入的对象流,对象流最低多重性是0,且没有输入的控制流,所以不需要任何令牌即可启动

7.2 调用行为动作

调用行为动作是一种特定的动作,它会在启用的时候触发另一种行为。调用行为动作可以把一个高层次的行为分解成一系列低层次的行为。

调用行为动作所调用的行为可以是以下三种中的任意一种:

  1. 交互
  2. 状态机
  3. 其他活动(调用行为动作右下角会出现分支符号)

调用行为动作的标识法和动作的标识法相同(圆角矩形),只是其中的名称字符串有其特别的格式:

“<action name> :<Behavior Name>”

  • 动作名称(action name)由建模者定义。
  • 行为名称(Behavior Name)必须和建模者在模型层级关系中某处定义的交互、状态机或者活动的名称匹配。

如下图所示,调用行为动作ma和cv右下角有分支符号,是一种活动,而rs没有分支符号,可能是状态机也可能是交互

如下图所示,分支符合表明open telemetry stream 是一种活动,由于是流栓,所以这个动作会在一次执行过程中持续输出多个类型为Transfer Frame[1]的对象令牌

如下图所示,这是open telemetry stream的活动视图

7.3 发送信号动作

为了满足可伸缩性和性能的要求,系统工程师经常会设计分布式和并发的系统。这样的系统会使用并发机制来传递事件、能量和数据,并同步那些以并行的方式操作的各种动作。建模者可以使用发送信号动作和接受事件动作,在活动图上为这种类型的系统行为建模。

  • 异步是指在程序执行过程中,不需要等待某个操作完成才能继续执行后续的操作
  • 并发是指系统能够同时处理多个任务或操作的能力,这些任务可能是同时启动的,也可能是交替执行的
  • 没有异步就没有并发

发送信号活动是一种特定类型的动作,启用的时候会异步地生成信号实例,并把它发送到目的地。

发送信号动作的标识法是形状类似于路标的五边形

  • 在发送信号动作内部显示的字符串必须与建模者在模型层级关系某处定义的信号的名称相匹配
  • 信号是一种模型元素,和模块一样,信号可以拥有属性。那些属性一般会代表信号实例从发送方到目标方传递的数据。

如下图所示,其过程如下:

  1. 输入栓有输入的对象令牌
  2. 异步生成Orbit Radius Updated信号的实例,把currentOrbitRadius值传送给等待它的目标方
  3. 发送信号动作是异步的,不需要等待来自目标方的回应,因此会立即完成,并在输出边提供一个控制令牌

 每当有新的对象令牌到达输入栓,发送信号动作都会启动

7.4 接受事件动作

接受事件动作在异步行为中是发送信号动作的好搭档;接受事件动作是在活动中使用的元素,它表示活动在继续执行之前,必须等待发生一个异步的事件。

  • 一般情况下,这个异步事件是接收信号实例
  • 接受事件动作不仅限于(从发送信号动作)接收信号实例;它还可以接收异步的时间事件的发生

接受事件动作的标识法是一个五边形,看起来像是一个矩形的一边有一个三角形的槽

  • 在接受事件动作中的字符串通常会与建模者在模型层级关系某处定义的信号名称相匹配,表示接受事件动作会等待那个信号的实例,而该实例会异步到达
  • 接收信号实例的接受事件动作和生成该信号的发送信号动作,可能会出现在同一个活动中。或者,它可能会出现在单独的活动中;这样,建模者可以为两个不同的系统行为之间的异步通信建模。

如下图所示:

  • 当完成enter transfer orbit动作后,接受事件动作会等待Orbit Radius Updated实例
  • 必须等待右侧的发送信号动作生成了一个Orbit Radius Updated实例,此时接受事件动作才会立即完成,并在它的输出控制流中提供控制令牌,然后执行到下一个节点
  • 综上所述,接受事件发送在发送信号动作之后
  • 这跟操作系统的同步和互斥是类似的

7.5 等待时间动作

等待时间事件发生的接受事件动作也叫做等待时间动作。等待时间动作的标识法是一个沙漏形状的符号,下面有时间表达式。

  • 等待时间动作和其他接受事件动作的区别:仅在于标识法和事件的类型不同
  • 绝对时间事件表达式以关键字at开始,如 at(1430 GMT)
  • 相对时间事件表达式以关键字after开始,如 after(50ms)
  • 等待时间动作是一种特殊类型的接受事件动作

如下图所示,时间的特定值在currentCommand.executionTime值属性中(点标识法),当控制令牌到达等待时间动作后,它就会启动,如果由executionTime指定的绝对时间事件已经发生,则等待时间动作就会立即完成,并在输出控制流中提供控制令牌,执行过程就会前进到下一个节点

如下图所示:

  • 当该活动开始执行时,等待时间动作就会启动(没有输入边)
  • 两秒之后,相对时间事件发生,等待时间会在其输出控制流中提供控制令牌,启动下游的调用行为动作,然后它调用Read temperature行为
  • 等待时间动作是一种特殊类型的接受事件动作,即便在所需要的事件第一次发生之后,也没有任何输入边的接受事件动作还会保持有效,因此等待时间动作会每两秒输出一个控制令牌,直到该活动结束

8 控制节点

基本介绍

活动中存在三种节点,上面已经说了动作节点和对象节点。

使用控制节点,可以引导活动沿着路径执行,而不只是简单的序列动作。控制节点既可以指引活动中控制令牌的流,也可以指引活动中对象令牌的流。

控制节点有7种类型:

  1. 初始节点
  2. 活动终节点
  3. 流终节点
  4. 决定节点
  5. 合并节点
  6. 分支节点
  7. 集合节点

8.1 初始节点

初始节点标记活动的起点。它标记了活动中的一个位置,控制令牌的流会从那里开始

  • 初始节点的标识法是一个小的实心圆形,它一般只有一个输出控制流
  • 活动不一定需要初始节点

如下图所示,当该活动开始时,会在初始节点放置一个控制令牌,它会把输出控制流转换为分支节点,然后活动继续执行(之后会将分支节点)

8.2 流最终节点和活动最终节点

流终节点活动终节点是标记控制令牌流结束的控制节点

  • 当控制令牌到达流终节点的时候,那个令牌会被销毁,以此标记单独一个控制流的结束。
  • 当控制令牌到达活动终节点的时候,整个活动都会结束,以此标记所有控制流的结束(不管它们当前是否还在执行中)
  • 流终节点的标识法是包含X的圆形
  • 活动终节点的标识法是包含小的实心圆形的圆形

如下图所示,这是一个例子

注意:

  1. 建模者可以为一个活动添加多个活动最终节点
  2. 建模者应该使用流最终节点而不是活动最终节点来避免建立竞争条件的模型

8.3 决定节点

决定节点标记在活动中可替换序列的开始。其标识法是一个空心的菱形。决定节点必须拥有单一的输入边,一般拥有两个或多个输出边。每个输出边会带有布尔表达式的标签(以此作为监听),显示为方括号中间的字符串。

  • 当一个令牌(可能是对象令牌,也可能是控制令牌)到达决定节点的时候,输出边的监听会被估值。令牌会提供给那时监听估值为真的输出边。
  • SysML允许建模者使用else作为(最多)一个输出边的监听,以确保满足“完整”的标准。(如果所有其他监听的估值都是假,那么else的估值就是真。)、

例子如下

8.4 合并节点

合并节点标记活动中可选序列的结尾。其标识法和决定节点相同:空心菱形。

  • 当一个令牌(可能是对象令牌,也可能是控制令牌)通过任意一条输入边到达合并节点,令牌马上就会提供给输出边
  • 合并节点拥有两条或多条输入边,而只拥有一个输出边。
  • 决定节点拥有两个或多个输出边,而只拥有一个输入边

例子如下:

8.5 分支节点

分支节点标记活动中并发序列的起点。分支节点的标识法是一条线段(方向随意),它必须拥有一条输入边和两条或多条输出边。

  • 当一个令牌(可能是对象令牌,也可能是控制令牌)到达分支节点的时候,它会被复制到所有输出边上。原始令牌的每个副本都代表独立、并发、沿着各自路径前进的控制流

如下图所示,控制令牌到达分支节点后被复制到两条输出边上,两个副本会向前执行到活动cv和ma上

8.6 集合节点

集合节点标记活动中并发序列的结束。集合节点的标识法和分支节点一样:一条线段

  • 集合节点一般拥有两条或多条输入边,而只有一条输出边
  • 分支节点一般拥有两条或多条输出边,而只有一条输入边

如下图所示,和“与”操作一样,仅当所有动作完成后,才能结束活动

9 活动分区

活动图不仅可以传达活动中动作的顺序,而且还可以传达执行每个动作的结构。建模者可以使用活动分区来表示。

  • 活动分区的标识法是一个大矩形(包含一个或多个节点),在一端有头部内容:头部内容会指定活动分区代表什么

活动分区最常见的情况下会代表存在于系统模型某处的一个模块或者一个组成部分属性

  • 在活动分区中放置一个动作表示该动作被分配给一个名称由头部决定的结构
  • 如果只是简单地放置,那么当活动在系统操作过程中执行的时候,结构就会负责执行那个动作
  • 当活动分区代表一个模块的时候,它表示那个模块的所有实例都能够执行其中包含的动作
  • 当活动分区代表组成部分属性的时候,那么只是那个组成部分属性会负责执行所包含的动作。

如下图所示,有三个活动分区,表示那些动作被分配给系统模型的三个不同模块

  • 34
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值