Значения переменных FMU не совпадают с входными

Я получаю странное поведение в простой ко-симуляции, которую пытаюсь настроить. Я настроил энергетическую модель здания в EnergyPlus, чтобы проверить FMU, сгенерированный из JModelica. Тем не менее, модель энергии здания будет зависать на этапе совместного моделирования. Затем я запустил FMU в JModelica и получил очень странные результаты.

Код 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 с оберткой, и он прекрасно работает.

Затем я использовал 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 не соответствует времени симуляции

В дополнение к этому странному поведению входные данные "FirstInput" и "SecondInput" в результатах FMU не соответствуют u1 и u2, указанным в коде python. Я надеюсь, что кто-то может помочь мне лучше понять, что происходит.

Лучший,

Джастин

1 ответ

После предложения @ChristianAndersson обновить мою установку JModelica проблема, описанная в моем вопросе выше, была решена.

JModelica 1.17.0 был выпущен в декабре 2015 года.

JModelica-SDK-1.12.0 был выпущен в феврале 2016 года и построен на основе исходного кода, который устранил проблему и дал мне ожидаемые результаты.

Другие вопросы по тегам