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, как должно. Хотя "Это" меняется на 4 на самом деле, что можно увидеть, построив временную кривую "Это" после моделирования. Кто-нибудь знает, есть ли способ изменить его на лету, чтобы он действительно влиял на цикл?

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

Спасибо

1 ответ

Проблема в том, что компилятор рассматривает параметр "Это" как структурный параметр, т.е. его нельзя изменить после компиляции, к сожалению. Запуск той же проблемы с последней версией разработки 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")
Другие вопросы по тегам