2

私の問題はこの前の質問に何らかの形で関連していると思いますが、彼らのアドバイスでは問題を解決できませんでした.

これは最小限の非動作例です。整流スイッチを備えた単純な電気回路があります(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 秒をシミュレートしますが、1 秒のシミュレーションを 60 回連続してシミュレートします)。これは、別の 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)で提案されていることを理解しようとしましたが、うまくいきませんでした。実際に値を変更できるため、関連しているかどうかはわかりません。問題は、このパラメーターに基づく方程式が初期化中にのみ評価されるように見えることです:-/

どんなアイデア/助けも大歓迎です...

4

1 に答える 1

2

私が理解できる限り、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、時間、値) をシミュレーションに与える場合にも機能する場合があります: http://www.jmodelica.org/assimulo_home/pyfmi_1。 0/pyfmi.examples.html#module-pyfmi.examples.fmu_with_input ただし、試していないので動かないかもしれません。

于 2015-08-10T00:18:13.197 に答える