我在通过 PyFMI 模拟 EnergyPlus-FMU 时遇到了麻烦。我使用参考建筑模型创建了 EnergyPlus FMU。我使用的是PyFMI2.5。如何运行 do_step() 函数?
from pyfmi import load_fmu
model = load_fmu("MyEnergyplus.fmu")
start_time = 0
final_time = 60.0 * 60 * 24 * 3 #seconds
step_size = 60 # seconds
opts = model.simulate_options()
idf_steps_per_hour = 60
ncp = (final_time - start_time)/(3600./idf_steps_per_hour)
opts['ncp'] = ncp
t = 0
status = model.do_step(current_t = t, step_size= step_size, new_step=True)
Run Code Online (Sandbox Code Playgroud)
我得到的错误:
File "test_fmi2.py", line 15, in <module> status = model.do_step(current_t = t, step_size= step_size, new_step=True)
AttributeError: 'pyfmi.fmi.FMUModelME2' object has no attribute …
Run Code Online (Sandbox Code Playgroud) 我的研究小组开发了一个新建筑组件的python代码,我们希望与EnergyPlus共同模拟.对于可重复使用性和市场影响,我们希望这种连接对于没有经验的用户来说尽可能简单,并且相信使用功能样机接口标准(FMI)打包模型是最佳选择.
我们已经探索了JModelica来测试其他功能样机单元(FMU),但发现它没有为模型交换或协同仿真进行Python代码的FMU导出.
我很好奇是否有任何方法将python代码打包为FMU?如果没有,是否有另一种方法将Python链接到FMI标准或将其连接到像EnergyPlus这样的建筑能源软件?
替代方案是将建筑能源模型作为FMU导出并导入到modelica/jmodelica或使用BCVTB.虽然这对我们有用,但我们担心这会让没有经验的人使用我们的工具变得困难.
主要目标
区域供热网络的敏感性分析。
方法
使用 AixLib 和 BuildingSystem 库的系统 Modelica 模型(在 Dymola 中)
将模型导出为 FMU 协同仿真
使用SALib(灵敏度分析python库)定义样本(参数扫描)
使用 PyFMI 在 Python 中的 for 循环中为所有单个样本运行模型(并并行化 for 循环,可能使用 JobLib 在多个处理器上执行模拟)
SALib 执行基于方差的敏感性分析 ( http://salib.readthedocs.io/en/latest/basics.html#an-example )
第一步
Ishigami 函数的简单模型模型(与时间无关)。该函数常用于测试敏感性分析方法(https://www.sfu.ca/~ssurjano/ishigami.html)。
python 代码(包括使用 PyFMI 加载 FMU 和参数扫描)工作正常。
问题
经过一定量的模拟后,我们得到一个错误。错误输出看起来并不总是相同的。有时我们得到
FMUException:加载二进制文件时出错。无法加载 DLL:Eine DLL-Initialisierungsroutine ist fehlgeschlagen。
翻译:DLL 初始化例程失败。
有时我们会得到:
FMUException:加载二进制文件时出错。无法加载 DLL:Für diesen Befehl ist nicht genügend Speicher verfügbar。
翻译:此命令没有足够的可用内存。
该错误发生在大约 650 次模拟运行后。这与模拟是在一个接一个地重新运行的较小循环块中执行还是一个单独的 for 循环运行所有模拟无关。通过重新启动 python 控制台/进程,可以再次运行新的模拟。
工作环境:
Windows 10、Python 2.7、使用 …
我尝试在Anaconda(Python 3.6.8)上设置pyFMI
安装了pyFMI站点上列出的所有必需软件包。fmu加载没有问题,但是当我尝试模拟fmu时出现错误:
Could not find cannot import name 'radau5'
Could not find cannot import name 'dopri5'
Could not find cannot import name 'rodas'
Could not find cannot import name 'odassl'
Could not find ODEPACK functions.
Could not find RADAR5
Could not find GLIMDA.
Traceback (most recent call last):
File "assimulo\solvers\../lib/sundials_callbacks_ida_cvode.pxi", line 240, in assimulo.solvers.sundials.cv_jac
File "C:\Users\d60378\AppData\Local\Continuum\anaconda3\lib\site-packages\pyfmi\simulation\assimulo_interface.py", line 733, in j
A = self._model._get_A(add_diag=True, output_matrix=self._A)
File "src\pyfmi\fmi.pyx", line 6041, in pyfmi.fmi.FMUModelBase2._get_A
File "src\pyfmi\fmi.pyx", line 7592, in pyfmi.fmi.FMUModelME2._get_directional_proxy
File "src\pyfmi\fmi.pyx", line …
Run Code Online (Sandbox Code Playgroud) 我有一个模型的 FMU,用例是更改 FMU 的参数值以查看对结果的影响。如果我无法访问 Modelica 模型,有没有办法使用 FMPy 或 pyFMI 列出 FMU 的顶级参数?
我一直在遵循的过程之一是使用 FMPy.gui 打开 FMU 并查看参数列表,然后在脚本中使用它们,但我想知道是否有更简单的方法,以便我可以列出然后在 Jupyter notebook 中根据需要更改参数?
如何使用 Dymola 创建具有大型参数数组的 FMU?我发现当数组大小超过 100 个元素时,数组会丢失 causality="parameter" 和 modelDescription.xml 文件中的起始值属性。有没有办法将最大参数数组大小从 100 增加到 10000?
型号:
model Unnamed
parameter Real smallArray[:] = fill(3.,100);
parameter Real largeArray[:] = fill(3.,101);
equation
end Unnamed;
Run Code Online (Sandbox Code Playgroud)
模型描述.xml:
model Unnamed
parameter Real smallArray[:] = fill(3.,100);
parameter Real largeArray[:] = fill(3.,101);
equation
end Unnamed;
Run Code Online (Sandbox Code Playgroud) 我们正在尝试测试Dymola的协同仿真选项,并创建了一个fmu文件。我们从www.fmi-standard.org安装/构建了FMILibrary-2.0b2和FMUChecker-2.0b1。
尝试运行我的同事用Dymola创建的fmu文件的FMUChecker(fmuCheck.linux32)时遇到问题。我用我的Dymola许可证从同一Dymola模型创建了一个fmu文件,此问题无法重现。因为fmuCheck.linux32运行正常,没有任何错误消息。我的同事可以同时运行两个文件!
由于我们的目标是使用此选项进行协同仿真,因此我尝试在没有Dymola的PC上运行fmu文件,并且我的fmu复制件和我的同事创建的同一个错误再次出现。
这是错误消息
fmuCheck.linux32 PemFcSysLib_Projects_Modl_SimCoolCirc.fmu
[INFO][FMUCHK] Will process FMU PemFcSysLib_Projects_Modl_SimCoolCirc.fmu
[INFO][FMILIB] XML specifies FMI standard version 1.0
[INFO][FMI1XML] Processing implementation element (co-simulation FMU detected)
[INFO][FMUCHK] Model name: PemFcSysLib.Projects.Modl.SimCoolCirc
[INFO][FMUCHK] Model identifier: PemFcSysLib_Projects_Modl_SimCoolCirc
[INFO][FMUCHK] Model GUID: {6eba096a-a778-4cf1-a7c2-3bd6121a1a52}
[INFO][FMUCHK] Model version:
[INFO][FMUCHK] FMU kind: CoSimulation_StandAlone
[INFO][FMUCHK] The FMU contains:
18 constants
1762 parameters
26 discrete variables
281 continuous variables
0 inputs
0 outputs
2087 internal variables
0 variables with causality 'none'
2053 real variables
0 integer variables
0 enumeration variables
34 …
Run Code Online (Sandbox Code Playgroud) 我试图与我的一位同事交换我的 Modelica 模型,但在 CSV 文件的路径方面遇到了困难。
当我创建 FMU 时,一些 CSV 文件的路径被设置并指向我计算机上的文件夹。例如 C:/Users/Me/file.csv。这显然对我的同事不起作用。
如何以相对于用户设置路径的方式导出我的 Modelica 模型 (Dymola)?
通过像 FMPy 这样的 Python 库,我能够针对给定的和模拟 fmus(使用fmpy.simulate_fmu
) 。在这种情况下,函数simulate_fmu完成模拟并返回时间序列结果。start_time
stop_time
但是,我想在 fmu 和 Python 函数之间创建一个闭环(即在 Python 脚本中初始化 fmu,每 0.1 秒后从 fmu 获取结果,并基于该结果将下一个时间步的输入值更新到 fmu) 。有没有办法使用 fmpy 或 pyfmi 等现有库来实现此目的?
我有一个 pandapower 网络,在一些公交车上,我将电池和光伏设备作为 FMU。现在我有一个主算法,可以在不同 FMU 的输入和输出之间创建连接并运行模拟。
我的问题是是否有可能将所有内容组合成一个 FMU,它将所有不同的输入和所有不同的输出组合在一起。
fmi ×10
modelica ×8
dymola ×4
pyfmi ×4
python ×4
jmodelica ×2
assimulo ×1
energyplus ×1
python-3.x ×1
simulation ×1