2. Modelica语言快速入门

Modelica 不是传统意义上的“编程语言”,而是一种面向对象的、以方程为核心的建模语言。理解这一点,是写出第一个可运行液压模型的前提。本节围绕模型、类、方程、连接器、参数与变量这些基本语法要素展开,并说明方程与算法的区别、initial equation 与 when 语句的作用,最后用一个简单液压回路示例建立可运行模型。

一、模型与类:一切皆类

在 Modelica 中,model 是最常用的类(class)关键字。一个 model 可以包含变量声明、参数声明、方程、算法、连接器实例以及嵌套的子模型。除 model 外,还有 block、record、connector、function、package 等类关键字,它们共享同一套面向对象机制:继承、封装、实例化。可以这样理解:model 是“可实例化的类”,package 是“组织类的容器”,connector 是“定义接口的类”。

一个最小 model 的结构如下:

model SimpleTank
  parameter Real A = 0.01 "截面积 m2";
  Real h(start = 0.1) "液位 m";
  Real qin "入口流量 m3/s";
equation
  der(h) = qin / A;
end SimpleTank;

其中 parameter 表示仿真开始前确定的常量,Real 表示连续实变量,start 是变量初值属性,equation 段内是方程。注意 der(h) 表示 h 对时间的导数,这是 Modelica 表达动态系统的核心算子。

二、参数与变量:区分“设定值”与“状态量”

参数(parameter)在编译期或初始化阶段确定,仿真过程中不变,例如管道直径、油液密度、泵排量。变量(variable)随时间变化,例如压力、流量、液位、温度。变量又可分为连续变量(Real)和离散变量(Boolean、Integer、枚举),以及状态变量(由 der 出现的变量)和代数变量(由方程直接求解的变量)。

合理使用参数能让模型可复用:把几何尺寸、物性参数抽成 parameter,通过修改参数即可适配不同工况,而不必改动方程。变量声明时可用 start 指定迭代初值,用 fixed=true 强制固定初值,用 min、max 限定取值范围,这些属性对数值求解的收敛性影响很大。

三、方程与算法:声明式与命令式的分界

方程段(equation)是声明式的:只写“关系”,不写“求解顺序”。例如 p1 = p2 + dp 与 dp = p1 - p2 在数学上等价,Modelica 工具会自动进行符号处理、排序和求解。方程可以是等式,也可以是 if 表达式、for 循环方程等。

算法段(algorithm)是命令式的:按书写顺序执行赋值,类似传统编程。算法中可以使用 := 赋值、if-else、while、for 等控制结构。算法适合表达查表、迭代计算、逻辑判断等难以用纯方程描述的过程,但会破坏工具的全局符号分析能力,因此能用方程表达时优先用方程。

经验法则:物理守恒关系(质量、能量、动量)用 equation;数据处理、状态机、查表插值用 algorithm。二者可在同一 model 中共存,但同一变量的求解不应同时依赖两段。

四、连接器:接口即物理节点

连接器(connector)定义组件之间的交互接口。液压领域常用的连接器包含两类变量:势变量(potential)和流变量(flow)。势变量在连接时相等,流变量在连接时求和为零,这正是基尔霍夫定律在 Modelica 中的体现。

connector HydraulicPort
  Modelica.Units.SI.Pressure p "压力";
  flow Modelica.Units.SI.VolumeFlowRate q "流量";
end HydraulicPort;

当两个 HydraulicPort 用 connect(a, b) 连接时,工具自动生成 a.p = b.p 和 a.q + b.q = 0。因此连接器不是“导线”,而是物理守恒关系的载体。液压系统建模中,压力作为势变量、体积流量作为流变量是最常见的约定。

五、initial equation 与 when 语句

动态模型需要足够的初始条件。initial equation 段专门用于声明初始化方程,例如让液位从 0.1 m 开始、让某压力初始为 1e5 Pa。它与普通 equation 的区别在于:只在 t=0 时刻参与求解,用于确定状态变量的初值。

when 语句用于表达离散事件:当条件从 false 变为 true 的瞬间触发一次赋值。例如液位达到上限时关闭入口阀:

when h >= hMax then
  valveOpen = false;
end when;

注意 when 是事件驱动,不是持续判断;条件持续为真时不会反复触发。与之相对,if 表达式在连续方程中用于分段关系,二者语义不同,不可混用。

六、第一个可运行液压回路示例

下面用一个“恒压源—节流孔—油箱”回路建立最小可运行模型。假设恒压源提供 10 bar 压力,节流孔按 q = Cq·A·sqrt(2·Δp/ρ) 计算流量,油液密度取 850 kg/m³,节流面积 1e-6 m²,流量系数 0.62。这是一个典型的压力—流量关系示例,参数为教学假设值。

model OrificeCircuit
  parameter Real pSupply = 10e5 "供油压力 Pa";
  parameter Real rho = 850 "油液密度 kg/m3";
  parameter Real Cd = 0.62 "流量系数";
  parameter Real Aorifice = 1e-6 "节流面积 m2";
  Real pTank(start = 1e5) "油箱侧压力 Pa";
  Real q "节流流量 m3/s";
equation
  q = Cd * Aorifice * sqrt(2 * abs(pSupply - pTank) / rho)
      * sign(pSupply - pTank);
  der(pTank) = q * 1e9 / 1e-3;
end OrificeCircuit;

该模型中,q 由压力差驱动,pTank 由流量积分得到,体现了“压力差→流量→压力变化”的因果链。仿真时观察 pTank 是否从 1e5 Pa 单调上升并逐渐趋近 10e5 Pa,即可判断模型是否合理。若曲线发散或出现负压,应检查 sqrt 参数、sign 方向以及初始条件是否匹配。

液压回路建模要素与信号链 恒压源 pSupply = 10e5 Pa 节流孔 Cd=0.62, A=1e-6 m² q = Cd·A·√(2Δp/ρ) 油箱/容腔 pTank 状态变量 HydraulicPort HydraulicPort 建模因果链与方程对应 压力差 Δp pSupply - pTank 流量 q 节流方程 压力变化 der(pTank) 积分方程 结果 pTank 上升 势变量 p 在连接处相等,流变量 q 在连接处代数和为零

把上述模型放入支持 Modelica 的仿真环境(如 OpenModelica、Dymola 或 MWorks),设置仿真区间 0~2 s、步长自适应,运行后绘制 pTank 与 q 曲线。若 pTank 从 1e5 Pa 平滑上升并趋于 10e5 Pa,同时 q 随压差减小而下降,说明方程、参数与初始条件设置一致,模型可运行且物理意义正确。至此,你已经完成了从语法要素到可运行液压模型的第一次闭环。