JModelica:在不重新编译的情况下更改loopiteration变量

2024-05-15 16:17:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我对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()之后更改为参数“It”时测试.fmu)有:

^{pr2}$

然后运行模拟,它仍然给出“Dum”的5,而不是4。虽然“它”实际上变成了4,这可以从模拟后绘制“它”的时间曲线看出。有没有人知道有没有一种方法可以在运行中改变它,从而真正影响到循环?在

这当然是一个玩具的例子,但我需要一个更大的项目的功能,我迫切需要在一个不同的范围内循环,而重新编译只是浪费时间。在

非常感谢


Tags: in模型testformodelparameteritinteger
1条回答
网友
1楼 · 发布于 2024-05-15 16:17:34

问题是编译器将参数“It”当作一个结构参数来处理,也就是说,很遗憾,在编译之后它不能被更改。在JModelica(r9190)的最新开发版本中运行相同的问题会导致在尝试设置变量“It”时出现异常

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.

如果您检查日志,您将了解失败的原因:

^{pr2}$

所以要回答你的问题,很不幸不能这样做。在

但您可以在编译调用期间更改参数:

from pymodelica import compile_fmu
name = compile_fmu("TEST(It=6)", "test.mo")

相关问题 更多 >