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, и он, конечно же, работает, а переменная Dum всегда имеет значение 5, как и должно быть. Проблема в том, что теперь, когда я хочу изменить параметр «It» после загрузки скомпилированного fmu (test.fmu) с помощью:

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

а затем запустите симуляцию, она все равно даст 5 для "Dum", а не 4, как должно. Хотя на самом деле "It" меняется на 4, что можно увидеть, построив временную кривую "It" после моделирования. Кто-нибудь знает, есть ли способ изменить его на лету, чтобы он действительно влиял на цикл?

Это, конечно, игрушечный пример, но мне нужна эта функциональность для гораздо более крупного проекта, где мне отчаянно нужно перебирать в цикле изменяющийся диапазон и где повторная компиляция занимает слишком много времени.

Огромное спасибо


person Stefanowitschko    schedule 27.02.2016    source источник


Ответы (1)


Проблема в том, что компилятор рассматривает параметр "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.

Если вы проверите журнал, вы увидите, почему это не удалось:

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")
person Christian Winther    schedule 14.09.2016
comment
Действительно хороший пример того, как передавать (структурные) параметры при компиляции. - person saroele; 25.10.2017