2016-02-27 95 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

相關問題