FMU变量值不匹配输入
问题描述:
我正在尝试配置一个简单的联合仿真中出现一些奇怪的行为。我在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;
上面的代码的引用 “CADD”,它是C代码 “CAdd.c” 库文件:其被编译成一个库
double CAdd(double x, double y){
double answer;
answer = x + y;
return answer;
}
文件与CMD中的以下两个命令:
gcc -c CAdd.c -o CAdd.o
ar rcs libCAdd.a CAdd.o
我可以在OpenModelica中运行上面的示例与wrapp呃,它的效果很好。
然后,我使用JModelica将上述内容编译为用于协同仿真的FMU。该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代码的奇怪的结果:
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不匹配。我希望有人能帮助我更好地理解正在发生的事情。
最佳,
贾斯汀
答
继@ ChristianAndersson的建议来更新我的JModelica安装在上面我提到的问题得到了解决。
JModelica 1.17.0在12月发行,2015年
JModelica-SDK-1.12.0发布于2016年二月,从源代码,这解决了问题,并与预期为我提供了内置结果。
任何你为了增加两个'双打'而使用C模块不必要地增加复杂度的原因? – Olaf
@Olaf是的,这是一个更大模型的简单配置,我们使用c代码来调用python模型。 –
对不起,但这听起来很奇怪。但是由于我并不真正了解modelica以及它如何与Python集成,所以我将它留在这里。 – Olaf