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

Package of sequences for cooling tower control

Information

This package contains sequences for cooling tower control. The implementation is based on section 5.20.12 in ASHRAE Guideline 36-2021.

Package Content

Name Description
Buildings.Controls.OBC.ASHRAE.G36.Plants.Chillers.Towers.Controller Controller Cooling tower controller
Buildings.Controls.OBC.ASHRAE.G36.Plants.Chillers.Towers.WaterLevel WaterLevel Sequences to control water level in cooling tower
Buildings.Controls.OBC.ASHRAE.G36.Plants.Chillers.Towers.FanSpeed FanSpeed Package of sequences for cooling tower fan speed control
Buildings.Controls.OBC.ASHRAE.G36.Plants.Chillers.Towers.Staging Staging Package of sequences for cooling tower staging
Buildings.Controls.OBC.ASHRAE.G36.Plants.Chillers.Towers.Validation Validation Collection of validation models

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

Cooling tower controller

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

Information

Block that controls the cooling tower cells enabling status yTowSta, the supply isolation valve positions yIsoVal of each cell and the cell fan operating speed ySpeSet. This is implemented according to ASHRAE Guideline 36-2021, section 5.20.12. The section specifies sequences to control the cooling tower. It includes three subsequences:

Parameters

TypeNameDefaultDescription
HeadPressureControlchiHeaPreConBuildings.Controls.OBC.ASHRA...Chiller head pressure controlled type
IntegernChi2Total number of chillers
IntegernPlaSta5Total number of plant stages, including stage zero and the stages with a WSE, if applicable
IntegernTowCel2Total number of cooling tower cells
IntegernConWatPum2Total number of condenser water pumps
TowerSpeedControlfanSpeConBuildings.Controls.OBC.ASHRA...Tower fan speed control type
BooleancloseCoupledPlantfalseTrue: the plant is close coupled, i.e. the pipe length from the chillers to cooling towers does not exceed approximately 100 feet
Booleanhave_WSEtrueFlag to indicate if the plant has waterside economizer
Nominal
RealdesCap1e6Plant design capacity [W]
RealfanSpeMin0.1Minimum tower fan speed
Fan speed
WSE enabled
RealchiMinCap[nChi]{1e4,1e4}Minimum cyclining load below which chiller will begin cycling [W]
SimpleControllerintOpeConBuildings.Controls.OBC.CDL.T...Controller in the mode when WSE and chillers are enabled
RealkIntOpe1Gain of controller
RealTiIntOpe0.5Time constant of integrator block [s]
RealTdIntOpe0.1Time constant of derivative block [s]
SimpleControllerchiWatConBuildings.Controls.OBC.CDL.T...Controller in the mode when only WSE is enabled
RealkWSE1Gain of controller
RealTiWSE0.5Time constant of integrator block [s]
RealTdWSE0.1Time constant of derivative block [s]
Return temperature control
RealminChiLif[nChi]{12,12}Minimum LIFT of each chiller [K]
RealTConWatSup_nominal[nChi]{293.15,293.15}Condenser water supply temperature (condenser entering) of each chiller [K]
RealTConWatRet_nominal[nChi]{303.15,303.15}Condenser water return temperature (condenser leaving) of each chiller [K]
RealTChiWatSupMin[nChi]{278.15,278.15}Lowest chilled water supply temperature oc each chiller [K]
SimpleControllercouPlaConBuildings.Controls.OBC.CDL.T...Type of coupled plant controller
RealkCouPla1Gain of controller
RealTiCouPla0.5Time constant of integrator block [s]
RealTdCouPla0.1Time constant of derivative block [s]
RealyCouPlaMax1Upper limit of output
RealyCouPlaMin0Lower limit of output
RealsamplePeriod30Period of sampling condenser water supply and return temperature difference [s]
SimpleControllersupWatConBuildings.Controls.OBC.CDL.T...Condenser supply water temperature controller for less coupled plant
RealkSupCon1Gain of controller
RealTiSupCon0.5Time constant of integrator block [s]
RealTdSupCon0.1Time constant of derivative block [s]
RealySupConMax1Upper limit of output
RealySupConMin0Lower limit of output
Advanced
RealspeChe0.005Lower threshold value to check fan or pump speed
RealiniPlaTim600Time to hold return temperature at initial setpoint after plant being enabled [s]
RealramTim180Time to ramp return water temperature from initial value to setpoint [s]
RealcheMinFanSpe300Threshold time for checking duration when tower fan equals to the minimum tower fan speed [s]
RealcheMaxTowSpe300Threshold time for checking duration when any enabled chiller maximum cooling speed equals to the minimum tower fan speed [s]
RealcheTowOff60Threshold time for checking duration when there is no enabled tower fan [s]
Tower staging
Nominal
RealstaVec[nPlaSta]{0,0.5,1,1.5,2}Plant stage vector, element value like x.5 means chiller stage x plus WSE
IntegertowCelOnSet[nPlaSta]{0,1,1,2,2}Design number of tower fan cells that should be enabled, according to current chiller stage and WSE status
Isolation valves
Booleanhave_inlIsoValtrueTrue: tower cells have the inlet isolation valve
Booleanhave_outIsoValfalseTrue: tower cells have the outlet isolation valve
Booleanhave_endSwifalseTrue: tower cells isolatiove valve have the end switch feedback
RealchaTowCelIsoTim90Nominal time needed for open isolation valve of the tower cells
Makeup water
RealwatLevMin0.7Minimum cooling tower water level recommended by manufacturer [m]
RealwatLevMax1Maximum cooling tower water level recommended by manufacturer [m]

