Name | Description |
---|---|
PrimaryOnlyWithEconomizer | Chiller plant with water side economizer for data center |
BaseClasses | Package with base classes for Buildings.Examples.ChillerPlant |
This example demonstrates the implementation of a chiller plant with water-side economizer to cool a data center. The system schematics is as shown below.
The system is a primary-only chiller plant with integrated water-side economizer. The data center room is simplified as a mixed air volume with a heat source. The only means to transfer heat between the room and the environment is through the HVAC system. Heat conduction and air infiltration through building leakage are neglected since the heat exchange between the room and the ambient environment is small compared to the heat released by the servers. The control objective is to maintain the temperature of the supply air into the data center room and to reduce energy consumption of the chiller, fans and pumps by maximizing the usage of the water-side economizer (WSE) for free cooling. The control sequence is as described by Stein (2009). The chiller may be on or off. If it is on, then the leaving water temperature setpoint is reset based on the load. The WSE can be on or off.
The WSE is enabled when
Note: The formulas use temperature in Fahrenheit. The input and output data for the WSE control unit are in SI units. The WSE control component internally converts the data between SI units and IP units.
The control strategy is as follows:
The chiller set point reset strategy is to first increase the mass flow rate of the chiller chilled water, m. If m reaches the maximum value and further cooling is still needed, the return temperature set point of the chilled water will be reduced. If there is too much cooling, the set point will be changed in the reverse direction. This strategy is realized by using a trim and respond logic as follows:
CW: | condenser water |
CWST: | condenser water supply temperature |
CWRT: | condenser water return temperature |
CHW: | chilled water |
CHWST: | chilled water supply temperature |
CHWRT: | chilled water return temperature |
WSE: | water side economizer |
Extends from Modelica.Icons.Example (Icon for runnable examples).
Type | Name | Default | Description |
---|---|---|---|
MassFlowRate | mAir_flow_nominal | 28.43 | Nominal mass flow rate at fan [kg/s] |
Power | P_nominal | 80E3 | Nominal compressor power (at y=1) [W] |
TemperatureDifference | dTEva_nominal | 10 | Temperature difference evaporator inlet-outlet [K] |
TemperatureDifference | dTCon_nominal | 10 | Temperature difference condenser outlet-inlet [K] |
Real | COPc_nominal | 3 | Chiller COP |
MassFlowRate | mCHW_flow_nominal | mAir_flow_nominal*1000/4200*... | Nominal mass flow rate at chilled water [kg/s] |
MassFlowRate | mCW_flow_nominal | 4*mCHW_flow_nominal/COPc_nom... | Nominal mass flow rate at condenser water [kg/s] |
Pressure | dp_nominal | 500 | Nominal pressure difference [Pa] |
Type | Name | Description |
---|---|---|
Bus | weaBus |
model PrimaryOnlyWithEconomizer "Chiller plant with water side economizer for data center" extends Modelica.Icons.Example; package MediumAir = Buildings.Media.GasesPTDecoupled.SimpleAir "Medium model"; package MediumCHW = Buildings.Media.ConstantPropertyLiquidWater "Medium model"; package MediumCW = Buildings.Media.ConstantPropertyLiquidWater "Medium model"; parameter Modelica.SIunits.MassFlowRate mAir_flow_nominal=28.43 "Nominal mass flow rate at fan"; parameter Modelica.SIunits.Power P_nominal=80E3 "Nominal compressor power (at y=1)"; parameter Modelica.SIunits.TemperatureDifference dTEva_nominal=10 "Temperature difference evaporator inlet-outlet"; parameter Modelica.SIunits.TemperatureDifference dTCon_nominal=10 "Temperature difference condenser outlet-inlet"; parameter Real COPc_nominal=3 "Chiller COP"; parameter Modelica.SIunits.MassFlowRate mCHW_flow_nominal=mAir_flow_nominal* 1000/4200*18/23 "Nominal mass flow rate at chilled water"; parameter Modelica.SIunits.MassFlowRate mCW_flow_nominal=4*mCHW_flow_nominal/ COPc_nominal*(COPc_nominal + 1) "Nominal mass flow rate at condenser water"; parameter Modelica.SIunits.Pressure dp_nominal=500 "Nominal pressure difference";Buildings.Fluid.Movers.FlowMachine_m_flow fan( redeclare package Medium = MediumAir, m_flow_nominal=mAir_flow_nominal, dp(start=249), m_flow(start=mAir_flow_nominal), T_start=293.15, filteredSpeed=false); Buildings.Fluid.HeatExchangers.DryCoilCounterFlow cooCoi( redeclare package Medium1 = MediumCHW, redeclare package Medium2 = MediumAir, m2_flow_nominal=mAir_flow_nominal, m1_flow_nominal=mCHW_flow_nominal, UA_nominal=1e6, m1_flow(start=mCHW_flow_nominal), m2_flow(start=mAir_flow_nominal), dp2_nominal=249, dp1_nominal(displayUnit="Pa") = 1000 + 89580) "Cooling coil"; Modelica.Blocks.Sources.Constant mFanFlo(k=mAir_flow_nominal) "Mass flow rate of fan"; BaseClasses.SimplifiedRoom roo( redeclare package Medium = MediumAir, nPorts=2, rooLen=50, rooWid=30, rooHei=3, m_flow_nominal=mAir_flow_nominal, QRoo_flow=200000) "Room model"; inner Modelica.Fluid.System system(T_ambient=283.15); Buildings.Fluid.Movers.FlowMachine_m_flow pumCHW( redeclare package Medium = MediumCHW, m_flow_nominal=mCHW_flow_nominal, m_flow(start=mCHW_flow_nominal), dp(start=325474), filteredSpeed=false) "Chilled water pump"; Modelica.Blocks.Sources.Constant mPumCHW(k=mCHW_flow_nominal) "Flow rate of primary system"; Buildings.Fluid.Storage.ExpansionVessel expVesCHW(redeclare package Medium = MediumCHW, VTot=1) "Expansion vessel"; Buildings.Fluid.HeatExchangers.CoolingTowers.YorkCalc cooTow( redeclare package Medium = MediumCW, m_flow_nominal=mCW_flow_nominal, PFan_nominal=6000, TAirInWB_nominal(displayUnit="degC") = 283.15, TApp_nominal=6, dp_nominal=14930 + 14930 + 74650) "Cooling tower"; Buildings.Fluid.Movers.FlowMachine_m_flow pumCW( redeclare package Medium = MediumCW, m_flow_nominal=mCW_flow_nominal, dp(start=214992), filteredSpeed=false) "Condenser water pump"; Modelica.Blocks.Sources.Constant mCWFlo(k=mCW_flow_nominal) "Flow rate of condenser water side"; Buildings.Fluid.HeatExchangers.ConstantEffectiveness wse( redeclare package Medium1 = MediumCW, redeclare package Medium2 = MediumCHW, m1_flow_nominal=mCW_flow_nominal, m2_flow_nominal=mCHW_flow_nominal, eps=0.8, dp2_nominal=0, dp1_nominal=0) "Water side economizer (Heat exchanger)"; Fluid.Actuators.Valves.TwoWayLinear val5( redeclare package Medium = MediumCW, m_flow_nominal=mCW_flow_nominal, dpValve_nominal=20902, dpFixed_nominal=89580) "Control valve for condenser water loop of chiller"; Fluid.Actuators.Valves.TwoWayLinear val1( redeclare package Medium = MediumCHW, m_flow_nominal=mCHW_flow_nominal, dpValve_nominal=20902) "Bypass control valve for economizer. 1: disable economizer, 0: enable economoizer"; Buildings.Fluid.Storage.ExpansionVessel expVesChi(redeclare package Medium = MediumCW, VTot=1); Buildings.Examples.ChillerPlant.BaseClasses.Controls.WSEControl wseCon; Modelica.Blocks.Sources.RealExpression expTowTApp(y=cooTow.TApp_nominal) "Cooling tower approach"; Buildings.Fluid.Chillers.ElectricEIR chi( redeclare package Medium1 = MediumCW, redeclare package Medium2 = MediumCHW, m1_flow_nominal=mCW_flow_nominal, m2_flow_nominal=mCHW_flow_nominal, per=Buildings.Fluid.Chillers.Data.ElectricEIR.ElectricEIRChiller_Carrier_19XR_823kW_6_28COP_Vanes(), dp2_nominal=0, dp1_nominal=0); Fluid.Actuators.Valves.TwoWayLinear val6( redeclare package Medium = MediumCHW, m_flow_nominal=mCHW_flow_nominal, dpValve_nominal=20902, dpFixed_nominal=14930 + 89580) "Control valve for chilled water leaving from chiller"; Buildings.Examples.ChillerPlant.BaseClasses.Controls.ChillerSwitch chiSwi( deaBan(displayUnit="K") = 1) "Control unit switching chiller on or off "; Buildings.Examples.ChillerPlant.BaseClasses.Controls.TrimAndRespond triAndRes( yMax=1, yMin=0, nActDec=0, nActInc=1, n=1, yEqu0=0, uTri=0.8, yDec=-0.01, tSam=240, yInc=0.02) "trim and respond logic"; Buildings.Examples.ChillerPlant.BaseClasses.Controls.LinearPiecewiseTwo linPieTwo( x0=0, x2=1, x1=0.5, y11=1, y10=0.3, y21=273.15 + 5.56, y20=273.15 + 12) "Translate the control signal for chiller setpoint reset"; Modelica.Blocks.Sources.Constant TSupSet(k=273.15 + 18) "Set temperature for room"; Buildings.Controls.Continuous.LimPID limPID( reverseAction=true, controllerType=Modelica.Blocks.Types.SimpleController.P, Td=0, Ti=100, k=1); Modelica.Blocks.Logical.Pre pre1; Modelica.Blocks.Math.BooleanToReal chiCon "Contorl signal for chiller"; Modelica.Blocks.Logical.Switch swi; Modelica.Blocks.Sources.Constant off(k=0) "Control signal of chiller"; Fluid.Actuators.Valves.TwoWayLinear val4( redeclare package Medium = MediumCW, m_flow_nominal=mCW_flow_nominal, dpValve_nominal=20902, dpFixed_nominal=59720) "Control valve for condenser water loop of economizer"; Buildings.Fluid.Sensors.TemperatureTwoPort TSupAir(redeclare package Medium = MediumAir, m_flow_nominal=mAir_flow_nominal) "Supply air temperature to data center"; Buildings.Fluid.Sensors.TemperatureTwoPort TChiCHWST(redeclare package Medium = MediumCHW, m_flow_nominal=mCHW_flow_nominal) "Temperature of chilled water entering chiller"; Buildings.Fluid.Sensors.TemperatureTwoPort TChiCWST(redeclare package Medium = MediumCW, m_flow_nominal=mCW_flow_nominal) "Condenser water supply temperature for economizer and chiller"; Modelica.Blocks.Sources.Constant cooTowFanCon(k=1) "Control singal for cooling tower fan"; Fluid.Actuators.Valves.TwoWayEqualPercentage val2( redeclare package Medium = MediumCHW, m_flow_nominal=mCHW_flow_nominal, dpValve_nominal=20902, dpFixed_nominal=14930) "Bypass valve for chiller. It controls the mass flow rate of chilled water going into the chiller"; Buildings.Examples.ChillerPlant.BaseClasses.Controls.KMinusU KMinusU(k=1); Fluid.Actuators.Valves.TwoWayLinear val3( redeclare package Medium = MediumCHW, m_flow_nominal=mCHW_flow_nominal, dpValve_nominal=20902, dpFixed_nominal=59720 + 1000) "Control valve for economizer. 0: disable economizer, 1: enable economoizer"; Buildings.Fluid.Sensors.TemperatureTwoPort TWseCHWST(redeclare package Medium = MediumCHW, m_flow_nominal=mCHW_flow_nominal) "Temperature of chilled water goes into the WSE"; Fluid.Sensors.MassFlowRate mChiCHW(redeclare package Medium = MediumCHW); BaseClasses.WeatherData weaData(filNam= "Resources/weatherdata/USA_CA_San.Francisco.Intl.AP.724940_TMY3.mos"); BoundaryConditions.WeatherData.Bus weaBus; equationconnect(expVesCHW.port_a, cooCoi.port_b1); connect(expTowTApp.y, wseCon.towTApp); connect(TSupSet.y, limPID.u_s); connect(limPID.y, triAndRes.u[1]); connect(linPieTwo.y[1], swi.u1); connect(off.y, swi.u3); connect(triAndRes.y, linPieTwo.u); connect(chiSwi.y, chiCon.u); connect(cooTow.port_b, pumCW.port_a); connect(pumCW.m_flow_in, mCWFlo.y); connect(val5.port_a, chi.port_b1); connect(expVesChi.port_a, chi.port_b1); connect(val4.port_a, wse.port_b1); connect(chiSwi.y, chi.on); connect(linPieTwo.y[2], chi.TSet); connect(chiCon.y, val6.y); connect(chiCon.y, val5.y); connect(chiSwi.y, pre1.u); connect(chiSwi.y, swi.u2); connect(linPieTwo.y[2], chiSwi.TSet); connect(cooTowFanCon.y, cooTow.y); connect(cooCoi.port_b2, fan.port_a); connect(mFanFlo.y, fan.m_flow_in); connect(TSupAir.T, limPID.u_m); connect(swi.y, KMinusU.u); connect(KMinusU.y, val2.y); connect(mPumCHW.y, pumCHW.m_flow_in); connect(val6.port_b, cooCoi.port_a1); connect(wse.port_a2, val3.port_b); connect(wseCon.y2, val1.y); connect(wseCon.y1, val3.y); connect(wseCon.y1, val4.y); connect(TSupAir.port_a, fan.port_b); connect(roo.airPorts[1], TSupAir.port_b); connect(roo.airPorts[2], cooCoi.port_a2); connect(TWseCHWST.port_a, pumCHW.port_b); connect(TChiCHWST.port_b, val2.port_a); connect(TChiCHWST.port_a, val1.port_b); connect(val1.port_a, TWseCHWST.port_b); connect(val3.port_a, TWseCHWST.port_b); connect(TChiCWST.port_b, chi.port_a1); connect(TChiCWST.port_b, wse.port_a1); connect(pre1.y, triAndRes.sta); connect(TChiCHWST.T, chiSwi.chiCHWST); connect(wseCon.wseCWST, TChiCWST.T); connect(wseCon.wseCHWST, TWseCHWST.T); connect(mChiCHW.port_b, val6.port_a); connect(mChiCHW.port_a, chi.port_b2); connect(weaData.weaBus, weaBus); connect(wseCon.TWetBul, weaBus.TWetBul); connect(cooTow.TAir, weaBus.TWetBul); connect(TChiCHWST.port_a, wse.port_b2); connect(cooCoi.port_b1, pumCHW.port_a); connect(val2.port_b, val6.port_b); connect(TChiCHWST.port_b, chi.port_a2); connect(val5.port_b, cooTow.port_a); connect(val4.port_b, cooTow.port_a); connect(pumCW.port_b, TChiCWST.port_a); end PrimaryOnlyWithEconomizer;