Modelica 集中体积加热流体模型
我很难找到写一个简单的集总体积的能量平衡的最佳方法,比如说一个管道,有流体流动和热流输出。我基本上只想在能量平衡中添加一个Q_损失项,以降低流经的任何流体的温度,但保持整个模型超级简单(无摩擦、压力、对流损失等) 我试着写一个简单的模型,但我陷入了一个方程比我需要的少的困境。有没有办法在不固定压力的情况下实现这一点 我的代码(介质不是标准的,可能需要重新声明): 提前谢谢你帮了我的忙 编辑:在我的模型中删除了不必要的热端口我编辑了您的模型(见下文)。一些新增内容包括初始化Modelica 集中体积加热流体模型,modelica,dymola,openmodelica,Modelica,Dymola,Openmodelica,我很难找到写一个简单的集总体积的能量平衡的最佳方法,比如说一个管道,有流体流动和热流输出。我基本上只想在能量平衡中添加一个Q_损失项,以降低流经的任何流体的温度,但保持整个模型超级简单(无摩擦、压力、对流损失等) 我试着写一个简单的模型,但我陷入了一个方程比我需要的少的困境。有没有办法在不固定压力的情况下实现这一点 我的代码(介质不是标准的,可能需要重新声明): 提前谢谢你帮了我的忙 编辑:在我的模型中删除了不必要的热端口我编辑了您的模型(见下文)。一些新增内容包括初始化medium,如果对基本
medium
,如果对基本属性使用该方法,则需要初始化。仔细查看现有的开源流体库(例如Modelica标准库、TRANSFORM或ThermoPower)将有助于了解它们是如何工作或使用其组件的
model IdealLossPipe
import SI = Modelica.SIunits;
replaceable package Medium = Modelica.Media.Water.StandardWater
constrainedby Modelica.Media.Interfaces.PartialMedium annotation (
choicesAllMatching=true);
Medium.BaseProperties medium(
each preferredMediumStates=true,
p(start=p_start),
T(start=T_start),
h(start=Medium.specificEnthalpy(Medium.setState_pT(p_start, T_start))),
d(start=Medium.density(Medium.setState_pT(p_start, T_start))),
u(start=Medium.specificInternalEnergy(Medium.setState_pT(p_start, T_start))),
Xi(start=X_start[1:Medium.nXi]),
X(start=X_start));
Modelica.Fluid.Interfaces.FluidPort_a fluid_a(redeclare package Medium =
Medium) annotation (Placement(transformation(extent={{-90,-10},{-110,10}},
rotation=0), iconTransformation(extent={{-90,-10},{-110,10}})));
Modelica.Fluid.Interfaces.FluidPort_b fluid_b(redeclare package Medium =
Medium) annotation (Placement(transformation(extent={{110,-10},{90,10}},
rotation=0), iconTransformation(extent={{110,-10},{90,10}})));
parameter Real Q_loss_spec(unit="W/m") = 284 "Heat loss per m of piping";
parameter SI.Length length=13.1 annotation (Dialog(group="Length"));
parameter SI.Length diameter=0.052;
// Initialization
parameter SI.Pressure p_start=1e5;
parameter SI.Temperature T_start=293.15;
parameter SI.MassFraction X_start[Medium.nX]=Medium.X_default "Mass fraction";
SI.HeatFlowRate Q_loss;
SI.Energy U;
SI.Mass m;
SI.Volume V;
equation
V = length*(diameter/2)^2*Modelica.Constants.pi;
m = V*medium.d;
U = m*medium.u;
Q_loss = -length*Q_loss_spec;
//Mass Balance
fluid_a.m_flow + fluid_b.m_flow = der(m);
//Energy Balance
der(U) = fluid_a.m_flow*inStream(fluid_a.h_outflow) + fluid_b.m_flow*inStream(
fluid_b.h_outflow) + Q_loss;
// Port definitions
fluid_a.h_outflow = medium.h;
fluid_b.h_outflow = medium.h;
fluid_a.p = medium.p;
fluid_b.p = medium.p;
fluid_a.Xi_outflow = medium.Xi;
fluid_b.Xi_outflow = medium.Xi;
fluid_a.C_outflow = inStream(fluid_b.C_outflow);
fluid_b.C_outflow = inStream(fluid_a.C_outflow);
end IdealLossPipe;
需要记住的一点是模型的“流量与体积”或“非状态(流量)与状态(非流量/体积)”表示。暴露状态的端口设置连接器状态变量的值(即流体的压力),而非状态端口设置连接器的流量变量(即流体的质量流量)。因此,对于流体,要确保不连接每个设置压力的端口(状态变量)。与质量流量类似,但求解器更容易接受
作为参考,您的模型设置状态变量(fluid_a.p=medium.p
,fluid_b.p=medium.p
)。一个简单的模型示例需要将每个端口连接到一个设置质量流率的模型,例如流体A
上的质量流源和流体b
上紧跟压力边界的阻力元件
model Example
Unnamed pipe(redeclare package Medium = Modelica.Media.Water.StandardWater,
Q_loss_spec=10000)
annotation (Placement(transformation(extent={{-68,4},{-48,24}})));
Modelica.Fluid.Sources.Boundary_pT boundary(
nPorts=1,
redeclare package Medium = Modelica.Media.Water.StandardWater,
p=100000,
T=293.15) annotation (Placement(transformation(extent={{34,2},{14,22}})));
Modelica.Fluid.Sources.MassFlowSource_T boundary1(
nPorts=1,
redeclare package Medium = Modelica.Media.Water.StandardWater,
m_flow=1,
T=293.15)
annotation (Placement(transformation(extent={{-124,2},{-104,22}})));
Modelica.Fluid.Valves.ValveLinear valveLinear(
redeclare package Medium = Modelica.Media.Water.StandardWater,
dp_nominal=100000,
m_flow_nominal=1)
annotation (Placement(transformation(extent={{-30,4},{-10,24}})));
Modelica.Blocks.Sources.Constant const(k=1)
annotation (Placement(transformation(extent={{-52,30},{-32,50}})));
equation
connect(boundary1.ports[1], pipe.fluid_a) annotation (Line(points={{-104,12},{
-86,12},{-86,14},{-68,14}}, color={0,127,255}));
connect(pipe.fluid_b, valveLinear.port_a)
annotation (Line(points={{-48,14},{-30,14}}, color={0,127,255}));
connect(valveLinear.port_b, boundary.ports[1]) annotation (Line(points={{-10,14},
{2,14},{2,12},{14,12}}, color={0,127,255}));
connect(const.y, valveLinear.opening)
annotation (Line(points={{-31,40},{-20,40},{-20,22}}, color={0,0,127}));
end Example;
非常感谢你的帮助!我的另一个问题是——这在闭环系统中是如何工作的?在文献中,它说需要一个泵(例如)作为自由压力源。质量流也是这样吗?什么样的组件会使质量流保持未定义状态?此外,在闭环系统中,是否可能有两个容积与环境开放(即每个容积中的压力固定为环境压力),但每个容积与泵循环流体相连?在这种情况下,两个固定压力是否意味着需要两个自由压力?在封闭系统中,泵可以作为自由压力源(即,它让其出口压力根据设定流量浮动)。虽然这句话有细微差别,但为了简单起见,我会说这是真的。在这种情况下,泵设置模型的流量(或deltaP)。是否可以有多个开放到环境卷?。。当然这只取决于模型,但取决于它的外观。因此,对于多个泵,每个泵的质量流量(deltap)将取决于从何处泵送以及泵送到何处。因此,在闭环系统中,有可能仅将一个泵和多个储罐设置为环境压力?当我尝试这一点时,我发现我得到了错误/过度确定的系统。阀门是必要的还是管道通常会工作以满足流量/体积要求?简短回答是。我能想到的一个例子是,你想把水从一个水箱泵到一个海拔更高的水箱。水通过管道从高位水箱流出,通过重力排水管进入低位水箱。这个过程会重复。然而,建模涉及到正在使用的组件以及它们的工作情况,正如您正在学习的那样。阀门只是流量元件(设置质量流量/dp),所以任何类似的功能都可以工作,比如简单的流动阻力。@DarcyCorbett。如果原始问题已回答,请将答案标记为已接受。谢谢:)
model Example
Unnamed pipe(redeclare package Medium = Modelica.Media.Water.StandardWater,
Q_loss_spec=10000)
annotation (Placement(transformation(extent={{-68,4},{-48,24}})));
Modelica.Fluid.Sources.Boundary_pT boundary(
nPorts=1,
redeclare package Medium = Modelica.Media.Water.StandardWater,
p=100000,
T=293.15) annotation (Placement(transformation(extent={{34,2},{14,22}})));
Modelica.Fluid.Sources.MassFlowSource_T boundary1(
nPorts=1,
redeclare package Medium = Modelica.Media.Water.StandardWater,
m_flow=1,
T=293.15)
annotation (Placement(transformation(extent={{-124,2},{-104,22}})));
Modelica.Fluid.Valves.ValveLinear valveLinear(
redeclare package Medium = Modelica.Media.Water.StandardWater,
dp_nominal=100000,
m_flow_nominal=1)
annotation (Placement(transformation(extent={{-30,4},{-10,24}})));
Modelica.Blocks.Sources.Constant const(k=1)
annotation (Placement(transformation(extent={{-52,30},{-32,50}})));
equation
connect(boundary1.ports[1], pipe.fluid_a) annotation (Line(points={{-104,12},{
-86,12},{-86,14},{-68,14}}, color={0,127,255}));
connect(pipe.fluid_b, valveLinear.port_a)
annotation (Line(points={{-48,14},{-30,14}}, color={0,127,255}));
connect(valveLinear.port_b, boundary.ports[1]) annotation (Line(points={{-10,14},
{2,14},{2,12},{14,12}}, color={0,127,255}));
connect(const.y, valveLinear.opening)
annotation (Line(points={{-31,40},{-20,40},{-20,22}}, color={0,0,127}));
end Example;