我从JModelica获得了以下安静的基本问题。考虑一个相当简单的模型:
model TEST
Real Dum(start = 0);
parameter Integer It = 5;
algorithm
Dum := 0;
for i in 1:It loop
Dum := Dum + 1;
end for;
end TEST;
我用python编译它然后运行,当然,变量Dum总是值5,因为它应该是。问题是,当我想在加载编译后的fmu(test.fmu)之后更改为参数“It”:
test = load_fmu("test.fmu");
test.set("It",4);
然后运行模拟,它仍为“Dum”提供5,而不是4。虽然“It”实际上变为4,但可以通过在模拟后绘制“It”的时间曲线来看出。有没有人知道是否有办法在运行中改变它以便它实际上影响循环?
这当然是一个玩具示例,但我需要一个更大的项目的功能,我迫切需要在不同的范围内循环,重新编译只是耗费时间。
非常感谢
答案 0 :(得分:2)
问题是编译器会处理参数"它"作为结构参数,即不幸的是在编译之后它不能被改变。使用最新开发版本的JModelica(r9190)运行相同的问题会在尝试设置变量时导致异常"它"
In [9]: test.set("It", 6)
---------------------------------------------------------------------------
FMUException Traceback (most recent call last)
<ipython-input-9-b5b436a55add> in <module>()
----> 1 model.set("It", 6)
src\pyfmi\fmi.pyx in pyfmi.fmi.ModelBase.set (src\pyfmi\fmi.c:4648)()
src\pyfmi\fmi.pyx in pyfmi.fmi.FMUModelBase._set (src\pyfmi\fmi.c:17714)()
src\pyfmi\fmi.pyx in pyfmi.fmi.FMUModelBase.set_integer (src\pyfmi\fmi.c:15398)()
FMUException: Failed to set the Integer values.
如果你查看日志,你会看到它失败的原因:
In [10]: test.get_log()
Out[10]: ['FMIL: module = Model, log level = 2: [ERROR][FMU status:Error] <CannotSetVariable category="error">Cannot set Integer structural parameter <value name="variable">"It"</value></CannotSetVariable>']
所以为了回答你的问题,不幸的是不能这样做。
您可以在编译调用期间更改参数:
from pymodelica import compile_fmu
name = compile_fmu("TEST(It=6)", "test.mo")