FMU Variable Values Do Not Match Input

情到浓时终转凉″ 提交于 2019-12-11 06:42:34

问题


I'm getting some strange behavior in a simple co-simulation that I'm trying to configure. I setup a building energy model in EnergyPlus to test out an FMU generated from JModelica. However, the building energy model would get hung up at the co-simulation step. I then ran the FMU in JModelica and got some very strange results.

The Modelica code is:

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;

The above code references "CAdd" which is library file for the c code "CAdd.c":

double CAdd(double x, double y){
    double answer;
    answer = x + y;
    return answer;
}

which is compiled into a library file with the below two commands in CMD:

gcc -c CAdd.c -o CAdd.o
ar rcs libCAdd.a CAdd.o

I can run the above example in OpenModelica with a wrapper and it works great.

I then used JModelica to compile the above as an FMU for co-simulation. The JModelica compile code is:

# 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")

I then simulated the FMU and got the strange results with the JModelica Python code:

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

which resulted in the plot for result "FMUTime" vs python "t":

In addition to seeing this strange behavior the input "FirstInput" and "SecondInput" in the FMU results do not match the u1 and u2 specified in the python code. I'm hoping that someone can help me better understand what is going on.

Best,

Justin


回答1:


Following @ChristianAndersson's suggestion to update my JModelica installation the problem described in my question above was solved.

JModelica 1.17.0 was release in December, 2015.

JModelica-SDK-1.12.0 was released in February, 2016 and is built from the source code, which fixed the problem and provided me with the expected results.



来源:https://stackoverflow.com/questions/39005445/fmu-variable-values-do-not-match-input

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!