FMU FMI моделирование, нет оценки некоторых уравнений после инициализации

Я полагаю, что моя проблема так или иначе связана с этим предыдущим вопросом, но я не смог исправить мою проблему с их советами.

Вот минимальный нерабочий пример. У меня есть простая электрическая схема с коммутатором в ней (разработано в openModelica). Я хочу изменить значение switch.control в зависимости от значения входного параметра. Для этого у меня есть следующее:

model MinimalNonWorkingExemple

 parameter Modelica.Blocks.Interfaces.RealInput openclose;
 Modelica.Electrical.Analog.Ideal.IdealCommutingSwitch switch;
 Modelica.Electrical.Analog.Basic.Ground G;

equation
 connect(switch.p, G.p);
 connect(switch.n2, G.p);
 connect(switch.n1, G.p);

 switch.control = if openclose > 0.5 then true else false;
end MinimalNonWorkingExemple;

Примечание: я пробовал много комбинаций между параметром, вводом и т. Д.

Я хочу сделать итеративное моделирование (например, имитировать 60 секунд системы, но с 60 последовательными симуляциями в 1 секунду). Это необходимо для изменения входного значения (openclose) в соответствии с другим моделированием FMU.

В результате я могу изменить значение ввода из pyFMI. (когда я читаю это, изменения принимаются во внимание). Однако "новое значение" не учитывается ни в моих уравнениях.

Вот мой скрипт pyfmi:

# Import the load function (load_fmu)
from pyfmi import load_fmu
import numpy as np 
from pylab import *

def simulate(model, res, startTime,finalTime, initialState):
 if res == None:
    opts=model.simulate_options()
    opts['initialize']=True
 else:
    opts=model.simulate_options()
    opts['initialize']=False

 for s in initialState:
    model.set(s[0],s[1])

 res = model.simulate(start_time = startTime, final_time=finalTime, options=opts)
 return res


 #main part
 model = load_fmu('MinimalNonWorkingExemple.fmu')
 switchClose = ['openclose', [0.0]]
 switchOpen = ['openclose', [1.0]]

 #Simulate an FMU
 res = simulate(model, None, 0, 50, [switchOpen])

 v = res["openclose"]
 v2 = res["switch.control"]

 res = simulate(model, res, 50, 100, [switchClose])
 v = np.concatenate((v,res["openclose"]))
 v2 = np.concatenate((v2,res["switch.control"]))

 res = simulate(model, res, 100, 200, [switchOpen])
 v = np.concatenate((v,res["openclose"]))
 v2 = np.concatenate((v2,res["switch.control"]))

 print v
 print v2

В основном я симулирую в течение 50 единиц времени, затем меняю значение openclose переменная, затем имитация снова, переключение снова и повторное моделирование. В результате я получил:

 openclose:      [ 1.  1.  1.  1.  0.  0.  0.  0.  1.  1.  1.  1.]
 switch.control: [ 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.  1.]

На самом деле, только набор, сделанный до первого звонка model.simulate(...) распространяет свое значение в системе.

Я пытался понять annotation(Evaluate = false) предложил здесь, но это не сработало. Я не уверен, связано ли это, так как я действительно могу изменить свою ценность. Проблема в том, что уравнения, основанные на этом параметре, оцениваются только во время инициализации:-/

Любая идея / помощь будет приветствоваться...

1 ответ

Решение

Насколько я понимаю, стандарт FMI гласит, что после инициализации модели ваши изменения параметров больше не будут влиять на модель. Таким образом, необходимо использовать сброс и повторную инициализацию модели, чтобы изменения снова были обнаружены. Кажется, хорошо работает с этим кодом:

# Import the load function (load_fmu)
from pyfmi import load_fmu
import numpy as np 
from pylab import *

def simulate(model, res, startTime,finalTime, initialState):
  if res == None:
    opts=model.simulate_options()
    opts['initialize']=True
  else:
    model.reset()
    opts=model.simulate_options()
    opts['initialize']=True

  for s in initialState:
    model.set(s[0],s[1])

  res = model.simulate(start_time = startTime, final_time=finalTime, options=opts)
  return res


#main part
model = load_fmu('MinimalNonWorkingExemple.fmu')
print model.get_description()
model.set_log_level(7)
switchClose = ['openclose', [0.0]]
switchOpen = ['openclose', [1.0]]

#Simulate an FMU
res = simulate(model, None, 0, 50, [switchOpen])

v = res["openclose"]
v2 = res["switch.control"]

res = simulate(model, res, 50, 100, [switchClose])
v = np.concatenate((v,res["openclose"]))
v2 = np.concatenate((v2,res["switch.control"]))

res = simulate(model, res, 100, 200, [switchOpen])
v = np.concatenate((v,res["openclose"]))
v2 = np.concatenate((v2,res["switch.control"]))

print v
print v2

Результат:

[ 1.  1.  1.  1.  0.  0.  0.  0.  1.  1.  1.  1.]
[ 1.  1.  1.  1.  0.  0.  0.  0.  1.  1.  1.  1.]

Вы также можете увидеть обсуждение здесь: http://ext5.modelon.ideon.se/5858

Это также может сработать, если вы сделаете openclose вход (без параметра), а затем передаете объект моделирования для ввода (openclose, time, value), как в примере здесь: http://www.jmodelica.org/assimulo_home/pyfmi_1.0/pyfmi.examples.html Однако я не пробовал, поэтому он может не работать.

Другие вопросы по тегам