我想描述一条连续的生产线,该生产线具有介质流和不同的工艺单元。介质从一个单元流出就是流入下一个单元。介质通常可以通过流速、压力和多种物质的浓度来描述。一组核心物质通过整个生产线,但每个单元可能需要考虑一些额外的物质。最简单的方法是有一个通用的介质定义,并在不相关的操作单元中保持物质为零。我认为,改变每个单元的媒体描述以避免多个零变量会更简洁实用。
那么,我们Modelica如何描述核心媒体组件从一种媒体到另一种媒体的翻译呢?并且我们希望保持连接器";"平衡";。
让我们来看一个基本的例子。饲料箱通过管道连接到收割箱。然后给料罐具有介质组分A和B,而收获罐具有组分B和C。介质的自适应在管道模型中进行。下面的代码在JModelica和OpenModelica中都可以工作,并且不会引起任何编译器的抱怨。我仍然怀疑这种方法是否合理?
package DEMO_v52
// ---------------------------------------------------------------------------------------------
// Interfaces
// ---------------------------------------------------------------------------------------------
partial package MediumBase
constant String name "Medium name";
constant Integer nc = 1 "Number of substances";
replaceable type Concentration = Real[nc] "Substance conc";
end MediumBase;
// ---------------------------------------------------------------------------------------------
// Media specified
// ---------------------------------------------------------------------------------------------
package MediumAB
extends MediumBase
(name="Two component medium A, B",
nc=2);
constant Real[nc] mw = {10, 20} "Substance weight";
constant Integer A = 1 "Substance index";
constant Integer B = 2 "Substance index";
end MediumAB;
package MediumBC
extends MediumBase
(name="Two component medium B, C",
nc=2);
constant Real[nc] mw = {20, 30} "Substance weight";
constant Integer B = 1 "Substance index";
constant Integer C = 2 "Substance index";
end MediumBC;
// ---------------------------------------------------------------------------------------------
// Equipment dependent on the medium but written in a general way
// ---------------------------------------------------------------------------------------------
package EquipmentLib
import DEMO_v52.MediumAB;
import DEMO_v52.MediumBC;
connector LiquidConAB
Real p "Pressure";
flow Real F (unit="m3/s") "Flow rate";
stream MediumAB.Concentration c "Substance conc";
end LiquidConAB;
connector LiquidConBC
Real p "Pressure";
flow Real F (unit="m3/s") "Flow rate";
stream MediumBC.Concentration c "Substance conc";
end LiquidConBC;
model PipeType
LiquidConAB inlet;
LiquidConBC outlet;
parameter Real area = 1;
equation
inlet.F = -outlet.F;
outlet.F = area^2*(outlet.p - inlet.p); // Linearized Bernoulli equation
outlet.c[1] = inStream(inlet.c[2]);
outlet.c[2] = 0; // Reduction of media components
inlet.c[2] = inStream(outlet.c[1]);
inlet.c[1] = 0; // Reduction of media components
end PipeType;
model FeedtankType
LiquidConAB outlet;
parameter Real p = 0.1 "Pressure";
parameter Real V_0 (unit="m3") = 100 "Initial feed volume";
parameter Real[MediumAB.nc] c_in (each unit="kg/m3")
= {1.0*k for k in 1:MediumAB.nc} "Feed inlet conc";
Real V(start=V_0, fixed=true, unit="m3") "Feed volume";
equation
for i in 1:MediumAB.nc loop
outlet.c[i] = c_in[i];
end for;
outlet.p = p;
der(V) = outlet.F;
end FeedtankType;
model HarvesttankType
LiquidConBC inlet;
parameter Real p = 0.0 "Pressure";
parameter Real V_0 (unit="m3") = 1.0 "Initial harvest liquid volume";
parameter Real[MediumBC.nc] m_0
(each unit="kg/m3") = zeros(MediumBC.nc) "Initial substance mass";
Real[MediumBC.nc] m
(start=m_0, each fixed=true) "Substance mass";
Real[MediumBC.nc] c "Substance conc";
Real V(start=V_0, fixed=true, unit="m3") "Harvest liquid volume";
equation
inlet.p = p;
inlet.c = c;
der(V) = inlet.F;
for i in 1:MediumBC.nc loop
der(m[i]) = actualStream(inlet.c[i])*inlet.F;
c[i] = m[i]/V;
end for;
end HarvesttankType;
end EquipmentLib;
// ---------------------------------------------------------------------------------------------
// Example of a system
// ---------------------------------------------------------------------------------------------
model Test
EquipmentLib.FeedtankType feedtank;
EquipmentLib.HarvesttankType harvesttank;
EquipmentLib.PipeType pipe;
equation
connect(feedtank.outlet, pipe.inlet);
connect(pipe.outlet, harvesttank.inlet);
end Test;
end DEMO_v52;
在我的直接应用中,我不需要对流动可逆性进行建模,如果工艺单元之间的物质数量发生变化,则需要特别小心。流动可逆性的处理是使用Modelica流概念的一个重要动机。尽管我不关注流的可逆性,但我通常还是希望继续使用流的概念。但是,这一概念的使用是否恰当?
如上所述,替代方法是为所有工艺装置制定一个通用介质定义,然后描述这些物质在大多数装置中不受影响。这引入了许多类型为dz_i/dt=0的状态z _i,不仅让人分心,而且可能给数值求解器带来负担,但我不太确定。有人能在这里确认或拒绝我的担忧吗?
Modelica标准库如何满足连续生产线中对介质不同细节的需求?
在一个更现实的例子中,你可能有越来越多的物质来描述生产线的下游。例如,与质量相关的物质在最后通常比在开始时更多。在生产初期引入对此类物质的描述是很尴尬的,因为这些物质不相关,而且会被描述为零。
如果可能的话,我会采用"标准化"的方式来使用基于FluidPort
连接器的现有管道、泵箱型号等。
可能,最大的挑战是创建一个包含过程中所需所有不同物质的介质模型。然而,如果流体通常表现得像液态水(密度、比焓等),并且沿线的过程仅改变";物质";在不显著影响液体行为的情况下,你可以考虑利用介质的微量物质特性,创造一种基于水的新介质。例如水处理计划:
package DHWater "District heating water with trace substances for desalination plant"
extends Modelica.Media.Water.ConstantPropertyLiquidWater(extraPropertiesNames
={"solids","anions","cations","carbonDioxide","oxygen"});
end DHWater;
在MSL边界组件中,您应该指定微量物质矢量C
的内容,在您自己的组件模型(蒸煮器、过滤器等)中,您可以使用相应的方程修改C_outflow
。标准管道、泵等只会传递微量物质。
这个问题有几个方面,我认为在混合媒体的情况下,如何思考流概念的影响存在一些不确定性,而这并不是真正为之设计的。媒体可能比上面用于说明问题的例子复杂得多。下面我试着总结一下我从你和其他一些有见识的人那里得到的东西。
- 这里明确支持";"安全";Hans和Rene Just给出的建议,为生产线上的许多工艺单元制定一个通用的介质定义,尽管有些物质会一直为零
- 这些";零物质";通常很小,但可能需要分析。在一些模型中;"零物质";成为显著的计算负担
- 在某些应用程序中,也有一种传统,即使用不同的介质并构造适配器代码,以允许在具有不同介质定义的单元之间传输介质,正如Rene Just所描述的那样。为了允许可逆流,您需要仔细设计适配器代码以进行适当的近似。对于具有相同介质的设备,流概念以更精确的方式自动处理可逆流
- 在可以保证没有可逆流的应用程序中,适配器代码可能会被简化。特别是对于不可压缩的水和微量物质的介质,就像我上面的例子。这是我一直在寻找的一些理论指导