私の問題はこの前の質問に何らかの形で関連していると思いますが、彼らのアドバイスでは問題を解決できませんでした.
これは最小限の非動作例です。整流スイッチを備えた単純な電気回路があります(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)
で提案されていることを理解しようとしましたが、うまくいきませんでした。実際に値を変更できるため、関連しているかどうかはわかりません。問題は、このパラメーターに基づく方程式が初期化中にのみ評価されるように見えることです:-/
どんなアイデア/助けも大歓迎です...