Изменить переменную / функцию FMI во время симуляции
У меня есть простой файл FMU, который содержит блок синуса, который принимает вас в качестве входных данных и выводит у. В этом случае u устанавливается равным времени. В своем коде C++ я загрузил библиотеку FMI из FMILibrary и сделал все необходимые шаги до того момента, когда я хочу дать своему вводу новое значение pi(как 3.14). Поэтому я пошел:
fmistatus = fmi2_import_set_real(fmu, &uRef, 1, &pi);
while (timeCurrent < timeEnd){
fmistatus = fmi2_import_do_step(fmu, timeCurrent , stepSize, fmi2_true);
timeCurrent += stepSize;
}
Вы все еще были настроены на время, хотя я пытался придать ему новое значение. Я что-то пропустил?
PS. Где-нибудь я могу найти более подробное описание функций библиотеки FMI? В настоящее время я могу только найти описания ввода-вывода или я что-то пропустил снова.
ОБНОВЛЕНИЕ: После нескольких испытаний, я думаю, что эта проблема может быть, потому что я пытался переопределить свое уравнение u = время. Другими словами, когда я меняю переменную u в блок RealInput в openmodelica, все идет хорошо. Так что, если я действительно хочу переопределить определенное уравнение? Что мне нужно сделать?
1 ответ
Вы не сможете установить какую-либо переменную в FMI - и особенно не переменную с уравнением связывания - и я предполагаю, что ваша модель Modelica имеет "u= время;". Вместо того, чтобы иметь "u= время", вам нужно добавить вход верхнего уровня без какого-либо уравнения (так, чтобы экспортированная ИФР имела его в качестве входа) - и затем подключить его к синусоидальному блоку.
Детали: Для FMI совместного моделирования ограничение на то, что вы можете установить, находится в диаграмме состояний в разделе 4.2.4 спецификации FMI2.
Между fmi2DoStep вы можете установить только действительные переменные, которые имеют причинность = "вход" или причинность = "параметр" и переменность = "настраиваемый" - и вход с уравнением не подходит.
Перед началом интеграции вы можете установить его и для других переменных, но это только предположительные значения для инициализации, и не следует переписывать уравнение "u= время".