我有一个应用程序,我使用 Dymola 作为开发环境,但将以 FMU 形式导出模型以在另一个应用程序中使用。我正在建模的系统具有可互换的组件,这使得它们非常适合在 Modelica 中进行建模。但是,当我想以 FMU 形式导出模型时,我不确定是否可以利用该功能。
考虑下面非常简单的包。该包的目标是定义两个非常简单的模型,并允许用户在执行模型时在可能的模型之间进行选择。虽然这在 Modelica IDE 中很容易做到,但我需要 FMU 中的类似功能。
部分模型定义了一个模型,其中 y = p0 + p1*x。两个扩展模型只是为参数 p0 和 p1 分配不同的值。最后,TestModel 添加一个名为 modelIndex 的参数,该参数在定义两种可能的模型类型的条件表达式中使用。在 Dymola 中,这非常有效,因为用户可以轻松设置参数 modelIndex 的值。我试图弄清楚是否可以通过将 modelIndex 作为 FMU 的输入来通过 FMU 来完成此任务。但是,如果我为 modelIndex 变量设置注释 Evaluate=false,编译就会失败。所指出的错误是:“当前版本的 Modelica 转换器只能处理具有固定条件的条件组件......条件声明的条件中使用的所有变量必须声明为常量或参数。”
如果有人可以帮助提供有关如何创建有条件 FMU 的指导,我们将不胜感激。这个简单的例子只是用来演示这个问题。正在建模的真实系统有 4-5 个主要组件,每个组件都有 5 种以上可能的不同模型,从而产生大量可能的排列。简单地批量导出所有配置可能是不可行的。
谢谢!贾斯汀
package ConfigurableModel
"Package to test whether or not models can be configured by external inputs"
partial model partialModel
"Partial model used to control selectable options in Dymola"
Modelica.Blocks.Interfaces.RealInput x(start = 1) "input value";
Modelica.Blocks.Interfaces.RealOutput y "output value";
parameter Real p0 = 0;
parameter Real p1 = 0;
equation
y = p0 + p1*x;
annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram(
coordinateSystem(preserveAspectRatio=false)));
end partialModel;
model linearModel_NoOffset "Linear model with no offset"
extends partialModel(p0 = 0, p1 = 1);
end linearModel_NoOffset;
model linearModel_Offset "Linear model with offset"
extends partialModel(p0=1, p1=1);
end linearModel_Offset;
model TestModel "Model to test configurability"
// parameter Integer modelIndex = 2 "1 = linear_NoOffset, 2 = linear_Offset" annotation(Evaluate=false);
parameter Integer modelIndex = 2 "1 = linear_NoOffset, 2 = linear_Offset";
// Conditional instances, only one model is created based upon value of modelIndex
linearModel_NoOffset linear_NoOffset if modelIndex == 1;
linearModel_Offset linear_Offset if modelIndex == 2;
// Input and output blocks
Modelica.Blocks.Sources.Constant xMaster(k=1) annotation (Placement(transformation(extent={{-100,-10},{-80,10}})));
Modelica.Blocks.Interfaces.RealOutput yMaster annotation (Placement(transformation(extent={{100,-10},{120,10}})));
equation
// Note that only the connections for the components that exist will be used
// Connect input to each model instance
connect(xMaster.y, linear_NoOffset.x);
connect(xMaster.y, linear_Offset.x);
// Connect output to each model instance
connect(yMaster, linear_NoOffset.y);
connect(yMaster, linear_Offset.y);
annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram(
coordinateSystem(preserveAspectRatio=false)));
end TestModel;
annotation (uses(Modelica(version="3.2.1")));
end ConfigurableModel;
Run Code Online (Sandbox Code Playgroud)
据我了解,直接使用 FMI 是不可能实现这一点的。Modelica 的面向对象功能(如条件实例化)是在 Modelica 的符号处理过程中处理的,然后生成作为 FMU 一部分的 C 代码(作为 C 代码或编译形式)。通过条件实例化,导出的 FMU 的许多属性都可以更改(例如,具有不同数量的状态)。因此,FMU 中不能有单个 modeldescription.xml 文件来描述 FMU 的属性。您可以考虑将模型拆分为多个 FMU,并通过交换其中一些子系统来处理子系统的可变性。然而,这可能会导致比原始整体 Modelica 模型更复杂的数值任务,因为无法像 Modelica 编译器对整体模型那样对整体模型执行优化。您的示例中的一个优点是,您的部分模型已经具有因果接口(RealInput 和 RealOutput)。接近您的预期解决方案的解决方法可能是,您同时包含子模型 Linear_NoOffset 和 Linear_Offset (没有“if modelIndex == xy”) )在您的模型中,包括由 modelIndex 触发的开关,以在进出两个子模型的信号之间进行切换。由于两个子模型都存在并进行评估,可能会导致一些计算开销。
| 归档时间: |
|
| 查看次数: |
369 次 |
| 最近记录: |