Connectors

TypeNameDescription
input RealInputuChiLoaCurrent cooling load [W]
input BooleanInputuChi[nChi]Vector of chiller proven on status: true=ON
input BooleanInputuWseWaterside economizer proven on status: true=ON
input RealInputTChiWatSupChilled water supply temperature [K]
input RealInputTChiWatSupSetChilled water supply temperature setpoint [K]
input RealInputreqPlaCapCurrent required plant capacity [W]
input RealInputuMaxSpeSet[nChi]Maximum cooling tower speed setpoint from each chiller head pressure control loop [1]
input BooleanInputuTowSta[nTowCel]Vector of tower cell proven on status: true=running tower cell
input BooleanInputuPlaPlant enabling status
input RealInputTConWatRetCondenser water return temperature (condenser leaving) [K]
input BooleanInputuConWatPum[nConWatPum]Current condenser water pump status
input RealInputTConWatSupCondenser water supply temperature (condenser entering) [K]
input BooleanInputuEnaPlaTrue: plant is just enabled
input IntegerInputuChiStaCurrent chiller stage
input IntegerInputuChiStaSetChiller stage setpoint
input BooleanInputuTowStaChaCooling tower stage change command from plant staging process
input BooleanInputu1InlIsoValOpe[nTowCel]Tower cells inlet isolation valve open end switch. True: the isolation valve is fully open
input BooleanInputu1OutIsoValOpe[nTowCel]Tower cells outlet isolation valve open end switch. True: the isolation valve is fully open
input BooleanInputu1InlIsoValClo[nTowCel]Tower cells inlet isolation valve close end switch. True: the isolation valve is fully closed
input BooleanInputu1OutIsoValClo[nTowCel]Tower cells outlet isolation valve close end switch. True: the isolation valve is fully closed
input RealInputwatLevMeasured water level [m]
output RealOutputyLifMaxMaximum LIFT among enabled chillers [K]
output RealOutputyLifMinMinimum LIFT among enabled chillers [K]
output RealOutputTConWatRetSetCondenser water return temperature setpoint [K]
output RealOutputTConWatSupSetCondenser water supply temperature setpoint [K]
output BooleanOutputyLeaCelLead tower cell status setpoint
output BooleanOutputy1IsoVal[nTowCel]Cooling tower cells isolation valve position
output BooleanOutputyTowSta[nTowCel]Vector of tower cells status setpoint
output RealOutputySpeSetFan speed setpoint for enabled cell [1]
output BooleanOutputyMakUpMakeup water valve On-Off status

Modelica definition

