Buildings.Controls.OBC.ASHRAE.G36.Plants.Chillers.Economizers

Waterside economizer (WSE) sequences

Information

This package contains waterside economizer (WSE) control sequences. The implementation is based on section 5.20.3 of ASHRAE Guideline 36-2021.

Package Content

Name Description
Buildings.Controls.OBC.ASHRAE.G36.Plants.Chillers.Economizers.Controller Controller Waterside economizer (WSE) enable/disable status
Buildings.Controls.OBC.ASHRAE.G36.Plants.Chillers.Economizers.Subsequences Subsequences Waterside economizer control subsequences
Buildings.Controls.OBC.ASHRAE.G36.Plants.Chillers.Economizers.Validation Validation Collection of validation models

Buildings.Controls.OBC.ASHRAE.G36.Plants.Chillers.Economizers.Controller Buildings.Controls.OBC.ASHRAE.G36.Plants.Chillers.Economizers.Controller

Waterside economizer (WSE) enable/disable status

Buildings.Controls.OBC.ASHRAE.G36.Plants.Chillers.Economizers.Controller

Information

Waterside economizer (WSE) control sequence per ASHRAE Guideline 36-2021, section 5.20.3.

Enable and disable WSE

The sequence controls the WSE status as follows:

The following state machine chart illustrates the transitions between WSE enabled and disabled states:

Image of WSE enable-disable state machine chart

The WSE enabling sequence uses the following subsequences:

Chilled water flow through the WSE

Economizer-only chilled water bypass valve

Per section 5.20.3.11, when the economizer is enabled and all chiller isolation valves are commanded closed, open the economizer-only chilled water bypass valve (y1ChiWatBypVal=true). Close the bypass valve when any chiller isolation valve is commanded open and exceeds 25% open.

The economizer-only chilled water bypass valve is typically needed for primary-only parallel plant.

Parameters

TypeNameDefaultDescription
Booleanhave_byPasValContrueTrue: chilled water flow through economizer is controlled using heat exchanger bypass valve
Booleanhave_priOnltrueTrue: the primary-only plant; False: the primary-secondary plant
Booleanhave_parChitrueTrue: the plant has parallel chillers
IntegernChi2Number of chillers in the plant
IntegernSta3Number of chiller stages
ActuatorchiIsoValTypBuildings.Controls.OBC.ASHRA...Chiller CHW isolation valve type
Booleanhave_modPosChiValfalseTrue for chiller CHW isolation valves with position feedback
RealchaChiWatIsoTim300Time to slowly change chiller chilled water isolation valve, should be determined in the field [s]
Enable parameters
RealholdPeriod1200WSE minimum on or off time [s]
RealdelDis120Delay disable time period [s]
RealTOffsetEna2Temperature offset between the chilled water return upstream of WSE and the predicted WSE output [K]
RealTOffsetDis1Temperature offset between the chilled water return upstream and downstream WSE [K]
Design parameters
RealheaExcAppDes2Design heat exchanger approach [K]
RealcooTowAppDes2Design cooling tower approach [K]
RealTOutWetDes288.15Design outdoor air wet bulb temperature [K]
RealVHeaExcDes_flow0.015Design heat exchanger chilled water volume flow rate [m3/s]
Valve or pump control
RealdpDes6000Design pressure difference across the chilled water side economizer [Pa]
SimpleControllervalConBuildings.Controls.OBC.CDL.T...Type of controller
Realk0.1Gain of controller
RealTi0.5Time constant of integrator block [s]
RealTd0.1Time constant of derivative block [s]
RealminSpe0.1Minimum pump speed
RealdesSpe1Design pump speed
Advanced
Tuning
Realstep0.02Incremental step used to reduce or increase the water-side economizer tuning parameter [1]
RealwseOnTimDec3600Economizer enable time needed to allow decrease of the tuning parameter [s]
RealwseOnTimInc1800Economizer enable time needed to allow increase of the tuning parameter [s]
Hysteresis
RealhysDt1Deadband temperature used in hysteresis block [K]
RealhysVal0.05Hysteresis for checking valve position [1]
RealdtHol900Minimum hold time during stage change [s]

Connectors

