Ran Wei / SysML v2 Series / 模块一
EN
SysML v2 — Ran Wei

模块一: 基础

什么是 SysML v2,它从哪里来,以及使它精确的 KerML 基础层。完成本模块后,你将理解语言设计背后的"为什么"。

1

什么是 SysML v2?

想象一下:你要建造一座大型工厂。在动工之前,你需要画出很多图纸——平面图、电路图、管道图……每一张图都描述工厂的某一个方面。系统工程也是一样。工程师在建造复杂系统(比如飞机、火箭、医疗设备)之前,也需要用图纸来描述系统的各个方面。SysML v2 就是专门用来画这种"系统图纸"的语言。

💡 一句话总结

SysML v2 是工程师用来描述和设计复杂系统的一套标准"画图语言",就像建筑师有 CAD 软件一样,系统工程师有 SysML v2。

SysML v2 是谁制定的?

SysML v2 是由一个叫"对象管理组织"(OMG)的国际标准机构制定的,并与国际系统工程理事会(INCOSE)共同合作完成。它在 2024 年正式发布,是目前最新的版本(官方标准编号为 OMG ptc/2024-05-04)。

NOTE

SysML v2 还配套了一个 API(程序接口)标准,让不同软件工具之间可以共享模型数据——这在以前的版本中是没有的。

那 SysML v1 呢?它哪里不够好?

SysML v1 是 2006 年发布的老版本。它当时是基于 UML(一种软件设计语言)改造而来的,因此带来了很多与系统工程无关的"历史包袱"。SysML v2 则是从零重新设计的,专门为系统工程师打造。下表列出了 v1 的主要问题和 v2 的改进:

SysML v1 的问题SysML v2 的改进
从 UML 继承了大量与系统无关的概念,用起来很绕全新设计,基于 KerML,不再依赖 UML
很多概念的含义不够精确,容易产生歧义采用严格的数学定义,含义明确
只有图形表示法,没有标准的文字语法新增标准文字语法(STN),图文并存
不同工具之间无法互相读取对方的模型文件提供标准 API 接口,工具间可以互通
行为建模(描述系统如何运作)的语言比较难用行为建模更加简洁、统一
分配关系(谁负责什么)的写法很随意分配关系有明确的规范写法
表 1 — SysML v1 的局限性及 v2 的改进
2

KerML — SysML v2 的语言基础

🏠 ANALOGY

想象你要建一座城市。在建任何建筑之前,你需要先建好地基、道路和水电网络——这些基础设施决定了城市里所有建筑遵循的规则。KerML 就是 SysML v2 的"城市基础设施"——它定义了最基本的规则,SysML v2 的所有内容都建立在它之上。

KerML 的全称是"内核建模语言"(Kernel Modeling Language)。它本身也是一个独立的国际标准(OMG ptc/2024-05-05)。你通常不需要直接用 KerML 写模型——就像你盖房子不需要自己先建水泥厂一样。但了解 KerML 的基本概念,能帮你更好地理解 SysML v2 的设计逻辑。

💡 给初学者

KerML 是"幕后英雄"。它为 SysML v2 提供了精确的数学定义,让语言变得严格和一致。你学 SysML v2 时,感受到的那种"规整感"就来自 KerML。

KerML 的核心概念 — 逐步理解

下面我们从最基础的概念开始,一步一步往上建立理解。每个概念都建立在前一个之上。

第一步  Element(元素)

📖 简单理解: 模型里所有"东西"的总称。每一个有名字的东西都是一个 Element。

🏠 生活类比: 就像文件系统里的"文件或文件夹"——一切东西都是文件/文件夹,只是内容不同。

📐 技术定义: 模型的根基。所有 KerML 构件都是 Element 的子类型。携带 name(名称)和 qualifiedName(完全限定名)两个属性。

第二步  Namespace(命名空间)

📖 简单理解: 一种可以"包含其他东西"的 Element,相当于一个容器或文件夹。

🏠 生活类比: 就像电脑里的文件夹——文件夹本身也是一个文件,但它可以装其他文件。

📐 技术定义: 可以拥有其他 Element 的 Element。Package(包)、Type(类型)和 Feature(特征)都是 Namespace 的子类型。

第三步  Type(类型)

📖 简单理解: 描述"某一类事物"是什么样子的模板,比如"所有发动机的共同特征"。

🏠 生活类比: 就像饼干模具——模具本身不是饼干,但它定义了饼干的形状。用模具可以做出很多一模一样的饼干。

📐 技术定义: 对事物进行分类的 Namespace。通过 Feature(特征)来描述其实例的属性和行为。isAbstract 属性控制该类型是否可以直接实例化。

第四步  Feature(特征)

📖 简单理解: Type 的具体属性或行为,比如发动机的"功率"属性,或者"启动"这个动作。

🏠 生活类比: 就像一份简历的各个栏目——"姓名""年龄""工作经历"都是这份简历的 Feature。

