2016-08-17 8 views
1

設定しようとしているシンプルな協調シミュレーションで、奇妙な動作が発生しています。私は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 Time does not match simulation time

FMUの結果の" FirstInput "と" SecondInput "の入力が、pythonコードで指定されたu1とu2と一致しません。私は、誰かが何が起こっているのかをより良く理解できるように助けてくれることを望んでいます。上記の私の質問で説明した問題が解決された私のJModelicaのインストールを更新するChristianAnderssonの提案@続きジャスティン

+0

2つの 'doubles'を追加するだけでCモジュールを使用することによって、不必要に複雑さが増す理由は何ですか? – Olaf

+0

@Olafはい、これは、私たちがPythonモデルを呼び出すためにcコードを使用しているはるかに大きなモデルの単純な構成です。 –

+0

申し訳ありませんが、それはまた奇妙に聞こえる。しかし、私がモデルカーを実際に知りませんし、それがPythonとどのように統合されているのか、私はこれをそのままにしています。 – Olaf

答えて

0

ベスト

JModelica 1.17.0は、12月にリリースした2015年

JModelica-SDK-1.12.0は2月、2016年にリリースされた問題を修正し、予想を私に提供されたソースコードから構築されています結果。

関連する問題