2016-02-27 94 views
0

我得到了JModelica的以下安静基本问题。考虑一个相当简单的模型: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和运行,当然,和可变姆始终值5,因为它应该是。现在的问题是,当我想改变参数“它”加载编译FMU(test.fmu)与后:

test = load_fmu("test.fmu"); 
test.set("It",4); 

,然后运行仿真,它仍然给5“姆”,而不是4应该如此。虽然“It”实际上变为4,但可以通过仿真后绘制“It”的时间曲线来看到。有没有人知道是否有办法改变它在飞行中,以便它实际上影响循环?

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

非常感谢

回答

1

的问题是,编译器将参数“它”作为结构参数,即它不能被编译后改变了不幸。尝试设置变量“它”

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. 

如果您检查日志,你会看到,当运行在一个异常的JModelica(r9190)结果的最新开发版本同样的问题,为什么会失败:

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") 
+0

如何在编译通(结构)的参数非常好的例子。 – saroele

相关问题