Los valores variables de FMU no coinciden con la entrada

Estoy obteniendo un comportamiento extraño en una co-simulación simple que estoy tratando de configurar. Configuré un modelo de energía de construcción en EnergyPlus para probar una FMU generada desde JModelica. Sin embargo, el modelo de energía del edificio quedaría colgado en el paso de co-simulación. Luego ejecuté la FMU en JModelica y obtuve algunos resultados muy extraños.

El código de Modelica es:

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; 

El código anterior hace referencia a “CAdd”, que es un archivo de biblioteca para el código c “CAdd.c”:

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

que se comstack en un archivo de biblioteca con los dos comandos siguientes en CMD:

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

Puedo ejecutar el ejemplo anterior en OpenModelica con una envoltura y funciona muy bien.

Luego utilicé JModelica para comstackr lo anterior como una FMU para la co-simulación. El código de comstackción de JModelica es:

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

Luego simulé la FMU y obtuve resultados extraños con el código Python de JModelica:

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

que resultó en la gráfica para el resultado “FMUTime” vs python “t”: El tiempo de FMU no coincide con el tiempo de simulación

Además de ver este extraño comportamiento, la entrada “FirstInput” y “SecondInput” en los resultados de FMU no coinciden con u1 y u2 especificados en el código de python. Espero que alguien pueda ayudarme a comprender mejor lo que está pasando.

Mejor,

Justin

Siguiendo la sugerencia de @ ChristianAndersson de actualizar mi instalación de JModelica, se solucionó el problema descrito en mi pregunta anterior.

JModelica 1.17.0 se lanzó en diciembre de 2015.

JModelica-SDK-1.12.0 se lanzó en febrero de 2016 y se creó a partir del código fuente, que solucionó el problema y me proporcionó los resultados esperados.