模块 5:需求与约束
如何在 SysML v2 中定义、组织和验证系统需求 — 需求定义、层次分解、满足关系、约束表达式,以及每个需求关键字如何映射到 KerML 的底层构造。
KerML → SysML:需求与约束概念
SysML v2 的需求建模建立在 KerML 的 约束(Constraint)机制之上。在 KerML 层面,约束是一种布尔类型的特征,其实例必须求值为 true 或 false。SysML v2 在此基础上增加了 需求(Requirement) 的概念 — 将约束与文本描述、主体、利益相关方等元数据结合在一起。
| SysML v2 概念 (L2) | 底层 KerML 构造 (L1) | SysML 增加的内容 |
|---|---|---|
requirement def | ConstraintDefinition(特化 Class) | 添加 doc 文本描述、subject、stakeholder 等元数据 |
requirement(使用) | 由 ConstraintDefinition 类型化的 Feature | 在特定上下文中实例化需求,绑定具体主体 |
satisfy | SatisfyRequirementUsage | 声明一个设计元素满足某个需求 |
specializes(需求间) | Subclassification | 需求流转:子需求继承并细化父需求的约束 |
constraint def | ConstraintDefinition | 纯布尔约束,不附加需求元数据 |
constraint(使用) | 由 ConstraintDefinition 类型化的 Feature | 在上下文中应用约束表达式 |
assume constraint | 前提约束(ConstraintUsage) | 声明需求成立的前提条件 |
require constraint | 要求约束(ConstraintUsage) | 声明需求必须满足的条件 |
在 KerML 中,ConstraintDefinition 是一种 Class,其实例的求值结果为布尔值。SysML v2 的 requirement def 特化了 ConstraintDefinition,在布尔约束的基础上叠加了需求工程所需的丰富元数据,如文本说明、主体声明和利益相关方标注。
需求定义
KerML 溯源:requirement def → ConstraintDefinition(特化 Class)
需求定义(requirement def)是 SysML v2 中描述系统需求的核心构造。它将自然语言描述与形式化约束结合在一起,形成可追溯、可验证的需求规格。
把 requirement def 想象成一份合同条款的模板。它规定了"谁"(主体)需要满足"什么条件"(约束),并附带解释性文字(文档)。每次在具体项目中使用该条款时,就是创建了一个 requirement 使用实例。
基本需求定义
一个最基本的需求定义包括名称、文档说明和可选的主体声明:
1 requirement def MassRequirement {
2 doc /* 系统总质量不得超过规定上限 */
3 subject vehicle : Vehicle;
4 attribute massLimit : ISQ::MassValue;
5 require constraint { vehicle.totalMass <= massLimit }
6 }
带利益相关方的需求
stakeholder 关键字标注需求的来源或关注方:
1 requirement def SafetyRequirement {
2 doc /* 系统必须在检测到故障后 500ms 内进入安全状态 */
3 subject sys : ControlSystem;
4 stakeholder safetyEngineer : SafetyEngineer;
5 attribute responseTime : ISQ::TimeValue;
6 require constraint { responseTime <= 500 [ms] }
7 }
subject 声明了需求的作用对象 — 即需要满足该需求的设计元素。它是一个类型化的特征,在需求被使用时可以绑定到具体的零部件或子系统。stakeholder 则记录谁提出或关注这个需求,支持需求追溯。
需求使用与层次
KerML 溯源:requirement(使用)→ 由 ConstraintDefinition 类型化的 Feature
与结构建模中 part def / part 的关系一样,requirement def 是模板,requirement 使用是在具体上下文中的实例化。需求可以嵌套形成层次结构,实现从顶层系统需求到子系统需求的逐级分解。
需求使用
1 // 在具体项目上下文中使用需求
2 requirement vehicleMass : MassRequirement {
3 subject vehicle : PassengerVehicle; // 绑定具体主体
4 attribute redefines massLimit = 1500 [kg];
5 }
需求层次分解
需求可以包含子需求,形成树状层次结构。父需求被满足当且仅当所有子需求都被满足:
1 requirement def VehicleRequirements {
2 doc /* 车辆系统顶层需求 */
3 subject vehicle : Vehicle;
4
5 // 子需求:质量约束
6 requirement massReq : MassRequirement {
7 attribute redefines massLimit = 2000 [kg];
8 }
9
10 // 子需求:最高速度
11 requirement speedReq {
12 doc /* 最高速度不低于 180 km/h */
13 require constraint { vehicle.maxSpeed >= 180 [km/h] }
14 }
15
16 // 子需求:安全性
17 requirement safetyReq : SafetyRequirement;
18 }
需求层次分解是系统工程的核心实践。SysML v2 中子需求是父需求的组合特征 — 与零件的组合关系在概念上完全一致。工具可以自动检查:当所有子需求约束均为 true 时,父需求方可判定为已满足。
满足与需求流转
KerML 溯源:satisfy → SatisfyRequirementUsage(特化 RequirementUsage 和 AssertConstraintUsage)
满足(assert satisfy)声明一个设计元素满足某个需求。需求流转(从系统需求推导出子系统需求)通过 特化(specializes)来实现,而非单独的 derive 关键字。
满足关系
1 part def ChassisDesign {
2 attribute totalMass : ISQ::MassValue;
3 }
4
5 // 声明底盘设计满足质量需求
6 assert satisfy vehicleMass by chassisDesign : ChassisDesign;
assert satisfy 建立了从设计解决方案到需求的追溯链。工具可以检查 chassisDesign 的属性值是否满足 vehicleMass 中的约束表达式。
需求流转(使用特化)
需求流转通过 specializes 实现。子需求继承父需求的所有约束,并可以添加更严格的条件:
1 requirement def SafetyReq {
2 doc /* 系统安全顶层需求 */
3 }
4
5 // 制动距离需求特化自安全需求
6 requirement def BrakingDistance specializes SafetyReq {
7 doc /* 从 100 km/h 到完全停车的距离不超过 35m */
8 subject brakeSystem : BrakeSystem;
9 require constraint { brakeSystem.stoppingDistance <= 35 [m] }
10 }
把 assert satisfy 想象成"这个零件兑现了这份合同条款",而 specializes 是"这个细化条款继承并扩展了那份总合同"。两者共同建立起从顶层利益相关方需求到底层组件设计的完整追溯链。
需求特化
需求定义可以通过 specializes 继承并细化父需求的约束:
1 requirement def HighPerformanceMass specializes MassRequirement {
2 doc /* 高性能版本的更严格质量限制 */
3 attribute redefines massLimit = 1200 [kg];
4 }
satisfy 不等于验证(verification)。satisfy 只是声明设计意图 — "这个元素旨在满足该需求"。实际验证需要在模块 9(验证与确认)中通过测试用例、分析或仿真来完成。不要把 satisfy 当作已通过验证的证据。
约束与表达式
KerML 溯源:constraint def → ConstraintDefinition;constraint → ConstraintUsage
约束(constraint)是需求的核心组件 — 一个求值为布尔值的表达式。约束可以独立于需求使用,也可以嵌入需求定义中。SysML v2 提供了丰富的表达式语法来编写约束条件。
约束定义
1 constraint def TemperatureRange {
2 in attribute temp : ISQ::TemperatureValue;
3 in attribute lower : ISQ::TemperatureValue;
4 in attribute upper : ISQ::TemperatureValue;
5 temp >= lower and temp <= upper
6 }
在零件上应用约束
约束可以直接附加到零件定义上,作为不变条件(invariant):
1 part def BatteryPack {
2 attribute temperature : ISQ::TemperatureValue;
3 attribute minTemp : ISQ::TemperatureValue = -20 [degC];
4 attribute maxTemp : ISQ::TemperatureValue = 60 [degC];
5
6 // 温度必须始终在范围内
7 assert constraint tempInRange : TemperatureRange {
8 in temp = temperature;
9 in lower = minTemp;
10 in upper = maxTemp;
11 }
12 }
表达式语法
SysML v2 约束表达式支持算术运算、逻辑运算、比较运算以及属性链式访问:
| 表达式类型 | 示例 | 说明 |
|---|---|---|
| 比较 | x >= 100 | 大于等于 |
| 逻辑与 | a and b | 两个条件同时成立 |
| 逻辑或 | a or b | 至少一个条件成立 |
| 逻辑非 | not a | 条件取反 |
| 算术 | x + y * z | 基本数学运算 |
| 属性访问 | part.sub.attr | 链式访问嵌套属性 |
| 带单位 | v <= 120 [km/h] | 值带量纲单位 |
assert constraint 表示该约束在其所属上下文中必须始终为 true。如果仿真或分析发现约束被违反,工具应报告建模缺陷。不带 assert 的约束只是声明式的,不强制执行。
假设与要求约束
KerML 溯源:assume constraint / require constraint → ConstraintUsage(带方向标记)
SysML v2 的需求支持两种约束角色:假设约束(assume constraint)和 要求约束(require constraint)。这一区分源自合同式设计(Design by Contract)的思想。
假设约束
假设约束描述需求成立的前提条件 — 环境或上下文必须满足的条件:
1 requirement def OperationalRange {
2 doc /* 系统在正常环境条件下工作距离不少于 200km */
3 subject sys : MobileSystem;
4
5 // 前提:环境温度在正常范围内
6 assume constraint {
7 sys.environment.temperature >= -10 [degC] and
8 sys.environment.temperature <= 45 [degC]
9 }
10
11 // 要求:工作距离满足指标
12 require constraint {
13 sys.operationalRange >= 200 [km]
14 }
15 }
把需求想象成一份保修协议。assume constraint 是"正常使用条件"(如:温度在 -10 到 45 度之间);require constraint 是保修承诺(如:工作距离不少于 200km)。只有在用户遵守使用条件时,保修承诺才成立。
多条约束组合
一个需求可以包含多条假设约束和要求约束:
1 requirement def CommunicationReliability {
2 doc /* 通信子系统可靠性要求 */
3 subject comm : CommunicationSubsystem;
4
5 // 假设:供电正常
6 assume constraint { comm.powerSupply.voltage >= 11.5 [V] }
7
8 // 假设:天线完好
9 assume constraint { comm.antenna.status == AntennaStatus::operational }
10
11 // 要求:丢包率低于阈值
12 require constraint { comm.packetLossRate <= 0.01 }
13
14 // 要求:延迟低于阈值
15 require constraint { comm.latency <= 50 [ms] }
16 }
不要遗漏假设约束。如果一个需求在特定环境条件下才成立但没有用 assume constraint 显式声明,验证时可能在不合理的条件下判定需求未满足,产生误导性结论。明确的假设约束让验证范围精确可控。
完整示例
以下模型整合了前面所有概念:为一个无人机系统建立需求体系,包含需求定义、层次分解、约束表达式、假设/要求约束,以及满足关系。
1 package UAVRequirements {
2 private import ISQ::*;
3 private import SI::*;
4 private import ScalarValues::*;
5
6 // ── 约束定义(可复用的布尔表达式)──────────────
7 constraint def WithinRange {
8 in attribute value : Real;
9 in attribute min : Real;
10 in attribute max : Real;
11 value >= min and value <= max
12 }
13
14 // ── 顶层需求定义 ─────────────────────────────
15 requirement def UAVSystemRequirements {
16 doc /* 无人机系统顶层需求规格 */
17 subject uav : UAV;
18
19 // 子需求:最大起飞质量
20 requirement massReq {
21 doc /* 最大起飞质量不超过 25kg */
22 require constraint { uav.totalMass <= 25 [kg] }
23 }
24
25 // 子需求:续航时间
26 requirement enduranceReq {
27 doc /* 续航时间不少于 45 分钟 */
28 assume constraint {
29 uav.environment.windSpeed <= 15 [m/s]
30 }
31 require constraint { uav.endurance >= 45 [min] }
32 }
33
34 // 子需求:通信距离
35 requirement commRangeReq {
36 doc /* 遥控通信距离不少于 10km */
37 require constraint { uav.commRange >= 10 [km] }
38 }
39
40 // 子需求:工作温度范围
41 requirement tempReq {
42 doc /* 系统需在 -20 至 50 度环境下正常工作 */
43 assert constraint operatingTemp : WithinRange {
44 in value = uav.environment.temperature;
45 in min = -20 [degC];
46 in max = 50 [degC];
47 }
48 }
49
50 // 子需求:安全响应
51 requirement safetyReq {
52 doc /* 检测到致命故障后 1 秒内启动紧急着陆 */
53 stakeholder safetyOfficer : SafetyOfficer;
54 require constraint {
55 uav.faultResponseTime <= 1000 [ms]
56 }
57 }
58 }
59
60 // ── 满足关系 ─────────────────────────────────
61 part def UAVDesign {
62 part airframe : Airframe;
63 part battery : BatteryPack;
64 part radioLink : RadioLink;
65 part controller : FlightController;
66 }
67
68 // 具体使用顶层需求
69 requirement sysReqs : UAVSystemRequirements {
70 subject uav : UAVDesign;
71 }
72
73 // 声明满足关系
74 assert satisfy sysReqs.massReq by uavDesign.airframe;
75 assert satisfy sysReqs.enduranceReq by uavDesign.battery;
76 assert satisfy sysReqs.commRangeReq by uavDesign.radioLink;
77 assert satisfy sysReqs.safetyReq by uavDesign.controller;
78 }
该模型展示了:constraint def(可复用的布尔约束)、requirement def 的层次分解(顶层需求包含五个子需求)、assume/require constraint(续航需求的风速假设)、stakeholder(安全需求的来源标注)、satisfy(将设计零件映射到各项需求)。
模块总结
| SysML v2 概念 | KerML 溯源 | 关键规则 |
|---|---|---|
requirement def | ConstraintDefinition(特化 Class) | 定义可复用的需求模板,包含文档、主体和约束 |
requirement(使用) | 由 ConstraintDefinition 类型化的 Feature | 在上下文中实例化需求,可绑定具体主体和重定义参数 |
| 需求层次 | 组合 Feature 嵌套 | 父需求满足当且仅当所有子需求均满足 |
satisfy | SatisfyRequirementUsage | 声明设计元素满足需求;是设计意图而非验证证据 |
specializes(需求间) | Subclassification | 需求流转:子需求继承并细化父需求的约束 |
constraint def | ConstraintDefinition | 定义可复用的布尔表达式,不含需求元数据 |
constraint(使用) | ConstraintUsage | 在上下文中应用约束;assert 版本强制执行 |
assume constraint | ConstraintUsage(前提) | 需求成立的前提条件;界定验证的有效范围 |
require constraint | ConstraintUsage(要求) | 需求必须满足的条件;验证的核心判据 |
subject | 类型化的 Feature | 需求的作用对象,在使用时绑定到具体设计元素 |
stakeholder | 元数据特征 | 标注需求来源或关注方,支持追溯 |