A air-cooled direct expansion (DX) cooling system with an airside economizer is used for a data center room.
For simplicity, the data center room has a constant cooling load. The DX cooling system includes a variable-speed
compressor, a cooling coil and a variable speed fun. The airside economizer is located before DX package to pre-cool
the mixed air.
This system can run in three cooling modes: free cooling (FC) mode, partially mechanical cooling (PMC) mode and
fully mechanical cooling (FMC) mode.In FC mode, only the airside economizer is commanded to run. The supply air
temperature is maintained by adjusting the outdoor air damper. In PMC mode, the airside economizer and the DX
cooling coil are commanded to run together. And in FMC mode, only the DX cooling coil is commanded to run.
To avoid frequent switching,
a deadband of 1 Kelvin and a waiting time of 120 s are used.
In FC mode, the supply air temperature is controlled by adjusting outdoor air damper. In PMC mode, the outdoor air
damper is fully open, and the speed of compressor in the DX unit can be adjusted to maintain the supply air temperature.
In FMC mode, the outdoor air damper is fully closed and the supply air temperature is maintained by manipulating the
compressor speed. In this case, the supply air temperature setpoint is set as 18 °C.
The room temperature is maintained at 24°C by adjusting the speed of the supply air fan.
model DXCooledAirsideEconomizer
extends Modelica.Icons.Example;
extends Buildings.Applications.DataCenters.ChillerCooled.Examples.BaseClasses.PostProcess
(
fulMecCooSig(y=
if cooModCon.y ==
Integer(Buildings.Applications.DataCenters.Types.CoolingModes.FullMechanical)
then 1
else 0),
parMecCooSig(y=
if cooModCon.y ==
Integer(Buildings.Applications.DataCenters.Types.CoolingModes.PartialMechanical)
then 1
else 0),
PHVAC(y=varSpeDX.P + fan.P),
PIT(y=roo.QRoo_flow),
freCooSig(y=
if cooModCon.y ==
Integer(Buildings.Applications.DataCenters.Types.CoolingModes.FreeCooling)
then 1
else 0));
replaceable package Medium =
Buildings.Media.Air;
parameter Modelica.SIunits.Temperature TASup_nominal=286.15 ;
parameter Modelica.SIunits.Temperature TRooSet=298.15 ;
parameter Modelica.SIunits.Temperature TAirSupSet=291.13 ;
parameter Modelica.SIunits.HeatFlowRate QRooInt_flow=500000 ;
parameter Modelica.SIunits.HeatFlowRate QRooC_flow_nominal=-2*QRooInt_flow;
parameter Modelica.SIunits.MassFlowRate mA_flow_nominal=QRooC_flow_nominal/1006
/(TASup_nominal - TRooSet) ;
parameter Modelica.SIunits.HeatFlowRate QCoiC_flow_nominal=QRooC_flow_nominal
;
parameter Real minSpeFan=0.2 ;
Buildings.Examples.ChillerPlant.BaseClasses.SimplifiedRoom roo(
redeclare package Medium =
Medium,
rooLen=50,
rooHei=3,
rooWid=40,
QRoo_flow=QRooInt_flow,
m_flow_nominal=mA_flow_nominal,
nPorts=2) ;
Buildings.Fluid.HeatExchangers.DXCoils.AirCooled.VariableSpeed varSpeDX(
redeclare package Medium =
Medium,
dp_nominal=400,
datCoi=datCoi,
minSpeRat=0,
energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial,
show_T=true,
T_start=303.15) ;
Buildings.BoundaryConditions.WeatherData.ReaderTMY3 weaDat(pAtmSou=Buildings.BoundaryConditions.Types.DataSource.Parameter,
filNam="modelica://Buildings/Resources/weatherdata/USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.mos")
;
Buildings.BoundaryConditions.WeatherData.Bus weaBus ;
Buildings.Fluid.Movers.SpeedControlled_y fan(
redeclare package Medium =
Medium,
energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState,
addPowerToMedium=false,
per(pressure(V_flow=mA_flow_nominal*{0,1,2}/1.2, dp=500*{2,1,0})),
use_inputFilter=true) ;
Modelica.Blocks.Sources.Constant TRooAirSet(k=TRooSet) ;
Buildings.Fluid.Sensors.TemperatureTwoPort senTemSupAir(
redeclare package
Medium =
Medium, m_flow_nominal=mA_flow_nominal) ;
Modelica.Blocks.Sources.Constant SATSetPoi(k=TAirSupSet) ;
Buildings.Fluid.HeatExchangers.DXCoils.AirCooled.Data.Generic.DXCoil datCoi(
nSta=4, sta={
Buildings.Fluid.HeatExchangers.DXCoils.AirCooled.Data.Generic.BaseClasses.Stage
(
spe=900/60,
nomVal=
Buildings.Fluid.HeatExchangers.DXCoils.AirCooled.Data.Generic.BaseClasses.NominalValues
(
Q_flow_nominal=QCoiC_flow_nominal*(3/8),
COP_nominal=3,
SHR_nominal=0.8,
TEvaIn_nominal=TRooSet,
m_flow_nominal=mA_flow_nominal),
perCur=
Buildings.Fluid.HeatExchangers.DXCoils.AirCooled.Examples.PerformanceCurves.Curve_I
()),
Buildings.Fluid.HeatExchangers.DXCoils.AirCooled.Data.Generic.BaseClasses.Stage
(
spe=1200/60,
nomVal=
Buildings.Fluid.HeatExchangers.DXCoils.AirCooled.Data.Generic.BaseClasses.NominalValues
(
Q_flow_nominal=QCoiC_flow_nominal*(1/2),
COP_nominal=3,
SHR_nominal=0.8,
TEvaIn_nominal=TRooSet,
m_flow_nominal=mA_flow_nominal),
perCur=
Buildings.Fluid.HeatExchangers.DXCoils.AirCooled.Examples.PerformanceCurves.Curve_I
()),
Buildings.Fluid.HeatExchangers.DXCoils.AirCooled.Data.Generic.BaseClasses.Stage
(
spe=1800/60,
nomVal=
Buildings.Fluid.HeatExchangers.DXCoils.AirCooled.Data.Generic.BaseClasses.NominalValues
(
Q_flow_nominal=QCoiC_flow_nominal*(3/4),
COP_nominal=3,
SHR_nominal=0.8,
TEvaIn_nominal=TRooSet,
m_flow_nominal=mA_flow_nominal),
perCur=
Buildings.Fluid.HeatExchangers.DXCoils.AirCooled.Examples.PerformanceCurves.Curve_II
()),
Buildings.Fluid.HeatExchangers.DXCoils.AirCooled.Data.Generic.BaseClasses.Stage
(
spe=2400/60,
nomVal=
Buildings.Fluid.HeatExchangers.DXCoils.AirCooled.Data.Generic.BaseClasses.NominalValues
(
Q_flow_nominal=QCoiC_flow_nominal,
COP_nominal=3,
SHR_nominal=0.8,
TEvaIn_nominal=TRooSet,
m_flow_nominal=mA_flow_nominal),
perCur=
Buildings.Fluid.HeatExchangers.DXCoils.AirCooled.Examples.PerformanceCurves.Curve_III
())}) ;
Buildings.Fluid.Actuators.Dampers.MixingBox eco(
redeclare package Medium =
Medium,
mOut_flow_nominal=mA_flow_nominal,
dpOut_nominal=20,
mRec_flow_nominal=mA_flow_nominal,
dpRec_nominal=20,
mExh_flow_nominal=mA_flow_nominal,
dpExh_nominal=20,
use_inputFilter=false) ;
Buildings.Fluid.Sources.Outside out(
redeclare package Medium =
Medium, nPorts
=2) ;
Buildings.Applications.DataCenters.DXCooled.Controls.CoolingMode cooModCon(dT
=1, tWai=120) ;
Buildings.Fluid.Actuators.Dampers.Exponential dam1(
redeclare package Medium
=
Medium, m_flow_nominal=mA_flow_nominal) ;
Buildings.Fluid.Actuators.Dampers.Exponential dam2(
redeclare package Medium =
Medium,
m_flow_nominal=mA_flow_nominal,
y_start=0) ;
Buildings.Fluid.Sensors.TemperatureTwoPort senTemMixAir(
redeclare package
Medium =
Medium, m_flow_nominal=mA_flow_nominal) ;
Buildings.Applications.DataCenters.DXCooled.Controls.AirsideEconomizer ecoCon(
minOAFra=0.05,
Ti=240,
gai=0.5) ;
Modelica.Blocks.Sources.RealExpression freCoo(y=
if cooModCon.y ==
Integer(
Buildings.Applications.DataCenters.Types.CoolingModes.FreeCooling)
then 1
else 0) ;
Modelica.Blocks.Math.Feedback feedback1 ;
Modelica.Blocks.Sources.Constant const(k=1) ;
Buildings.Controls.Continuous.LimPID fanSpe(
Td=1,
yMin=minSpeFan,
Ti=240,
k=0.5,
controllerType=Modelica.Blocks.Types.SimpleController.PI,
reverseAction=true) ;
Buildings.Applications.DataCenters.DXCooled.Controls.Compressor speCon(k=1,
Ti=120) ;
equation
connect(weaDat.weaBus, weaBus);
connect(fan.port_a, senTemSupAir.port_b);
connect(senTemSupAir.port_a, varSpeDX.port_b);
connect(weaBus, out.weaBus);
connect(dam2.port_b, varSpeDX.port_a);
connect(dam1.port_b, senTemSupAir.port_a);
connect(SATSetPoi.y, cooModCon.TSupSet);
connect(eco.port_Sup, senTemMixAir.port_a);
connect(senTemMixAir.port_b, dam1.port_a);
connect(senTemMixAir.port_b, dam2.port_a);
connect(SATSetPoi.y, ecoCon.TMixAirSet);
connect(senTemMixAir.T, ecoCon.TMixAirMea);
connect(ecoCon.y, eco.y);
connect(feedback1.y, dam2.y);
connect(out.ports[1], eco.port_Out);
connect(eco.port_Exh, out.ports[2]);
connect(weaBus.TDryBul, cooModCon.TOutDryBul);
connect(fan.port_b, roo.airPorts[1]);
connect(eco.port_Ret, roo.airPorts[2]);
connect(const.y, feedback1.u1);
connect(cooModCon.y, ecoCon.cooMod);
connect(TRooAirSet.y, fanSpe.u_s);
connect(roo.TRooAir, fanSpe.u_m);
connect(fanSpe.y, fan.y);
connect(roo.TRooAir, cooModCon.TRet);
connect(weaBus.TDryBul, varSpeDX.TConIn);
connect(cooModCon.y, sigCha.u);
connect(freCoo.y, dam1.y);
connect(freCoo.y, feedback1.u2);
connect(SATSetPoi.y, speCon.TMixAirSet);
connect(senTemSupAir.T, speCon.TMixAirMea);
connect(cooModCon.y, speCon.cooMod);
connect(speCon.y, varSpeDX.speRat);
end DXCooledAirsideEconomizer;