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() 

这导致了情节的结果“FMUTime”与蟒蛇“T “: FMU Time does not match simulation time

除了看到这种奇怪的行为,FMU结果中的输入”FirstInput“和”SecondInput“与Python代码中指定的u1和u2不匹配。我希望有人能帮助我更好地理解正在发生的事情。

最佳,

贾斯汀

+0

任何你为了增加两个'双打'而使用C模块不必要地增加复杂度的原因? – Olaf

+0

@Olaf是的,这是一个更大模型的简单配置,我们使用c代码来调用python模型。 –

+0

对不起,但这听起来很奇怪。但是由于我并不真正了解modelica以及它如何与Python集成,所以我将它留在这里。 – Olaf

继@ ChristianAndersson的建议来更新我的JModelica安装在上面我提到的问题得到了解决。

JModelica 1.17.0在12月发行,2015年

JModelica-SDK-1.12.0发布于2016年二月,从源代码,这解决了问题,并与预期为我提供了内置结果。