在Engee中启动FMI模型
我们在Julia环境中运行FMU模型以获得仿真结果并将其用于进一步的计算。
任务说明
Fmi(Functional Mockup Interface)标准意味着将模型打包到FMU(Functional Mockup Unit)文件中,其中包含一组方程或系统建模代码(据推测,可以在Engee中调用的各种编程语言支持:Python,Java,Fortran,C++等。 包括朱莉娅)。
例如,考虑在Dymola中组装的弹簧和摆锤的模型。 要运行它,我们需要一个图书馆。 FMI.jl 和一组集合在包中的训练模型 FMIZoo.jl.
Pkg.add( ["FMI", "FMIZoo"] )
连接已安装的库:
using FMI
using FMIZoo
我们将对这样一个模型进行模拟。:
图书馆 FMI.jl 它允许您以多种方式运行FMI/FMU模型,我们将展示其中的两个。:
*通过命令 simulate
*通过创建自己的模拟循环和命令 fmi2DoStep.
创建时间向量(设置开始 tStart,结局 Stop 模拟和时间步长 tStep):
tStart = 0.0
tStep = 0.1
tStop = 8.0
tSave = tStart:tStep:tStop
启动FMU模型的最简单场景
加载模型 SpringFrictionPendulum1D 从模型包 FMIZoo.jl.
fmu = loadFMU( "SpringFrictionPendulum1D", "Dymola", "2022x" )
info(fmu)
让我们运行这个模型的计算,指定模拟时间的开始和结束以及要保存的变量。 mass.s. 由于模型中存在摩擦,波动会随着振幅的减小而发生,一段时间后负载就会停止。
simData = simulate(fmu, (tStart, tStop); recordValues=["mass.s"], saveat=tSave)
plot( simData )
计算完成后,您需要从内存中卸载FMU模型并删除所有临时数据。
unloadFMU(fmu)
创建自己的模拟周期
在更复杂的情况下,例如,当您需要一次链接多个模型的工作时,您可以组织一个计算周期,其中模型将沿着某个时间矢量在其相空间中执行步骤。
下载FMU模型:
fmu = loadFMU("SpringFrictionPendulum1D", "Dymola", "2022x")
Step函数需要一个专门准备的模型(一个具体的实现),我们将使用它来创建 fmi2Instantiate. 通过这种方式,可以一次从单个FMU文件初始化许多模型。
instanceFMU = fmi2Instantiate!(fmu)
在下一个单元格中,我们设置了实验(fmi2SetupExperiment),其中我们指定时间间隔的开始和结束进行模拟,那么模型必须切换到初始化模式(fmi2EnterInitializationMode)并在初始化后获得其初始状态(fmi2ExitInitializationMode).
fmi2SetupExperiment(instanceFMU, tStart, tStop)
fmi2EnterInitializationMode(instanceFMU) # установить исходное состояние
fmi2ExitInitializationMode(instanceFMU) # прочитать исходное состояние
现在我们可以在计算周期中运行模型。 功能 fmi2DoStep 具有固定间距 tStep 允许您执行此模型的计算步骤。 如果模型具有输入参数或接收数据,则可以循环更改它们。
values = []
for t in tSave
# выставить входные параметры модели, если требуется
# ...
fmi2DoStep(instanceFMU, tStep)
# сохранить выходы модели
value = fmi2GetReal(instanceFMU, "mass.s")
push!(values, value)
end
plot(tSave, values)
在计算结束时,我们必须释放内存并删除中间文件。
fmi2Terminate(instanceFMU)
fmi2FreeInstance!(instanceFMU)
unloadFMU(fmu)
结论
我们用一个命令启动了一个简单的FMU模型,并想出了如何组织一个计算周期,在这个周期中我们可以更新模型的输入参数并根据输出数据做出操作决策。