Sequences for primary pumps
Information
This package contains control sequences for primary pumps.
Package Content
Name |
Description |
EnableLeadHeadered
|
Lead primary pump enable/disable for plants with headered primary pumps |
VariableSpeedNoDpControl
|
Variable speed primary pumps without differential pressure control |
Validation
|
Collection of validation models |
Lead primary pump enable/disable for plants with headered primary pumps
Information
Plants with parallel piped equipment
The lead primary pump is enabled when any equipment isolation valve is commanded open.
The lead primary pump is disabled when all equipment isolation valves are commanded closed.
For modulating valves, the "valve commanded open"
condition is evaluated based on a command signal > 0 %.
The "valve commanded closed" condition is evaluated as the negation of the previous condition.
Plants with series piped equipment
The lead primary pump is enabled when any equipment isolation valve is commanded closed.
The lead primary pump is disabled when all equipment isolation valves are commanded open.
For modulating valves, the "valve commanded closed"
condition is evaluated based on a command signal < 100 %.
The "valve commanded open" condition is evaluated as the negation of the previous condition.
Details
This logic is prescribed in ASHRAE, 2021 for:
-
headered primary pumps in chiller plants with parallel chillers
and without a waterside economizer,
-
primary pumps in chiller plants with series chillers
and without a waterside economizer,
-
headered primary pumps in boiler plants.
The valve command is used in contrast to the feedback of the
valve position or the end switch status, as prescribed by Guideline 36.
This is for the sake of simplicity, as there is no harm in deadheading the pump
for a couple seconds and it simplifies the programming.
For modulating valves, the "valve commanded open/closed" condition is
evaluated without hysteresis because the
valve command signal is generated by the
enabling or staging logic and both use minimum runtime conditions.
Therefore, the valve command signal is not subject to any oscillatory
behavior.
References
-
ASHRAE, 2021. Guideline 36-2021, High-Performance Sequences of Operation
for HVAC Systems. Atlanta, GA.
Parameters
Type | Name | Default | Description |
EquipmentConnection | typCon | | Type of connection between equipment and primary loop |
Actuator | typValIso | Buildings.Templates.Plants.C... | Type of isolation valve |
Integer | nValIso | | Number of isolation valves |
Connectors
Type | Name | Description |
input BooleanInput | u1ValIso[nValIso] | Isolation valve command |
input RealInput | uValIso[nValIso] | Isolation valve command |
output BooleanOutput | y1 | Lead pump enable signal |
Modelica definition
block EnableLeadHeadered
parameter Buildings.Templates.Plants.Controls.Types.EquipmentConnection typCon
;
parameter Buildings.Templates.Plants.Controls.Types.Actuator typValIso=
Buildings.Templates.Plants.Controls.Types.Actuator.TwoPosition
;
parameter Integer nValIso(
final min=1)
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1ValIso[nValIso]
if typValIso == Buildings.Templates.Plants.Controls.Types.Actuator.TwoPosition
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput uValIso[nValIso]
if typValIso == Buildings.Templates.Plants.Controls.Types.Actuator.Modulating
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput y1
;
Buildings.Controls.OBC.CDL.Logical.MultiOr anyOpePar(
nin=nValIso)
if typCon == Buildings.Templates.Plants.Controls.Types.EquipmentConnection.Parallel
;
Buildings.Controls.OBC.CDL.Logical.MultiAnd allCloPar(
nin=nValIso)
if typCon == Buildings.Templates.Plants.Controls.Types.EquipmentConnection.Parallel
;
Buildings.Controls.OBC.CDL.Logical.Not cloParMod[nValIso]
if typValIso == Buildings.Templates.Plants.Controls.Types.Actuator.Modulating
and typCon == Buildings.Templates.Plants.Controls.Types.EquipmentConnection.Parallel
;
Buildings.Controls.OBC.CDL.Reals.GreaterThreshold opeParMod[nValIso](
each final t=0)
if typValIso == Buildings.Templates.Plants.Controls.Types.Actuator.Modulating
and typCon == Buildings.Templates.Plants.Controls.Types.EquipmentConnection.Parallel
;
Buildings.Controls.OBC.CDL.Logical.Latch lat
;
Buildings.Controls.OBC.CDL.Logical.MultiOr anyCloSer(
nin=nValIso)
if typCon == Buildings.Templates.Plants.Controls.Types.EquipmentConnection.Series
;
Buildings.Controls.OBC.CDL.Logical.MultiAnd allOpeSer(
nin=nValIso)
if typCon == Buildings.Templates.Plants.Controls.Types.EquipmentConnection.Series
;
Buildings.Controls.OBC.CDL.Reals.LessThreshold cloSerMod[nValIso](
each final t=0.99)
if typValIso == Buildings.Templates.Plants.Controls.Types.Actuator.Modulating
and typCon == Buildings.Templates.Plants.Controls.Types.EquipmentConnection.Series
;
Buildings.Controls.OBC.CDL.Logical.Not opeSerMod[nValIso]
if typValIso == Buildings.Templates.Plants.Controls.Types.Actuator.Modulating
and typCon == Buildings.Templates.Plants.Controls.Types.EquipmentConnection.Series
;
Buildings.Controls.OBC.CDL.Logical.Not cloTwo[nValIso]
if typValIso == Buildings.Templates.Plants.Controls.Types.Actuator.TwoPosition
;
equation
connect(uValIso, opeParMod.u);
connect(opeParMod.y, cloParMod.u);
connect(lat.y, y1);
connect(anyOpePar.y, lat.u);
connect(allCloPar.y, lat.clr);
connect(allOpeSer.y, lat.clr);
connect(anyCloSer.y, lat.u);
connect(uValIso, cloSerMod.u);
connect(cloSerMod.y, opeSerMod.u);
connect(u1ValIso, cloTwo.u);
connect(cloTwo.y, anyCloSer.u);
connect(u1ValIso, anyOpePar.u);
connect(cloTwo.y, allCloPar.u);
connect(u1ValIso, allOpeSer.u);
connect(cloParMod.y, allCloPar.u);
connect(cloSerMod.y, anyCloSer.u);
connect(opeSerMod.y, allOpeSer.u);
connect(opeParMod.y, anyOpePar.u);
end EnableLeadHeadered;
Variable speed primary pumps without differential pressure control
Information
Heating-only plants with variable speed primary pumps that are not controlled to maintain differential pressure or flow setpoint
When commanded on, the primary HW pumps are commanded at a fixed
speed yPumHeaWatPriSet
, as determined during the Testing, Adjusting,
and Balancing phase to provide the design heat pump flow.
Heating and cooling plants with common variable speed primary pumps that are not controlled to maintain differential pressure or flow setpoint
When commanded on, the primary pumps are commanded at a fixed
speed yPumHeaWatPriSet
in heating mode or
yPumChiWatPriSet
in cooling mode, as determined during the
Testing, Adjusting, and Balancing phase to provide the design heat pump flow
in heating mode or cooling mode.
Heating and cooling plants with separate variable speed primary pumps that are not controlled to maintain differential pressure or flow setpoint
When commanded on, the primary HW pumps are commanded at a fixed
speed yPumHeaWatPriSet
.
When commanded on, the primary CHW pumps are commanded at a fixed
speed yPumChiWatPriSet
.
The pump speed yPumHeaWatPriSet
or yPumChiWatPriSet
is determined during the Testing, Adjusting, and Balancing phase to provide
the design heat pump flow in heating mode or cooling mode.
Parameters
Type | Name | Default | Description |
Plant configuration |
Boolean | have_heaWat | | Set to true for plants that provide HW |
Boolean | have_chiWat | | Set to true for plants that provide CHW |
Boolean | have_pumChiWatPriDed | | Set to true for plants with separate dedicated primary CHW pumps |
Boolean | have_pumPriHdr | | Set to true for headered primary pumps, false for dedicated pumps |
Integer | nEqu | | Number of equipment |
Integer | nPumHeaWatPri | | Number of primary HW pumps |
Integer | nPumChiWatPri | | Number of primary CHW pumps |
Information provided by testing, adjusting, and balancing contractor |
Real | yPumHeaWatPriSet | | Primary pump speed providing design heat pump flow in heating mode [1] |
Real | yPumChiWatPriSet | | Primary pump speed providing design heat pump flow in cooling mode [1] |
Connectors
Type | Name | Description |
input BooleanInput | u1PumHeaWatPri[nPumHeaWatPri] | Primary HW pump start command |
output RealOutput | yPumHeaWatPriHdr | Headered primary HW pump speed command |
input BooleanInput | u1PumChiWatPri[nPumChiWatPri] | Primary CHW pump start command |
output RealOutput | yPumChiWatPriHdr | Headered primary CHW pump speed command |
output RealOutput | yPumHeaWatPriDed[nPumHeaWatPri] | Dedicated primary HW pump speed command |
output RealOutput | yPumChiWatPriDed[nPumChiWatPri] | Dedicated primary CHW pump speed command |
input BooleanInput | u1Hea[nEqu] | Heating/cooling mode command |
Modelica definition
block VariableSpeedNoDpControl
parameter Boolean have_heaWat
;
parameter Boolean have_chiWat
;
final parameter Boolean have_pumHeaWatPri=have_heaWat
;
parameter Boolean have_pumChiWatPriDed(start=false)
;
final parameter Boolean have_pumChiWatPri=
have_chiWat
and (have_pumPriHdr
or have_pumChiWatPriDed)
;
parameter Boolean have_pumPriHdr
;
parameter Integer nEqu(start=0)
;
parameter Integer nPumHeaWatPri
;
parameter Integer nPumChiWatPri(start=
if have_chiWat
and have_pumChiWatPri
then nEqu
else 0)
;
parameter Real yPumHeaWatPriSet(
max=1,
min=0,
start=1,
unit="1")
;
parameter Real yPumChiWatPriSet(
max=1,
min=0,
start=1,
unit="1")
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1PumHeaWatPri[nPumHeaWatPri]
if have_heaWat
and have_pumHeaWatPri
;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput yPumHeaWatPriHdr
if have_heaWat
and have_pumHeaWatPri
and have_pumPriHdr
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1PumChiWatPri[nPumChiWatPri]
if have_chiWat
and have_pumChiWatPri
;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput yPumChiWatPriHdr
if have_chiWat
and have_pumChiWatPri
and have_pumPriHdr
;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput yPumHeaWatPriDed[nPumHeaWatPri]
if have_heaWat
and have_pumHeaWatPri
and not have_pumPriHdr
;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput yPumChiWatPriDed[nPumChiWatPri]
if have_chiWat
and have_pumChiWatPri
and not have_pumPriHdr
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1Hea[nEqu]
if have_heaWat
and have_chiWat
and not have_pumChiWatPriDed
and not have_pumPriHdr
;
Buildings.Controls.OBC.CDL.Reals.Switch setPumChiWatPriDed[nPumChiWatPri]
if have_chiWat
and have_pumChiWatPri
and not have_pumPriHdr
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant zer(
final k=0)
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant spePumChiWatPri(
final k=yPumChiWatPriSet)
if have_chiWat
;
Buildings.Controls.OBC.CDL.Reals.Switch setPumHeaWatPriDed[nPumHeaWatPri]
if have_heaWat
and have_pumHeaWatPri
and not have_pumPriHdr
;
Buildings.Controls.OBC.CDL.Routing.RealScalarReplicator rep(
nout=nPumHeaWatPri)
if have_heaWat
and have_pumHeaWatPri
;
Buildings.Controls.OBC.CDL.Routing.RealScalarReplicator rep1(
nout=nPumChiWatPri)
if have_chiWat
and have_pumChiWatPri
;
Buildings.Controls.OBC.CDL.Routing.RealScalarReplicator rep2(
nout=nPumChiWatPri)
if have_chiWat
and have_pumChiWatPri
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant spePumHeaWatPri(
final k=yPumHeaWatPriSet)
if have_heaWat
and have_pumHeaWatPri
;
Buildings.Controls.OBC.CDL.Reals.Switch setPumChiWatPriHdr
if have_chiWat
and have_pumChiWatPri
and have_pumPriHdr
;
Buildings.Controls.OBC.CDL.Reals.Switch setPumHeaWatPriHdr
if have_heaWat
and have_pumHeaWatPri
and have_pumPriHdr
;
Buildings.Controls.OBC.CDL.Logical.MultiOr anyPumChiWatPri(
nin=nPumChiWatPri)
if have_chiWat
and have_pumChiWatPri
;
Buildings.Controls.OBC.CDL.Logical.MultiOr anyPumHeaWatPri(
nin=nPumHeaWatPri)
if have_heaWat
and have_pumHeaWatPri
;
Buildings.Controls.OBC.CDL.Reals.Switch selSpeHea[nPumHeaWatPri]
if
have_heaWat
and have_chiWat
and not have_pumChiWatPri
and not
have_pumPriHdr
;
Buildings.Controls.OBC.CDL.Routing.RealScalarReplicator rep3(
nout=nPumHeaWatPri)
if have_heaWat
and have_pumHeaWatPri
;
Buildings.Controls.OBC.CDL.Routing.RealScalarReplicator rep4(
nout=nPumHeaWatPri)
if have_heaWat
and have_chiWat
and not
have_pumChiWatPri
and not have_pumPriHdr
;
Utilities.PlaceholderReal ph[nPumHeaWatPri](
each final have_inp=have_heaWat
and have_chiWat
and not have_pumChiWatPri
and not have_pumPriHdr,
each final have_inpPh=false,
each final u_internal=yPumHeaWatPriSet)
if have_heaWat
and have_pumHeaWatPri
and not have_pumPriHdr
;
equation
connect(u1PumChiWatPri, setPumChiWatPriDed.u2);
connect(setPumChiWatPriDed.y, yPumChiWatPriDed);
connect(setPumHeaWatPriDed.y, yPumHeaWatPriDed);
connect(zer.y, rep.u);
connect(spePumChiWatPri.y, rep1.u);
connect(zer.y, rep2.u);
connect(setPumHeaWatPriHdr.y, yPumHeaWatPriHdr);
connect(setPumChiWatPriHdr.y, yPumChiWatPriHdr);
connect(rep2.y, setPumChiWatPriDed.u3);
connect(rep1.y, setPumChiWatPriDed.u1);
connect(zer.y, setPumChiWatPriHdr.u3);
connect(rep.y, setPumHeaWatPriDed.u3);
connect(zer.y, setPumHeaWatPriHdr.u3);
connect(spePumChiWatPri.y, setPumChiWatPriHdr.u1);
connect(u1PumChiWatPri, anyPumChiWatPri.u);
connect(u1PumHeaWatPri, anyPumHeaWatPri.u);
connect(anyPumHeaWatPri.y, setPumHeaWatPriHdr.u2);
connect(spePumHeaWatPri.y, setPumHeaWatPriHdr.u1);
connect(anyPumChiWatPri.y, setPumChiWatPriHdr.u2);
connect(u1PumHeaWatPri, setPumHeaWatPriDed.u2);
connect(u1Hea, selSpeHea.u2);
connect(spePumHeaWatPri.y, rep3.u);
connect(rep3.y, selSpeHea.u1);
connect(rep4.y, selSpeHea.u3);
connect(spePumChiWatPri.y, rep4.u);
connect(ph.y, setPumHeaWatPriDed.u1);
connect(selSpeHea.y, ph.u);
end VariableSpeedNoDpControl;