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
extends Modelica.Icons.Example;
replaceable package MediumA =
Buildings.Media.Air(T_default=293.15);
package MediumW =
Buildings.Media.Water ;
parameter Modelica.SIunits.Volume VRooCor=2698 ;
parameter Modelica.SIunits.Volume VRooSou=568.77 ;
parameter Modelica.SIunits.Volume VRooNor=568.77 ;
parameter Modelica.SIunits.Volume VRooEas=360.08 ;
parameter Modelica.SIunits.Volume VRooWes=360.08 ;
constant Real conv=1.2/3600 ;
parameter Modelica.SIunits.MassFlowRate m0_flow_cor=6*VRooCor*conv ;
parameter Modelica.SIunits.MassFlowRate m0_flow_sou=7*VRooSou*conv ;
parameter Modelica.SIunits.MassFlowRate m0_flow_eas=10*VRooEas*conv ;
parameter Modelica.SIunits.MassFlowRate m0_flow_nor=7*VRooNor*conv ;
parameter Modelica.SIunits.MassFlowRate m0_flow_wes=10*VRooWes*conv ;
parameter Modelica.SIunits.MassFlowRate m_flow_nominal=m0_flow_cor +
m0_flow_sou + m0_flow_eas + m0_flow_nor + m0_flow_wes ;
parameter Modelica.SIunits.Angle lat=41.98*3.14159/180 ;
Fluid.Sources.Outside amb(
redeclare package Medium =
MediumA, nPorts=2) ;
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) ;
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) ;
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) ;
Buildings.Fluid.FixedResistances.FixedResistanceDpM dpSupDuc(
m_flow_nominal=m_flow_nominal,
dh=1,
redeclare package Medium =
MediumA,
dp_nominal=20) ;
Buildings.Fluid.FixedResistances.FixedResistanceDpM dpRetDuc(
m_flow_nominal=m_flow_nominal,
use_dh=false,
dh=1,
redeclare package Medium =
MediumA,
dp_nominal=20) ;
Buildings.Fluid.Movers.SpeedControlled_y fanSup(
redeclare package Medium =
MediumA,
tau=60,
per(pressure(V_flow={0,m_flow_nominal/1.2*2}, dp={850,0})),
energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial) ;
Buildings.Fluid.Movers.SpeedControlled_y fanRet(
redeclare package Medium =
MediumA,
tau=60,
per(pressure(V_flow=m_flow_nominal/1.2*{0,2}, dp=1.5*110*{2,0})),
energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial) ;
Buildings.Fluid.Sources.FixedBoundary sinHea(
redeclare package Medium = MediumW,
p=300000,
T=318.15,
nPorts=1) ;
Buildings.Fluid.Sources.FixedBoundary sinCoo(
redeclare package Medium = MediumW,
p=300000,
T=285.15,
nPorts=1) ;
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) ;
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) ;
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) ;
Buildings.Fluid.Sensors.RelativePressure dpRetFan(
redeclare package Medium =
MediumA) ;
Controls.FanVFD conFanSup(xSet_nominal(displayUnit="Pa") = 410, r_N_min=0.2) ;
Buildings.Fluid.Sensors.VolumeFlowRate senSupFlo(
redeclare package Medium =
MediumA, m_flow_nominal=m_flow_nominal) ;
Buildings.Controls.SetPoints.OccupancySchedule occSch(occupancy=3600*{6,19}) ;
Controls.ModeSelector modeSelector;
Controls.ControlBus controlBus;
Buildings.Fluid.Sensors.TemperatureTwoPort TCoiHeaOut(
redeclare package
Medium =
MediumA, m_flow_nominal=m_flow_nominal) ;
Buildings.Utilities.Math.Min min(nin=5) ;
Buildings.Utilities.Math.Average ave(nin=5) ;
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) ;
Buildings.Fluid.Sources.FixedBoundary souCoo(
nPorts=1,
redeclare package Medium = MediumW,
p=3E5 + 12000,
T=285.15) ;
Controls.Economizer conEco(
dT=1,
VOut_flow_min=0.3*m_flow_nominal/1.2,
Ti=600,
k=0.1) ;
Buildings.Fluid.Sensors.TemperatureTwoPort TRet(
redeclare package Medium =
MediumA, m_flow_nominal=m_flow_nominal) ;
Buildings.Fluid.Sensors.TemperatureTwoPort TMix(
redeclare package Medium =
MediumA, m_flow_nominal=m_flow_nominal) ;
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) ;
Buildings.Fluid.Sources.FixedBoundary souHea(
nPorts=1,
redeclare package Medium = MediumW,
p(displayUnit="Pa") = 300000 + 12000,
T=318.15) ;
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) ;
Buildings.Fluid.Sensors.VolumeFlowRate VOut1(
redeclare package Medium =
MediumA, m_flow_nominal=m_flow_nominal) ;
Controls.DuctStaticPressureSetpoint pSetDuc(
nin=5,
controllerType=Modelica.Blocks.Types.SimpleController.PI,
pMin=50) ;
Buildings.Examples.VAVReheat.ThermalZones.VAVBranch
cor(
redeclare package MediumA =
MediumA,
redeclare package MediumW = MediumW,
m_flow_nominal=m0_flow_cor,
VRoo=VRooCor) ;
Buildings.Examples.VAVReheat.ThermalZones.VAVBranch
sou(
redeclare package MediumA =
MediumA,
redeclare package MediumW = MediumW,
m_flow_nominal=m0_flow_sou,
VRoo=VRooSou) ;
Buildings.Examples.VAVReheat.ThermalZones.VAVBranch
eas(
redeclare package MediumA =
MediumA,
redeclare package MediumW = MediumW,
m_flow_nominal=m0_flow_eas,
VRoo=VRooEas) ;
Buildings.Examples.VAVReheat.ThermalZones.VAVBranch
nor(
redeclare package MediumA =
MediumA,
redeclare package MediumW = MediumW,
m_flow_nominal=m0_flow_nor,
VRoo=VRooNor) ;
Buildings.Examples.VAVReheat.ThermalZones.VAVBranch
wes(
redeclare package MediumA =
MediumA,
redeclare package MediumW = MediumW,
m_flow_nominal=m0_flow_wes,
VRoo=VRooWes) ;
Controls.FanVFD conFanRet(xSet_nominal(displayUnit="m3/s") = m_flow_nominal/
1.2, r_N_min=0.2) ;
Buildings.Fluid.Sensors.VolumeFlowRate senRetFlo(
redeclare package Medium =
MediumA, m_flow_nominal=m_flow_nominal) ;
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,
linearized=true,
energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial) ;
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,
linearized=true,
energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial) ;
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,
linearized=true,
energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial) ;
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,
linearized=true,
energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial) ;
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) ;
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) ;
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) ;
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) ;
Controls.CoolingCoilTemperatureSetpoint TSetCoo ;
BoundaryConditions.WeatherData.ReaderTMY3 weaDat(filNam=
"modelica://Buildings/Resources/weatherdata/USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.mos");
BoundaryConditions.WeatherData.Bus weaBus ;
ThermalZones.Floor flo(
redeclare package Medium =
MediumA,
lat=lat) ;
Modelica.Blocks.Routing.DeMultiplex5 TRooAir ;
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;