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、WUnit库中的单位实例

量纲是比单位更稳定的语义层。例如“速度”的量纲是L·T⁻¹,无论用m/s还是km/h,量纲不变。建模时应先定义量纲,再绑定单位,最后通过ValueProperty在具体块上实例化。这样当单位从m/s切换到km/h时,约束方程无需改写,只需在单位库中完成换算。

建议在项目初期建立“量纲—量种类—单位”三级字典,所有ValueType都从字典中引用,避免同一物理量出现多个不一致的定义。

三、使用SysML单位库建立物理量字典

SysML单位库(如ISO80000、SIUnits、NIST等)提供了标准化的单位与量种类定义。实际建模时,推荐按以下顺序构建可复用的物理量字典:

  1. 导入单位库:在模型中引入ISO80000或SIUnits包,获得kg、m、s、N、Pa等标准单位。
  2. 定义基本ValueType:为长度、质量、时间、电流等基本量建立ValueType,绑定dimension与默认单位。
  3. 定义导出ValueType:通过量纲组合定义速度、加速度、力、压力、功率等,如Force = Mass × Acceleration,量纲为M·L·T⁻²。
  4. 建立量种类映射:为每个ValueType指定quantityKind,便于后续约束校验时判断“力”不能与“功率”直接相加。
  5. 在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不再是零散的类型声明,而是构成一套可校验、可复用、可演进的物理量语义层,为后续约束方程、参数图和性能仿真提供一致的数据基础。

物理量字典:ValueType / ValueProperty / 单位 / 量纲 关系图 ISO 80000 标准 基本量:L / M / T / I 导出量:v / F / P / E 单位符号:m / kg / s / N 量纲表达式:L·T⁻¹ 等 映射 物理量字典(可复用包) ValueType(类型定义) dimension · unit · quantityKind baseType · 可复用 SysML 单位库 SIUnits · ISO80000 · NIST kg · m · s · N · Pa · W 实例化 ValueProperty(使用) mass : Mass [1] {unit = kg} speed : Velocity [1] {unit = m/s} force : Force [1] {unit = N} 量纲一致性检查与常见错误 ✓ 量纲一致 Force = Mass × Acceleration 量纲:M·L·T⁻² = M·L·T⁻² 单位:N = kg·m/s² ✗ 量纲冲突 Force + Pressure 量纲:M·L·T⁻² ≠ M·L⁻¹·T⁻² quantityKind 不同,不可相加 校验