Buildings.Templates.Plants.Controls.Pumps.Primary

Sequences for primary pumps

Information

This package contains control sequences for primary pumps.

Package Content

Name Description
Buildings.Templates.Plants.Controls.Pumps.Primary.EnableLeadHeadered EnableLeadHeadered Lead primary pump enable/disable for plants with headered primary pumps
Buildings.Templates.Plants.Controls.Pumps.Primary.VariableSpeedNoDpControl VariableSpeedNoDpControl Variable speed primary pumps without differential pressure control
Buildings.Templates.Plants.Controls.Pumps.Primary.Validation Validation Collection of validation models

Buildings.Templates.Plants.Controls.Pumps.Primary.EnableLeadHeadered Buildings.Templates.Plants.Controls.Pumps.Primary.EnableLeadHeadered

Lead primary pump enable/disable for plants with headered primary pumps

Buildings.Templates.Plants.Controls.Pumps.Primary.EnableLeadHeadered

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:

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

Parameters

TypeNameDefaultDescription
EquipmentConnectiontypCon Type of connection between equipment and primary loop
ActuatortypValIsoBuildings.Templates.Plants.C...Type of isolation valve
IntegernValIso Number of isolation valves

Connectors

TypeNameDescription
input BooleanInputu1ValIso[nValIso]Isolation valve command
input RealInputuValIso[nValIso]Isolation valve command
output BooleanOutputy1Lead pump enable signal

Modelica definition

block EnableLeadHeadered "Lead primary pump enable/disable for plants with headered primary pumps" parameter Buildings.Templates.Plants.Controls.Types.EquipmentConnection typCon "Type of connection between equipment and primary loop"; parameter Buildings.Templates.Plants.Controls.Types.Actuator typValIso= Buildings.Templates.Plants.Controls.Types.Actuator.TwoPosition "Type of isolation valve"; parameter Integer nValIso( final min=1) "Number of isolation valves"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1ValIso[nValIso] if typValIso == Buildings.Templates.Plants.Controls.Types.Actuator.TwoPosition "Isolation valve command"; Buildings.Controls.OBC.CDL.Interfaces.RealInput uValIso[nValIso] if typValIso == Buildings.Templates.Plants.Controls.Types.Actuator.Modulating "Isolation valve command"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput y1 "Lead pump enable signal"; Buildings.Controls.OBC.CDL.Logical.MultiOr anyOpePar( nin=nValIso) if typCon == Buildings.Templates.Plants.Controls.Types.EquipmentConnection.Parallel "Return true if any valve is commanded open - Parallel piped equipment"; Buildings.Controls.OBC.CDL.Logical.MultiAnd allCloPar( nin=nValIso) if typCon == Buildings.Templates.Plants.Controls.Types.EquipmentConnection.Parallel "Return true if all valves are commanded closed - Parallel piped equipment"; 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 "Return true if valve is commanded closed"; 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 "Return true if valve commanded > 0 % open"; Buildings.Controls.OBC.CDL.Logical.Latch lat "Clear enable signal if disable conditions are met"; Buildings.Controls.OBC.CDL.Logical.MultiOr anyCloSer( nin=nValIso) if typCon == Buildings.Templates.Plants.Controls.Types.EquipmentConnection.Series "Return true if any valve is commanded closed - Series piped equipment"; Buildings.Controls.OBC.CDL.Logical.MultiAnd allOpeSer( nin=nValIso) if typCon == Buildings.Templates.Plants.Controls.Types.EquipmentConnection.Series "Return true if all valves are commanded open - Series piped equipment"; 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 "Return true if valve commanded < 99 % open"; 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 "Return true if valve is commanded open"; Buildings.Controls.OBC.CDL.Logical.Not cloTwo[nValIso] if typValIso == Buildings.Templates.Plants.Controls.Types.Actuator.TwoPosition "Return true if valve is commanded closed"; 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;

Buildings.Templates.Plants.Controls.Pumps.Primary.VariableSpeedNoDpControl Buildings.Templates.Plants.Controls.Pumps.Primary.VariableSpeedNoDpControl

Variable speed primary pumps without differential pressure control

Buildings.Templates.Plants.Controls.Pumps.Primary.VariableSpeedNoDpControl

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

TypeNameDefaultDescription
Plant configuration
Booleanhave_heaWat Set to true for plants that provide HW
Booleanhave_chiWat Set to true for plants that provide CHW
Booleanhave_pumChiWatPriDed Set to true for plants with separate dedicated primary CHW pumps
Booleanhave_pumPriHdr Set to true for headered primary pumps, false for dedicated pumps
IntegernEqu Number of equipment
IntegernPumHeaWatPri Number of primary HW pumps
IntegernPumChiWatPri Number of primary CHW pumps
Information provided by testing, adjusting, and balancing contractor
RealyPumHeaWatPriSet Primary pump speed providing design heat pump flow in heating mode [1]
RealyPumChiWatPriSet Primary pump speed providing design heat pump flow in cooling mode [1]

Connectors

TypeNameDescription
input BooleanInputu1PumHeaWatPri[nPumHeaWatPri]Primary HW pump start command
output RealOutputyPumHeaWatPriHdrHeadered primary HW pump speed command
input BooleanInputu1PumChiWatPri[nPumChiWatPri]Primary CHW pump start command
output RealOutputyPumChiWatPriHdrHeadered primary CHW pump speed command
output RealOutputyPumHeaWatPriDed[nPumHeaWatPri]Dedicated primary HW pump speed command
output RealOutputyPumChiWatPriDed[nPumChiWatPri]Dedicated primary CHW pump speed command
input BooleanInputu1Hea[nEqu]Heating/cooling mode command