TypeNameDescription
input RealInputTOutWetOutdoor air wet bulb temperature [K]
input RealInputTChiWatRetChilled water return temperature upstream of the WSE [K]
input RealInputTChiWatRetDowChilled water return temperature downstream of the WSE [K]
input RealInputuTowFanSpeMaxMaximum cooling tower fan speed [1]
input RealInputVChiWat_flowMeasured chilled water volume flow rate [m3/s]
input BooleanInputuPlaPlant enable signal
input IntegerInputuIniInitial chiller stage (at plant enable)
input IntegerInputuChiStaCurrent chiller stage
input RealInputdpChiWatDifferential static pressure across economizer in the chilled water side [Pa]
input BooleanInputuPumTrue: heat exchanger pump is proven on
input BooleanInputuStaProTrue: in staging process
input RealInputTEntHexChilled water temperature entering heat exchanger [K]
input BooleanInputu1ChiIsoVal[nChi]Chiller isolation valve commanded setpoint: true- commanded on
input RealInputuChiIsoVal[nChi]Measured chiller isolation valve position [1]
output RealOutputTWsePrePredicted waterside economizer outlet temperature [K]
output RealOutputyTunParTuning parameter
output BooleanOutputyWSE enable/disable status
output BooleanOutputyConWatIsoValEconomizer condenser water isolation valve position
output RealOutputyRetValWSE in-line CHW return line valve position [1]
output BooleanOutputyPumOnHeat exchanger pump command on
output RealOutputyPumSpeHeat exchanger pump speed setpoint [1]
output BooleanOutputy1ChiWatBypValEconomizer-only chiller water bypass valve commanded status

Modelica definition

