設定しようとしているシンプルな協調シミュレーションで、奇妙な動作が発生しています。私はEnergyPlusで建物のエネルギーモデルをセットアップし、JModelicaから生成されたFMUをテストしました。しかし、建物のエネルギー・モデルは、協調シミュレーションの段階でハングアップすることになります。私はその後、JModelicaでFMUを実行し、いくつかの非常に奇妙な結果を得ました。FMUの変数の値が入力と一致しない
Modelicaコード:
model CallAdd
input Real FirstInput(start=0);
input Real SecondInput(start=0);
output Real FMUOutput(start=0);
function CAdd
input Real x(start=0);
input Real y(start=0);
output Real z(start=0);
external "C" annotation(Library = "CAdd", LibraryDirectory = "modelica://CallAdd");
end CAdd;
equation
FMUOutput = CAdd(FirstInput,SecondInput);
annotation(uses(Modelica(version = "3.2.1")));
end CallAdd;
上記コードリファレンスCコード "CAdd.c" のライブラリファイルである "CADD":
double CAdd(double x, double y){
double answer;
answer = x + y;
return answer;
}
ライブラリにコンパイルされCMDで下の2つのコマンドでファイル:
gcc -c CAdd.c -o CAdd.o
ar rcs libCAdd.a CAdd.o
私はwrappとOpenModelicaに上記の例を実行することができますそれは素晴らしい作品です。
その後、JModelicaを使用して、上記のFMMを共同シミュレーション用にコンパイルしました。 JModelicaコンパイルしたコードは次のとおりです。
# Import the compiler function
from pymodelica import compile_fmu
# Specify Modelica model and model file (.mo or .mop)
model_name = "CallAdd"
mo_file = "CallAdd.mo"
# Compile the model and save the return argument, for use later if wanted
my_fmu = compile_fmu(model_name, mo_file, target="cs")
私はその後、FMUをシミュレートし、JModelica Pythonコードで奇妙な結果を得た:結果のためのプロットのpython対「FMUTime」「トンになった
from pyfmi import load_fmu
import numpy as np
import matplotlib.pyplot as plt
modelName = 'CallAdd'
numSteps = 100
timeStop = 20
# Load FMU created with the last script
myModel = load_fmu(modelName+'.fmu')
# Load options
opts = myModel.simulate_options()
# Set number of timesteps
opts['ncp'] = numSteps
# Set up input, needs more than one value to interpolate the input over time.
t = np.linspace(0.0,timeStop,numSteps)
u1 = np.sin(t)
u2 = np.empty(len(t)); u2.fill(5.0)
u_traj = np.transpose(np.vstack((t,u1,u2)))
input_object = (['FirstInput','SecondInput'],u_traj)
# Internalize results
res = myModel.simulate(final_time=timeStop, input = input_object, options=opts)
# print 'res: ', res
# Internalize individual results
FMUTime = res['time']
FMUIn1 = res['FirstInput']
FMUIn2 = res['SecondInput']
FMUOut = res['FMUOutput']
plt.figure(2)
FMUIn1Plot = plt.plot(t,FMUTime[1:],label='FMUTime')
# FMUIn1Plot = plt.plot(t,FMUIn1[1:],label='FMUIn1')
# FMUIn2Plot = plt.plot(t,FMUIn2[1:],label='FMUIn2')
# FMUOutPlot = plt.plot(t,FMUOut[1:],label='FMUOut')
plt.grid(True)
plt.legend()
plt.ylabel('FMU time [s]')
plt.xlabel('time [s]')
plt.show()
FMUの結果の" FirstInput "と" SecondInput "の入力が、pythonコードで指定されたu1とu2と一致しません。私は、誰かが何が起こっているのかをより良く理解できるように助けてくれることを望んでいます。上記の私の質問で説明した問題が解決された私のJModelicaのインストールを更新するChristianAnderssonの提案@続きジャスティン
2つの 'doubles'を追加するだけでCモジュールを使用することによって、不必要に複雑さが増す理由は何ですか? – Olaf
@Olafはい、これは、私たちがPythonモデルを呼び出すためにcコードを使用しているはるかに大きなモデルの単純な構成です。 –
申し訳ありませんが、それはまた奇妙に聞こえる。しかし、私がモデルカーを実際に知りませんし、それがPythonとどのように統合されているのか、私はこれをそのままにしています。 – Olaf