Modelica definition

block VariableSpeedNoDpControl "Variable speed primary pumps without differential pressure control" parameter Boolean have_heaWat "Set to true for plants that provide HW"; parameter Boolean have_chiWat "Set to true for plants that provide CHW"; final parameter Boolean have_pumHeaWatPri=have_heaWat "Set to true for plants with primary HW pumps"; parameter Boolean have_pumChiWatPriDed(start=false) "Set to true for plants with separate dedicated primary CHW pumps"; final parameter Boolean have_pumChiWatPri= have_chiWat and (have_pumPriHdr or have_pumChiWatPriDed) "Set to true for plants with separate primary CHW pumps"; parameter Boolean have_pumPriHdr "Set to true for headered primary pumps, false for dedicated pumps"; parameter Integer nEqu(start=0) "Number of equipment"; parameter Integer nPumHeaWatPri "Number of primary HW pumps"; parameter Integer nPumChiWatPri(start=if have_chiWat and have_pumChiWatPri then nEqu else 0) "Number of primary CHW pumps"; parameter Real yPumHeaWatPriSet( max=1, min=0, start=1, unit="1") "Primary pump speed providing design heat pump flow in heating mode"; parameter Real yPumChiWatPriSet( max=1, min=0, start=1, unit="1") "Primary pump speed providing design heat pump flow in cooling mode"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1PumHeaWatPri[nPumHeaWatPri] if have_heaWat and have_pumHeaWatPri "Primary HW pump start command"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput yPumHeaWatPriHdr if have_heaWat and have_pumHeaWatPri and have_pumPriHdr "Headered primary HW pump speed command"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1PumChiWatPri[nPumChiWatPri] if have_chiWat and have_pumChiWatPri "Primary CHW pump start command"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput yPumChiWatPriHdr if have_chiWat and have_pumChiWatPri and have_pumPriHdr "Headered primary CHW pump speed command"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput yPumHeaWatPriDed[nPumHeaWatPri] if have_heaWat and have_pumHeaWatPri and not have_pumPriHdr "Dedicated primary HW pump speed command"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput yPumChiWatPriDed[nPumChiWatPri] if have_chiWat and have_pumChiWatPri and not have_pumPriHdr "Dedicated primary CHW pump speed command"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1Hea[nEqu] if have_heaWat and have_chiWat and not have_pumChiWatPriDed and not have_pumPriHdr "Heating/cooling mode command"; Buildings.Controls.OBC.CDL.Reals.Switch setPumChiWatPriDed[nPumChiWatPri] if have_chiWat and have_pumChiWatPri and not have_pumPriHdr "Set prescribed speed when pump is enabled"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant zer( final k=0) "Constant"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant spePumChiWatPri( final k=yPumChiWatPriSet) if have_chiWat "Constant"; Buildings.Controls.OBC.CDL.Reals.Switch setPumHeaWatPriDed[nPumHeaWatPri] if have_heaWat and have_pumHeaWatPri and not have_pumPriHdr "Set prescribed speed when pump is enabled"; Buildings.Controls.OBC.CDL.Routing.RealScalarReplicator rep( nout=nPumHeaWatPri) if have_heaWat and have_pumHeaWatPri "Replicate signal"; Buildings.Controls.OBC.CDL.Routing.RealScalarReplicator rep1( nout=nPumChiWatPri) if have_chiWat and have_pumChiWatPri "Replicate signal"; Buildings.Controls.OBC.CDL.Routing.RealScalarReplicator rep2( nout=nPumChiWatPri) if have_chiWat and have_pumChiWatPri "Replicate signal"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant spePumHeaWatPri( final k=yPumHeaWatPriSet) if have_heaWat and have_pumHeaWatPri "Constant"; Buildings.Controls.OBC.CDL.Reals.Switch setPumChiWatPriHdr if have_chiWat and have_pumChiWatPri and have_pumPriHdr "Set prescribed speed when pump is enabled"; Buildings.Controls.OBC.CDL.Reals.Switch setPumHeaWatPriHdr if have_heaWat and have_pumHeaWatPri and have_pumPriHdr "Set prescribed speed when pump is enabled"; Buildings.Controls.OBC.CDL.Logical.MultiOr anyPumChiWatPri( nin=nPumChiWatPri) if have_chiWat and have_pumChiWatPri "Return true if any pump is enabled"; Buildings.Controls.OBC.CDL.Logical.MultiOr anyPumHeaWatPri( nin=nPumHeaWatPri) if have_heaWat and have_pumHeaWatPri "Return true if any pump is enabled"; Buildings.Controls.OBC.CDL.Reals.Switch selSpeHea[nPumHeaWatPri] if have_heaWat and have_chiWat and not have_pumChiWatPri and not have_pumPriHdr "Select prescribed pump speed depending on heating/cooling mode – Case with common CHW and HW dedicated pumps"; Buildings.Controls.OBC.CDL.Routing.RealScalarReplicator rep3( nout=nPumHeaWatPri) if have_heaWat and have_pumHeaWatPri "Replicate signal"; Buildings.Controls.OBC.CDL.Routing.RealScalarReplicator rep4( nout=nPumHeaWatPri) if have_heaWat and have_chiWat and not have_pumChiWatPri and not have_pumPriHdr "Replicate signal"; 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 "Always use HW pump speed in case of separate dedicated CHW pumps "; 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;