2、Modelica语言基础:类、继承、方程、连接器、参数与变量的基本语法
Modelica 是一种面向对象的非因果建模语言,其核心设计目标是通过数学方程而非赋值语句来描述物理系统的行为。与 Simulink 等基于信号流的工具不同,Modelica 天然支持双向耦合的物理拓扑结构,这使得它在电气系统仿真中具有显著优势。本章将围绕 Modelica 语言的六大核心语法要素——类(class)、继承(extends)、方程(equation)、连接器(connector)、参数(parameter)与变量(variable)——展开系统讲解,帮助学员建立从面向对象建模到物理拓扑描述、再到仿真参数配置的完整知识框架。
上图展示了 Modelica 语言中六大核心语法要素之间的逻辑关系。类作为基本封装单元,通过继承机制实现代码复用;参数和变量分别承担编译期配置与仿真期状态描述的角色;方程定义物理规律,连接器则负责建立组件间的拓扑连接。这六者共同构成了 Modelica 建模的完整语法基础,下面逐一深入剖析。
2.1 类(class)与继承(extends)
核心原理:在 Modelica 中,class 是构建模型的基本单元,它封装了数据(参数、变量)和行为(方程、算法)。与面向对象编程语言中的类不同,Modelica 的类更侧重于物理拓扑的声明式描述。一个典型的电气组件类可以包含电气端口(连接器)、电气参数(电阻值、电容值)以及描述其物理行为的方程。
继承通过 extends 关键字实现,子类自动获得父类的全部声明,并可以添加新的元素或修改已有元素。这种机制在电气元件库的构建中极为重要——例如,可以从一个抽象的"二端元件"基类派生出电阻、电容、电感等具体元件,从而避免重复声明公共的引脚和基础属性。
操作流程:定义类与继承时,建议遵循以下步骤:
- 识别公共特征:分析一组电气元件共有的属性(如两个电气引脚)和行为模式。
- 定义基类:将公共特征写入基类,使用
connector声明引脚,使用parameter声明可配置参数。 - 派生子类:使用
extends继承基类,并添加特有参数(如电阻值、电容值)和方程(如欧姆定律、电容伏安关系)。 - 实例化使用:在系统模型中创建子类的实例,并通过
connect()建立连接。
// 基类:二端电气元件
class TwoPin
Pin p; // 正极引脚
Pin n; // 负极引脚
end TwoPin;
// 子类:电阻
class Resistor extends TwoPin
parameter Real R(unit="Ohm") = 1000; // 电阻值,默认1kΩ
equation
R * p.i = p.v - n.v; // 欧姆定律
p.i + n.i = 0; // 基尔霍夫电流定律
end Resistor;
案例拆解:考虑构建一个分压电路,需要两个电阻串联。通过继承机制,我们只需定义一次电阻类,然后创建两个实例并设置不同的参数值即可。若后续需要增加一个电容元件,只需从 TwoPin 派生新的子类,无需修改已有代码。
| 类名 | 继承来源 | 新增参数 | 新增方程 |
|---|---|---|---|
| TwoPin | — | — | — |
| Resistor | TwoPin | R(电阻值) | R*i = v_p - v_n |
| Capacitor | TwoPin | C(电容值) | i = C * der(v_p - v_n) |
| Inductor | TwoPin | L(电感值) | v_p - v_n = L * der(i) |
2.2 参数(parameter)与变量(variable)
核心原理:参数与变量的本质区别在于时间维度。参数(parameter)在仿真开始前必须确定值,且在仿真过程中保持不变,属于编译期常量;变量(variable)则在仿真过程中随时间动态变化,是微分方程求解的对象。在电气系统中,电阻值、电容值、电源电压幅值等通常声明为参数;而节点电压、支路电流、电荷量等则声明为变量。
判断方法:选择参数还是变量,可依据以下标准:
- 该值是否在仿真过程中保持不变?若是,则用
parameter。 - 该值是否由其他方程计算得出?若是,则用
variable。 - 该值是否需要作为外部输入在仿真前配置?若是,则用
parameter。
案例拆解:以直流电机模型为例,电枢电阻 Ra、电感 La、转矩常数 Kt 均为参数,在仿真前由电机规格书确定;而电枢电流 i_a、转速 w、反电动势 e 均为变量,由电机方程动态求解。参数还支持修饰符 start 用于提供迭代初值,这在非线性电路仿真中尤为重要。
model DCMotor
parameter Real Ra = 0.5; // 电枢电阻 (Ω)
parameter Real La = 0.002; // 电枢电感 (H)
parameter Real Kt = 0.05; // 转矩常数 (N·m/A)
parameter Real J = 0.001; // 转动惯量 (kg·m²)
Real i_a(start=0); // 电枢电流 (A)
Real w(start=0); // 角速度 (rad/s)
Real e; // 反电动势 (V)
Real T_e; // 电磁转矩 (N·m)
equation
e = Kt * w;
T_e = Kt * i_a;
// 电枢回路方程
// v_a = i_a*Ra + La*der(i_a) + e
// 机械方程
// T_e = J*der(w) + T_load
end DCMotor;
min、max 约束,编译器会在仿真前检查参数是否越界。建议在模型库开发时充分利用这些约束条件,避免仿真中出现数值奇异。
2.3 方程(equation)与连接器(connector)
核心原理:方程是 Modelica 描述物理规律的核心手段,采用非因果声明式语法,即方程两侧没有赋值方向,编译器自动进行符号处理以确定计算顺序。连接器则定义了组件之间的交互接口,电气连接器通常包含两个变量:电势(v)和电流(i),并遵循基尔霍夫定律。
操作流程:定义电气连接器时,需要声明 flow 变量(电流)和 potential 变量(电压)。flow 变量在连接时自动满足基尔霍夫电流定律(流入=流出),potential 变量在连接时自动相等。这一机制极大简化了电路拓扑的建模。
connector Pin
Real v; // 电势 (V)
flow Real i; // 电流 (A),flow 前缀表示这是流变量
end Pin;
// 使用连接器建立电路拓扑
model SimpleCircuit
Resistor R1(R=100);
Resistor R2(R=200);
VoltageSource V(src=5);
Ground G;
equation
connect(V.p, R1.p);
connect(R1.n, R2.p);
connect(R2.n, V.n);
connect(V.n, G.p);
end SimpleCircuit;
案例拆解:考虑一个 RLC 串联谐振电路。通过连接器将电阻、电感、电容和电压源串联,编译器自动生成节点电压方程和电流守恒方程。若手动编写这些方程,需要 4 个节点电压方程和 3 个支路电流关系;而使用连接器后,只需声明拓扑连接,编译器自动完成方程组装。
| 连接器元素 | 类型 | 连接规则 | 物理意义 |
|---|---|---|---|
| v | potential | 连接后相等 | 基尔霍夫电压定律 |
| i | flow | 连接后代数和为零 | 基尔霍夫电流定律 |
flow 和 potential 变量是模型能否正确编译的前提。若将电流误声明为 potential 类型,编译器将无法生成正确的节点方程。
2.4 综合实战:直流电源供电系统建模
场景描述:构建一个 12V 直流电源为电阻负载供电的系统,包含电源内阻、传输线电阻和负载电容。要求通过参数配置实现不同工况的仿真。
建模步骤:
- 定义基类
TwoPin和连接器Pin。 - 派生
Resistor、Capacitor、DCVoltageSource子类。 - 创建系统模型,实例化各元件并设置参数。
- 使用
connect()建立拓扑连接。 - 设置仿真参数(起止时间、容差)并运行。
model PowerSupplySystem
parameter Real V_src = 12; // 电源电压
parameter Real R_internal = 0.1; // 电源内阻
parameter Real R_line = 0.5; // 线路电阻
parameter Real C_load = 1e-3; // 负载电容
DCVoltageSource V(V=V_src);
Resistor R_int(R=R_internal);
Resistor R_line1(R=R_line/2);
Resistor R_line2(R=R_line/2);
Capacitor C_load1(C=C_load);
Ground G;
equation
connect(V.p, R_int.p);
connect(R_int.n, R_line1.p);
connect(R_line1.n, R_line2.p);
connect(R_line2.n, C_load1.p);
connect(C_load1.n, V.n);
connect(V.n, G.p);
end PowerSupplySystem;
结果分析:仿真结果显示,负载电容两端电压从 0V 逐渐上升至接近 12V,时间常数由 (R_internal + R_line) * C_load 决定。通过修改参数 C_load 可以观察不同滤波效果。该案例验证了参数配置的灵活性和连接器拓扑建模的高效性。
connect() 与赋值语句。连接器只能用于连接声明为 connector 类型的对象,不能连接普通变量。此外,连接器不能直接用于方程中,必须通过引脚变量(如 p.v、p.i)访问。若在方程中直接使用连接器名称,编译器会报类型错误。
2.5 总结与复盘
本章系统梳理了 Modelica 语言的六大核心语法要素。类与继承提供了代码复用的机制,参数与变量区分了编译期配置与仿真期状态,方程实现了非因果物理描述,连接器则建立了拓扑连接的基础。这六者相互配合,使得 Modelica 能够高效、准确地描述电气系统的复杂行为。
关键要点回顾:
- 类是最小封装单元,继承通过
extends实现,子类自动获得父类声明。 - 参数在仿真前确定且不变,变量在仿真中动态变化。
- 方程采用非因果声明式语法,编译器自动排序求解。
- 连接器通过
flow和potential变量自动满足基尔霍夫定律。 - 参数应设置合理的默认值和约束范围,避免仿真数值问题。