4. 约束块与约束属性

在 SysML 中,参数图(Parametric Diagram)之所以能表达“性能如何被计算出来”,核心并不在于图形本身,而在于它背后的约束块(ConstraintBlock)。约束块把一条数学关系封装成可复用的模型元素,约束属性(ConstraintProperty)则把这条关系“实例化”到具体系统上,再通过参数端口和绑定连接器把约束变量与实际属性连接起来。理解这三者的分工,是完成力学约束建模的关键。

约束块:把公式封装成可复用类型

约束块是一种特殊的块(Block),它不描述结构,而描述一条约束关系。一个约束块通常包含两部分:约束参数(constraint parameter)和约束表达式(constraint expression)。约束参数是公式中的变量,例如力 F、质量 m、加速度 a;约束表达式则是这些变量之间必须满足的等式或不等式,例如 F = m * a。

在模型层面,约束块用 «constraint» 构造型标识。以牛顿第二定律为例,可以定义:

ConstraintBlock NewtonSecondLaw
  parameters:
    F : N   // 合力
    m : kg  // 质量
    a : m/s² // 加速度
  expression:
    F = m * a

这里需要强调一个容易混淆的点:约束参数不是值属性(ValueProperty),它本身不存储数值,只代表公式中的一个占位变量。真正提供数值的是后续被绑定到参数上的值属性。约束块的价值在于“一次定义、多处复用”——同一个 NewtonSecondLaw 可以用于车辆纵向动力学、电梯提升系统、无人机姿态控制等多个场景,只要变量含义一致即可。

约束属性:把约束块用到具体系统上

约束属性是约束块在某个上下文(通常是块或另一个约束块)中的使用。它相当于“把公式贴到系统上”。例如在“小车直线运动”这个块中,可以声明一个约束属性 c1 : NewtonSecondLaw,表示该小车满足牛顿第二定律。

约束属性与普通属性最大的区别是:普通属性描述“系统有什么”,约束属性描述“系统必须满足什么”。一个块可以拥有多个约束属性,它们共同构成该系统的约束网络。例如小车既满足 F = m * a,又满足 a = dv/dt,还满足 v = dx/dt,这三条约束通过共享参数(如 a、v)耦合在一起,形成完整的运动学—动力学模型。

约束属性本身不产生新公式,它只是引用约束块。修改约束块中的表达式,所有引用它的约束属性都会同步更新,这正是模型复用的意义。

参数端口与绑定连接器:让公式和属性“对上号”

约束块定义好后,参数是“悬空”的。要让公式真正参与计算,必须把每个约束参数绑定到系统中实际的值属性上。SysML 用参数端口(parameter port)表示约束参数在约束属性上的可见接口,用绑定连接器(binding connector)把参数端口与值属性连接起来。

绑定连接器与普通连接器不同:普通连接器表示结构连接,绑定连接器表示“数值相等”。也就是说,如果 F 参数端口绑定到小车的 driveForce 属性,那么在任何满足约束的解中,driveForce 的值就等于公式中的 F。绑定是双向的:已知其中任意两个变量,就可以解出第三个。

下面这张图展示了一个简单力学约束建模的完整关系:左侧是约束块 NewtonSecondLaw 及其三个参数端口,右侧是小车块 Car 的三个值属性,中间通过绑定连接器一一对应。图中同时标出了约束属性 c1 作为“使用点”的位置。

«constraint» NewtonSecondLaw 约束表达式 F = m · a F m a 参数端口(parameter port) 约束属性 c1 : NewtonSecondLaw 在 Car 块中声明,引用约束块 «block» Car 值属性 driveForce mass accel 单位:N / kg / m·s⁻² 绑定连接器 (数值相等,双向可解) 约束块定义公式 → 约束属性引用公式 → 参数端口暴露变量 → 绑定连接器把变量接到实际值属性

完成一个简单力学约束建模

下面以“小车在水平方向受驱动力加速”为例,走一遍完整建模过程。假设我们关注三个量:驱动力 driveForce(N)、整车质量 mass(kg)、纵向加速度 accel(m/s²)。约定坐标方向:以小车前进方向为正,因此驱动力为正时加速度为正。

第一步,定义约束块 NewtonSecondLaw,参数为 F、m、a,表达式为 F = m * a。第二步,在 Car 块中声明值属性 driveForce、mass、accel,并声明约束属性 c1 : NewtonSecondLaw。第三步,在参数图上把 c1 的 F、m、a 三个参数端口分别绑定到 Car 的 driveForce、mass、accel。至此,模型已经能够表达“驱动力等于质量乘加速度”这一物理关系。

为了验证绑定是否正确,可以给定一组示例参数(以下为教学假设值,非实测):设 mass = 1200 kg,accel = 2.0 m/s²,则约束要求 driveForce = 1200 × 2.0 = 2400 N。如果模型中 driveForce 被赋为 2000 N,则约束不满足,说明要么驱动力不足,要么加速度应调整为 2000 / 1200 ≈ 1.67 m/s²。这种“给两个、解第三个”的检查方式,正是参数图用于性能分析的基本用法。

常见错误:把约束参数直接当成值属性使用,或在绑定连接器上再赋一次数值。约束参数只负责“占位”,数值只能来自被绑定的值属性,否则会出现同一变量两个来源的冲突。

约束表达式与参数角色的对应关系

约束表达式中的每个变量都必须对应一个约束参数,而每个约束参数又必须通过参数端口暴露出来,才能被绑定。三者是严格的一一对应关系:表达式里的 F 对应参数 F,参数 F 对应端口 F,端口 F 绑定到某个值属性。缺少任何一环,约束都无法参与求解。

模型元素 作用 本例中的名称 是否存储数值
约束块 ConstraintBlock 封装公式,定义变量集合 NewtonSecondLaw 否
约束参数 constraint parameter 公式中的变量占位 F、m、a 否
约束属性 ConstraintProperty 把约束块用到具体上下文 c1 : NewtonSecondLaw 否
参数端口 parameter port 暴露约束参数供绑定 c1.F、c1.m、c1.a 否
值属性 ValueProperty 提供实际数值 driveForce、mass、accel 是
绑定连接器 binding connector 声明数值相等关系 F↔driveForce 等三条 否

理解这张表,就能理解参数图“看起来只是连了几根线,实际上建立了可求解方程组”的本质。约束块负责“公式是什么”,约束属性负责“用在哪里”,参数端口和绑定连接器负责“变量接到谁”。三者配合,才能让 SysML 模型从结构描述走向性能计算。

在实际建模中,建议先写清约束表达式,再反推需要哪些参数,最后检查每个参数是否都有对应的值属性可绑定。对于力学约束,还要特别注意单位一致性和正方向约定:本例统一采用国际单位制,并以小车前进方向为正。若后续引入摩擦力或坡度,只需新增约束块并通过共享参数与 NewtonSecondLaw 耦合,而不必修改原有约束块,这正是约束块复用带来的建模效率。