Документация Engee
Notebook

Импорт компонента FMU Co-Simulation

Показываем, как использовать блоки FMU Import чтобы добавлять на холст Engee внешние модели в формате FMU.

Описание модели

Режим Co-Simulation (совместное моделирование) в компонентах FMU (Functional Mock-up Unit) предназначен для объединения нескольких моделей, разработанных в разных инструментах моделирования, в единую систему с синхронизацией по времени.

Такой режим позволяет соединять модели, созданные в разных средах (MATLAB/Simulink, Dymola, OpenModelica и др.), без необходимости переписывать их код.

Каждый FMU работает как "чёрный ящик" со своим решателем (solver).

В этом примере наша "внешняя" модель находится в файле fmuVanDerPol.fmu, который мы поместим в блок FMU Import, и после настройки получим графики из модели, которая в нем лежит.

image.png

Предлагаем изучить файл FMU. Для этого поставим несколько библиотек и вызовем команду info(fmu).

In [ ]:
Pkg.add( ["FMI"] )
using FMI
fmu = loadFMU( "fmuVanDerPol.fmu" )
info(fmu)
#################### Begin information for FMU ####################
	Model name:			myvdp
	FMI-Version:			2.0
	GUID:				{a50ebd80-9a0f-b492-4bf4-893f9611b1a5}
	Generation tool:		[Unknown generation tool]
	Generation time:		2018-09-26T19:47:29Z
	Var. naming conv.:		structured
	Event indicators:		0
	Inputs:				0
	Outputs:			2
		0 ["Out1"]
		1 ["Out2"]
	States:				0
	Parameters:			1
		2 ["mu"]
	Supports Co-Simulation:		true
		Model identifier:	myvdp
		Get/Set State:		true
		Serialize State:	true
		Dir. Derivatives:	false
		Var. com. steps:	false
		Input interpol.:	false
		Max order out. der.:	nothing
	Supports Model-Exchange:	false
##################### End information for FMU #####################

Настройка блока

В этой информации нам нужно найти названия входных, выходных портов и названия параметров, чтобы правильным образом создать интерфейс блока и настроить его.

У этой модели нет входов, есть два выхода (Out1 и Out2) и есть параметр mu. Кроме того мы не видим настроек временного шага, которые ждет решатель этой модели.

Мы выяснили эмпирически, что размер расчетного шага этой FMU модели не должен быть ниже 0.1 с. Глобальный размер шага всей симуляции может быть каким угодно.

image.png

Запустим модель на выполнение и построим графики:

In [ ]:
model_name = "fmu_co_simulation";
model_name in [m.name for m in engee.get_all_models()] ? engee.open(model_name) : engee.load( "$(@__DIR__)/$(model_name).engee");
res = engee.run( model_name );

plot( res["x"].time, [res["x"].value res["dx"].value], label=["x" "dx"],
      lw=3, size=(600,300) )
Out[0]:

Когда выбирают Co-Simulation вместо Model Exchange?

Model Exchange (ME) требует единого решателя для всей системы и подходит, если все модели могут работать с одним solver.

Co-Simulation (CS) выбирают, когда:

  • модели используют разные решатели,
  • есть legacy-код или проприетарные симуляторы,
  • требуется распределённое выполнение (например, HIL-тестирование).

Заключение

Co-Simulation FMU — это мощный инструмент для интеграции разнородных моделей без необходимости их полного переписывания, но с компромиссом в виде управляемой синхронизации и потенциальных ошибок дискретизации.

Блоки, использованные в примере