我有一个关于在可重用库部分和特定应用程序部分中构建 Modelica 代码的问题。问题涉及依赖于介质的介质和设备,我受到 MSL 流体库中的一些结构的启发,但我想制作更小的东西并适应我的需要,但我也可以随之成长。
问题是关于如何方便地使库适应应用程序代码中定义的新介质。由于不同设备有多种型号,因此很自然会有一个局部模型来定义设备应具有的连接器类型,然后只有在需要适配连接器时才对局部模型进行更改。对我来说,看起来我需要一个三步适应库的过程,而不是我希望的一步。我在下面有一个详细的示例,可以更清楚地提出问题。
该示例是将液体从一个容器泵送到另一个容器的模型,即我们有一个进料罐、一个泵和一个收获罐。液体介质最初包含两种物质,现在在应用程序中我们要对七种物质进行建模。
在应用程序代码中,包含七种物质的新介质被声明为包 Medium7。泵、饲料和收获罐的库模型的调整分以下三个步骤进行:
- 将连接器 LiquidCon7 定义为从库中导入标准连接器 LiquidCon 的扩展,并将介质重新声明为 Medium7
- 将部分模型 EquipmentMedium7 定义为标准部分模型 EquipmentMedium 导入的扩展,并且连接器被重新声明为 LiquidCon 到 LiquidCon7
- 将包 Equipment7 定义为标准包 Equipment 的导入扩展,其中部分模型从 EquipmentMedium 重新声明为 EquipmentMedium7。
首先,现在可以使用 Equipment7 中的设备在为 Medium7 定制的应用程序代码中定义一个系统。——我希望我能比上面描述的更直接地进行改编。如果我避免像这里那样在库和应用程序中划分代码,那么从 Medium2 切换到 Medium7 会容易得多,只需更改 LiquidConType 中使用的介质,然后该更改就会传播到整个系统。
当我阅读 Tiller 和 Fritzson 关于该主题的教科书材料时,或者当我尝试理解 MSL 代码时,我发现了类似的结构,但仍然不是我在这里所拥有的。我还认为我关于如何有效地使库适应新应用程序所要求的接口变化的问题不仅限于介质,而是更广泛的代码。
只需阅读 2008 年的 Tillers 论文“Modelica 中的模式和反模式”,在第 2.3 节“中模型模式”中,这里有一个与我的问题相关的讨论,并考虑了 pg 649 的最后几行。
我刚刚意识到我的模型结构违反了 Modelica 的定义,因为您不允许从部分模型 EquipmentMedium 扩展 PumpType、FeedtankType 等,因为我需要 EquipmentMedium 是可替换的。请参阅 Modelica def 3.2 rev 2 第 6.2.1 节“传递性不可替换”。
我将不胜感激有关该主题的一些评论,也许还有阅读建议。我的玩具问题的替代解决方案也很受欢迎!
谢谢,简彼得
我不知道如何附加代码文件,但下面我展示了上面描述的应用程序代码。库 DATA_v04 是直截了当的。但请注意,我需要使用从部分模型 EquipmentMedium 扩展来定义模型 PumpType、FeedtankType 等......并且不允许。
encapsulated package d4_app7
// ------------------------------------------------------------------------
// Interfaces
// ------------------------------------------------------------------------
import Modelica.Blocks.Interfaces.RealInput;
import Modelica.Blocks.Interfaces.RealOutput;
package Medium7
constant String name = "Seven components" "Medium name";
constant Integer nc = 7 "Number of substances;
type Concentration
= Real[nc] (each min=0, each unit="kg/m3") "Substance conc";
end Medium7;
// ------------------------------------------------------------------------
// Adaptation of library DEMO to Medium7
// ------------------------------------------------------------------------
connector LiquidCon7
import DEMO_v4.LiquidCon;
extends LiquidCon(redeclare package medium=Medium7);
end LiquidCon7;
partial model EquipmentMedium7
connector LiquidConType=LiquidCon7;
end EquipmentMedium7;
package Equipment7
import DEMO_v4.Equipment;
extends Equipment
(redeclare partial model EquipmentMedium=EquipmentMedium7);
end Equipment7;
import DEMO_v4.Control;
// ------------------------------------------------------------------------
// Examples of systems
// ------------------------------------------------------------------------
model Test
LiquidCon7.medium medium;
Equipment7.PumpType pump;
Equipment7.FeedtankType feedtank;
Equipment7.HarvesttankType harvesttank;
Control.FixValueType Fsp(val=0.2);
equation
connect(feedtank.outlet, pump.inlet);
connect(pump.outlet, harvesttank.inlet);
connect(Fsp.out, pump.Fsp);
end Test;
end d4_app7;