如何描述具有不同操作的连续生产线上的介质?

How to describe media along a continuous production line with different operations?

我想描述一条连续的生产线,该生产线具有介质流和沿线的不同工艺单元。从一个单元流出的介质流入下一个单元。介质通常可以用流速、压力和多种物质的浓度来描述。一组核心物质贯穿整个生产线,但每个单元可能需要考虑一些额外的物质。最简单的方法是拥有一个通用的媒体定义,并在不相关的操作单元中将物质保持为零。我认为更改每个单元的媒体描述以避免多个零变量会更简洁和实用。

那么我们在 Modelica 中如何描述核心媒体组件从一种媒体到另一种媒体的这种转换?我们希望保持连接器“平衡”。

让我们看一个基本的例子。进料箱通过管道连接到收获箱。然后 feedtank 有媒体组件 A 和 B,而 harvesttank 有组件 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 标准库如何解决连续生产线中对媒体细节变化的需求?

在一个更现实的例子中,您可能有越来越多的物质来描述更下游的生产线。例如,与开始时相比,最终与质量相关的物质通常更多。在生产早期引入此类物质的描述是很尴尬的,因为它们不相关并且会被描述为零。

我会采用 'standardized' 方式,以便能够使用现有的管道、泵箱模型等,这些模型基于 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 .标准管道、泵等只会传递微量物质。

这个问题有几个方面,我认为关于如何考虑 流概念 在混合媒体的情况下的影响存在一些不确定性,它不是为混合媒体设计的真的。媒体可能比上面用于说明问题的示例复杂得多。下面我试着总结一下我从你和论坛外其他一些知识渊博的人那里得到的东西。

  1. 这里明确支持 Hans 和 Rene Just 提出的“安全”建议,即为生产线上的许多工艺单元采用通用介质定义,尽管有些物质始终为零。
  2. 这些“zero-substances”的额外计算负担通常很小,但可能需要分析。在某些模型中,保留这些“zero-substance”会成为重大的计算负担。
  3. 在某些应用程序中也有使用不同媒体和构建适配器代码以允许在具有不同媒体定义的单元之间传输媒体的传统,正如 Rene Just 所描述的那样。为了允许可逆流,您需要仔细设计适配器代码以进行适当的近似。对于具有相同介质的设备,流概念以更精确的方式自动处理可逆流。
  4. 在可以保证没有可逆流的应用程序中,适配器代码可能会得到简化。特别是对于不可压缩的水和微量物质的介质,就像我上面的例子一样。这是我一直在寻找的一些理论指导