Импорт компонента FMU Co-Simulation¶
Показываем, как использовать блоки FMU Import
чтобы добавлять на холст Engee внешние модели в формате FMU.
Режим Co-Simulation (совместное моделирование) в компонентах FMU (Functional Mock-up Unit) предназначен для объединения нескольких моделей, разработанных в разных инструментах моделирования, в единую систему с синхронизацией по времени.
Такой режим позволяет соединять модели, созданные в разных средах (MATLAB/Simulink, Dymola, OpenModelica и др.), без необходимости переписывать их код.
Каждый FMU работает как "чёрный ящик" со своим решателем (solver).
В этом примере наша "внешняя" модель находится в файле fmuVanDerPol.fmu
, который мы поместим в блок FMU Import, и после настройки получим графики из модели, которая в нем лежит.
Предлагаем изучить файл 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 с
. Глобальный размер шага всей симуляции может быть каким угодно.
Запустим модель на выполнение и построим графики:
Когда выбирают Co-Simulation вместо Model Exchange?¶
Model Exchange (ME) требует единого решателя для всей системы и подходит, если все модели могут работать с одним solver.
Co-Simulation (CS) выбирают, когда:
- модели используют разные решатели,
- есть legacy-код или проприетарные симуляторы,
- требуется распределённое выполнение (например, HIL-тестирование).
Co-Simulation FMU — это мощный инструмент для интеграции разнородных моделей без необходимости их полного переписывания, но с компромиссом в виде управляемой синхронизации и потенциальных ошибок дискретизации.
Блоки, использованные в примере¶
{"id": "d73567c4-fc96-4377-beba-4292122a4de9", "data": [{"showlegend": true, "mode": "lines", "xaxis": "x", "colorbar": {"y": 0.5185185185185185, "title": {"text": ""}, "len": 0.936716243802858, "x": 0.9934383202099738}, "name": "x", "yaxis": "y", "legendgroup": "x", "line": {"color": "rgba(0, 154, 250, 1.000)", "shape": "linear", "dash": "solid", "width": 3}, "y": [2, 1.991, 1.967053928591668, 1.9319446295352218, 1.8882868657255774, 1.837817345100953, 1.7816370714157164, 1.720390912443356, 1.6543915487242917, 1.5837003158541976, 1.5081763369269523, 1.4275025267668409, 1.3411943422759074, 1.248595096285817, 1.148860372171079, 1.0409336824327668, 0.9235163262017531, 0.7950371601142134, 0.6536341376500157, 0.4971713985790433, 0.32333668381839437, 0.1298962675439932, -0.08477702389765718, -0.32077372218798234, -0.5752826359582779, -0.8410992836473743, -1.10592696673003, -1.3537781119310621, -1.5689112020813347, -1.7405356830669882, -1.865334666836358, -1.9465931913081636, -1.9913249676455533, -2.0074504953127734, -2.002062763146558, -1.9807644408118683, -1.9476545010964432, -1.9055826869744807, -1.8564525502782379, -1.801482031226678, -1.7413991793541046, -1.6765784326027842, -1.607130333502007, -1.53295697966182, -1.4537826426455716, -1.3691660756287207, -1.2784987504840313, -1.18099176194739, -1.0756534751875015, -0.9612604003296126, -0.8363258387927661, -0.6990757511856218, -0.5474511322218978, -0.3791740311311702, -0.19194327744314155, 0.016135818613113778, 0.24575638319861123, 0.4951672939371867, 0.758652802851862, 1.025452075230045, 1.2803918072648601, 1.5071210697791808, 1.6928977152988933, 1.8320466818970205, 1.9260819715214659, 1.9812106592095287, 2.005321349742527, 2.0058786433437246, 1.9889688414566111, 1.9591343840429891, 1.9195772347072753, 1.8724616930249562, 1.819192791926763, 1.7606322491205342, 1.6972518336510558, 1.629236024848271, 1.5565468719864644, 1.4789614436329626, 1.3960892356100314, 1.3073744013431026, 1.2120859199920204, 1.1092978828668223, 0.9978621129035949, 0.8763767865668305, 0.7431585736914265, 0.5962338277375407, 0.43337934925255667, 0.25226853058674353, 0.05081491717401443, -0.17215993584352302, -0.41582202012881436, -0.675844922122534, -0.943074801979174, -1.2034864953475313, -1.4406070363446786, -1.6400794147846611, -1.7938534373486668, -1.901394267760074, -1.9677894969148115, -2.0006874651073043, -2.007836099769441], "type": "scatter", "x": [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9, 5, 5.1, 5.2, 5.3, 5.4, 5.5, 5.6, 5.7, 5.8, 5.9, 6, 6.1, 6.2, 6.3, 6.4, 6.5, 6.6, 6.7, 6.8, 6.9, 7, 7.1, 7.2, 7.3, 7.4, 7.5, 7.6, 7.7, 7.8, 7.9, 8, 8.1, 8.2, 8.3, 8.4, 8.5, 8.6, 8.7, 8.8, 8.9, 9, 9.1, 9.2, 9.3, 9.4, 9.5, 9.6, 9.7, 9.8, 9.9, 10]}, {"showlegend": true, "mode": "lines", "xaxis": "x", "colorbar": {"y": 0.5185185185185185, "title": {"text": ""}, "len": 0.936716243802858, "x": 0.9934383202099738}, "name": "dx", "yaxis": "y", "legendgroup": "dx", "line": {"color": "rgba(227, 111, 71, 1.000)", "shape": "linear", "dash": "solid", "width": 3}, "y": [0, -0.17283634791666666, -0.30100150062324194, -0.3977063334072956, -0.47314921039623725, -0.5347910956546068, -0.587980138751756, -0.6365672584470178, -0.683402425688082, -0.7307045028010848, -0.7803300960983489, -0.8339709900534732, -0.8933044607213521, -0.960113251727297, -1.0363838242259824, -1.124381516626691, -1.2266863395121277, -1.3461478203440795, -1.4856731826690643, -1.6476898241454772, -1.8330164778359745, -2.038769693390557, -2.254968576884805, -2.460068235177658, -2.617383560630539, -2.677332088616308, -2.591771064803224, -2.339703542191047, -1.947638521312524, -1.482831373664316, -1.0211332996595632, -0.6163342245031908, -0.2905750711535876, -0.04215069575750191, 0.142187997464425, 0.27827125777797396, 0.3801443968908372, 0.4587775159851883, 0.5222233766212409, 0.5762422300311895, 0.6249538180529262, 0.6713722949929317, 0.7178064521145447, 0.7661495722560973, 0.8180902543415517, 0.8752707854838963, 0.9394120500802521, 1.0124159311244365, 1.096447007854284, 1.1939824789080138, 1.3077979344359807, 1.440819368818358, 1.595708517041845, 1.7739514093004582, 1.9741044412675381, 2.1888165879357833, 2.4005898814539184, 2.5775484984892643, 2.6731846245099553, 2.636490361953328, 2.435167767180765, 2.080282799660821, 1.6292431650225438, 1.1592412557881975, 0.7330115948480269, 0.38216701900728334, 0.11100142402726265, -0.091377978766014, -0.24067900455124822, -0.3517484702084308, -0.436532713312795, -0.5039272407140983, -0.5603258135005706, -0.6102896457022787, -0.6571242137259556, -0.7033194839364058, -0.750870442043571, -0.8015091125238781, -0.8568766798019696, -0.9186571329135464, -0.9886859227197089, -1.0690385107891616, -1.162092366278836, -1.2705379404746435, -1.397282855403754, -1.545139480076106, -1.716099538377499, -1.909884640582829, -2.1213813623254123, -2.3367453693012785, -2.5288939397405943, -2.6553946044676398, -2.664701705209547, -2.515707392717195, -2.204244261838493, -1.7749876368952502, -1.30292564894718, -0.8581818654766749, -0.48240011463036314, -0.18718446013577628, 0.03495063764791806], "type": "scatter", "x": [0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8, 1.9, 2, 2.1, 2.2, 2.3, 2.4, 2.5, 2.6, 2.7, 2.8, 2.9, 3, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6, 3.7, 3.8, 3.9, 4, 4.1, 4.2, 4.3, 4.4, 4.5, 4.6, 4.7, 4.8, 4.9, 5, 5.1, 5.2, 5.3, 5.4, 5.5, 5.6, 5.7, 5.8, 5.9, 6, 6.1, 6.2, 6.3, 6.4, 6.5, 6.6, 6.7, 6.8, 6.9, 7, 7.1, 7.2, 7.3, 7.4, 7.5, 7.6, 7.7, 7.8, 7.9, 8, 8.1, 8.2, 8.3, 8.4, 8.5, 8.6, 8.7, 8.8, 8.9, 9, 9.1, 9.2, 9.3, 9.4, 9.5, 9.6, 9.7, 9.8, 9.9, 10]}], "config": {"showlegend": true, "xaxis": {"showticklabels": true, "gridwidth": 0.5, "tickvals": [0, 2.5, 5, 7.5, 10], "range": [-0.3000000000000007, 10.3], "domain": [0.03619130941965587, 0.9934383202099738], "mirror": false, "tickangle": 0, "showline": true, "ticktext": ["0.0", "2.5", "5.0", "7.5", "10.0"], "zeroline": false, "tickfont": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 11}, "zerolinecolor": "rgba(0, 0, 0, 1)", "anchor": "y", "visible": true, "ticks": "inside", "tickmode": "array", "linecolor": "rgba(0, 0, 0, 1)", "showgrid": true, "title": {"text": "", "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 15}}, "gridcolor": "rgba(0, 0, 0, 0.1)", "tickcolor": "rgb(0, 0, 0)", "type": "linear"}, "paper_bgcolor": "rgba(255, 255, 255, 1.000)", "annotations": [], "height": 300, "margin": {"l": 0, "b": 20, "r": 0, "t": 20}, "plot_bgcolor": "rgba(255, 255, 255, 1.000)", "yaxis": {"showticklabels": true, "gridwidth": 0.5, "tickvals": [-2, -1, 0, 1, 2], "range": [-2.837847590010096, 2.833700125903743], "domain": [0.050160396617089535, 0.9868766404199475], "mirror": false, "tickangle": 0, "showline": true, "ticktext": ["-2", "-1", "0", "1", "2"], "zeroline": false, "tickfont": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 11}, "zerolinecolor": "rgba(0, 0, 0, 1)", "anchor": "x", "visible": true, "ticks": "inside", "tickmode": "array", "linecolor": "rgba(0, 0, 0, 1)", "showgrid": true, "title": {"text": "", "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 15}}, "gridcolor": "rgba(0, 0, 0, 0.1)", "tickcolor": "rgb(0, 0, 0)", "type": "linear"}, "legend": {"yanchor": "auto", "xanchor": "auto", "bordercolor": "rgba(0, 0, 0, 1)", "bgcolor": "rgba(255, 255, 255, 1.000)", "borderwidth": 1, "tracegroupgap": 0, "y": 1, "font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 11}, "title": {"font": {"color": "rgba(0, 0, 0, 1)", "family": "sans-serif", "size": 15}, "text": ""}, "traceorder": "normal", "x": 1}, "width": 838.765625}}