📐 技术定义: Type 的类型化属性。可以是结构性的(属性/部件)或行为性的(动作/步骤)。携带方向(in/out/inout)、是否为复合(isComposite)等属性。

第五步  Classifier(分类器)

📖 简单理解: 一种特殊的 Type,它描述的是真实存在或真实发生的事物(而不是抽象概念)。

🏠 生活类比: 如果 Type 是"动物"的概念,那么 Classifier 就是"哺乳动物""鸟类"这样具体的分类——它们都是真实存在于自然界的东西。

📐 技术定义: 其实例是存在或发生的事物的 Type——包括结构体、行为、事件。isSufficient 属性决定拥有所有特征是否足以判断某物属于该类型。

第六步  Class、DataType、Behavior(三种分类器)

📖 简单理解: Classifier 分为三种:描述持续存在的物体(Class)、描述纯粹的数值(DataType)、描述随时间发生的过程(Behavior)。

🏠 生活类比: 打个比方:一台洗衣机是 Class(它持续存在);它的功率"800W"是 DataType(纯粹的数值,没有身份);洗衣过程是 Behavior(它会随时间发生和结束)。

📐 技术定义: Class:实例具有持续标识的 Classifier(结构体,随时间存在)。DataType:实例无标识的 Classifier(纯值,如数字、字符串)。Behavior:实例是随时间发生的事件的 Classifier(动作、过程、函数)。

第七步  Connector(连接器)

📖 简单理解: 把两个 Feature 连接在一起的桥梁,描述它们之间的关系。

🏠 生活类比: 就像电路图里的导线——导线本身不是电源也不是灯泡,但它把两者连了起来。

📐 技术定义: 将 Feature 实例相互链接的 Feature。是连接(Connection)、绑定(BindingConnector)和流(Flow)的语义基础。isDirected 控制是否有方向。

第八步  Relationship(关系)及其三种子类型

📖 简单理解: 描述两个元素之间关系的桥梁。最重要的三种关系是:特化(一种是另一种的子类)、子集(一个特征是另一个的子集)、重定义(在子类中替换父类的某个特征)。

🏠 生活类比: 特化 = "猫是哺乳动物的一种";子集 = "我的朋友圈是所有人的子集";重定义 = "我把父亲留给我的方法改造成了更适合自己的版本"。

📐 技术定义: Relationship:关联两个或多个 Element 的 Element。Specialisation(特化):specific Type 继承 general Type 的所有实例。Subsetting(子集):子特征的所有值也是父特征的值。Redefinition(重定义):在特化上下文中替换父特征,比子集更强。

3

SysML v2 的语言层次结构

🏠 ANALOGY

想象一栋大楼:地基(L0)→ 承重结构(L1/KerML)→ 房间布局(L2/SysML 语言)→ 家具和装饰(L3/标准库)。每一层都依赖下面的层,但你平时生活在最上层,不需要关心混凝土的配方。SysML v2 的四个层次也是这个道理。

SysML v2 由四个层次组成,从下往上依次是:

层次名称说明
L3SysML v2 标准库模型现成的"工具箱":已经定义好的国际单位(如米、千克、安培)、量制(ISQ)、几何空间关系等。你可以直接拿来用,不用自己重新定义。
L2SysML v2 语言(核心)你平时建模时用的所有关键字都在这一层:part(部件)、item(流动项)、port(端口)、action(动作)、requirement(需求)、connection(连接)等。
L1KerML(内核建模语言)上一节介绍的 KerML 就在这一层。它为 L2 的所有概念提供精确的语义定义,就像 Word 底层的文件格式规范——你看不到它,但它保证了所有功能都有明确的含义。
L0基础数学语义用集合论(高中数学的"集合"概念)来精确定义"类型""实例""特征值"等词的含义。这是给语言设计者看的,初学阶段不需要深究。
图 2 — SysML v2 语言层次(从下往上,L0 是基础,L3 是应用层)
💡 实际上你需要了解哪一层?

作为初学者,你 90% 的时间都在 L2(SysML 语言层)工作——用 partactionport 这些关键字建模。L3(标准库)提供现成的单位和类型。L1(KerML)帮你理解"为什么"。L0 是给语言设计者看的,初学阶段不需要深究。

4

SysML v2 最重要的一个区分:定义 vs 用法

🏠 ANALOGY

想象"披萨"这道菜。

【定义】餐厅的食谱卡片写着:披萨 = 面饼 + 番茄酱 + 奶酪 + 配料。这张食谱卡片就是"定义"——它描述披萨是什么,但它本身不是一张真正的披萨。

【用法】厨师今天按照食谱做了三张披萨:一张玛格丽特、一张夏威夷、一张培根。这三张真实的披萨就是"用法"——它们是定义的具体实例,出现在特定的上下文中(今晚的菜单)。

SysML v2 中:part def Battery 是定义(食谱);part battery : Battery 是用法(今晚的那道菜)。

