1

我在 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”的时间曲线可以看出。有谁知道是否有办法即时更改它,以便它真正影响循环?

这当然是一个玩具示例,但我需要该功能用于一个更大的项目,我迫切需要在不同的范围内循环,并且重新编译只是非常耗时。

非常感谢

4

1 回答 1

2

问题在于编译器将参数“It”视为结构参数,即不幸的是编译后无法更改它。尝试设置变量“It”时,使用最新开发版本的 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")
于 2016-09-14T17:03:09.350 回答