block Controller "Waterside economizer (WSE) enable/disable status" parameter Boolean have_byPasValCon=true "True: chilled water flow through economizer is controlled using heat exchanger bypass valve"; parameter Boolean have_priOnl=true "True: the primary-only plant; False: the primary-secondary plant"; parameter Boolean have_parChi=true "True: the plant has parallel chillers"; parameter Integer nChi=2 "Number of chillers in the plant"; parameter Integer nSta = 3 "Number of chiller stages"; parameter Buildings.Controls.OBC.ASHRAE.G36.Plants.Chillers.Types.Actuator chiIsoValTyp= Buildings.Controls.OBC.ASHRAE.G36.Plants.Chillers.Types.Actuator.Modulating "Chiller CHW isolation valve type"; parameter Boolean have_modPosChiVal=false "True for chiller CHW isolation valves with position feedback"; parameter Real chaChiWatIsoTim(unit="s")=300 "Time to slowly change chiller chilled water isolation valve, should be determined in the field"; parameter Real holdPeriod( final unit="s", final quantity="Time")=1200 "WSE minimum on or off time"; parameter Real delDis( final unit="s", final quantity="Time")=120 "Delay disable time period"; parameter Real TOffsetEna( final unit="K", final quantity="TemperatureDifference")=2 "Temperature offset between the chilled water return upstream of WSE and the predicted WSE output"; parameter Real TOffsetDis( final unit="K", final quantity="TemperatureDifference")=1 "Temperature offset between the chilled water return upstream and downstream WSE"; parameter Real heaExcAppDes( final unit="K", final quantity="TemperatureDifference")=2 "Design heat exchanger approach"; parameter Real cooTowAppDes( final unit="K", final quantity="TemperatureDifference")=2 "Design cooling tower approach"; parameter Real TOutWetDes( final unit="K", final quantity="ThermodynamicTemperature", displayUnit="degC")=288.15 "Design outdoor air wet bulb temperature"; parameter Real VHeaExcDes_flow( final unit="m3/s", final quantity="VolumeFlowRate", displayUnit="m3/s")=0.015 "Design heat exchanger chilled water volume flow rate"; parameter Real dpDes( final unit="Pa", final quantity="PresureDifference")=6000 "Design pressure difference across the chilled water side economizer"; parameter CDL.Types.SimpleController valCon=Buildings.Controls.OBC.CDL.Types.SimpleController.PI "Type of controller"; parameter Real k=0.1 "Gain of controller"; parameter Real Ti(unit="s")=0.5 "Time constant of integrator block"; parameter Real Td(unit="s")=0.1 "Time constant of derivative block"; parameter Real minSpe( final min=0, final max=1)=0.1 "Minimum pump speed"; parameter Real desSpe( final min=0, final max=1)=1 "Design pump speed"; parameter Real step( final unit="1")=0.02 "Incremental step used to reduce or increase the water-side economizer tuning parameter"; parameter Real wseOnTimDec( final unit="s", final quantity="Time", displayUnit="h") = 3600 "Economizer enable time needed to allow decrease of the tuning parameter"; parameter Real wseOnTimInc( final unit="s", final quantity="Time", displayUnit="h") = 1800 "Economizer enable time needed to allow increase of the tuning parameter"; parameter Real hysDt( final unit="K", final quantity="TemperatureDifference")=1 "Deadband temperature used in hysteresis block"; parameter Real hysVal( final unit="1")=0.05 "Hysteresis for checking valve position"; parameter Real dtHol( final min=0, final unit="s")=900 "Minimum hold time during stage change"; Buildings.Controls.OBC.CDL.Interfaces.RealInput TOutWet( final unit="K", displayUnit="degC", final quantity="ThermodynamicTemperature") "Outdoor air wet bulb temperature"; Buildings.Controls.OBC.CDL.Interfaces.RealInput TChiWatRet( final unit="K", displayUnit="degC", final quantity="ThermodynamicTemperature") "Chilled water return temperature upstream of the WSE"; Buildings.Controls.OBC.CDL.Interfaces.RealInput TChiWatRetDow( final unit="K", displayUnit="degC", final quantity="ThermodynamicTemperature") "Chilled water return temperature downstream of the WSE"; Buildings.Controls.OBC.CDL.Interfaces.RealInput uTowFanSpeMax( final min=0, final max=1, final unit="1") "Maximum cooling tower fan speed"; Buildings.Controls.OBC.CDL.Interfaces.RealInput VChiWat_flow( final quantity="VolumeFlowRate", final unit="m3/s") "Measured chilled water volume flow rate"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput uPla "Plant enable signal"; Buildings.Controls.OBC.CDL.Interfaces.IntegerInput uIni( final min=0, final max=nSta) "Initial chiller stage (at plant enable)"; Buildings.Controls.OBC.CDL.Interfaces.IntegerInput uChiSta( final min=0, final max=nSta) "Current chiller stage"; Buildings.Controls.OBC.CDL.Interfaces.RealInput dpChiWat( final unit="Pa", final quantity="PressureDifference") if have_byPasValCon "Differential static pressure across economizer in the chilled water side"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput uPum if not have_byPasValCon "True: heat exchanger pump is proven on"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput uStaPro if not have_byPasValCon "True: in staging process"; Buildings.Controls.OBC.CDL.Interfaces.RealInput TEntHex( final unit="K", displayUnit="degC", final quantity="ThermodynamicTemperature") if not have_byPasValCon "Chilled water temperature entering heat exchanger"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1ChiIsoVal[nChi] if have_priOnl and have_parChi "Chiller isolation valve commanded setpoint: true- commanded on"; Buildings.Controls.OBC.CDL.Interfaces.RealInput uChiIsoVal[nChi]( final unit=fill("1", nChi), final min=fill(0, nChi), final max=fill(1, nChi)) if have_priOnl and have_parChi and have_modPosChiVal and chiIsoValTyp == Buildings.Controls.OBC.ASHRAE.G36.Plants.Chillers.Types.Actuator.Modulating "Measured chiller isolation valve position"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput TWsePre( final quantity="ThermodynamicTemperature", displayUnit="degC", final unit="K") "Predicted waterside economizer outlet temperature"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput yTunPar "Tuning parameter"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput y "WSE enable/disable status"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput yConWatIsoVal "Economizer condenser water isolation valve position"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput yRetVal( final min=0, final max=1, final unit="1") if have_byPasValCon "WSE in-line CHW return line valve position"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput yPumOn if not have_byPasValCon "Heat exchanger pump command on"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput yPumSpe( final min=0, final max=1, final unit="1") if not have_byPasValCon "Heat exchanger pump speed setpoint"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput y1ChiWatBypVal if have_priOnl and have_parChi "Economizer-only chiller water bypass valve commanded status"; Buildings.Controls.OBC.CDL.Reals.Hysteresis enaTWet( final uLow = TOffsetEna - hysDt/2, final uHigh = TOffsetEna + hysDt/2) "Enable condition based on the outdoor wet bulb temperature"; Buildings.Controls.OBC.CDL.Logical.Not notDisWse "Economizer does not need being disabled"; protected Buildings.Controls.OBC.ASHRAE.G36.Plants.Chillers.Economizers.Subsequences.Tuning wseTun( final step=step, final wseOnTimDec=wseOnTimDec, final wseOnTimInc=wseOnTimInc) "Tuning parameter for the WSE outlet temperature calculation"; Buildings.Controls.OBC.ASHRAE.G36.Plants.Chillers.Economizers.Subsequences.PredictedOutletTemperature wseTOut( final heaExcAppDes=heaExcAppDes, final cooTowAppDes=cooTowAppDes, final TOutWetDes=TOutWetDes, final VHeaExcDes_flow=VHeaExcDes_flow) "Calculates the predicted WSE outlet temperature"; Buildings.Controls.OBC.CDL.Reals.Subtract sub2 "Subtract"; Buildings.Controls.OBC.CDL.Reals.Subtract temDif "Find temperature difference"; Buildings.Controls.OBC.CDL.Logical.TrueFalseHold truFalHol( final trueHoldDuration=holdPeriod, final falseHoldDuration=holdPeriod) "Keeps a signal constant for a given time period"; Buildings.Controls.OBC.CDL.Logical.And and2 "And"; Buildings.Controls.OBC.CDL.Reals.Hysteresis hys( final uLow=-hysDt/2, final uHigh=hysDt/2) "Hysteresis comparing CHW temperatures upstream and downstream WSE"; Buildings.Controls.OBC.ASHRAE.G36.Plants.Chillers.Economizers.Subsequences.BypassValve wseVal( final dpDes=dpDes, final controllerType=valCon, final k=k, final Ti=Ti, final Td=Td) if have_byPasValCon "Chilled water flow through economizer is controlled using bypass valve"; Buildings.Controls.OBC.ASHRAE.G36.Plants.Chillers.Economizers.Subsequences.HeatExchangerPump wsePum( final minSpe=minSpe, final desSpe=desSpe, final dtHol=dtHol) if not have_byPasValCon "Pump control for economizer when the chilled water flow is controlled by a variable speed heat exchanger pump"; Buildings.Controls.OBC.CDL.Logical.And and1 "Plant enabled with 0 initial stage, it means enabled with economizer-only operation"; Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt( final k=0) "Stage 0"; Buildings.Controls.OBC.CDL.Integers.Equal intEqu "Check if initial stage is 0"; Buildings.Controls.OBC.CDL.Logical.Latch lat "Plant enabled with economizer-only operation"; Buildings.Controls.OBC.CDL.Integers.Equal intEqu1 "Check if current stage is initial stage"; Buildings.Controls.OBC.CDL.Logical.Not not1 "Not in initial stage"; Buildings.Controls.OBC.CDL.Logical.Or enaEco "Economizer enabled"; Buildings.Controls.OBC.CDL.Logical.Pre pre2 "Break algebric loop"; Buildings.Controls.OBC.CDL.Logical.And enaWSE "Enable economizer if the plant is enabled"; Buildings.Controls.OBC.CDL.Logical.Pre pre1 "Break algebric loop"; Buildings.Controls.OBC.CDL.Logical.MultiOr anyComOpe( final nin=nChi) if have_priOnl and have_parChi "Check if there is any commanded open valve"; Buildings.Controls.OBC.CDL.Logical.Not notOpe if have_priOnl and have_parChi "All valves are commanded close"; Buildings.Controls.OBC.CDL.Logical.Latch valCom if have_priOnl and have_parChi "Economizer-only chiller water bypass valve commanded setpoint"; Buildings.Controls.OBC.CDL.Logical.And opeVal if have_priOnl and have_parChi "Check if the economizer-only bypass valve should open"; Buildings.Controls.OBC.CDL.Reals.GreaterThreshold valOpe[nChi]( final t=fill(0.25, nChi), final h=fill(hysVal,nChi)) if have_priOnl and have_parChi and have_modPosChiVal and chiIsoValTyp == Buildings.Controls.OBC.ASHRAE.G36.Plants.Chillers.Types.Actuator.Modulating "Check if any valve has been open greater than threshold"; Buildings.Controls.OBC.CDL.Logical.MultiOr anyOpeVal( final nin=nChi) if have_priOnl and have_parChi and have_modPosChiVal and chiIsoValTyp == Buildings.Controls.OBC.ASHRAE.G36.Plants.Chillers.Types.Actuator.Modulating "Check if any commanded valve has been open greater than the threshold"; Buildings.Controls.OBC.CDL.Logical.And cloVal if have_priOnl and have_parChi "Check if the economizer-only bypass valve should close"; Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel( final delayTime=0.25*chaChiWatIsoTim) if have_priOnl and have_parChi and not (have_modPosChiVal and chiIsoValTyp == Buildings.Controls.OBC.ASHRAE.G36.Plants.Chillers.Types.Actuator.Modulating) "Valve being open by more than 25%"; Buildings.Controls.OBC.CDL.Logical.Not notOpe1 if have_priOnl and have_parChi "All valves are commanded close"; Buildings.Controls.OBC.CDL.Logical.Not anyOpe if have_priOnl and have_parChi "True: there is valve open"; Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel1( final delayTime=1) if have_priOnl and have_parChi "False delay to avoid falling edge"; Buildings.Controls.OBC.CDL.Logical.And disWse "Disable economizer"; Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel2( final delayTime=delDis) "Check if it has been true for sufficient time"; Buildings.Controls.OBC.CDL.Reals.AddParameter addDif( final p=TOffsetDis) "Add threshold difference"; Buildings.Controls.OBC.CDL.Logical.TrueDelay sufEna( final delayTime=holdPeriod) "Check if the economizer has been true for sufficient time"; equation connect(uTowFanSpeMax, wseTun.uTowFanSpeMax); connect(TOutWet, wseTOut.TOutWet); connect(VChiWat_flow, wseTOut.VChiWat_flow); connect(enaTWet.y, and2.u1); connect(temDif.y, hys.u); connect(wseTun.y, wseTOut.uTunPar); connect(wseTOut.y, sub2.u2); connect(TChiWatRet, sub2.u1); connect(sub2.y, enaTWet.u); connect(wseTun.y, yTunPar); connect(wseTOut.y, TWsePre); connect(uIni, intEqu.u1); connect(conInt.y, intEqu.u2); connect(uIni, intEqu1.u1); connect(uChiSta, intEqu1.u2); connect(intEqu1.y, not1.u); connect(enaEco.y, y); connect(dpChiWat, wseVal.dpChiWat); connect(uPum, wsePum.uPum); connect(TEntHex, wsePum.TEntHex); connect(wseVal.yRetVal, yRetVal); connect(wsePum.yPumOn, yPumOn); connect(wsePum.yPumSpe, yPumSpe); connect(TChiWatRet, wsePum.TEntWSE); connect(uPla, wseVal.uPla); connect(uPla, wsePum.uPla); connect(uPla, and1.u1); connect(lat.y, pre2.u); connect(enaEco.y, wseVal.uWSE); connect(enaEco.y, wsePum.uWSE); connect(enaEco.y, wseTun.uWseSta); connect(pre2.y, enaEco.u2); connect(not1.y, lat.clr); connect(uPla, enaWSE.u2); connect(enaWSE.y, pre1.u); connect(pre1.y, enaEco.u1); connect(truFalHol.y, enaWSE.u1); connect(u1ChiIsoVal, anyComOpe.u); connect(notOpe.y, opeVal.u1); connect(opeVal.y, valCom.u); connect(valCom.y, y1ChiWatBypVal); connect(enaEco.y, opeVal.u2); connect(uChiIsoVal, valOpe.u); connect(valOpe.y, anyOpeVal.u); connect(cloVal.y, valCom.clr); connect(uStaPro, wsePum.uStaPro); connect(wseVal.yConWatIsoVal, yConWatIsoVal); connect(wsePum.yConWatIsoVal, yConWatIsoVal); connect(intEqu.y, and1.u2); connect(and1.y, lat.u); connect(truDel.y, cloVal.u2); connect(anyOpeVal.y, cloVal.u2); connect(anyComOpe.y, notOpe1.u); connect(notOpe1.y, truDel1.u); connect(truDel1.y, anyOpe.u); connect(anyOpe.y, notOpe.u); connect(anyOpe.y, cloVal.u1); connect(anyOpe.y, truDel.u); connect(hys.y, truDel2.u); connect(TChiWatRetDow,addDif. u); connect(TChiWatRet, temDif.u2); connect(addDif.y, temDif.u1); connect(truDel2.y, disWse.u1); connect(disWse.y, notDisWse.u); connect(notDisWse.y, and2.u2); connect(enaEco.y, sufEna.u); connect(sufEna.y, disWse.u2); connect(and2.y, truFalHol.u); end Controller;