OpenModelica 中文教程
一、OpenModelica简介
1.1 什么是OpenModelica?
OpenModelica是一个开源的多领域建模与仿真环境,基于Modelica语言。它为工程师和学者提供了强大的平台来设计、分析和优化复杂系统。
Modelica语言特点:
-
面向对象的建模语言
-
支持多领域物理系统建模(机械、电气、热力、液压、控制等)
-
基于方程而非赋值语句
-
非专有、统一的建模语言
1.2 主要特点
| 特点 | 说明 |
|---|---|
| 开源免费 | 基于OSMC-PL开源许可证 |
| 跨平台 | 支持Windows、Linux、macOS |
| 图形化建模 | OMEdit图形化连接编辑器 |
| 多领域支持 | 机械、电气、热力学、液压等 |
| Modelica标准库 | 内置丰富的模型库 |
| FMI/FMU支持 | 功能模型接口标准 |
| 脚本接口 | Python、Matlab、Julia API |
二、安装与配置
2.1 下载安装
Windows系统:
-
访问OpenModelica官方网站下载页面
-
选择适合系统架构的安装包(64位)
-
双击安装包,按照安装向导完成安装
-
确保安装路径不包含空格或特殊字符
Linux系统(Ubuntu/Debian):
bash
# 添加软件源
echo "deb https://build.openmodelica.org/apt $(lsb_release -cs) release" | sudo tee /etc/apt/sources.list.d/openmodelica.list
# 添加GPG密钥
wget -q https://build.openmodelica.org/apt/openmodelica.asc -O- | sudo apt-key add -
# 安装
sudo apt-get update
sudo apt-get install openmodelica
macOS:
-
下载.dmg安装包
-
拖拽到应用程序文件夹
-
注意:1.17.0版本后官方不再提供macOS构建,建议使用Linux虚拟机
2.2 环境变量配置
配置环境变量确保OpenModelica命令行工具可被系统调用:
Windows:
-
添加
MODELICAPATH变量指向OpenModelica安装路径 -
将
C:\OpenModelica\bin添加到系统Path变量
Linux/macOS:
bash
# 编辑 ~/.bashrc 或 ~/.profile
export MODELICAPATH="/path/to/openmodelica/libraries:$MODELICAPATH"
source ~/.bashrc
2.3 验证安装
bash
omc --version
返回版本信息则表示安装成功。
2.4 界面语言设置
OMEdit支持中文界面:
-
点击菜单栏 Tools → Options → General Options
-
将语言更改为中文
三、OMEdit图形化建模
3.1 启动OMEdit
| 平台 | 启动方式 |
|---|---|
| Windows | 开始菜单 → OpenModelica → OpenModelica Connection Editor |
| Linux | 终端输入 OMEdit 或应用菜单 |
| macOS | /Application/MacPorts/OMEdit.app |
3.2 主窗口组成
OMEdit包含以下可停靠浏览器:
-
库浏览器:显示已加载的Modelica类
-
文档浏览器:显示类的HTML文档
-
变量浏览器:显示模型变量,可勾选绘图
-
消息浏览器:显示错误和通知信息
3.3 四种视角
| 视角 | 用途 |
|---|---|
| 欢迎视角 | 显示最近文件和新闻 |
| 建模视角 | 创建和设计模型 |
| 绘图视角 | 显示仿真结果 |
| 调试视角 | 调试模型代码 |
3.4 创建新模型
方法:
-
点击 Ctrl+N 或 File → New → New Modelica Class
-
输入模型名称
-
选择类类型(model、connector、block、record、function)
3.5 图形化建模
步骤:
-
从库浏览器拖拽组件到图标/图表视图
-
启用连接模式(工具栏连接按钮)
-
鼠标移动到组件连接点(光标变十字)
-
拖拽连线到目标组件
-
双击组件设置参数
快捷键:
-
Ctrl+R:旋转组件 -
Delete:删除组件 -
Ctrl+鼠标滚轮:缩放视图
3.6 简单示例:RLC电路
-
新建模型命名为
RLC_TEST -
从
Electrical/Analog/Basic拖拽组件:-
Resistor(电阻)
-
Capacitor(电容)
-
Inductor(电感)
-
Ground(接地)
-
-
从
Sources拖拽 ConstantVoltage(恒压源) -
按电路图连接,右键设置元件参数
-
点击仿真按钮运行
四、Modelica语言基础
4.1 模型结构
modelica
model SimpleCircuit
// 参数声明
parameter Real V = 5; // 电压
parameter Real R = 100; // 电阻值
Real i; // 电流变量
// 方程部分
equation
V = i * R; // 欧姆定律
end SimpleCircuit;
4.2 变量类型
| 关键字 | 说明 | 示例 |
|---|---|---|
parameter |
常量参数 | parameter Real R=100 |
Real |
实数变量 | Real x(start=1) |
Integer |
整数变量 | Integer n=5 |
Boolean |
布尔变量 | Boolean flag=true |
String |
字符串 | String name="test" |
4.3 方程式 vs 算法
方程式(方程部分):
-
声明式,不指定计算顺序
-
使用
=符号
modelica
equation
der(x) = -k * x; // 微分方程
算法(算法部分):
-
过程式,指定执行顺序
-
使用
:=赋值符号
modelica
algorithm
y := 2 * x;
for i in 1:10 loop
sum := sum + i;
end for;
4.4 RLC电路代码示例
modelica
model RLC_TEST
Modelica.Electrical.Analog.Basic.Resistor R1(R = 100);
Modelica.Electrical.Analog.Basic.Ground G;
Modelica.Electrical.Analog.Basic.Capacitor C1(C = 0.001);
Modelica.Electrical.Analog.Basic.Inductor L1(L = 1);
Modelica.Electrical.Analog.Sources.ConstantVoltage CV1(V = 5);
equation
connect(R1.p, C1.p);
connect(L1.n, C1.p);
connect(CV1.p, L1.p);
connect(CV1.n, C1.n);
connect(R1.n, C1.n);
connect(CV1.n, G.p);
annotation(uses(Modelica(version = "4.0.0")));
end RLC_TEST;
五、仿真操作
5.1 仿真流程
-
检查模型 :
Ctrl+Shift+C或 Simulation → Check Model -
设置仿真参数:点击仿真设置按钮
-
运行仿真:点击运行按钮(绿色箭头)
-
查看结果:自动切换到绘图视角
5.2 仿真参数设置
| 参数 | 说明 | 默认值 |
|---|---|---|
| Start Time | 开始时间 | 0.0 |
| Stop Time | 停止时间 | 1.0 |
| Number of Intervals | 输出时间点数量 | 500 |
| Tolerance | 容差 | 1e-6 |
| Method | 求解器 | dassl |
5.3 求解器选择
| 求解器 | 类型 | 适用场景 |
|---|---|---|
| dassl | BDF隐式 | 刚性系统(默认) |
| ida | BDF隐式 | 大型稀疏系统 |
| cvode | Adams/BDF | 通用 |
| euler | 显式 | 简单教学示例 |
| rungekutta | 显式 | 固定步长求解 |
5.4 命令行仿真
modelica
loadFile("RLC_TEST.mo");
simulate(RLC_TEST, startTime=0, stopTime=10, numberOfIntervals=500);
plot({R1.i, L1.i});
六、结果绘图
6.1 变量浏览器
-
仿真完成后,变量浏览器显示所有变量
-
勾选变量复选框即可在绘图窗口显示曲线
-
支持:时间曲线、参数图、数组图
6.2 绘图操作
变量浏览器过滤选项:
-
正则表达式:
der(.*)匹配所有导数 -
通配符:
R*匹配所有R开头的变量 -
固定字符串:直接输入变量名
6.3 绘图命令
modelica
plot(x); // 单变量
plot({x1, x2}); // 多变量
plotParametric(x, y); // 参数图
plotAll(); // 全部变量
6.4 绘图选项
modelica
plot(Resistor.i,
title="电流曲线",
grid="simple",
logX=false,
xLabel="时间(s)",
yLabel="电流(A)");
七、OMShell交互式会话
7.1 启动OMShell
-
Windows:开始菜单 → OpenModelica → OpenModelica Shell
-
Linux :终端运行
OMShell-terminal
7.2 基本命令
| 命令 | 说明 | 示例 |
|---|---|---|
cd() |
获取当前目录 | cd() |
cd("dir") |
切换目录 | cd("D:/models") |
loadFile("file.mo") |
加载模型文件 | loadFile("RLC.mo") |
loadModel(Modelica) |
加载标准库 | loadModel(Modelica) |
simulate(model) |
仿真 | simulate(RLC_TEST) |
plot(x) |
绘图 | plot(R1.i) |
val(var, time) |
获取变量值 | val(R1.i, 0.5) |
list() |
列出所有类 | list() |
clear() |
清除所有 | clear() |
getErrorString() |
查看错误 | getErrorString() |
7.3 交互式编程示例
For循环求和:
modelica
k := 0;
for i in 1:1000 loop
k := k + i;
end for;
k; // 500500
函数定义与调用:
modelica
function mySqr
input Real x;
output Real y;
algorithm
y := x * x;
end mySqr;
b := mySqr(2); // 4.0
八、库管理
8.1 加载Modelica标准库
modelica
loadModel(Modelica, {"4.0.0"});
8.2 加载自定义库
modelica
loadFile("C:/my_libraries/MyPackage.mo");
8.3 查看已加载库
modelica
getClassNames(); // 列出所有已加载类
getLoadedLibraries(); // 列出已加载库
8.4 包管理器命令
| 命令 | 说明 |
|---|---|
updatePackageIndex() |
更新包索引 |
getAvailablePackageVersions(Pkg, "") |
查看可用版本 |
installPackage(Pkg, "version") |
安装包 |
upgradeInstalledPackages() |
升级所有已安装包 |
九、脚本编程
9.1 MOS脚本文件
创建 simulate.mos 文件:
modelica
loadFile("RLC_TEST.mo");
simulate(RLC_TEST, stopTime=5, numberOfIntervals=1000);
plot({R1.i, L1.i});
执行脚本:
bash
omc simulate.mos
9.2 参数扫描示例
modelica
loadFile("RLC_TEST.mo");
buildModel(RLC_TEST);
for i in 1:3 loop
system("./RLC_TEST -override=R1.R=" + String(100*i) + " -r=result_" + String(i) + ".mat");
end for;
十、Python接口 (OMPython)
10.1 安装
bash
pip install OMPython
10.2 基本使用
python
from OMPython import OMCSessionZMQ
omc = OMCSessionZMQ()
# 加载模型
omc.sendExpression('loadFile("RLC_TEST.mo")')
# 仿真
omc.sendExpression('simulate(RLC_TEST, stopTime=5)')
# 获取结果
val = omc.sendExpression('val(R1.i, 2.0)')
print(val)
10.3 使用ModelicaSystem类
python
from OMPython import ModelicaSystem
mod = ModelicaSystem("RLC_TEST.mo", "RLC_TEST")
# 获取参数
mod.getParameters()
# 修改参数
mod.setParameters(["R1.R=200"])
# 仿真
mod.simulate()
# 获取结果
mod.getSolutions(["time", "R1.i"])
十一、FMI/FMU导出
11.1 导出FMU
modelica
buildModelFMU(RLC_TEST, version="2.0", fmuType="me");
参数说明:
-
version: "1.0" 或 "2.0" -
fmuType: "me"(模型交换)/"cs"(协同仿真)/"me_cs"
11.2 导入FMU
modelica
importFMU("RLC_TEST.fmu");
十二、常见问题与技巧
12.1 常用快捷键
| 快捷键 | 功能 |
|---|---|
| Ctrl+N | 新建模型 |
| Ctrl+O | 打开文件 |
| Ctrl+S | 保存 |
| Ctrl+R | 旋转组件 |
| Ctrl+Shift+C | 检查模型 |
| F5 | 仿真 |
12.2 常见错误解决
| 问题 | 解决方案 |
|---|---|
| 模型加载失败 | 检查MODELICAPATH环境变量 |
| 仿真不收敛 | 调整容差或更换求解器 |
| 变量不存在 | 检查变量名拼写和大小写 |
| 初始化失败 | 添加state变量的start属性 |
12.3 调试技巧
modelica
// 查看错误信息
getErrorString();
// 设置详细输出
setCommandLineOptions("-d=initialization");
// 检查模型结构
checkModel(RLC_TEST);
instantiateModel(RLC_TEST);