Buildings.Examples.ChillerPlant

Chiller plant with water side economizer for data center

Information

Extends from Modelica.Icons.ExamplesPackage (Icon for packages containing runnable examples).

Package Content

NameDescription
Buildings.Examples.ChillerPlant.PrimaryOnlyWithEconomizer PrimaryOnlyWithEconomizer Chiller plant with water side economizer for data center
Buildings.Examples.ChillerPlant.BaseClasses BaseClasses Package with base classes for Buildings.Examples.ChillerPlant


Buildings.Examples.ChillerPlant.PrimaryOnlyWithEconomizer Buildings.Examples.ChillerPlant.PrimaryOnlyWithEconomizer

Chiller plant with water side economizer for data center

Buildings.Examples.ChillerPlant.PrimaryOnlyWithEconomizer

Information

System Configuration

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.

Enabling/Disabling the WSE

The WSE is enabled when

  1. The WSE has been disabled for at least 20 minutes, and
  2. TWSE_CHWST > 0.9 TWetBul + TTowApp + TWSEApp

The WSE is disabled when
  1. The WSE has been enabled for at least 20 minutes, and
  2. TWSE_CHWRT < 1 + TWSE_CWST

where TWSE_CHWST is the chilled water supply temperature for the WSE, TWetBul is the wet bulb temperature, TTowApp is the cooling tower approach, TWSEApp is the approach for the WSE, TWSE_CHWRT is the chilled water return temperature for the WSE, and TWSE_CWST is the condenser water return temperature for the WSE.

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.

Enabling/Disabling the Chiller

The control strategy is as follows:

where TChi_CHWST is the chiller chilled water supply temperature, TChiSet is the set point temperature for the chilled water leaving the chiller, and TDeaBan is the dead-band to prevent short cycling.

Chiller Set Point Reset

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:


The chiller set point u is converted to control signals for the mass flow rate m and for the chiller set point temperature T as follows: where m0 and m1 are minimum and maximum flow rates, and T0 and T1 are the highest and lowest values for the set point of CHWRT for the chiller.

Nomenclature

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

Reference

Stein, J. (2009). Waterside Economizing in Data Centers: Design and Control Considerations. ASHRAE Transactions, 115(2), 192-200.

Extends from Modelica.Icons.Example (Icon for runnable examples).

Parameters

TypeNameDefaultDescription
MassFlowRatemAir_flow_nominal28.43Nominal mass flow rate at fan [kg/s]
PowerP_nominal80E3Nominal compressor power (at y=1) [W]
TemperatureDifferencedTEva_nominal10Temperature difference evaporator inlet-outlet [K]
TemperatureDifferencedTCon_nominal10Temperature difference condenser outlet-inlet [K]
RealCOPc_nominal3Chiller COP
MassFlowRatemCHW_flow_nominalmAir_flow_nominal*1000/4200*...Nominal mass flow rate at chilled water [kg/s]
MassFlowRatemCW_flow_nominal4*mCHW_flow_nominal/COPc_nom...Nominal mass flow rate at condenser water [kg/s]
Pressuredp_nominal500Nominal pressure difference [Pa]

Connectors

TypeNameDescription
BusweaBus 

