AnyMath 文档
Notebook

导入FMU协同仿真组件

本文将演示如何使用FMU Import 模块,将FMU格式的外部模型添加到AnyMath画布中。

模型描述

FMU(功能原型单元)组件中的协同仿真(Co-Simulation)模式,旨在将使用不同仿真工具开发的多个模型整合为一个具有时间同步功能的统一系统。

该模式允许将不同环境(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 #####################

模块配置

在这些信息中,我们需要找出输入端口、输出端口和参数的名称,以便正确创建模块接口并进行配置。

该模型没有输入,有两个输出(Out1Out2 ),并有一个参数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)?

模型交换(ME)要求整个系统使用统一的求解器,当所有模型均可与同一求解器配合使用时,该方法适用。

在以下情况下应选择协同仿真(Co-Simulation,CS):

  • 模型使用不同的求解器,
  • 存在遗留代码或专有仿真器,
  • 需要分布式执行(例如 HIL 测试)。

结论

FMU协同仿真是一种强大的工具,可用于集成异构模型,而无需对其进行彻底重写,但需在可控同步和潜在离散化误差方面做出妥协。

示例中使用的块