This package contains waterside economizer (WSE) control sequences.
The implementation is based on section 5.20.3 of ASHRAE Guideline 36-2021.
Waterside economizer (WSE) control sequence per ASHRAE Guideline 36-2021, section 5.20.3.
The following state machine chart illustrates the transitions between WSE enabled and disabled states:
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.
| Type | Name | Default | Description |
| Boolean | have_byPasValCon | true | True: chilled water flow through economizer is controlled using heat exchanger bypass valve |
| Boolean | have_priOnl | true | True: the primary-only plant; False: the primary-secondary plant |
| Boolean | have_parChi | true | True: the plant has parallel chillers |
| Integer | nChi | 2 | Number of chillers in the plant |
| Integer | nSta | 3 | Number of chiller stages |
| Actuator | chiIsoValTyp | Buildings.Controls.OBC.ASHRA... | Chiller CHW isolation valve type |
| Boolean | have_modPosChiVal | false | True for chiller CHW isolation valves with position feedback |
| Real | chaChiWatIsoTim | 300 | Time to slowly change chiller chilled water isolation valve, should be determined in the field [s] |
| Enable parameters |
| Real | holdPeriod | 1200 | WSE minimum on or off time [s] |
| Real | delDis | 120 | Delay disable time period [s] |
| Real | TOffsetEna | 2 | Temperature offset between the chilled water return upstream of WSE and the predicted WSE output [K] |
| Real | TOffsetDis | 1 | Temperature offset between the chilled water return upstream and downstream WSE [K] |
| Design parameters |
| Real | heaExcAppDes | 2 | Design heat exchanger approach [K] |
| Real | cooTowAppDes | 2 | Design cooling tower approach [K] |
| Real | TOutWetDes | 288.15 | Design outdoor air wet bulb temperature [K] |
| Real | VHeaExcDes_flow | 0.015 | Design heat exchanger chilled water volume flow rate [m3/s] |
| Valve or pump control |
| Real | dpDes | 6000 | Design pressure difference across the chilled water side economizer [Pa] |
| SimpleController | valCon | Buildings.Controls.OBC.CDL.T... | Type of controller |
| Real | k | 0.1 | Gain of controller |
| Real | Ti | 0.5 | Time constant of integrator block [s] |
| Real | Td | 0.1 | Time constant of derivative block [s] |
| Real | minSpe | 0.1 | Minimum pump speed |
| Real | desSpe | 1 | Design pump speed |
| Advanced |
| Tuning |
| Real | step | 0.02 | Incremental step used to reduce or increase the water-side economizer tuning parameter [1] |
| Real | wseOnTimDec | 3600 | Economizer enable time needed to allow decrease of the tuning parameter [s] |
| Real | wseOnTimInc | 1800 | Economizer enable time needed to allow increase of the tuning parameter [s] |
| Hysteresis |
| Real | hysDt | 1 | Deadband temperature used in hysteresis block [K] |
| Real | hysVal | 0.05 | Hysteresis for checking valve position [1] |
| Real | dtHol | 900 | Minimum hold time during stage change [s] |
block Controller
parameter Boolean have_byPasValCon=true
;
parameter Boolean have_priOnl=true
;
parameter Boolean have_parChi=true
;
parameter Integer nChi=2
;
parameter Integer nSta = 3
;
parameter Buildings.Controls.OBC.ASHRAE.G36.Plants.Chillers.Types.Actuator chiIsoValTyp=
Buildings.Controls.OBC.ASHRAE.G36.Plants.Chillers.Types.Actuator.Modulating
;
parameter Boolean have_modPosChiVal=false
;
parameter Real chaChiWatIsoTim(unit="s")=300
;
parameter Real holdPeriod(
final unit="s",
final quantity="Time")=1200
;
parameter Real delDis(
final unit="s",
final quantity="Time")=120
;
parameter Real TOffsetEna(
final unit="K",
final quantity="TemperatureDifference")=2
;
parameter Real TOffsetDis(
final unit="K",
final quantity="TemperatureDifference")=1
;
parameter Real heaExcAppDes(
final unit="K",
final quantity="TemperatureDifference")=2
;
parameter Real cooTowAppDes(
final unit="K",
final quantity="TemperatureDifference")=2
;
parameter Real TOutWetDes(
final unit="K",
final quantity="ThermodynamicTemperature",
displayUnit="degC")=288.15
;
parameter Real VHeaExcDes_flow(
final unit="m3/s",
final quantity="VolumeFlowRate",
displayUnit="m3/s")=0.015
;
parameter Real dpDes(
final unit="Pa",
final quantity="PresureDifference")=6000
;
parameter CDL.Types.SimpleController valCon=Buildings.Controls.OBC.CDL.Types.SimpleController.PI
;
parameter Real k=0.1
;
parameter Real Ti(unit="s")=0.5
;
parameter Real Td(unit="s")=0.1
;
parameter Real minSpe(
final min=0,
final max=1)=0.1
;
parameter Real desSpe(
final min=0,
final max=1)=1
;
parameter Real step(
final unit="1")=0.02
;
parameter Real wseOnTimDec(
final unit="s",
final quantity="Time",
displayUnit="h") = 3600
;
parameter Real wseOnTimInc(
final unit="s",
final quantity="Time",
displayUnit="h") = 1800
;
parameter Real hysDt(
final unit="K",
final quantity="TemperatureDifference")=1
;
parameter Real hysVal(
final unit="1")=0.05
;
parameter Real dtHol(
final min=0,
final unit="s")=900
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput TOutWet(
final unit="K",
displayUnit="degC",
final quantity="ThermodynamicTemperature")
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput TChiWatRet(
final unit="K",
displayUnit="degC",
final quantity="ThermodynamicTemperature")
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput TChiWatRetDow(
final unit="K",
displayUnit="degC",
final quantity="ThermodynamicTemperature")
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput uTowFanSpeMax(
final min=0,
final max=1,
final unit="1")
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput VChiWat_flow(
final quantity="VolumeFlowRate",
final unit="m3/s") ;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput uPla ;
Buildings.Controls.OBC.CDL.Interfaces.IntegerInput uIni(
final min=0,
final max=nSta) ;
Buildings.Controls.OBC.CDL.Interfaces.IntegerInput uChiSta(
final min=0,
final max=nSta)
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput dpChiWat(
final unit="Pa",
final quantity="PressureDifference")
if have_byPasValCon
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput uPum
if not have_byPasValCon ;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput uStaPro
if not have_byPasValCon
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput TEntHex(
final unit="K",
displayUnit="degC",
final quantity="ThermodynamicTemperature")
if not have_byPasValCon
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1ChiIsoVal[nChi]
if have_priOnl
and have_parChi
;
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
;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput TWsePre(
final quantity="ThermodynamicTemperature",
displayUnit="degC",
final unit="K")
;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput yTunPar
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput y
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput yConWatIsoVal
;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput yRetVal(
final min=0,
final max=1,
final unit="1")
if have_byPasValCon
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput yPumOn
if not have_byPasValCon ;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput yPumSpe(
final min=0,
final max=1,
final unit="1")
if not have_byPasValCon
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput y1ChiWatBypVal
if have_priOnl
and have_parChi
;
Buildings.Controls.OBC.CDL.Reals.Hysteresis enaTWet(
final uLow = TOffsetEna - hysDt/2,
final uHigh = TOffsetEna + hysDt/2)
;
Buildings.Controls.OBC.CDL.Logical.Not notDisWse
;
protected
Buildings.Controls.OBC.ASHRAE.G36.Plants.Chillers.Economizers.Subsequences.Tuning
wseTun(
final step=step,
final wseOnTimDec=wseOnTimDec,
final wseOnTimInc=wseOnTimInc)
;
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)
;
Buildings.Controls.OBC.CDL.Reals.Subtract sub2 ;
Buildings.Controls.OBC.CDL.Reals.Subtract temDif
;
Buildings.Controls.OBC.CDL.Logical.TrueFalseHold truFalHol(
final trueHoldDuration=holdPeriod,
final falseHoldDuration=holdPeriod)
;
Buildings.Controls.OBC.CDL.Logical.And and2 ;
Buildings.Controls.OBC.CDL.Reals.Hysteresis hys(
final uLow=-hysDt/2,
final uHigh=hysDt/2)
;
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
;
Buildings.Controls.OBC.ASHRAE.G36.Plants.Chillers.Economizers.Subsequences.HeatExchangerPump
wsePum(
final minSpe=minSpe,
final desSpe=desSpe,
final dtHol=dtHol)
if not have_byPasValCon
;
Buildings.Controls.OBC.CDL.Logical.And and1
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt(
final k=0) ;
Buildings.Controls.OBC.CDL.Integers.Equal intEqu
;
Buildings.Controls.OBC.CDL.Logical.Latch lat
;
Buildings.Controls.OBC.CDL.Integers.Equal intEqu1
;
Buildings.Controls.OBC.CDL.Logical.Not not1
;
Buildings.Controls.OBC.CDL.Logical.Or enaEco ;
Buildings.Controls.OBC.CDL.Logical.Pre pre2
;
Buildings.Controls.OBC.CDL.Logical.And enaWSE
;
Buildings.Controls.OBC.CDL.Logical.Pre pre1
;
Buildings.Controls.OBC.CDL.Logical.MultiOr anyComOpe(
final nin=nChi)
if have_priOnl
and have_parChi
;
Buildings.Controls.OBC.CDL.Logical.Not notOpe
if have_priOnl
and have_parChi
;
Buildings.Controls.OBC.CDL.Logical.Latch valCom
if have_priOnl
and have_parChi
;
Buildings.Controls.OBC.CDL.Logical.And opeVal
if have_priOnl
and have_parChi
;
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
;
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
;
Buildings.Controls.OBC.CDL.Logical.And cloVal
if have_priOnl
and have_parChi
;
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)
;
Buildings.Controls.OBC.CDL.Logical.Not notOpe1
if have_priOnl
and have_parChi
;
Buildings.Controls.OBC.CDL.Logical.Not anyOpe
if have_priOnl
and have_parChi
;
Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel1(
final delayTime=1)
if have_priOnl
and have_parChi
;
Buildings.Controls.OBC.CDL.Logical.And disWse
;
Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel2(
final delayTime=delDis)
;
Buildings.Controls.OBC.CDL.Reals.AddParameter addDif(
final p=TOffsetDis) ;
Buildings.Controls.OBC.CDL.Logical.TrueDelay sufEna(
final delayTime=holdPeriod)
;
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;