定义(Definitions)— 描述"是什么"

定义就是一个可以反复使用的模板。你只需要写一次,就可以在很多地方引用它。SysML v2 的主要定义关键字:

用法(Usages)— 描述"在哪里用"

用法是把定义放到具体场景中使用。就像把"披萨食谱"应用到"今晚的菜单"里。用法的关键字和定义关键字一一对应,只是去掉了 def

看一个完整的例子

// ── 第一步:定义(写"食谱") ─────────────────────────────

part def Battery {                    // 定义"电池"是什么
    attribute capacity : Real;        // 电池有一个属性:容量(Wh)
    attribute voltage  : Real;        // 电池有一个属性:电压(V)
}

part def Motor {                      // 定义"电机"是什么
    attribute maxRPM : Real;          // 电机有一个属性:最大转速
    port powerIn : ~ElectricalPort;   // 电机有一个连接点:电源输入口
}

part def Drone {                      // 定义"无人机"是什么
    part battery : Battery;          // 无人机里有一个 Battery(用法)
    part motor1  : Motor;            // 无人机里有四个 Motor(用法)
    part motor2  : Motor;
    part motor3  : Motor;
    part motor4  : Motor;
}

// ── 第二步:用法("点菜") ──────────────────────────────────

part missionDrone : Drone;           // 这是一架具体的任务无人机
💡 关键规律

定义(def)= 模板,写一次,用很多次。用法(无 def)= 模板的一次具体应用,出现在某个上下文里。两者缺一不可:没有定义,就没有规范;没有用法,定义永远停留在纸上。

5

SysML v2 文本表示法(STN)

SysML v1 只有图形语言(各种方框和箭头的图)。SysML v2 新增了一套文字语法,叫做"SysML 文本表示法"(STN,SysML Textual Notation)。文字语法的好处是:可以用普通的文本编辑器编写,可以用 Git 管理版本,可以被程序自动处理。图形和文字可以互相转换,内容完全一致。

🏠 ANALOGY

类比:就像音乐既可以用五线谱(图形)来表示,也可以用简谱(文字)来表示,两种记法描述的是同一首曲子。SysML v2 的图形表示法和文本表示法也是如此。

基本语法规则(逐条说明)

语法模式含义与说明
关键字 名称 : 类型最基本的模式。比如 part battery : Battery 意思是"有一个叫 battery 的部件,它的类型是 Battery"。
{ ... }花括号里是这个元素"拥有"的内容,比如它的子部件、属性、动作等。
// 注释双斜线后面是注释,给人看的说明文字,不影响模型含义。
package Pkg { ... }定义一个命名空间(包),相当于一个文件夹,把相关的定义组织在一起。
import Pkg::*;把某个包里的所有内容导入当前作用域,这样就可以直接用里面的定义,不用每次写完整路径。
:>(子集符号)表示"是…的子集"。比如 part motor1 :> rotatingPart 表示 motor1 也是一种 rotatingPart。
:>>(重定义符号)表示"替换父类中的某个特征"。比子集更强,原来的特征会被隐藏。
= expr(赋值)给属性指定一个默认值或计算表达式。比如 attribute voltage = 3.7 表示默认电压是 3.7V。
表 2 — SysML v2 文本表示法基本语法
NOTE

图文互转保证:任何符合规范的 SysML v2 工具都必须支持图形和文本两种形式,而且两者之间可以无损转换。你用文字写的模型,可以自动生成图形;图形也可以导出为文字。

6

与 SysML v1 的对应关系

如果你完全没用过 SysML v1,可以跳过这一节,或者把它当作词汇预览来看。下表列出了 v1 中常见概念在 v2 中对应的叫法:

SysML v1 的叫法SysML v2 的叫法主要变化说明
Blockpart def名称更清晰,不再有 UML Class 的历史包袱
Block Propertypart / attribute(用法)明确区分:part 是结构组件,attribute 是数值属性
Flow Port带方向的 portport def 上直接指定 in/out/inout 方向
Standard Port带接口的 port def端口通过接口类型来描述兼容性
ValuePropertyattribute更简洁,可以关联国际单位(ISQ)
ConstraintBlockconstraint def约束有了正式的数学表达式
Requirement (block)requirement def需求可以关联主体(subject)和利益相关者
satisfy / verifysatisfy / verify现在是一等关系,有明确的类型化语义
Activityaction def行为建模更统一,不再依赖 UML 活动图
StateMachinestate def状态机与动作语义统一,更加一致
IBD(块图)部件用法树/互连不再需要单独的图形类型,用法树可以直接展示结构
表 3 — SysML v1 到 SysML v2 概念对照
7

本模块总结

恭喜完成第一模块!下面用最简单的语言回顾一下本模块的核心内容:

Up Next

模块二 — 核心语言概念 — 命名空间、包、导入/可见性、特化链、多重性以及完整的特征模型。