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 Однако я не пробовал, поэтому он может не работать.