首页 文章

Modelica:创建简单流体模型

提问于
浏览
1

我正在尝试创建流程组件的模块化模拟(首先不使用标准的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;

我可以创建这些模型的实例,并在单独的模型中将它们连接在一起 . 但是我遇到了一个我认为是边界条件的问题 . 我想指定输入流体源的压力 . 随着流动进入油箱,阀门将在其上方产生压降 . 这取决于储 jar 内的标称压力与流体源之间的差异,应该可以正常工作 .

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

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

谢谢!

编辑:我忘了提到设定点(泵还没有实现它)是在主模型中设置的,它使用这些模型和方程 . 所以我的所有模型都是 balancer 的 . (参见我对以下答案的评论) .

1 回答

  • 3

    我的第一个建议是"unit test"你的每一个组件 . 在那时你已经看到泵和阀门模型也有一个变量(或者缺少一个等式) . 如果你想对你的坦克模型进行单元测试,你应该制作一个质量流量源的模型(你称之为 FlowSource 的实际上是一个压力源)并将它们中的两个连接到你的坦克上 .

    在阀门模型中,您应该使 setpoint 参数或外部输入 . 在泵模型中,不使用变量 setpoint ,因此您可以删除它或使其成为参数 .

    一旦你修复了你的模型工作正常 .

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

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

    此致,Rene Just Nielsen

相关问题