block Controller "Cooling tower controller" parameter Buildings.Controls.OBC.ASHRAE.G36.Plants.Chillers.Types.HeadPressureControl chiHeaPreCon= Buildings.Controls.OBC.ASHRAE.G36.Plants.Chillers.Types.HeadPressureControl.ByPlant "Chiller head pressure controlled type"; parameter Integer nChi=2 "Total number of chillers"; parameter Integer nPlaSta=5 "Total number of plant stages, including stage zero and the stages with a WSE, if applicable"; parameter Integer nTowCel=2 "Total number of cooling tower cells"; parameter Integer nConWatPum=2 "Total number of condenser water pumps"; parameter Buildings.Controls.OBC.ASHRAE.G36.Plants.Chillers.Types.TowerSpeedControl fanSpeCon= Buildings.Controls.OBC.ASHRAE.G36.Plants.Chillers.Types.TowerSpeedControl.CondenserWaterReturnTemperaure "Tower fan speed control type"; final parameter Boolean have_conWatRetCon = fanSpeCon==Buildings.Controls.OBC.ASHRAE.G36.Plants.Chillers.Types.TowerSpeedControl.CondenserWaterReturnTemperaure "True: the fan speed is controlled to maintain the condenser water return temperature setpoint"; parameter Boolean closeCoupledPlant=false "True: the plant is close coupled, i.e. the pipe length from the chillers to cooling towers does not exceed approximately 100 feet"; parameter Boolean have_WSE=true "Flag to indicate if the plant has waterside economizer"; parameter Real desCap(unit="W")=1e6 "Plant design capacity"; parameter Real fanSpeMin=0.1 "Minimum tower fan speed"; // Fan speed control: when WSE is enabled parameter Real chiMinCap[nChi](unit=fill("W", nChi))={1e4,1e4} "Minimum cyclining load below which chiller will begin cycling"; parameter Buildings.Controls.OBC.CDL.Types.SimpleController intOpeCon= Buildings.Controls.OBC.CDL.Types.SimpleController.PI "Controller in the mode when WSE and chillers are enabled"; parameter Real kIntOpe=1 "Gain of controller"; parameter Real TiIntOpe(unit="s")=0.5 "Time constant of integrator block"; parameter Real TdIntOpe(unit="s")=0.1 "Time constant of derivative block"; parameter Buildings.Controls.OBC.CDL.Types.SimpleController chiWatCon= Buildings.Controls.OBC.CDL.Types.SimpleController.PI "Controller in the mode when only WSE is enabled"; parameter Real kWSE=1 "Gain of controller"; parameter Real TiWSE(unit="s")=0.5 "Time constant of integrator block"; parameter Real TdWSE(unit="s")=0.1 "Time constant of derivative block"; // Fan speed control: controlling condenser return water temperature when WSE is not enabled parameter Real minChiLif[nChi](unit=fill("K", nChi))={12,12} "Minimum LIFT of each chiller"; parameter Real TConWatSup_nominal[nChi]( unit=fill("K", nChi), each displayUnit="degC")={293.15,293.15} "Condenser water supply temperature (condenser entering) of each chiller"; parameter Real TConWatRet_nominal[nChi]( unit=fill("K", nChi), each displayUnit="degC")={303.15,303.15} "Condenser water return temperature (condenser leaving) of each chiller"; parameter Real TChiWatSupMin[nChi]( unit=fill("K", nChi), each displayUnit="degC")={278.15,278.15} "Lowest chilled water supply temperature oc each chiller"; parameter Buildings.Controls.OBC.CDL.Types.SimpleController couPlaCon= Buildings.Controls.OBC.CDL.Types.SimpleController.PI "Type of coupled plant controller"; parameter Real kCouPla=1 "Gain of controller"; parameter Real TiCouPla(unit="s")=0.5 "Time constant of integrator block"; parameter Real TdCouPla(unit="s")=0.1 "Time constant of derivative block"; parameter Real yCouPlaMax=1 "Upper limit of output"; parameter Real yCouPlaMin=0 "Lower limit of output"; parameter Real samplePeriod(unit="s")=30 "Period of sampling condenser water supply and return temperature difference"; parameter Buildings.Controls.OBC.CDL.Types.SimpleController supWatCon= Buildings.Controls.OBC.CDL.Types.SimpleController.PI "Condenser supply water temperature controller for less coupled plant"; parameter Real kSupCon=1 "Gain of controller"; parameter Real TiSupCon(unit="s")=0.5 "Time constant of integrator block"; parameter Real TdSupCon(unit="s")=0.1 "Time constant of derivative block"; parameter Real ySupConMax=1 "Upper limit of output"; parameter Real ySupConMin=0 "Lower limit of output"; parameter Real speChe=0.005 "Lower threshold value to check fan or pump speed"; parameter Real iniPlaTim(unit="s")=600 "Time to hold return temperature at initial setpoint after plant being enabled"; parameter Real ramTim(unit="s")=180 "Time to ramp return water temperature from initial value to setpoint"; parameter Real cheMinFanSpe(unit="s")=300 "Threshold time for checking duration when tower fan equals to the minimum tower fan speed"; parameter Real cheMaxTowSpe(unit="s")=300 "Threshold time for checking duration when any enabled chiller maximum cooling speed equals to the minimum tower fan speed"; parameter Real cheTowOff(unit="s")=60 "Threshold time for checking duration when there is no enabled tower fan"; // Tower staging parameter Real staVec[nPlaSta]={0,0.5,1,1.5,2} "Plant stage vector, element value like x.5 means chiller stage x plus WSE"; parameter Integer towCelOnSet[nPlaSta]={0,1,1,2,2} "Design number of tower fan cells that should be enabled, according to current chiller stage and WSE status"; parameter Boolean have_inlIsoVal=true "True: tower cells have the inlet isolation valve"; parameter Boolean have_outIsoVal=false "True: tower cells have the outlet isolation valve"; parameter Boolean have_endSwi=false "True: tower cells isolatiove valve have the end switch feedback"; parameter Real chaTowCelIsoTim=90 "Nominal time needed for open isolation valve of the tower cells"; // Water level control parameter Real watLevMin( min=0, unit="m")=0.7 "Minimum cooling tower water level recommended by manufacturer"; parameter Real watLevMax(unit="m")=1 "Maximum cooling tower water level recommended by manufacturer"; Buildings.Controls.OBC.CDL.Interfaces.RealInput uChiLoa( final unit="W", final quantity="HeatFlowRate") if have_WSE "Current cooling load"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput uChi[nChi] "Vector of chiller proven on status: true=ON"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput uWse if have_WSE "Waterside economizer proven on status: true=ON"; Buildings.Controls.OBC.CDL.Interfaces.RealInput TChiWatSup( final unit="K", displayUnit="degC", final quantity="ThermodynamicTemperature") if have_WSE "Chilled water supply temperature"; Buildings.Controls.OBC.CDL.Interfaces.RealInput TChiWatSupSet( final unit="K", displayUnit="degC", final quantity="ThermodynamicTemperature") "Chilled water supply temperature setpoint"; Buildings.Controls.OBC.CDL.Interfaces.RealInput reqPlaCap( final unit="W", final quantity="HeatFlowRate") "Current required plant capacity"; Buildings.Controls.OBC.CDL.Interfaces.RealInput uMaxSpeSet[nChi]( final min=fill(0, nChi), final max=fill(1, nChi), final unit=fill("1", nChi)) if need_heaPreCon "Maximum cooling tower speed setpoint from each chiller head pressure control loop"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput uTowSta[nTowCel] "Vector of tower cell proven on status: true=running tower cell"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput uPla "Plant enabling status"; Buildings.Controls.OBC.CDL.Interfaces.RealInput TConWatRet( final unit="K", displayUnit="degC", final quantity="ThermodynamicTemperature") if have_conWatRetCon "Condenser water return temperature (condenser leaving)"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput uConWatPum[nConWatPum] "Current condenser water pump status"; Buildings.Controls.OBC.CDL.Interfaces.RealInput TConWatSup( final unit="K", displayUnit="degC", final quantity="ThermodynamicTemperature") if not closeCoupledPlant "Condenser water supply temperature (condenser entering)"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput uEnaPla "True: plant is just enabled"; Buildings.Controls.OBC.CDL.Interfaces.IntegerInput uChiSta "Current chiller stage"; Buildings.Controls.OBC.CDL.Interfaces.IntegerInput uChiStaSet "Chiller stage setpoint"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput uTowStaCha "Cooling tower stage change command from plant staging process"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1InlIsoValOpe[nTowCel] if have_inlIsoVal and have_endSwi "Tower cells inlet isolation valve open end switch. True: the isolation valve is fully open"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1OutIsoValOpe[nTowCel] if have_endSwi and have_outIsoVal "Tower cells outlet isolation valve open end switch. True: the isolation valve is fully open"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1InlIsoValClo[nTowCel] if have_inlIsoVal and have_endSwi "Tower cells inlet isolation valve close end switch. True: the isolation valve is fully closed"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1OutIsoValClo[nTowCel] if have_endSwi and have_outIsoVal "Tower cells outlet isolation valve close end switch. True: the isolation valve is fully closed"; Buildings.Controls.OBC.CDL.Interfaces.RealInput watLev( final unit="m") "Measured water level"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput yLifMax( final unit="K") if have_conWatRetCon "Maximum LIFT among enabled chillers"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput yLifMin( final unit="K") if have_conWatRetCon "Minimum LIFT among enabled chillers"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput TConWatRetSet( final quantity="ThermodynamicTemperature", displayUnit="degC", final unit="K") if have_conWatRetCon "Condenser water return temperature setpoint"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput TConWatSupSet( final quantity="ThermodynamicTemperature", displayUnit="degC", final unit="K") if have_conWatRetCon and not closeCoupledPlant "Condenser water supply temperature setpoint"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput yLeaCel "Lead tower cell status setpoint"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput y1IsoVal[nTowCel] if have_inlIsoVal "Cooling tower cells isolation valve position"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput yTowSta[nTowCel] "Vector of tower cells status setpoint"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput ySpeSet( final min=0, final max=1, final unit="1") if have_conWatRetCon "Fan speed setpoint for enabled cell"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput yMakUp "Makeup water valve On-Off status"; protected parameter Boolean need_heaPreCon = not chiHeaPreCon == Buildings.Controls.OBC.ASHRAE.G36.Plants.Chillers.Types.HeadPressureControl.NotRequired "True: the plant requires chiller head pressure being controlled"; Buildings.Controls.OBC.ASHRAE.G36.Plants.Chillers.Towers.FanSpeed.Controller towFanSpe( final need_heaPreCon=need_heaPreCon, final nChi=nChi, final nTowCel=nTowCel, final nConWatPum=nConWatPum, final fanSpeCon=fanSpeCon, final closeCoupledPlant=closeCoupledPlant, final have_WSE=have_WSE, final desCap=desCap, final fanSpeMin=fanSpeMin, final chiMinCap=chiMinCap, final intOpeCon=intOpeCon, final kIntOpe=kIntOpe, final TiIntOpe=TiIntOpe, final TdIntOpe=TdIntOpe, final chiWatCon=chiWatCon, final kWSE=kWSE, final TiWSE=TiWSE, final TdWSE=TdWSE, final minChiLif=minChiLif, final TConWatSup_nominal=TConWatSup_nominal, final samplePeriod=samplePeriod, final cheMinFanSpe=cheMinFanSpe, final cheMaxTowSpe=cheMaxTowSpe, final cheTowOff=cheTowOff, final iniPlaTim=iniPlaTim, final ramTim=ramTim, final TConWatRet_nominal=TConWatRet_nominal, final TChiWatSupMin=TChiWatSupMin, final couPlaCon=couPlaCon, final kCouPla=kCouPla, final TiCouPla=TiCouPla, final TdCouPla=TdCouPla, final yCouPlaMax=yCouPlaMax, final yCouPlaMin=yCouPlaMin, final supWatCon=supWatCon, final kSupCon=kSupCon, final TiSupCon=TiSupCon, final TdSupCon=TdSupCon, final ySupConMax=ySupConMax, final ySupConMin=ySupConMin, final speChe=speChe) "Tower fan speed"; Buildings.Controls.OBC.ASHRAE.G36.Plants.Chillers.Towers.Staging.Controller towSta( final have_WSE=have_WSE, final nTowCel=nTowCel, final nConWatPum=nConWatPum, final nPlaSta=nPlaSta, final staVec=staVec, final towCelOnSet=towCelOnSet, final have_inlIsoVal=have_inlIsoVal, final have_outIsoVal=have_outIsoVal, final have_endSwi=have_endSwi, final chaTowCelIsoTim=chaTowCelIsoTim) "Cooling tower staging"; Buildings.Controls.OBC.ASHRAE.G36.Plants.Chillers.Towers.WaterLevel makUpWat( final watLevMin=watLevMin, final watLevMax=watLevMax) "Make up water control"; Buildings.Controls.OBC.CDL.Reals.Switch swi if have_conWatRetCon "Logical switch"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant zer(final k=0) "Zero constant"; Buildings.Controls.OBC.CDL.Logical.MultiOr mulOr( final nin=nTowCel) "Check if there is any enabled cell"; Buildings.Controls.OBC.CDL.Logical.MultiOr mulOr1(final nin=nConWatPum) "Check if there is any pump on"; equation connect(towSta.yTowSta, yTowSta); connect(zer.y, swi.u3); connect(towFanSpe.uChiLoa, uChiLoa); connect(towFanSpe.uChi, uChi); connect(towFanSpe.uWse, uWse); connect(towFanSpe.TChiWatSup, TChiWatSup); connect(towFanSpe.TChiWatSupSet, TChiWatSupSet); connect(towFanSpe.reqPlaCap, reqPlaCap); connect(towFanSpe.uMaxSpeSet, uMaxSpeSet); connect(towFanSpe.uTow, uTowSta); connect(towFanSpe.uPla, uPla); connect(towFanSpe.TConWatRet, TConWatRet); connect(towFanSpe.TConWatSup, TConWatSup); connect(towSta.uChiSta, uChiSta); connect(makUpWat.watLev, watLev); connect(makUpWat.yMakUp, yMakUp); connect(uTowSta, towSta.uTowSta); connect(towSta.uChiStaSet, uChiStaSet); connect(towSta.uTowStaCha, uTowStaCha); connect(uWse, towSta.uWse); connect(towSta.yLeaCel, yLeaCel); connect(uEnaPla, towSta.uEnaPla); connect(swi.y, ySpeSet); connect(uPla, towSta.uPla); connect(towFanSpe.yLifMax, yLifMax); connect(towFanSpe.yLifMin, yLifMin); connect(towFanSpe.ySpeSet, swi.u1); connect(mulOr.y, swi.u2); connect(towSta.yTowSta, mulOr.u); connect(towFanSpe.TConWatRetSet, TConWatRetSet); connect(towFanSpe.TConWatSupSet, TConWatSupSet); connect(uConWatPum, towFanSpe.uConWatPum); connect(uConWatPum, mulOr1.u); connect(mulOr1.y, towSta.uAnyConWatPum); connect(towSta.y1IsoVal, y1IsoVal); connect(u1InlIsoValOpe, towSta.u1InlIsoValOpe); connect(u1OutIsoValOpe, towSta.u1OutIsoValOpe); connect(u1InlIsoValClo, towSta.u1InlIsoValClo); connect(u1OutIsoValClo, towSta.u1OutIsoValClo); end Controller;

