FMU FMI仿真,初始化后没有评估某些方程

时间:2015-08-08 08:52:59

标签: openmodelica fmi

我认为我的问题与this previous question有某种关系,但我无法用他们的建议解决我的问题。

这是一个最小的非工作示例。我有一个带有换向开关的简单电路(在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秒)。这是为了能够根据另一个FMU模拟更改输入值( openclose )。

结果我可以修改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,但它没有用。我不确定它是否相关,因为我实际上可以改变我的价值。问题是基于此参数的方程式似乎仅在初始化期间进行评估: - /

非常欢迎任何想法/帮助......

1 个答案:

答案 0 :(得分: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#module-pyfmi.examples.fmu_with_input 但是,我没有尝试过,所以它可能不起作用。