This model consist of an HVAC system, a building envelope model and a model
for air flow through building leakage and through open doors based
on wind pressure and flow imbalance of the HVAC system.
The HVAC system is a variable air volume (VAV) flow system with economizer
and a heating and cooling coil in the air handler unit. There is also a
reheat coil and an air damper in each of the five zone inlet branches.
The figure below shows the schematic diagram of the HVAC system
To model the heat transfer through the building envelope,
a model of five interconnected rooms is used.
The five room model is representative of one floor of the
new construction medium office building for Chicago, IL,
as described in the set of DOE Commercial Building Benchmarks
(Deru et al, 2009). There are four perimeter zones and one core zone.
The envelope thermal properties meet ASHRAE Standard 90.1-2004.
The thermal room model computes transient heat conduction through
walls, floors and ceilings and long-wave radiative heat exchange between
surfaces. The convective heat transfer coefficient is computed based
on the temperature difference between the surface and the room air.
There is also a layer-by-layer short-wave radiation,
long-wave radiation, convection and conduction heat transfer model for the
windows. The model is similar to the
Window 5 model and described in TARCOG 2006.
Each thermal zone can have air flow from the HVAC system, through leakages of the building envelope (except for the core zone) and through bi-directional air exchange through open doors that connect adjacent zones. The bi-directional air exchange is modeled based on the differences in static pressure between adjacent rooms at a reference height plus the difference in static pressure across the door height as a function of the difference in air density.
There is also wind pressure acting on each facade. The wind pressure is a function
of the wind speed and wind direction. Therefore, infiltration is a function of the
flow imbalance of the HVAC system and of the wind conditions.
ASHRAE.
Sequences of Operation for Common HVAC Systems.
ASHRAE, Atlanta, GA, 2006.
Deru M., K. Field, D. Studer, K. Benne, B. Griffith, P. Torcellini,
M. Halverson, D. Winiarski, B. Liu, M. Rosenberg, J. Huang, M. Yazdanian, and D. Crawley.
DOE commercial building research benchmarks for commercial buildings.
Technical report, U.S. Department of Energy, Energy Efficiency and
Renewable Energy, Office of Building Technologies, Washington, DC, 2009.
TARCOG 2006: Carli, Inc., TARCOG: Mathematical models for calculation
of thermal performance of glazing systems with our without
shading devices, Technical Report, Oct. 17, 2006.
model ClosedLoop
"Variable air volume flow system with terminal reheat and five thermal zones"
extends Modelica.Icons.Example;
replaceable package MediumA =
Buildings.Media.Air;
package MediumW =
Buildings.Media.Water "Medium model for water";
parameter Modelica.SIunits.Volume VRooCor=2698
"Room volume corridor";
parameter Modelica.SIunits.Volume VRooSou=568.77
"Room volume south";
parameter Modelica.SIunits.Volume VRooNor=568.77
"Room volume north";
parameter Modelica.SIunits.Volume VRooEas=360.08
"Room volume east";
parameter Modelica.SIunits.Volume VRooWes=360.08
"Room volume west";
constant Real conv=1.2/3600
"Conversion factor for nominal mass flow rate";
parameter Modelica.SIunits.MassFlowRate m0_flow_cor=6*VRooCor*conv
"Design mass flow rate core";
parameter Modelica.SIunits.MassFlowRate m0_flow_sou=7*VRooSou*conv
"Design mass flow rate perimeter 1";
parameter Modelica.SIunits.MassFlowRate m0_flow_eas=10*VRooEas*conv
"Design mass flow rate perimeter 2";
parameter Modelica.SIunits.MassFlowRate m0_flow_nor=7*VRooNor*conv
"Design mass flow rate perimeter 3";
parameter Modelica.SIunits.MassFlowRate m0_flow_wes=10*VRooWes*conv
"Design mass flow rate perimeter 4";
parameter Modelica.SIunits.MassFlowRate m_flow_nominal=m0_flow_cor +
m0_flow_sou + m0_flow_eas + m0_flow_nor + m0_flow_wes
"Nominal mass flow rate";
parameter Modelica.SIunits.Angle lat=41.98*3.14159/180
"Latitude";
Fluid.Sources.Outside amb(
redeclare package Medium =
MediumA, nPorts=2)
"Ambient conditions";
Buildings.Fluid.FixedResistances.FixedResistanceDpM fil(
m_flow_nominal=m_flow_nominal,
redeclare package Medium =
MediumA,
dp_nominal=200 + 200 + 100,
from_dp=false,
linearized=false)
"Filter";
Buildings.Fluid.HeatExchangers.DryEffectivenessNTU heaCoi(
redeclare package Medium1 =
MediumA,
redeclare package Medium2 = MediumW,
m1_flow_nominal=m_flow_nominal,
allowFlowReversal2=false,
m2_flow_nominal=m_flow_nominal*1000*(10 - (-20))/4200/10,
configuration=Buildings.Fluid.Types.HeatExchangerConfiguration.CounterFlow,
Q_flow_nominal=m_flow_nominal*1006*(16.7 - 8.5),
dp1_nominal=0,
dp2_nominal=0,
T_a1_nominal=281.65,
T_a2_nominal=323.15)
"Heating coil";
Buildings.Fluid.HeatExchangers.WetCoilCounterFlow cooCoi(
UA_nominal=m_flow_nominal*1000*15/
Buildings.Fluid.HeatExchangers.BaseClasses.lmtd(
T_a1=26.2,
T_b1=12.8,
T_a2=6,
T_b2=16),
redeclare package Medium1 = MediumW,
redeclare package Medium2 =
MediumA,
m1_flow_nominal=m_flow_nominal*1000*15/4200/10,
m2_flow_nominal=m_flow_nominal,
dp2_nominal=0,
dp1_nominal=0,
energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial)
"Cooling coil";
Buildings.Fluid.FixedResistances.FixedResistanceDpM dpSupDuc(
m_flow_nominal=m_flow_nominal,
dh=1,
redeclare package Medium =
MediumA,
dp_nominal=20)
"Pressure drop for supply duct";
Buildings.Fluid.FixedResistances.FixedResistanceDpM dpRetDuc(
m_flow_nominal=m_flow_nominal,
use_dh=false,
dh=1,
redeclare package Medium =
MediumA,
dp_nominal=20)
"Pressure drop for return duct";
Buildings.Fluid.Movers.SpeedControlled_y fanSup(
redeclare package Medium =
MediumA,
tau=60,
dynamicBalance=true,
per(pressure(V_flow={0, m_flow_nominal/1.2*2}, dp={850,0})),
energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial)
"Supply air fan";
Buildings.Fluid.Movers.SpeedControlled_y fanRet(
redeclare package Medium =
MediumA,
tau=60,
dynamicBalance=true,
per(pressure(V_flow=m_flow_nominal/1.2*{0, 2}, dp=1.5*110*{2,0})),
energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial)
"Return air fan";
Buildings.Fluid.Sources.FixedBoundary sinHea(
redeclare package Medium = MediumW,
p=300000,
T=318.15,
nPorts=1)
"Sink for heating coil";
Buildings.Fluid.Sources.FixedBoundary sinCoo(
redeclare package Medium = MediumW,
p=300000,
T=285.15,
nPorts=1)
"Sink for cooling coil";
Modelica.Blocks.Routing.RealPassThrough TOut(y(
final quantity="ThermodynamicTemperature",
final unit="K",
displayUnit="degC",
min=0));
Buildings.Fluid.Sensors.TemperatureTwoPort TSup(
redeclare package Medium =
MediumA, m_flow_nominal=m_flow_nominal);
Modelica.Blocks.Sources.Constant TSupSetHea(y(
final quantity="ThermodynamicTemperature",
final unit="K",
displayUnit="degC",
min=0), k=273.15 + 10)
"Supply air temperature setpoint for heating";
Buildings.Controls.Continuous.LimPID heaCoiCon(
yMax=1,
yMin=0,
Td=60,
initType=Modelica.Blocks.Types.InitPID.InitialState,
controllerType=Modelica.Blocks.Types.SimpleController.PI,
Ti=600,
k=0.01)
"Controller for heating coil";
Buildings.Controls.Continuous.LimPID cooCoiCon(
reverseAction=true,
Td=60,
initType=Modelica.Blocks.Types.InitPID.InitialState,
yMax=1,
yMin=0,
controllerType=Modelica.Blocks.Types.SimpleController.PI,
Ti=600,
k=0.01)
"Controller for cooling coil";
Buildings.Fluid.Sensors.RelativePressure dpRetFan(
redeclare package Medium =
MediumA)
"Pressure difference over return fan";
Controls.FanVFD conFanSup(xSet_nominal(displayUnit="Pa") = 410, r_N_min=0.2)
"Controller for fan";
Buildings.Fluid.Sensors.VolumeFlowRate senSupFlo(
redeclare package Medium =
MediumA, m_flow_nominal=m_flow_nominal)
"Sensor for supply fan flow rate";
Buildings.Controls.SetPoints.OccupancySchedule occSch(occupancy=3600*{6,19})
"Occupancy schedule";
Controls.ModeSelector modeSelector;
Controls.ControlBus controlBus;
Buildings.Fluid.Sensors.TemperatureTwoPort TCoiHeaOut(
redeclare package
Medium =
MediumA, m_flow_nominal=m_flow_nominal)
"Heating coil outlet temperature";
Buildings.Utilities.Math.Min min(nin=5)
"Computes lowest room temperature";
Buildings.Utilities.Math.Average ave(nin=5)
"Compute average of room temperatures";
Buildings.Fluid.Actuators.Valves.TwoWayLinear valCoo(
redeclare package Medium = MediumW,
CvData=Buildings.Fluid.Types.CvTypes.OpPoint,
m_flow_nominal=m_flow_nominal*1000*15/4200/10,
dpValve_nominal=6000,
from_dp=true,
dpFixed_nominal=6000)
"Cooling coil valve";
Buildings.Fluid.Sources.FixedBoundary souCoo(
nPorts=1,
redeclare package Medium = MediumW,
p=3E5 + 12000,
T=285.15)
"Source for cooling coil";
Controls.Economizer conEco(
dT=1,
VOut_flow_min=0.3*m_flow_nominal/1.2,
Ti=600,
k=0.1)
"Controller for economizer";
Buildings.Fluid.Sensors.TemperatureTwoPort TRet(
redeclare package Medium =
MediumA, m_flow_nominal=m_flow_nominal)
"Return air temperature sensor";
Buildings.Fluid.Sensors.TemperatureTwoPort TMix(
redeclare package Medium =
MediumA, m_flow_nominal=m_flow_nominal)
"Mixed air temperature sensor";
Controls.RoomTemperatureSetpoint TSetRoo;
Buildings.Fluid.Actuators.Valves.TwoWayLinear valHea(
redeclare package Medium = MediumW,
CvData=Buildings.Fluid.Types.CvTypes.OpPoint,
dpValve_nominal=6000,
m_flow_nominal=m_flow_nominal*1000*40/4200/10,
from_dp=true,
dpFixed_nominal=6000)
"Heating coil valve";
Buildings.Fluid.Sources.FixedBoundary souHea(
nPorts=1,
redeclare package Medium = MediumW,
p(displayUnit="Pa") = 300000 + 12000,
T=318.15)
"Source for heating coil";
Buildings.Fluid.Actuators.Dampers.MixingBox eco(
redeclare package Medium =
MediumA,
mOut_flow_nominal=m_flow_nominal,
mRec_flow_nominal=m_flow_nominal,
mExh_flow_nominal=m_flow_nominal,
dpOut_nominal=10,
dpRec_nominal=10,
dpExh_nominal=10)
"Economizer";
Buildings.Fluid.Sensors.VolumeFlowRate VOut1(
redeclare package Medium =
MediumA, m_flow_nominal=m_flow_nominal)
"Outside air volume flow rate";
Controls.DuctStaticPressureSetpoint pSetDuc(
nin=5,
controllerType=Modelica.Blocks.Types.SimpleController.PI,
pMin=50)
"Duct static pressure setpoint";
Buildings.Examples.VAVReheat.ThermalZones.VAVBranch
cor(
redeclare package MediumA =
MediumA,
redeclare package MediumW = MediumW,
m_flow_nominal=m0_flow_cor,
VRoo=VRooCor)
"Zone for core of buildings (azimuth will be neglected)";
Buildings.Examples.VAVReheat.ThermalZones.VAVBranch
sou(
redeclare package MediumA =
MediumA,
redeclare package MediumW = MediumW,
m_flow_nominal=m0_flow_sou,
VRoo=VRooSou)
"South-facing thermal zone";
Buildings.Examples.VAVReheat.ThermalZones.VAVBranch
eas(
redeclare package MediumA =
MediumA,
redeclare package MediumW = MediumW,
m_flow_nominal=m0_flow_eas,
VRoo=VRooEas)
"East-facing thermal zone";
Buildings.Examples.VAVReheat.ThermalZones.VAVBranch
nor(
redeclare package MediumA =
MediumA,
redeclare package MediumW = MediumW,
m_flow_nominal=m0_flow_nor,
VRoo=VRooNor)
"North-facing thermal zone";
Buildings.Examples.VAVReheat.ThermalZones.VAVBranch
wes(
redeclare package MediumA =
MediumA,
redeclare package MediumW = MediumW,
m_flow_nominal=m0_flow_wes,
VRoo=VRooWes)
"West-facing thermal zone";
Controls.FanVFD conFanRet(xSet_nominal(displayUnit="m3/s") = m_flow_nominal/
1.2, r_N_min=0.2)
"Controller for fan";
Buildings.Fluid.Sensors.VolumeFlowRate senRetFlo(
redeclare package Medium =
MediumA, m_flow_nominal=m_flow_nominal)
"Sensor for return fan flow rate";
Buildings.Fluid.FixedResistances.SplitterFixedResistanceDpM splRetRoo1(
redeclare package Medium =
MediumA,
m_flow_nominal={m_flow_nominal,m_flow_nominal - m0_flow_cor,m0_flow_cor},
dp_nominal(displayUnit="Pa") = {10,10,10},
from_dp=false,
dynamicBalance=true,
linearized=true,
energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial)
"Splitter for room return";
Buildings.Fluid.FixedResistances.SplitterFixedResistanceDpM splRetSou(
redeclare package Medium =
MediumA,
m_flow_nominal={m0_flow_sou + m0_flow_eas + m0_flow_nor + m0_flow_wes,
m0_flow_eas + m0_flow_nor + m0_flow_wes,m0_flow_sou},
dp_nominal(displayUnit="Pa") = {10,10,10},
from_dp=false,
dynamicBalance=true,
linearized=true,
energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial)
"Splitter for room return";
Buildings.Fluid.FixedResistances.SplitterFixedResistanceDpM splRetEas(
redeclare package Medium =
MediumA,
m_flow_nominal={m0_flow_eas + m0_flow_nor + m0_flow_wes,m0_flow_nor +
m0_flow_wes,m0_flow_eas},
dp_nominal(displayUnit="Pa") = {10,10,10},
from_dp=false,
dynamicBalance=true,
linearized=true,
energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial)
"Splitter for room return";
Buildings.Fluid.FixedResistances.SplitterFixedResistanceDpM splRetNor(
redeclare package Medium =
MediumA,
m_flow_nominal={m0_flow_nor + m0_flow_wes,m0_flow_wes,m0_flow_nor},
dp_nominal(displayUnit="Pa") = {10,10,10},
from_dp=false,
dynamicBalance=true,
linearized=true,
energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial)
"Splitter for room return";
Buildings.Fluid.FixedResistances.SplitterFixedResistanceDpM splSupRoo1(
redeclare package Medium =
MediumA,
m_flow_nominal={m_flow_nominal,m_flow_nominal - m0_flow_cor,m0_flow_cor},
dp_nominal(displayUnit="Pa") = {10,10,10},
from_dp=true,
linearized=true,
energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial)
"Splitter for room supply";
Buildings.Fluid.FixedResistances.SplitterFixedResistanceDpM splSupSou(
redeclare package Medium =
MediumA,
m_flow_nominal={m0_flow_sou + m0_flow_eas + m0_flow_nor + m0_flow_wes,
m0_flow_eas + m0_flow_nor + m0_flow_wes,m0_flow_sou},
dp_nominal(displayUnit="Pa") = {10,10,10},
from_dp=true,
linearized=true,
energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial)
"Splitter for room supply";
Buildings.Fluid.FixedResistances.SplitterFixedResistanceDpM splSupEas(
redeclare package Medium =
MediumA,
m_flow_nominal={m0_flow_eas + m0_flow_nor + m0_flow_wes,m0_flow_nor +
m0_flow_wes,m0_flow_eas},
dp_nominal(displayUnit="Pa") = {10,10,10},
from_dp=true,
linearized=true,
energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial)
"Splitter for room supply";
Buildings.Fluid.FixedResistances.SplitterFixedResistanceDpM splSupNor(
redeclare package Medium =
MediumA,
m_flow_nominal={m0_flow_nor + m0_flow_wes,m0_flow_wes,m0_flow_nor},
dp_nominal(displayUnit="Pa") = {10,10,10},
from_dp=true,
linearized=true,
energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial)
"Splitter for room supply";
Controls.CoolingCoilTemperatureSetpoint TSetCoo
"Setpoint for cooling coil";
BoundaryConditions.WeatherData.ReaderTMY3 weaDat(filNam=
"modelica://Buildings/Resources/weatherdata/USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.mos");
BoundaryConditions.WeatherData.Bus weaBus
"Weather Data Bus";
ThermalZones.Floor flo(
redeclare package Medium =
MediumA,
lat=lat)
"Model of a floor of the building that is served by this VAV system";
Modelica.Blocks.Routing.DeMultiplex5 TRooAir
"Demultiplex for room air temperature";
equation
connect(fil.port_b, heaCoi.port_a1);
connect(TSupSetHea.y, heaCoiCon.u_s);
connect(fanRet.port_a, dpRetFan.port_b);
connect(fanSup.port_b, dpRetFan.port_a);
connect(senSupFlo.port_b, dpSupDuc.port_a);
connect(controlBus, modeSelector.cb);
connect(occSch.tNexOcc, controlBus.dTNexOcc);
connect(TOut.y, controlBus.TOut);
connect(occSch.occupied, controlBus.occupied);
connect(min.y, controlBus.TRooMin);
connect(ave.y, controlBus.TRooAve);
connect(controlBus, conFanSup.controlBus);
connect(valCoo.port_a, souCoo.ports[1]);
connect(TRet.T, conEco.TRet);
connect(TMix.T, conEco.TMix);
connect(conEco.TSupHeaSet, TSupSetHea.y);
connect(controlBus, conEco.controlBus);
connect(TSetRoo.controlBus, controlBus);
connect(TSup.port_a, fanSup.port_b);
connect(TSup.port_b, senSupFlo.port_a);
connect(fil.port_a, TMix.port_b);
connect(conFanSup.y, fanSup.y);
connect(cor.controlBus, controlBus);
connect(sou.controlBus, controlBus);
connect(eas.controlBus, controlBus);
connect(nor.controlBus, controlBus);
connect(wes.controlBus, controlBus);
connect(TCoiHeaOut.T, heaCoiCon.u_m);
connect(souHea.ports[1], valHea.port_a);
connect(heaCoiCon.y, valHea.y);
connect(valHea.port_b, heaCoi.port_a2);
connect(heaCoi.port_b2, sinHea.ports[1]);
connect(cooCoiCon.y, valCoo.y);
connect(eco.port_Exh, amb.ports[1]);
connect(amb.ports[2], VOut1.port_a);
connect(VOut1.port_b, eco.port_Out);
connect(dpRetFan.p_rel, conFanSup.u_m);
connect(eco.port_Sup, TMix.port_a);
connect(pSetDuc.y, conFanSup.u);
connect(cor.yDam, pSetDuc.u[1]);
connect(sou.yDam, pSetDuc.u[2]);
connect(eas.yDam, pSetDuc.u[3]);
connect(nor.yDam, pSetDuc.u[4]);
connect(wes.yDam, pSetDuc.u[5]);
connect(heaCoi.port_b1, TCoiHeaOut.port_a);
connect(controlBus, conFanRet.controlBus);
connect(senSupFlo.V_flow, conFanRet.u);
connect(senRetFlo.port_b, fanRet.port_a);
connect(senRetFlo.V_flow, conFanRet.u_m);
connect(conFanRet.y, fanRet.y);
connect(dpRetDuc.port_b, senRetFlo.port_a);
connect(TRet.port_b, eco.port_Ret);
connect(TRet.port_a, fanRet.port_b);
connect(splRetRoo1.port_1, dpRetDuc.port_a);
connect(splRetNor.port_1, splRetEas.port_2);
connect(splRetEas.port_1, splRetSou.port_2);
connect(splRetSou.port_1, splRetRoo1.port_2);
connect(dpSupDuc.port_b, splSupRoo1.port_1);
connect(splSupRoo1.port_3, cor.port_a);
connect(splSupRoo1.port_2, splSupSou.port_1);
connect(splSupSou.port_3, sou.port_a);
connect(splSupSou.port_2, splSupEas.port_1);
connect(splSupEas.port_3, eas.port_a);
connect(splSupEas.port_2, splSupNor.port_1);
connect(splSupNor.port_3, nor.port_a);
connect(splSupNor.port_2, wes.port_a);
connect(TCoiHeaOut.port_b, cooCoi.port_a2);
connect(valCoo.port_b, cooCoi.port_a1);
connect(cooCoi.port_b1, sinCoo.ports[1]);
connect(TSetCoo.TSet, cooCoiCon.u_s);
connect(TSetCoo.TSet, conEco.TSupCooSet);
connect(TSupSetHea.y, TSetCoo.TSetHea);
connect(modeSelector.cb, TSetCoo.controlBus);
connect(conEco.VOut_flow, VOut1.V_flow);
connect(weaDat.weaBus, weaBus);
connect(weaBus.TDryBul, TOut.u);
connect(amb.weaBus, weaBus);
connect(weaBus.TDryBul, pSetDuc.TOut);
connect(cor.port_b, flo.portsCor[1]);
connect(splRetRoo1.port_3, flo.portsCor[2]);
connect(sou.port_b, flo.portsSou[1]);
connect(splRetSou.port_3, flo.portsSou[2]);
connect(eas.port_b, flo.portsEas[1]);
connect(splRetEas.port_3, flo.portsEas[2]);
connect(nor.port_b, flo.portsNor[1]);
connect(splRetNor.port_3, flo.portsNor[2]);
connect(wes.port_b, flo.portsWes[1]);
connect(splRetNor.port_2, flo.portsWes[2]);
connect(weaBus, flo.weaBus);
connect(flo.TRooAir, min.u);
connect(flo.TRooAir, ave.u);
connect(TRooAir.y1[1], sou.TRoo);
connect(TRooAir.y2[1], eas.TRoo);
connect(TRooAir.y3[1], nor.TRoo);
connect(TRooAir.y4[1], wes.TRoo);
connect(TRooAir.y5[1], cor.TRoo);
connect(TRooAir.u, flo.TRooAir);
connect(TSup.T, cooCoiCon.u_m);
connect(cooCoi.port_b2, fanSup.port_a);
connect(conEco.yOA, eco.y);
end ClosedLoop;