模块一: 基础
什么是 SysML v2,它从哪里来,以及使它精确的 KerML 基础层。完成本模块后,你将理解语言设计背后的"为什么"。
什么是 SysML v2?
想象一下:你要建造一座大型工厂。在动工之前,你需要画出很多图纸——平面图、电路图、管道图……每一张图都描述工厂的某一个方面。系统工程也是一样。工程师在建造复杂系统(比如飞机、火箭、医疗设备)之前,也需要用图纸来描述系统的各个方面。SysML v2 就是专门用来画这种"系统图纸"的语言。
SysML v2 是工程师用来描述和设计复杂系统的一套标准"画图语言",就像建筑师有 CAD 软件一样,系统工程师有 SysML v2。
SysML v2 是谁制定的?
SysML v2 是由一个叫"对象管理组织"(OMG)的国际标准机构制定的,并与国际系统工程理事会(INCOSE)共同合作完成。它在 2024 年正式发布,是目前最新的版本(官方标准编号为 OMG ptc/2024-05-04)。
SysML v2 还配套了一个 API(程序接口)标准,让不同软件工具之间可以共享模型数据——这在以前的版本中是没有的。
那 SysML v1 呢?它哪里不够好?
SysML v1 是 2006 年发布的老版本。它当时是基于 UML(一种软件设计语言)改造而来的,因此带来了很多与系统工程无关的"历史包袱"。SysML v2 则是从零重新设计的,专门为系统工程师打造。下表列出了 v1 的主要问题和 v2 的改进:
| SysML v1 的问题 | SysML v2 的改进 |
|---|---|
| 从 UML 继承了大量与系统无关的概念,用起来很绕 | 全新设计,基于 KerML,不再依赖 UML |
| 很多概念的含义不够精确,容易产生歧义 | 采用严格的数学定义,含义明确 |
| 只有图形表示法,没有标准的文字语法 | 新增标准文字语法(STN),图文并存 |
| 不同工具之间无法互相读取对方的模型文件 | 提供标准 API 接口,工具间可以互通 |
| 行为建模(描述系统如何运作)的语言比较难用 | 行为建模更加简洁、统一 |
| 分配关系(谁负责什么)的写法很随意 | 分配关系有明确的规范写法 |
KerML — SysML v2 的语言基础
想象你要建一座城市。在建任何建筑之前,你需要先建好地基、道路和水电网络——这些基础设施决定了城市里所有建筑遵循的规则。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(重定义):在特化上下文中替换父特征,比子集更强。
SysML v2 的语言层次结构
想象一栋大楼:地基(L0)→ 承重结构(L1/KerML)→ 房间布局(L2/SysML 语言)→ 家具和装饰(L3/标准库)。每一层都依赖下面的层,但你平时生活在最上层,不需要关心混凝土的配方。SysML v2 的四个层次也是这个道理。
SysML v2 由四个层次组成,从下往上依次是:
| 层次 | 名称 | 说明 |
|---|---|---|
| L3 | SysML v2 标准库模型 | 现成的"工具箱":已经定义好的国际单位(如米、千克、安培)、量制(ISQ)、几何空间关系等。你可以直接拿来用,不用自己重新定义。 |
| L2 | SysML v2 语言(核心) | 你平时建模时用的所有关键字都在这一层:part(部件)、item(流动项)、port(端口)、action(动作)、requirement(需求)、connection(连接)等。 |
| L1 | KerML(内核建模语言) | 上一节介绍的 KerML 就在这一层。它为 L2 的所有概念提供精确的语义定义,就像 Word 底层的文件格式规范——你看不到它,但它保证了所有功能都有明确的含义。 |
| L0 | 基础数学语义 | 用集合论(高中数学的"集合"概念)来精确定义"类型""实例""特征值"等词的含义。这是给语言设计者看的,初学阶段不需要深究。 |
作为初学者,你 90% 的时间都在 L2(SysML 语言层)工作——用 part、action、port 这些关键字建模。L3(标准库)提供现成的单位和类型。L1(KerML)帮你理解"为什么"。L0 是给语言设计者看的,初学阶段不需要深究。
SysML v2 最重要的一个区分:定义 vs 用法
想象"披萨"这道菜。
【定义】餐厅的食谱卡片写着:披萨 = 面饼 + 番茄酱 + 奶酪 + 配料。这张食谱卡片就是"定义"——它描述披萨是什么,但它本身不是一张真正的披萨。
【用法】厨师今天按照食谱做了三张披萨:一张玛格丽特、一张夏威夷、一张培根。这三张真实的披萨就是"用法"——它们是定义的具体实例,出现在特定的上下文中(今晚的菜单)。
SysML v2 中:part def Battery 是定义(食谱);part battery : Battery 是用法(今晚的那道菜)。
定义(Definitions)— 描述"是什么"
定义就是一个可以反复使用的模板。你只需要写一次,就可以在很多地方引用它。SysML v2 的主要定义关键字:
part def— 定义一个结构性组件(就像定义一个零件的"图纸")item def— 定义一种在部件之间流动的事物(比如信号、数据包、液体)port def— 定义一个连接点(就像插座的形状标准)action def— 定义一个动作或功能(就像定义一个操作步骤)state def— 定义一种状态机行为(就像定义系统的各种工作状态)requirement def— 定义一种需求类型(就像需求的模板格式)attribute def— 定义一种值类型或属性(比如温度、重量)
用法(Usages)— 描述"在哪里用"
用法是把定义放到具体场景中使用。就像把"披萨食谱"应用到"今晚的菜单"里。用法的关键字和定义关键字一一对应,只是去掉了 def:
part— 结构性部件的具体使用(这个系统里的那个具体零件)item— 流动项的具体实例port— 某个部件上的具体连接点action— 某个流程中的具体操作步骤state— 状态机中的一个具体状态requirement— 一条具体的需求attribute— 一个具体的属性值槽(等待被赋值)
看一个完整的例子
// ── 第一步:定义(写"食谱") ─────────────────────────────
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)= 模板的一次具体应用,出现在某个上下文里。两者缺一不可:没有定义,就没有规范;没有用法,定义永远停留在纸上。
SysML v2 文本表示法(STN)
SysML v1 只有图形语言(各种方框和箭头的图)。SysML v2 新增了一套文字语法,叫做"SysML 文本表示法"(STN,SysML Textual Notation)。文字语法的好处是:可以用普通的文本编辑器编写,可以用 Git 管理版本,可以被程序自动处理。图形和文字可以互相转换,内容完全一致。
类比:就像音乐既可以用五线谱(图形)来表示,也可以用简谱(文字)来表示,两种记法描述的是同一首曲子。SysML v2 的图形表示法和文本表示法也是如此。
基本语法规则(逐条说明)
| 语法模式 | 含义与说明 |
|---|---|
关键字 名称 : 类型 | 最基本的模式。比如 part battery : Battery 意思是"有一个叫 battery 的部件,它的类型是 Battery"。 |
{ ... } | 花括号里是这个元素"拥有"的内容,比如它的子部件、属性、动作等。 |
// 注释 | 双斜线后面是注释,给人看的说明文字,不影响模型含义。 |
package Pkg { ... } | 定义一个命名空间(包),相当于一个文件夹,把相关的定义组织在一起。 |
import Pkg::*; | 把某个包里的所有内容导入当前作用域,这样就可以直接用里面的定义,不用每次写完整路径。 |
:>(子集符号) | 表示"是…的子集"。比如 part motor1 :> rotatingPart 表示 motor1 也是一种 rotatingPart。 |
:>>(重定义符号) | 表示"替换父类中的某个特征"。比子集更强,原来的特征会被隐藏。 |
= expr(赋值) | 给属性指定一个默认值或计算表达式。比如 attribute voltage = 3.7 表示默认电压是 3.7V。 |
图文互转保证:任何符合规范的 SysML v2 工具都必须支持图形和文本两种形式,而且两者之间可以无损转换。你用文字写的模型,可以自动生成图形;图形也可以导出为文字。
与 SysML v1 的对应关系
如果你完全没用过 SysML v1,可以跳过这一节,或者把它当作词汇预览来看。下表列出了 v1 中常见概念在 v2 中对应的叫法:
| SysML v1 的叫法 | SysML v2 的叫法 | 主要变化说明 |
|---|---|---|
| Block | part def | 名称更清晰,不再有 UML Class 的历史包袱 |
| Block Property | part / attribute(用法) | 明确区分:part 是结构组件,attribute 是数值属性 |
| Flow Port | 带方向的 port | port def 上直接指定 in/out/inout 方向 |
| Standard Port | 带接口的 port def | 端口通过接口类型来描述兼容性 |
| ValueProperty | attribute | 更简洁,可以关联国际单位(ISQ) |
| ConstraintBlock | constraint def | 约束有了正式的数学表达式 |
| Requirement (block) | requirement def | 需求可以关联主体(subject)和利益相关者 |
| satisfy / verify | satisfy / verify | 现在是一等关系,有明确的类型化语义 |
| Activity | action def | 行为建模更统一,不再依赖 UML 活动图 |
| StateMachine | state def | 状态机与动作语义统一,更加一致 |
| IBD(块图) | 部件用法树/互连 | 不再需要单独的图形类型,用法树可以直接展示结构 |
本模块总结
恭喜完成第一模块!下面用最简单的语言回顾一下本模块的核心内容:
- SysML v2 是工程师用来设计复杂系统的"画图语言",由 OMG 在 2024 年发布。
- SysML v2 不再基于 UML,而是建立在全新的 KerML(内核建模语言)之上,概念更精确。
- KerML 定义了最基础的构件:Element(元素)、Type(类型)、Feature(特征)、Classifier(分类器)、Connector(连接器)、Relationship(关系)。
- SysML v2 分为四层:基础数学语义(L0)→ KerML(L1)→ SysML 语言(L2)→ 标准库(L3)。你平时在 L2 工作。
- 最核心的区分:定义(
def)= 模板;用法(无def)= 模板在具体场景中的应用。 - SysML v2 新增了文字语法(STN),图形和文字可以互相转换。
- 如果你学过 SysML v1:Block →
part def,Activity →action def,大多数概念都有直接对应。