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 作为“使用点”的位置。
完成一个简单力学约束建模
下面以“小车在水平方向受驱动力加速”为例,走一遍完整建模过程。假设我们关注三个量:驱动力 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 耦合,而不必修改原有约束块,这正是约束块复用带来的建模效率。