Я считаю, что моя проблема как-то связана с this previous question, но я не смог исправить свою проблему своими советами.Моделирование FMM 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)
предложил here, но это не сработало. Я не уверен, связано ли это, потому что я действительно могу изменить свою ценность. Проблема заключается в том, что уравнения, основанные на этом параметре, кажется, оценивается только во время инициализации: -/
Любая идея/помощь была бы очень кстати ...
Кажется, мы полностью удаляем уравнение if и помещаем только выбранную ветвь на основе openclose> 0.5. Однако, если вы не даете полной модели, ее сложно отладить. Вы можете попытаться переписать уравнение if в выражение if: switch.control = if openclose> 0.5, тогда true else false; –
Спасибо за объяснение, я думаю, что ты прав. Изменение формы уравнения ничего не меняет: -/Я изменил свое первоначальное сообщение, чтобы предоставить минимальный нерабочий пример. Надеюсь, это поможет нам понять, как это исправить. Спасибо –