流量变量的导数 [Openmodelica 流体库]

问题描述 投票:0回答:1

我正在尝试制作一些与 modelica 流体库具有类似工作原理的 openmodelica 模型,因为它使用带有流量变量的端口和在 TwoPort 组件上进一步工作的多个组件。为了简化我的问题,我将尝试使用 modelica 流体库作为示例。

在我的一个基于 PartialTwoPort 的组件中,我需要流变量 m_flow 的导数,但是当我尝试实现它时,系统似乎无法处理它。 (我尝试在网上寻找答案,但找不到任何可以帮助我的东西)

我制作了一个简单的测试模型,可以(希望)用于测试可能的解决方案。因此,我希望获得 TestValue 作为结果参数,我可以在进一步的代码中使用它。当 TestValue 被注释掉时,模型可以工作,但如果没有被注释掉,则返回错误。

model Fluid_test
  //extends Modelica.Icons.Example;

  replaceable package Medium = Modelica.Media.Water.StandardWaterOnePhase
    constrainedby Modelica.Media.Interfaces.PartialMedium;
    
Modelica.Fluid.Sources.FixedBoundary boundary(
    nPorts = 1,
    use_T=true,
    T=Modelica.Units.Conversions.from_degC(20),
    p=600000,
    redeclare package Medium = Medium) annotation(
    Placement(transformation(origin = {-56, -18}, extent = {{-10, -10}, {10, 10}})));
    
Modelica.Fluid.Sources.FixedBoundary boundary1(
    p=600000,
    T=400,
    nPorts=2,
    redeclare package Medium = Medium)
    annotation (Placement(transformation(origin = {-18, 44}, extent = {{100, -40}, {80, -20}})));

Modelica.Fluid.Machines.PrescribedPump pump(
    checkValve=true,
    checkValveHomotopy = Modelica.Fluid.Types.CheckValveHomotopyType.Closed,
    N_nominal=1200,
    redeclare function flowCharacteristic =
        Modelica.Fluid.Machines.BaseClasses.PumpCharacteristics.quadraticFlow (
          V_flow_nominal={0,0.25,0.5}, head_nominal={100,60,0}),
    use_N_in=true,
    nParallel=1,
    energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial,
    V(displayUnit="l") = 0.05,
    massDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial,
    redeclare package Medium = Medium,
    p_b_start=600000,
    T_start=400) annotation(
    Placement(transformation(origin = {-10, 14}, extent = {{-10, -10}, {10, 10}})));
  Modelica.Blocks.Sources.Constant const annotation(
    Placement(transformation(origin = {-8, 58}, extent = {{-10, -10}, {10, 10}})));

Real TestValue;

equation
TestValue = der(pump.port_a.m_flow);
  connect(boundary.ports[1], pump.port_a) annotation(
    Line(points = {{-46, -18}, {-20, -18}, {-20, 14}}, color = {0, 127, 255}));
  connect(pump.port_b, boundary1.ports[1]) annotation(
    Line(points = {{0, 14}, {62, 14}}, color = {0, 127, 255}));
  connect(const.y, pump.N_in) annotation(
    Line(points = {{4, 58}, {-10, 58}, {-10, 24}}, color = {0, 0, 127}));
  annotation(
    Diagram);
end Fluid_test;

返回的错误如下: enter image description here

modelica openmodelica
1个回答
0
投票

不幸的是,质量流量不是一种状态,在我看来,使用

der()
这种方式并不是评估导数的正确方法。我将使用具有足够小的时间常数的
Derivative block
,如下面修改后的示例中所述:

model Fluid_test
  //extends Modelica.Icons.Example;

  replaceable package Medium = Modelica.Media.Water.StandardWaterOnePhase constrainedby Modelica.Media.Interfaces.PartialMedium;

  Modelica.Fluid.Sources.FixedBoundary boundary(
    nPorts=1,
    use_T=true,
    T=Modelica.Units.Conversions.from_degC(20),
    p=600000,
    redeclare package Medium = Medium) annotation (Placement(transformation(origin={-50,0}, extent={{-10,-10},{10,10}})));

  Modelica.Fluid.Sources.FixedBoundary boundary1(
    p=600000,
    T=400,
    redeclare package Medium = Medium,
    nPorts=1) annotation (Placement(transformation(origin={-40,30}, extent={{100,-40},{80,-20}})));

  Modelica.Fluid.Machines.PrescribedPump pump(
    checkValve=true,
    checkValveHomotopy=Modelica.Fluid.Types.CheckValveHomotopyType.Closed,
    N_nominal=1200,
    redeclare function flowCharacteristic = Modelica.Fluid.Machines.BaseClasses.PumpCharacteristics.quadraticFlow (V_flow_nominal={0,0.25,0.5}, head_nominal={100,60,0}),
    use_N_in=true,
    nParallel=1,
    energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial,
    V(displayUnit="l") = 0.05,
    massDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial,
    redeclare package Medium = Medium,
    p_b_start=600000,
    T_start=400) annotation (Placement(transformation(extent={{-10,-10},{10,10}})));
  Modelica.Blocks.Sources.Constant const(k=1) annotation (Placement(transformation(origin={-20,30}, extent={{-10,-10},{10,10}})));

  Real TestValue;
  Modelica.Blocks.Continuous.Derivative derBlock(
    k=1,
    T=1e-2,
    initType=Modelica.Blocks.Types.Init.SteadyState);

  inner Modelica.Fluid.System system annotation (Placement(transformation(extent={{40,-80},{60,-60}})));
equation 
  derBlock.u = pump.port_a.m_flow;
  TestValue = derBlock.y;

  connect(boundary.ports[1], pump.port_a) annotation (Line(points={{-40,0},{-10,0}}, color={0,127,255}));
  connect(const.y, pump.N_in) annotation (Line(points={{-9,30},{0,30},{0,10}}, color={0,0,127}));
  connect(pump.port_b, boundary1.ports[1]) annotation (Line(points={{10,0},{40,0}}, color={0,127,255}));
  annotation (uses(Modelica(version="4.0.0")));
end Fluid_test;

我还更正了

boundary1
上的端口数量(从 2 到 1),并将
Constant block
的常量值设置为 1(而不是无)。两者都会导致 Dymola 发出警告。

© www.soinside.com 2019 - 2024. All rights reserved.