FMU FMI моделирование, без изменения результатов при настройке определенного типа параметра
Для примера я разработал простую модель Modelica, основанную на библиотеке жидкостей MSL. Я подключил MassFlowSource к каналу и Boundary_PT в качестве функции приемника, как показано на рисунке ниже:
http://www.casimages.com/img.php?i=14061806120359130.png
Я генерирую пакет FMU с OpenModelica (в режиме модел-обмен). Я управляю этим пакетом FMU с помощью Python с кодом ниже:
import pyfmi, os
from pyfmi import load_fmu
myModel = load_fmu('PathToFolder\\test3.fmu')
res1 = myModel.simulate() # First simulation with m_flow in source set to [1] Kg/s
x = myModel.get('boundary1.m_flow') # Mass flow rate of the source
y = myModel.get('pipe.port_a.m_flow') # Mass flow rate in pipe
print x, y
myModel.set('boundary1.m_flow', 2)
option = myModel.simulate_options()
option['initialize'] = False # Need to initialize the simulation
res2 = myModel.simulate(options = option) # Second simulation with m_flow in source set to [2] Kg/s
x = myModel.get('boundary1.m_flow') # Mass flow rate of the source
y = myModel.get('pipe.port_a.m_flow') # Mass flow rate in pipe
print x, y
os.system('pause')
Цель состоит в том, чтобы показать проблему при изменении параметра в модели, здесь переменная "m_flow" в исходном компоненте. Этот новый набор "2" должен изменить "m_flow" в трубе, но это не так. Результаты: в первом моделировании оба значения m_flow равны 1, и это нормально, потому что модель установлена следующим образом. Во втором моделировании я установил параметр "2" в источнике, но канал "m_flow" остался равным "1" (он должен быть "2"). http://www.casimages.com/img.php?i=140618060905759619.png
Вот модель источника жидкости в Modelica (только наша интересная часть):
equation
if not use_m_flow_in then
m_flow_in_internal = m_flow;
end if;
connect(m_flow_in, m_flow_in_internal);
Я думаю, что FMU не учитывает параметры, когда они находятся в условии if. Для меня это проблема, потому что мне нужно управлять FMU и быть уверенным, что если я установлю параметр, симуляция будет использовать этот новый набор. Как быть уверенным, что FMU/FMI работает хорошо? Где исчерпывающий список типов параметров, которыми мы не можем управлять в FMU?
Я уже знаю, что параметры, которые изменяют число уравнений, не могут учитываться в управлении FMU (то же самое для переменных, которые изменяют индекс DAE).
3 ответа
Всякий раз, когда вы пытаетесь установить новые значения для параметра, выполните следующие действия:
1. Сбросить модель
2. установить новые значения для параметра
3. Моделировать модель.
Обратите внимание, что OpenModelica имеет концепцию структурных параметров и Evaluate=true
аннотаций. Например, если параметр используется в качестве измерения массива, он может быть оценен как целочисленное значение. Все использования этого параметра будут использовать оцененное значение, как если бы оно было константой.
Вместо того, чтобы включать рисунок диаграммы, было бы проще взглянуть на исходный код Modelica, чтобы узнать, что OpenModelica сделал с системой.
Я подозреваю, что параметр был оценен. Если вы генерируете код не из FMU, вы можете проверить файл modelName_init.xml, сгенерированный OpenModelica, найти запись для параметра и найти свойство isValueChangeable
,
Вы также можете использовать OMEdit для отладки системы и просмотра исходного уравнения (сгенерируйте исполняемый файл, включающий отладочную информацию). Файл-> Открыть файл преобразований, затем выберите файл modelName_info.xml. Найдите переменную, которую вы пытались изменить, и перейдите к исходному уравнению, которое ее определило. Вполне может быть, что начальное значение (установленное PyFMI) игнорируется, поскольку оно не требуется для получения решения.
Я не знаком с PyFMI, но раньше я сталкивался с такой же ситуацией. Вы можете попробовать несколько вещей ниже.
Попробуйте прекратить / освободить сразу после вашей первой симки.
Поскольку большинство параметров не могут быть изменены после инициализации, вы можете сделать этот параметр входным соединителем, чтобы этот конкретный параметр мог быть изменен в любое время.
(В FMU от Dymola) Я также обнаружил, что если этот параметр включается в вашу исходную нелинейную систему уравнений, то вы получите ошибку "модель не может быть инициализирована", если вы попытаетесь запустить модель в тот же момент.