diff --git a/Buildings/Fluid/AirFilters/BaseClasses/FiltrationEfficiency.mo b/Buildings/Fluid/AirFilters/BaseClasses/FiltrationEfficiency.mo index 17fc18b98ee..372d1b025f3 100644 --- a/Buildings/Fluid/AirFilters/BaseClasses/FiltrationEfficiency.mo +++ b/Buildings/Fluid/AirFilters/BaseClasses/FiltrationEfficiency.mo @@ -10,27 +10,27 @@ model FiltrationEfficiency final unit="kg") "Mass of the contaminant captured by the filter" annotation (Placement( - transformation( - extent={{20,-20},{-20,20}}, - rotation=180, - origin={-120,0}), iconTransformation( - extent={{-20,-20},{20,20}}, - rotation=0, - origin={-120,0}))); + transformation( + extent={{20,-20},{-20,20}}, + rotation=180, + origin={-120,0}), iconTransformation( + extent={{-20,-20},{20,20}}, + rotation=0, + origin={-120,0}))); Buildings.Controls.OBC.CDL.Interfaces.RealOutput y( final unit="1", final min=0, final max=1) "Filtration efficiency" annotation (Placement(transformation(extent={{100,-80},{140,-40}}), - iconTransformation(extent={{100,-80},{140,-40}}))); + iconTransformation(extent={{100,-80},{140,-40}}))); Buildings.Controls.OBC.CDL.Interfaces.RealOutput rat( final unit="1", final min=0, final max=1) "Relative mass of the contaminant captured by the filter" - annotation (Placement(transformation(extent={{100,40},{140,80}}), - iconTransformation(extent={{100,40},{140,80}}))); + annotation (Placement(transformation(extent={{100,40},{140,80}}), + iconTransformation(extent={{100,40},{140,80}}))); equation rat = Buildings.Utilities.Math.Functions.smoothMin(x1=1, x2= mCon/mCon_nominal, deltaX=0.1); diff --git a/Buildings/Fluid/AirFilters/BaseClasses/FlowCoefficientCorrection.mo b/Buildings/Fluid/AirFilters/BaseClasses/FlowCoefficientCorrection.mo index 3988b3f5d56..22c8b6122a8 100644 --- a/Buildings/Fluid/AirFilters/BaseClasses/FlowCoefficientCorrection.mo +++ b/Buildings/Fluid/AirFilters/BaseClasses/FlowCoefficientCorrection.mo @@ -1,28 +1,31 @@ within Buildings.Fluid.AirFilters.BaseClasses; model FlowCoefficientCorrection "Component that calculates the flow coefficient correction factor" - parameter Real b( - final min = 1 + 1E-3) + parameter Real b "Resistance coefficient"; Buildings.Controls.OBC.CDL.Interfaces.RealInput rat( final unit="1", final min=0, final max=1) "Relative mass of the contaminant captured by the filter" - annotation (Placement( - transformation( - extent={{20,-20},{-20,20}}, - rotation=180, - origin={-120,0}), iconTransformation( - extent={{-20,-20},{20,20}}, - rotation=0, - origin={-120,0}))); + annotation (Placement( + transformation( + extent={{20,-20},{-20,20}}, + rotation=180, + origin={-120,0}), iconTransformation( + extent={{-20,-20},{20,20}}, + rotation=0, + origin={-120,0}))); Buildings.Controls.OBC.CDL.Interfaces.RealOutput y( final unit="1", final min=1) "Flow coefficient correction" annotation (Placement(transformation(extent={{100,-20},{140,20}}), - iconTransformation(extent={{100,-20},{140,20}}))); + iconTransformation(extent={{100,-20},{140,20}}))); +initial equation + assert(b > 1, + "In " + getInstanceName() + ":Resistance coefficient should be larger than 1", + level=AssertionLevel.error); equation y = b^rat; annotation (Dialog(group="Pressure"), @@ -43,7 +46,7 @@ equation This model calculates the flow coefficient of the filter by
- kCor = brat, + kCor = brat,
where b
is the resistance coefficient and it has to be greater than 1,
diff --git a/Buildings/Fluid/AirFilters/BaseClasses/MassAccumulation.mo b/Buildings/Fluid/AirFilters/BaseClasses/MassAccumulation.mo
index adb37786978..e1a0360c67d 100644
--- a/Buildings/Fluid/AirFilters/BaseClasses/MassAccumulation.mo
+++ b/Buildings/Fluid/AirFilters/BaseClasses/MassAccumulation.mo
@@ -9,28 +9,28 @@ model MassAccumulation
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput uRep
"Replacing the filter when trigger becomes true"
annotation (Placement(
- transformation(
- extent={{20,-20},{-20,20}},
- rotation=180,
- origin={-120,-60}), iconTransformation(
- extent={{-20,-20},{20,20}},
- rotation=0,
- origin={-120,-62})));
+ transformation(
+ extent={{20,-20},{-20,20}},
+ rotation=180,
+ origin={-120,-60}), iconTransformation(
+ extent={{-20,-20},{20,20}},
+ rotation=0,
+ origin={-120,-62})));
Buildings.Controls.OBC.CDL.Interfaces.RealInput mCon_flow(
final unit = "kg/s")
"Contaminant mass flow rate"
annotation (Placement(transformation(
- extent={{20,-20},{-20,20}},
- rotation=180,
- origin={-120,60}), iconTransformation(
- extent={{-20,-20},{20,20}},
- rotation=0,
- origin={-120,60})));
+ extent={{20,-20},{-20,20}},
+ rotation=180,
+ origin={-120,60}), iconTransformation(
+ extent={{-20,-20},{20,20}},
+ rotation=0,
+ origin={-120,60})));
Buildings.Controls.OBC.CDL.Interfaces.RealOutput mCon(
final unit = "kg")
"Mass of the contaminant captured by the filter"
annotation (Placement(transformation(extent={{100,-20},{140,20}}),
- iconTransformation(extent={{100,-20},{140,20}})));
+ iconTransformation(extent={{100,-20},{140,20}})));
Buildings.Controls.OBC.CDL.Reals.IntegratorWithReset intWitRes
"Calculate the mass of contaminant"
annotation (Placement(transformation(extent={{-10,-10},{10,10}})));
@@ -50,36 +50,37 @@ model MassAccumulation
"Error message when the filter is full, i.e., the mass captured by the filter is larger than the nominal value"
annotation (Placement(transformation(extent={{72,-48},{92,-28}})));
equation
- connect(intWitRes.u, mCon_flow) annotation (Line(points={{-12,0},{-40,0},{-40,
- 60},{-120,60}}, color={0,0,127}));
+ connect(intWitRes.u, mCon_flow)
+ annotation (Line(points={{-12,0},{-40,0},{-40,60},
+ {-120,60}}, color={0,0,127}));
connect(intWitRes.y, mCon)
annotation (Line(points={{12,0},{120,0}}, color={0,0,127}));
connect(con.y, intWitRes.y_reset_in)
annotation (Line(points={{-58,-20},{-20,-20},
- {-20,-8},{-12,-8}},color={0,0,127}));
+ {-20,-8},{-12,-8}},color={0,0,127}));
connect(intWitRes.trigger, uRep)
annotation (Line(points={{0,-12},{0,-60},{-120,-60}}, color={255,0,255}));
connect(assMes.u, greater.y)
annotation (Line(points={{70,-38},{61,-38}}, color={255,0,255}));
connect(greater.u2, intWitRes.y)
- annotation (Line(points={{38,-46},{20,-46},{20,
- 0},{12,0}}, color={0,0,127}));
+ annotation (Line(points={{38,-46},{20,-46},{20,0},
+ {12,0}}, color={0,0,127}));
connect(con1.y, greater.u1)
annotation (Line(points={{22,50},{30,50},{30,-38},
- {38,-38}}, color={0,0,127}));
+ {38,-38}}, color={0,0,127}));
annotation (Icon(coordinateSystem(preserveAspectRatio=false), graphics={
- Rectangle(
- extent={{-100,100},{100,-100}},
- lineColor={28,108,200},
- fillColor={255,255,255},
- fillPattern=FillPattern.Solid),
- Text(
- extent={{-100,140},{100,100}},
- textColor={0,0,255},
- textString="%name")}),
- Diagram(coordinateSystem(
- preserveAspectRatio=false)),
- defaultComponentName="masAcc",
+ Rectangle(
+ extent={{-100,100},{100,-100}},
+ lineColor={28,108,200},
+ fillColor={255,255,255},
+ fillPattern=FillPattern.Solid),
+ Text(
+ extent={{-100,140},{100,100}},
+ textColor={0,0,255},
+ textString="%name")}),
+ Diagram(coordinateSystem(
+ preserveAspectRatio=false)),
+ defaultComponentName="masAcc",
Documentation(info="
This model mimics the process for a filter to capture the contaminants. diff --git a/Buildings/Fluid/AirFilters/BaseClasses/MassTransfer.mo b/Buildings/Fluid/AirFilters/BaseClasses/MassTransfer.mo index 6447ab77b4a..f0d0f826efe 100644 --- a/Buildings/Fluid/AirFilters/BaseClasses/MassTransfer.mo +++ b/Buildings/Fluid/AirFilters/BaseClasses/MassTransfer.mo @@ -5,24 +5,24 @@ model MassTransfer Buildings.Controls.OBC.CDL.Interfaces.RealInput C_inflow[Medium.nC] "Input trace substance rate" annotation (Placement(transformation( - extent={{-20,-20},{20,20}}, - rotation=270, - origin={0,120}), iconTransformation( - extent={{-20,-20},{20,20}}, - rotation=270, - origin={0,120}))); + extent={{-20,-20},{20,20}}, + rotation=270, + origin={0,120}), iconTransformation( + extent={{-20,-20},{20,20}}, + rotation=270, + origin={0,120}))); Buildings.Controls.OBC.CDL.Interfaces.RealInput eps( final unit = "1", final min = 0, final max= 1) "Mass transfer coefficient" annotation (Placement(transformation( - extent={{20,-20},{-20,20}}, - rotation=180, - origin={-120,60}), iconTransformation( - extent={{-20,-20},{20,20}}, - rotation=0, - origin={-120,60}))); + extent={{20,-20},{-20,20}}, + rotation=180, + origin={-120,60}), iconTransformation( + extent={{-20,-20},{20,20}}, + rotation=0, + origin={-120,60}))); equation if allowFlowReversal then port_b.C_outflow =inStream(port_a.C_outflow) - eps*C_inflow; @@ -48,12 +48,12 @@ equation end if; annotation (Icon(coordinateSystem(preserveAspectRatio=false), graphics={ - Rectangle( - extent={{-100,100},{100,-100}}, - fillColor={255,255,255}, - fillPattern=FillPattern.Solid, - pattern=LinePattern.None)}), Diagram( - coordinateSystem(preserveAspectRatio=false)), + Rectangle( + extent={{-100,100},{100,-100}}, + fillColor={255,255,255}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None)}), Diagram( + coordinateSystem(preserveAspectRatio=false)), defaultComponentName="masTra", Documentation(info="
@@ -61,7 +61,7 @@ This model sets the trace substance
of the medium that leaves port_b
by
- port_b.C_outflow = inStream(port_a.C_outflow) - eps * C_inflow; +port_b.C_outflow = inStream(port_a.C_outflow) - eps * C_inflow;
where eps
is an input mass transfer efficiency and
diff --git a/Buildings/Fluid/AirFilters/BaseClasses/PressureDropWithVaryingFlowCoefficient.mo b/Buildings/Fluid/AirFilters/BaseClasses/PressureDropWithVaryingFlowCoefficient.mo
index 50a5be02774..a3a98dfe80a 100644
--- a/Buildings/Fluid/AirFilters/BaseClasses/PressureDropWithVaryingFlowCoefficient.mo
+++ b/Buildings/Fluid/AirFilters/BaseClasses/PressureDropWithVaryingFlowCoefficient.mo
@@ -13,16 +13,16 @@ model PressureDropWithVaryingFlowCoefficient
final min = 1)
"Flow coefficient"
annotation (Placement(transformation(
- extent={{-20,-20},{20,20}},
- rotation=270,
- origin={0,120}), iconTransformation(
- extent={{-20,-20},{20,20}},
- rotation=270,
- origin={0,120})));
+ extent={{-20,-20},{20,20}},
+ rotation=270,
+ origin={0,120}), iconTransformation(
+ extent={{-20,-20},{20,20}},
+ rotation=270,
+ origin={0,120})));
protected
final parameter Boolean computeFlowResistance=(dp_nominal_pos > Modelica.Constants.eps)
"Flag to enable/disable computation of flow resistance"
- annotation(Evaluate=true);
+ annotation(Evaluate=true);
initial equation
if computeFlowResistance then
diff --git a/Buildings/Fluid/AirFilters/BaseClasses/Validation/FiltrationEfficiency.mo b/Buildings/Fluid/AirFilters/BaseClasses/Validation/FiltrationEfficiency.mo
index 17e89b1c2be..5ba92d99700 100644
--- a/Buildings/Fluid/AirFilters/BaseClasses/Validation/FiltrationEfficiency.mo
+++ b/Buildings/Fluid/AirFilters/BaseClasses/Validation/FiltrationEfficiency.mo
@@ -15,7 +15,7 @@ model FiltrationEfficiency
annotation (Placement(transformation(extent={{-60,-10},{-40,10}})));
equation
connect(mCon.y, eps.mCon)
- annotation (Line(points={{-39,0},{-12,0}}, color={0,0,127}));
+ annotation (Line(points={{-39,0},{-12,0}}, color={0,0,127}));
annotation (experiment(Tolerance=1e-6, StopTime=1.0),
__Dymola_Commands(file="modelica://Buildings/Resources/Scripts/Dymola/Fluid/AirFilters/BaseClasses/Validation/FiltrationEfficiency.mos"
"Simulate and plot"),
diff --git a/Buildings/Fluid/AirFilters/BaseClasses/Validation/MassAccumulation.mo b/Buildings/Fluid/AirFilters/BaseClasses/Validation/MassAccumulation.mo
index d4f2494974a..1e8abc3d02d 100644
--- a/Buildings/Fluid/AirFilters/BaseClasses/Validation/MassAccumulation.mo
+++ b/Buildings/Fluid/AirFilters/BaseClasses/Validation/MassAccumulation.mo
@@ -19,10 +19,12 @@ model MassAccumulation
"Filter replacement signal"
annotation (Placement(transformation(extent={{-60,-30},{-40,-10}})));
equation
- connect(RepSig.y, masAcc.uRep) annotation (Line(points={{-38,-20},{-20,-20},{
- -20,-6.2},{-12,-6.2}}, color={255,0,255}));
- connect(mCon_flow.y, masAcc.mCon_flow) annotation (Line(points={{-39,30},{-20,
- 30},{-20,6},{-12,6}}, color={0,0,127}));
+ connect(RepSig.y, masAcc.uRep)
+ annotation (Line(points={{-38,-20},{-20,-20},{-20,-6.2},
+ {-12,-6.2}}, color={255,0,255}));
+ connect(mCon_flow.y, masAcc.mCon_flow)
+ annotation (Line(points={{-39,30},{-20,30},
+ {-20,6},{-12,6}}, color={0,0,127}));
annotation (experiment(Tolerance=1e-6, StopTime=1.0),
__Dymola_Commands(file="modelica://Buildings/Resources/Scripts/Dymola/Fluid/AirFilters/BaseClasses/Validation/MassAccumulation.mos"
"Simulate and plot"),
diff --git a/Buildings/Fluid/AirFilters/BaseClasses/Validation/MassTransfer.mo b/Buildings/Fluid/AirFilters/BaseClasses/Validation/MassTransfer.mo
index c26240773cd..ed263a237e8 100644
--- a/Buildings/Fluid/AirFilters/BaseClasses/Validation/MassTransfer.mo
+++ b/Buildings/Fluid/AirFilters/BaseClasses/Validation/MassTransfer.mo
@@ -44,7 +44,7 @@ model MassTransfer
equation
connect(eps.y, masTra.eps)
annotation (Line(points={{-39,50},{-20,50},{-20,6},{-12,6}},
- color={0,0,127}));
+ color={0,0,127}));
connect(traceSubstancesFlow.y, masTra.C_inflow[1])
annotation (Line(points={{-39,80},{0,80},{0,12}}, color={0,0,127}));
connect(C_out.port_b, sin.ports[1])
diff --git a/Buildings/Fluid/AirFilters/Empirical.mo b/Buildings/Fluid/AirFilters/Empirical.mo
index 406dac843f8..012c1faca4f 100644
--- a/Buildings/Fluid/AirFilters/Empirical.mo
+++ b/Buildings/Fluid/AirFilters/Empirical.mo
@@ -1,6 +1,6 @@
within Buildings.Fluid.AirFilters;
model Empirical "Empirical air filter model"
- replaceable package Medium =
+ replaceable package Medium =
Buildings.Media.Air(extraPropertiesNames={"CO2"})
"Air";
parameter Real mCon_nominal(
@@ -9,8 +9,7 @@ model Empirical "Empirical air filter model"
parameter Real epsFun[:]
"Filter efficiency curve"
annotation (Dialog(group="Efficiency"));
- parameter Real b(
- final min = 1 + 1E-3)
+ parameter Real b
"Resistance coefficient"
annotation (Dialog(group="Pressure"));
parameter Modelica.Units.SI.MassFlowRate m_flow_nominal
@@ -19,7 +18,8 @@ model Empirical "Empirical air filter model"
parameter Modelica.Units.SI.PressureDifference dp_nominal
"Nominal pressure drop"
annotation (Dialog(group="Nominal"));
-
+ parameter String substanceName = "CO2"
+ "Name of trace substance";
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput uRep
"Replacing the filter when trigger becomes true"
annotation (Placement(transformation(extent={{-140,40},{-100,80}})));
@@ -29,7 +29,7 @@ model Empirical "Empirical air filter model"
final max=1)
"Filtration efficiency"
annotation (Placement(transformation(extent={{100,20},{140,60}}),
- iconTransformation(extent={{100,-80},{140,-40}})));
+ iconTransformation(extent={{100,-80},{140,-40}})));
Modelica.Fluid.Interfaces.FluidPort_a port_a(
redeclare package Medium = Medium)
"Fluid connector a (positive design flow direction is from port_a to port_b)"
@@ -38,6 +38,7 @@ model Empirical "Empirical air filter model"
redeclare package Medium = Medium)
"Fluid connector b (positive design flow direction is from port_a to port_b)"
annotation (Placement(transformation(extent={{90,-10},{110,10}})));
+
protected
Buildings.Fluid.AirFilters.BaseClasses.PressureDropWithVaryingFlowCoefficient
res(
@@ -61,12 +62,27 @@ protected
final mCon_reset=0)
"Contaminant accumulation"
annotation (Placement(transformation(extent={{-40,70},{-20,90}})));
- Modelica.Blocks.Sources.RealExpression traSubFlo(y(unit="kg/s") = inStream(
- port_a.C_outflow[1])*port_a.m_flow) "Trace substances flow rate"
+ Modelica.Blocks.Sources.RealExpression traSubFlo(
+ y(unit="kg/s") = inStream(port_a.C_outflow[1])*port_a.m_flow)
+ "Trace substances flow rate"
annotation (Placement(transformation(extent={{-92,70},{-72,90}})));
Buildings.Fluid.AirFilters.BaseClasses.FlowCoefficientCorrection kCor(
- final b=b) "Flow coefficient correction"
+ final b=b)
+ "Flow coefficient correction"
annotation (Placement(transformation(extent={{60,70},{80,90}})));
+
+ parameter Real s[:]= {
+ if ( Modelica.Utilities.Strings.isEqual(string1=Medium.extraPropertiesNames[i],
+ string2=substanceName,
+ caseSensitive=false))
+ then 1 else 0 for i in 1:Medium.nC}
+ "Vector with zero everywhere except where species is"
+ annotation(Evaluate=true);
+initial equation
+ assert(max(s) > 0.9, "Trace substance '" + substanceName + "' is not present in medium '"
+ + Medium.mediumName + "'.\n"
+ + "Check filter parameter and medium model.");
+
equation
connect(masAcc.mCon, epsCal.mCon)
annotation (Line(points={{-18,80},{-2,80}}, color={0,0,127}));
@@ -76,22 +92,25 @@ equation
annotation (Line(points={{-10,0},{50,0}},color={0,127,255}));
connect(masTra.port_b, port_b)
annotation (Line(points={{70,0},{100,0}}, color={0,127,255}));
- connect(masAcc.uRep, uRep) annotation (Line(points={{-42,73.8},{-42,74},{-70,74},
- {-70,60},{-120,60}}, color={255,0,255}));
- connect(traSubFlo.y, masAcc.mCon_flow) annotation (Line(points={{-71,80},{-60,
- 80},{-60,86},{-42,86}}, color={0,0,127}));
+ connect(masAcc.uRep, uRep)
+ annotation (Line(points={{-42,73.8},{-42,74},{-70,74},
+ {-70,60},{-120,60}}, color={255,0,255}));
+ connect(traSubFlo.y, masAcc.mCon_flow)
+ annotation (Line(points={{-71,80},{-60,80},
+ {-60,86},{-42,86}}, color={0,0,127}));
connect(epsCal.y, masTra.eps)
annotation (Line(points={{22,74},{40,74},{40,6},{48,6}}, color={0,0,127}));
- connect(masTra.C_inflow[1], traSubFlo.y) annotation (Line(points={{60,12},{60,
- 28},{-60,28},{-60,80},{-71,80}}, color={0,0,127}));
+ connect(masTra.C_inflow[1], traSubFlo.y)
+ annotation (Line(points={{60,12},{60,28},
+ {-60,28},{-60,80},{-71,80}}, color={0,0,127}));
connect(epsCal.rat, kCor.rat)
annotation (Line(points={{22,86},{40,86},{40,80},{58,80}}, color={0,0,127}));
connect(kCor.y, res.kCor)
annotation (Line(points={{82,80},{90,80},{90,50},{-20,50},{-20,12}},
- color={0,0,127}));
+ color={0,0,127}));
connect(epsCal.y, eps)
annotation (Line(points={{22,74},{40,74},{40,40},{120,40}},
- color={0,0,127}));
+ color={0,0,127}));
annotation (defaultComponentName="airFil",
Icon(coordinateSystem(preserveAspectRatio=false), graphics={
@@ -294,14 +313,16 @@ Buildings.Fluid.AirFilters.BaseClasses.FiltrationEfficiency and
Buildings.Fluid.AirFilters.BaseClasses.FlowCoefficientCorrection.
-The input boolean flag, uRep
, triggers the filter replacement.
+The input boolean flag, uRep
, triggers the filter replacement:
+
When uRep
changes from false
to true
, the
-mass of the captured contaminant becomes zero.
+mass of the captured contaminant becomes 0.
A warning will be triggered when the captured contaminant mass becomes greater than the
maximum contaminant mass (mCon_nominal
).
+
In addition, the extraPropertiesNames
has to be defined in the medium model.