Modelica definition

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);
  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,
    dp1_nominal(displayUnit="Pa") = 100,
    UA_nominal=1e6,
    m1_flow(start=mCHW_flow_nominal),
    m2_flow(start=mAir_flow_nominal),
    dp2_nominal=249) "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,
    dp(start=329460),
    m_flow(start=mCHW_flow_nominal)) "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=47776) "Cooling tower";
  Buildings.Fluid.Movers.FlowMachine_m_flow pumCW(
    redeclare package Medium = MediumCW,
    m_flow_nominal=mCW_flow_nominal,
    dp(start=37474)) "Condenser water pump";
  Modelica.Blocks.Sources.Constant mCWFlo(k=mCW_flow_nominal) 
    "Flow rate of condenser water side";
  Buildings.Fluid.FixedResistances.FixedResistanceDpM res4(
    redeclare package Medium = MediumCW,
    m_flow_nominal=mCW_flow_nominal,
    dp_nominal=1000) "Fixed resistance ";
  Buildings.Fluid.FixedResistances.FixedResistanceDpM res3(
    redeclare package Medium = MediumCW,
    m_flow_nominal=mCW_flow_nominal,
    dp_nominal=1000) "Fixed resistance ";
  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,
    dp1_nominal=59720,
    dp2_nominal=59720,
    eps=0.8) "Water side economizer (Heat exchanger)";
  Fluid.Actuators.Valves.TwoWayLinear           val5(
    redeclare package Medium = MediumCW,
    m_flow_nominal=mCW_flow_nominal,
    dp_nominal=44790) "Control valve for condenser water loop of chiller";
  Fluid.Actuators.Valves.TwoWayLinear                    val1(
    redeclare package Medium = MediumCHW,
    m_flow_nominal=mCHW_flow_nominal,
    dp_nominal=44790) 
    "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,
    dp1_nominal=89580,
    dp2_nominal=89580,
    per=Buildings.Fluid.Chillers.Data.ElectricEIR.ElectricEIRChiller_Carrier_19XR_823kW_6_28COP_Vanes());
  Fluid.Actuators.Valves.TwoWayLinear           val6(
    redeclare package Medium = MediumCHW,
    m_flow_nominal=mCHW_flow_nominal,
    dp_nominal=44790) "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.Fluid.FixedResistances.FixedResistanceDpM res2(
    redeclare package Medium = MediumCHW,
    dp_nominal=1000,
    m_flow_nominal=mCHW_flow_nominal) "Fixed resistance in chilled water loop";
  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";
  Buildings.Fluid.FixedResistances.FixedResistanceDpM res1(
    redeclare package Medium = MediumCHW,
    m_flow_nominal=mCHW_flow_nominal,
    dp_nominal=100) "Fixed resistance in CHW loop";
  Fluid.Actuators.Valves.TwoWayLinear           val4(
    redeclare package Medium = MediumCW,
    m_flow_nominal=mCW_flow_nominal,
    dp_nominal=44790) "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,
    dp_nominal=44790) 
    "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,
    dp_nominal=44790) 
    "Control valve for economizer. 0: disable economizer, 1: enable economoizer";
  Buildings.Fluid.FixedResistances.FixedResistanceDpM res5(
    redeclare package Medium = MediumCHW,
    dp_nominal=1000,
    m_flow_nominal=mCHW_flow_nominal,
    m_flow(fixed=true, start=mCHW_flow_nominal)) "Fixed resistance in CHW loop";
  Buildings.Fluid.Sensors.TemperatureTwoPort TWseCHWST(redeclare package Medium
      = MediumCHW, m_flow_nominal=mCHW_flow_nominal) 
    "Temperature of chilled water goes into the WSE";
  Buildings.Fluid.FixedResistances.FixedResistanceDpM res6(
    redeclare package Medium = MediumCHW,
    m_flow_nominal=mCHW_flow_nominal,
    dp_nominal=44990) "Fixed resistance in chilled water loop";
  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;
equation 
  connect(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(pumCW.port_b, res3.port_a);
  connect(res4.port_a, val5.port_b);
  connect(val5.port_a, chi.port_b1);
  connect(expVesChi.port_a, chi.port_b1);
  connect(val4.port_a, wse.port_b1);
  connect(val4.port_b, res4.port_a);
  connect(res2.port_b, chi.port_a2);
  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(res5.port_a, cooCoi.port_b1);
  connect(pumCHW.port_a, res5.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(wse.port_b2, res1.port_a);
  connect(TWseCHWST.port_a, pumCHW.port_b);
  connect(TChiCHWST.port_b, res2.port_a);
  connect(TChiCHWST.port_b, val2.port_a);
  connect(res1.port_b, TChiCHWST.port_a);
  connect(TChiCHWST.port_a, val1.port_b);
  connect(val1.port_a, TWseCHWST.port_b);
  connect(val3.port_a, TWseCHWST.port_b);
  connect(res4.port_b, cooTow.port_a);
  connect(res3.port_b, TChiCWST.port_a);
  connect(TChiCWST.port_b, chi.port_a1);
  connect(TChiCWST.port_b, wse.port_a1);
  connect(val2.port_b, res6.port_a);
  connect(res6.port_b, val6.port_b);
  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);
end PrimaryOnlyWithEconomizer;

Automatically generated Fri Nov 4 08:30:29 2011.