导入FMU协同仿真组件
本文将演示如何使用FMU Import 模块,将FMU格式的外部模型添加到AnyMath画布中。
模型描述
FMU(功能原型单元)组件中的协同仿真(Co-Simulation)模式,旨在将使用不同仿真工具开发的多个模型整合为一个具有时间同步功能的统一系统。
该模式允许将不同环境(MATLAB/Simulink、Dymola、OpenModelica 等)中创建的模型进行连接,而无需重写其代码。
每个 FMU 都作为带有独立求解器(solver)的“黑箱”运行。
在此示例中,我们的“外部”模型位于文件fmuVanDerPol.fmu 中,我们将该文件放入FMU Import模块,配置完成后即可获取其中模型生成的图表。
.png)
建议您研究一下FMU文件。 为此,我们将安装几个库,并调用info(fmu) 命令。
In [ ]:
Pkg.add( ["FMI"] )
using FMI
fmu = loadFMU( "fmuVanDerPol.fmu" )
info(fmu)
模块配置
在这些信息中,我们需要找出输入端口、输出端口和参数的名称,以便正确创建模块接口并进行配置。
该模型没有输入,有两个输出(Out1 和Out2 ),并有一个参数mu 。此外,我们未看到该模型求解器所需的步长设置。
我们通过经验发现,该FMU模型的计算步长不应小于
0.1 с。整个仿真的全局步长可以任意设定。
.png)
让我们运行模型并绘制图表:
In [ ]:
model_name = "fmu_co_simulation";
model_name in [m.name for m in engee.get_all_models()] ? engee.open(model_name) : engee.load( "$(@__DIR__)/$(model_name).engee");
res = engee.run( model_name );
plot( res["x"].time, [res["x"].value res["dx"].value], label=["x" "dx"],
lw=3, size=(600,300) )
Out[0]:
何时应选择协同仿真(Co-Simulation)而非模型交换(Model Exchange)?
模型交换(ME)要求整个系统使用统一的求解器,当所有模型均可与同一求解器配合使用时,该方法适用。
在以下情况下应选择协同仿真(Co-Simulation,CS):
- 模型使用不同的求解器,
- 存在遗留代码或专有仿真器,
- 需要分布式执行(例如 HIL 测试)。
结论
FMU协同仿真是一种强大的工具,可用于集成异构模型,而无需对其进行彻底重写,但需在可控同步和潜在离散化误差方面做出妥协。