3. 值属性与值类型建模
在SysML参数约束与性能建模中,值类型(ValueType)与值属性(ValueProperty)是承载一切物理量语义的基础设施。如果把它们简单理解为“数据类型”和“变量”,就会在后续约束方程、单位换算和量纲校验中反复踩坑。本节从建模语义出发,说明如何用ISO 80000与SysML单位库构建一套可复用的物理量字典。
一、ValueType与ValueProperty的语义分工
ValueType定义“一个值是什么”,它描述值的集合、量纲、单位以及可用的运算。ValueProperty定义“一个值在哪里被使用”,它把某个ValueType绑定到具体的块(Block)、接口或约束参数上,并赋予其角色名称。二者的关系类似“类型”与“实例化属性”:ValueType是可复用的类型定义,ValueProperty是类型在具体语境中的一次使用。
在SysML中,ValueType通常通过ValueType构造型表达,其核心属性包括:
- unit:该值类型默认采用的单位,如
kg、m/s、N·m; - dimension:量纲表达式,如质量
M、长度L、时间T; - quantityKind:物理量种类,如“质量”“力”“功率”,用于语义校验;
- baseType:底层数据类型,如Real、Integer、Boolean。
ValueProperty则出现在Block的属性栏、约束参数列表或接口流属性中,其典型形式为mass : Mass [1] {unit = kg}。这里Mass是ValueType,mass是ValueProperty,[1]是多重性,{unit = kg}是单位绑定。
二、单位与量纲:ISO 80000的建模映射
ISO 80000系列标准规定了国际单位制(SI)中基本量、导出量、单位符号与量纲的规范表达。在SysML建模中,需要把标准中的三层信息映射为模型元素:
| ISO 80000层次 | 示例 | SysML映射 |
|---|---|---|
| 基本量 | 长度、质量、时间 | ValueType(带dimension) |
| 导出量 | 速度、力、功率 | ValueType(dimension由基本量组合) |
| 单位 | m、kg、s、N、W | Unit库中的单位实例 |
量纲是比单位更稳定的语义层。例如“速度”的量纲是L·T⁻¹,无论用m/s还是km/h,量纲不变。建模时应先定义量纲,再绑定单位,最后通过ValueProperty在具体块上实例化。这样当单位从m/s切换到km/h时,约束方程无需改写,只需在单位库中完成换算。
三、使用SysML单位库建立物理量字典
SysML单位库(如ISO80000、SIUnits、NIST等)提供了标准化的单位与量种类定义。实际建模时,推荐按以下顺序构建可复用的物理量字典:
- 导入单位库:在模型中引入
ISO80000或SIUnits包,获得kg、m、s、N、Pa等标准单位。 - 定义基本ValueType:为长度、质量、时间、电流等基本量建立ValueType,绑定dimension与默认单位。
- 定义导出ValueType:通过量纲组合定义速度、加速度、力、压力、功率等,如
Force = Mass × Acceleration,量纲为M·L·T⁻²。 - 建立量种类映射:为每个ValueType指定quantityKind,便于后续约束校验时判断“力”不能与“功率”直接相加。
- 在Block中声明ValueProperty:把ValueType绑定到具体属性,如
engineTorque : Torque {unit = N·m}。
下面给出一个可复用的物理量字典片段示例,展示ValueType与ValueProperty的配合方式:
package PhysicalQuantities {
import SIUnits::*;
value type Length {
dimension = L;
unit = m;
quantityKind = length;
baseType = Real;
}
value type Mass {
dimension = M;
unit = kg;
quantityKind = mass;
baseType = Real;
}
value type Time {
dimension = T;
unit = s;
quantityKind = time;
baseType = Real;
}
value type Velocity {
dimension = L * T^-1;
unit = m/s;
quantityKind = speed;
baseType = Real;
}
value type Force {
dimension = M * L * T^-2;
unit = N;
quantityKind = force;
baseType = Real;
}
}
block Vehicle {
value property mass : Mass [1] {unit = kg};
value property speed : Velocity [1] {unit = m/s};
value property tractionForce : Force [1] {unit = N};
}
这段模型的价值在于:Vehicle中的三个ValueProperty都引用了字典中的ValueType,单位与量纲在类型层统一管理。若后续需要把速度单位改为km/h,只需在Velocity类型上调整默认单位,所有引用它的属性自动继承,约束方程中的量纲校验仍然成立。
四、量纲一致性检查与常见错误
在参数约束建模中,最常见的错误是量纲不一致。例如把“力”与“压力”直接相加,或把N与kg混用。SysML工具通常支持基于dimension的静态检查,但前提是ValueType的dimension定义正确。建议在字典中为每个ValueType显式写出量纲表达式,而不是仅依赖单位符号。
N·m(力矩)与J(能量)单位等价,但量种类不同,语义上不可互换。建模时应通过quantityKind区分。另一个常见问题是ValueProperty的多重性与单位绑定冲突。例如mass : Mass [0..*] {unit = kg}表示多个质量值,但单位绑定在属性层,若不同元素需要不同单位,应改为在ValueType层定义单位,或在约束参数中显式转换。
五、可复用物理量字典的维护策略
物理量字典一旦建立,应作为项目级资产独立版本管理。推荐做法包括:
- 把字典放在独立的
PhysicalQuantities包中,不与其他业务模型混放; - 为每个ValueType添加
quantityKind和dimension,形成自描述类型; - 单位换算关系集中定义在单位库中,业务模型只引用不重定义;
- 当ISO 80000更新或项目需要新增导出量时,只扩展字典,不修改已有ValueType的语义。
通过这种方式,ValueType与ValueProperty不再是零散的类型声明,而是构成一套可校验、可复用、可演进的物理量语义层,为后续约束方程、参数图和性能仿真提供一致的数据基础。