【问题标题】:Modelica: Creation of Simple Fluid ModelsModelica:创建简单的流体模型
【发布时间】:2015-03-12 20:48:37
【问题描述】:

我正在尝试创建流组件的模块化模拟(起初不使用标准 Modelica.Fluid,以方便学习和简化)。我决定从只担心质量流量(而不是温度/焓)开始,并创建了一个连接器Stream,如下所示:

connector Stream
  Real pressure;
  flow Real m_flow;
end Stream;

使用此连接器,我想跟踪整个简单系统的压力和流量:

flow source >> valve >> tank >> pump >> flow sink

我为这些组件创建了以下模型:

model FlowSource "Flow Source can be used as a starting point of a flow"
  parameter Real pressure = 1.0 "Pressure of the source";
  Stream outlet;
equation
  outlet.pressure = pressure;
end FlowSource;

model Valve
  parameter Real Cv "Valve Coefficient, Cv";
  Real setpoint(min=0,max=1) "Valve setpoint";
  Real dp(start=1) "Pressure drop across the valve";
  Real m(start=Cv) "Flow through the valve";
  Real f(min=0,max=1) "Valve Characteristic f(setpoint)";
  Stream inlet, outlet;
equation
  inlet.m_flow + outlet.m_flow= 0.0;  // Conservation of mass
  dp = inlet.pressure - outlet.pressure;  // Pressure drop calculation
  f = setpoint; // linear valve
  m = inlet.m_flow;
  m = if(dp >= 0) then Cv*f*sqrt(dp) else -Cv*f*sqrt(-dp);
end Valve;

model Tank "Simple model of a tank"
  parameter Real volume=1 "tank volume (m^3)";
  parameter Integer num_ports=1 "Number of ports";
  parameter Real static_pressure=1 "Internal Tank Pressure";
  parameter Real initial_level = 0;
  Stream[num_ports] ports "Stream Connectors";
  Real level "Level in % 0-100";
  protected
  Real vol "Volume of medium in the tank";  
initial equation
  level = initial_level;
equation
  for i in 1:num_ports loop
    ports[i].pressure = static_pressure;
  end for;
  der(vol) = sum(ports.m_flow); // need to add density conversion
  level = vol * 100 / volume;
end Tank;

model Pump "Simple model of a Pump"
  Real setpoint(min=0,max=1) "setpoint of the pump (0.0 to 1.0)";
  Stream inlet, outlet;
  protected
    Real dp "Pressure differential across the pump";
    Real f "flow rate inside pump";
equation
  inlet.m_flow+ outlet.m_flow= 0.0;
  dp = outlet.pressure - inlet.pressure;
  f = inlet.m_flow;
  dp = (100-400*(f^2)); // insert better pump char. curve here
end Pump;

model FlowSource "Flow Source can be used as a starting point of a flow"
  parameter Real pressure = 1.0 "Pressure of the source";
  Stream outlet;
equation
  outlet.pressure = pressure;
end FlowSource;

我可以创建这些模型的实例并将它们连接到一个单独的模型中。但是,我遇到了一个我认为是边界条件的问题。我想指定输入流体源的压力。然后,当流量流向油箱时,阀门将产生压降。这是由油箱内的公称压力和流体源之间的差异决定的,应该可以正常工作。

问题是当泵遇到流体槽时(或者如果我让泵直接进入水箱)。设置流体槽的压力会导致我的泵出现问题,因为它也会设置泵出口的压力(它们是连接的)。泵的压力需要是入口压力和流量的函数(它应该给系统增加一些压力),水槽的压力应该以此为基础计算。然而,在计算 dp 时也需要这种压力......所以我最终绕了一个圈。

我做错了什么,有没有更好的方法来实现这样的系统?

谢谢!

编辑: 我忘了提到设定点(泵尚未实现)是在使用这些模型和方程的主模型中设置的。所以我所有的模型都是平衡的。 (请参阅我对下面答案的评论)。

【问题讨论】:

    标签: modelica openmodelica


    【解决方案1】:

    我的第一个建议是对每个组件进行“单元测试”。到那时,您将看到泵和阀门模型也可能有一个变量(或缺少一个方程)。 如果您想对您的储罐模型进行单元测试,您应该制作一个质量流量源模型(您称为 FlowSource 的那个实际上是一个压力源)并将其中两个连接到您的储罐。

    在阀门模型中,您应该将setpoint 设为参数或外部输入。在泵模型中没有使用变量setpoint,因此您可以将其删除或将其设为参数。

    一旦你修复了你的模型就可以正常工作了。

    我将修复程序放在一个 mo 文件中,您可以在此处获取:

    https://drive.google.com/file/d/0B8ojPn4YxnI9blRodUVWUjVGTE0/view?usp=sharing

    问候, 雷内·尼尔森

    【讨论】:

    • 对不起,我忽略了我在主模型中使用方程式设置设定点,我没有在这里展示(我正在使用外部 C 函数来提供动态更改设定点的接口)。所以这不是模型的问题。主要问题是关于如果我使用质量流量源(而不是压力),它将设置通过我的阀门的流量(无论我将阀门设置为什么)。如果我在末端使用压力源作为水槽,它会设置泵末端的压力(这不适用于我的泵的 dp 方程)
    • 我想部分问题是我可以在泵和末端源之间或阀门和水箱等之间添加一个阻力(管道)......但是我不想要这些模型的最终用户必须指定所有管道参数只是为了做一些简单的自动化代码测试(我只想动态地让水箱填充和排水等......)
    • 我不太确定如何重现您用模型描述的问题。但是,如果您实施更真实的泵曲线,其中将泵功率或速度设置为边界条件,泵流量/压力差将适应它所连接的任何内容。例如,速度、压力和流量之间的简单关系可以是:“dp = dp_max((N/N_max)^2 - abs(dp/dp_max)*(dp/dp_max))”。 abs() 运算符将帮助您获得正确的流向。我已经更新了上面答案中的链接并添加了泵曲线。问候,雷内·贾斯特·尼尔森
    • 如果我没听错的话:您需要一个既不固定压力也不固定流量的边界组件。如果您尝试使用 Stream 连接器制作这样的组件,它将是不平衡的,即它将有两个变量(流量 + 压力)和只有一个方程(自动将所有流量变量求和为零的方程)。此外,通过真实泵的流量确实取决于下游压力,因此最终您需要在某处设置压力。
    • 感谢您的帮助。我更好地理解我现在犯了什么错误。您对泵曲线的实现有助于解决我遇到的一些问题,而且我知道我可以构建不同的模拟,以避免像您上面提到的那样渴望拥有一个边界组件。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    • 2011-12-23
    • 2018-10-24
    • 2017-02-02
    • 2021-09-02
    相关资源
    最近更新 更多