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.

Note:

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.

", revisions=" diff --git a/Buildings/Fluid/AirFilters/Examples/Empirical.mo b/Buildings/Fluid/AirFilters/Examples/Empirical.mo index 1046292ea5a..3a06f7fc569 100644 --- a/Buildings/Fluid/AirFilters/Examples/Empirical.mo +++ b/Buildings/Fluid/AirFilters/Examples/Empirical.mo @@ -46,10 +46,12 @@ model Empirical "Example for using the empirical air filter model" "Trace substance sensor of outlet air" annotation (Placement(transformation(extent={{40,-10},{60,10}}))); equation - connect(repSig.y, fil.uRep) annotation (Line(points={{-28,50},{-4,50},{-4,6},{ - 2,6}}, color={255,0,255})); - connect(C_inflow.y, sou.C_in[1]) annotation (Line(points={{-73,22},{-68,22},{-68, - -8},{-62,-8}}, color={0,0,127})); + connect(repSig.y, fil.uRep) + annotation (Line(points={{-28,50},{-4,50},{-4,6},{2,6}}, + color={255,0,255})); + connect(C_inflow.y, sou.C_in[1]) + annotation (Line(points={{-73,22},{-68,22},{-68,-8}, + {-62,-8}}, color={0,0,127})); connect(C_out.port_b, sin.ports[1]) annotation (Line(points={{60,0},{72,0}}, color={0,127,255})); connect(C_out.port_a, fil.port_b)