Buildings.Controls.OBC.ASHRAE.G36.Plants.Chillers.Towers.WaterLevel Buildings.Controls.OBC.ASHRAE.G36.Plants.Chillers.Towers.WaterLevel

Sequences to control water level in cooling tower

Buildings.Controls.OBC.ASHRAE.G36.Plants.Chillers.Towers.WaterLevel

Information

Block that outputs yMakUp to control the cooling tower make-up water valve. It is implemented according to ASHRAE Guideline 36-2021, section 5.20.13, tower make-up water.

Make-up water valve shall cycle based on tower water fill level sensor. The valve shall open when the water level watLev falls below the minimum fill level watLevMin recommended by the tower manufacturer. It shall close when the water level goes above the maximum level watLevMax.

Parameters

TypeNameDefaultDescription
RealwatLevMin Minimum cooling tower water level recommended by manufacturer
RealwatLevMax Maximum cooling tower water level recommended by manufacturer

Connectors

TypeNameDescription
input RealInputwatLevMeasured water level
output BooleanOutputyMakUpMakeup water valve On-Off status

Modelica definition

block WaterLevel "Sequences to control water level in cooling tower" parameter Real watLevMin( final min=0) "Minimum cooling tower water level recommended by manufacturer"; parameter Real watLevMax( final min=0) "Maximum cooling tower water level recommended by manufacturer"; Buildings.Controls.OBC.CDL.Interfaces.RealInput watLev "Measured water level"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput yMakUp "Makeup water valve On-Off status"; protected Buildings.Controls.OBC.CDL.Reals.Hysteresis hys( final uLow=watLevMin, final uHigh=watLevMax) "Check if water level is lower than minimum level"; Buildings.Controls.OBC.CDL.Logical.Not not1 "Check if it should add water"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant minWatLev( final k=watLevMin) "Minimum water level"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant maxWatLev( final k=watLevMax) "Maximum water level"; Buildings.Controls.OBC.CDL.Utilities.Assert assMes( final message="The maximum level has to be greater than the minimum level.") "Print warning when the maximum level is not set to be greater than the minimum level"; Buildings.Controls.OBC.CDL.Reals.Greater greEqu "Check if maximum level is set to be greater than minimum level"; equation connect(watLev, hys.u); connect(hys.y, not1.u); connect(not1.y, yMakUp); connect(maxWatLev.y, greEqu.u1); connect(minWatLev.y, greEqu.u2); connect(greEqu.y, assMes.u); end WaterLevel;