Buildings.Templates.AirHandlersFans

Air handlers and fans

Information

This package contains templates for air handlers and fans.

Extends from Modelica.Icons.Package (Icon for standard packages).

Package Content

Name Description
Buildings.Templates.AirHandlersFans.VAVMultiZone VAVMultiZone Multiple-zone VAV
Buildings.Templates.AirHandlersFans.Components Components Package with component models
Buildings.Templates.AirHandlersFans.Configuration Configuration Records for configuration parameters
Buildings.Templates.AirHandlersFans.Data Data Records for design and operating parameters
Buildings.Templates.AirHandlersFans.Types Types Package with type definitions
Buildings.Templates.AirHandlersFans.Validation Validation Package with validation models
Buildings.Templates.AirHandlersFans.Interfaces Interfaces Interface classes

Buildings.Templates.AirHandlersFans.VAVMultiZone Buildings.Templates.AirHandlersFans.VAVMultiZone

Multiple-zone VAV

Buildings.Templates.AirHandlersFans.VAVMultiZone

Information

Description

This template represents a multiple-zone VAV air handler for a single duct system serving at least two terminal units.

The possible configuration options are enumerated in the table below. The user may refer to ASHRAE (2021) for further details. The first option displayed in bold characters corresponds to the default configuration.

Configuration parameterOptionsNotes
Outdoor air section Single damper for ventilation and economizer, with airflow measurement station
Separate dampers for ventilation and economizer, with airflow measurement station
Separate dampers for ventilation and economizer, with differential pressure sensor
Relief/return air section Return fan with modulating relief damper
Modulating relief damper without fan
Relief fan with two-position relief damper
Nonactuated barometric relief is currently not supported.
Supply fan - Blow-through position No fan
Single fan - Variable speed
Fan array - Variable speed
At least one supply fan must be specified, either in blow-through or draw-through position. Those two configurations are exclusive from one another.
ASHRAE Guideline 36 does not have any particular logic yet for handling fan arrays. If a fan array is selected, all of the fans are currently controlled together at the same speed, regardless of the number of VFDs.
Heating coil - Preheat position Hot water coil with two-way valve
Modulating electric heating coil
No coil
Cooling coil Chilled water coil with two-way valve
No coil
Heating coil - Reheat position No coil ASHRAE Guideline 36 does not support heating coils in reheat position yet.
Supply fan - Draw-through position Single fan - Variable speed
Fan array - Variable speed
No fan
At least one supply fan must be specified, either in blow-through or draw-through position. Those two configurations are exclusive from one another.
ASHRAE Guideline 36 does not have any particular logic yet for handling fan arrays. If a fan array is selected, all of the fans are currently controlled together at the same speed, regardless of the number of VFDs.
Return fan Single fan - Variable speed
Fan array - Variable speed
No fan
The relief fan and the return fan are both optional and they are exclusive from one another.
Relief fan No fan
Single fan - Variable speed
Fan array - Variable speed
The relief fan and the return fan are both optional and they are exclusive from one another.
Controller ASHRAE Guideline 36 controller An open loop controller is also available for validation purposes only.
Exhaust fan Not available: see note All exhaust fans that normally operate with the air handler must be configured separately, by means of a dedicated template.
Heat recovery Not available: see note Currently no heat recovery equipment is supported.

Simulation model assumptions and requirements

Pressure reference

The duct static pressure sensors use the outdoor absolute pressure as an approximation of the reference pressure in the mechanical room where the air handler is located.

When a building static pressure measurement is required by the control sequence (ctl.typCtlFanRet=AirHandlersFans.Types.ControlFanReturn.BuildingPressure), the corresponding sensor pBui_rel is instantiated within the current class. In this case, an additional variable pBui needs to be connected to the control bus to pass in the value of the absolute pressure in a representative space of the building. This is a modeling requirement, the actual control point remains the relative building static pressure.

References

Extends from Buildings.Templates.AirHandlersFans.Interfaces.PartialAirHandler (Interface class for air handler).

Parameters

TypeNameDefaultDescription
replaceable package MediumAirAirAir medium
replaceable package MediumChiWatWaterCHW medium
replaceable package MediumHeaWatWaterHHW medium
Configuration
ConfigurationtypBuildings.Templates.AirHandl...Type of system
Booleanhave_porRelsecOutRel.typ <> Types.Outdo...Set to true for relief (exhaust) fluid port
Booleanhave_souChiWatcoiCoo.have_souSet to true if system uses CHW
Booleanhave_souHeaWatcoiHeaPre.have_sou or coiHea...Set to true if system uses HHW
FantypFanSupif fanSupDra.typ <> Building...Type of supply fan
FantypFanRetsecOutRel.typFanRetType of return fan
FantypFanRelsecOutRel.typFanRelType of relief fan
IntegernFanSupif fanSupDra.typ <> Building...Number of supply fans
IntegernFanRetsecOutRel.nFanRetNumber of return fans
IntegernFanRelsecOutRel.nFanRelNumber of relief fans
MixedAirWithDampersecOutRelsecOutRel(redeclare final pa...Outdoor/relief/return air section
NonefanSupBloredeclare inner Buildings.Te...Supply fan - Blow through
SingleVariablefanSupDraredeclare inner Buildings.Te...Supply fan - Draw through
WaterBasedHeatingcoiHeaPrecoiHeaPre(redeclare final pa...Heating coil in preheat position
WaterBasedCoolingcoiCoocoiCoo(redeclare final packa...Cooling coil
NonecoiHeaRehredeclare inner Buildings.Te...Heating coil in reheat position
Nominal condition
MassFlowRatemChiWat_flow_nominalif coiCoo.have_sou then dat....Total CHW mass flow rate [kg/s]
MassFlowRatemHeaWat_flow_nominal(if coiHeaPre.have_sou then ...Total HHW mass flow rate [kg/s]
HeatFlowRateQChiWat_flow_nominalif coiCoo.have_sou then dat....Total CHW heat flow rate [W]
HeatFlowRateQHeaWat_flow_nominal(if coiHeaPre.have_sou then ...Total HHW heat flow rate [W]
Controls
G36VAVMultiZonectlredeclare inner Buildings.Te...Control selections
Dynamics
Conservation equations
DynamicsenergyDynamicsModelica.Fluid.Types.Dynamic...Type of energy balance: dynamic (3 initialization options) or steady state
Assumptions
BooleanallowFlowReversalLiqtrue= true to allow flow reversal, false restricts to design direction - CHW and HW side
Advanced
Diagnostics
Booleanshow_Tfalse= true, if actual temperature at ports of subcomponents is computed

Connectors

TypeNameDescription
FluidPort_aport_OutOutdoor air intake
FluidPort_bport_SupSupply air
FluidPort_bport_SupColDual duct cold deck air supply
FluidPort_bport_SupHotDual duct hot deck air supply
FluidPort_aport_RetReturn air
FluidPort_bport_RelRelief (exhaust) air
FluidPort_bport_bChiWatCHW return port
FluidPort_aport_aChiWatCHW supply port
FluidPort_bport_bHeaWatHHW return port
FluidPort_aport_aHeaWatHHW supply port
BusbusAHU control bus
BusbusWeaWeather bus
BusbusTer[nZon]Terminal unit control bus

Modelica definition

model VAVMultiZone "Multiple-zone VAV" /* HACK: In Dymola only (ticket SR00860858-01), bindings for the parameter record cannot be made final if propagation from a top-level record (whole building) is needed. Instead those parameter declarations are annoted with enable=false in the record class. */ extends Buildings.Templates.AirHandlersFans.Interfaces.PartialAirHandler( nZon(final min=2), redeclare final Buildings.Templates.AirHandlersFans.Configuration.VAVMultiZone cfg( final nFanSup=if fanSupDra.typ <> Buildings.Templates.Components.Types.Fan.None then fanSupDra.nFan elseif fanSupBlo.typ <> Buildings.Templates.Components.Types.Fan.None then fanSupBlo.nFan else 0, final nFanRet=secOutRel.nFanRet, final nFanRel=secOutRel.nFanRel, final typCoiHeaPre=coiHeaPre.typ, final typCoiCoo=coiCoo.typ, final typCoiHeaReh=coiHeaReh.typ, final typValCoiHeaPre=coiHeaPre.typVal, final typValCoiCoo=coiCoo.typVal, final typValCoiHeaReh=coiHeaReh.typVal, final typDamOut=secOutRel.typDamOut, final typDamOutMin=secOutRel.typDamOutMin, final typDamRet=secOutRel.typDamRet, final typDamRel=secOutRel.typDamRel, final typSecOut=secOutRel.typSecOut, final typCtl=ctl.typ, final buiPreCon=ctl.buiPreCon, final stdVen=ctl.stdVen), redeclare Buildings.Templates.AirHandlersFans.Data.VAVMultiZone dat, final typ=Buildings.Templates.AirHandlersFans.Types.Configuration.SingleDuct, final have_porRel=secOutRel.typ <> Types.OutdoorReliefReturnSection.MixedAirNoRelief, final have_souChiWat=coiCoo.have_sou, final have_souHeaWat=coiHeaPre.have_sou or coiHeaReh.have_sou, final typFanSup=if fanSupDra.typ <> Buildings.Templates.Components.Types.Fan.None then fanSupDra.typ elseif fanSupBlo.typ <> Buildings.Templates.Components.Types.Fan.None then fanSupBlo.typ else Buildings.Templates.Components.Types.Fan.None, final typFanRel=secOutRel.typFanRel, final typFanRet=secOutRel.typFanRet, final nFanSup=if fanSupDra.typ <> Buildings.Templates.Components.Types.Fan.None then fanSupDra.nFan elseif fanSupBlo.typ <> Buildings.Templates.Components.Types.Fan.None then fanSupBlo.nFan else 0, final nFanRel=secOutRel.nFanRel, final nFanRet=secOutRel.nFanRet, final mChiWat_flow_nominal=if coiCoo.have_sou then dat.coiCoo.mWat_flow_nominal else 0, final mHeaWat_flow_nominal=(if coiHeaPre.have_sou then dat.coiHeaPre.mWat_flow_nominal else 0) + (if coiHeaReh.have_sou then dat.coiHeaReh.mWat_flow_nominal else 0), final QChiWat_flow_nominal=if coiCoo.have_sou then dat.coiCoo.Q_flow_nominal else 0, final QHeaWat_flow_nominal=(if coiHeaPre.have_sou then dat.coiHeaPre.Q_flow_nominal else 0) + (if coiHeaReh.have_sou then dat.coiHeaReh.Q_flow_nominal else 0)); final parameter Boolean have_senPreBui= secOutRel.typSecRel==Buildings.Templates.AirHandlersFans.Types.ReliefReturnSection.ReliefDamper or secOutRel.typSecRel==Buildings.Templates.AirHandlersFans.Types.ReliefReturnSection.ReliefFan or secOutRel.typSecRel==Buildings.Templates.AirHandlersFans.Types.ReliefReturnSection.ReturnFan and secOutRel.typCtlFanRet==Buildings.Templates.AirHandlersFans.Types.ControlFanReturn.BuildingPressure "Set to true if building static pressure sensor is used"; /* RFE: Currently only the configuration with economizer is supported. Hence, no choices annotation, but still replaceable to access parameter dialog box of the component. */ inner replaceable Buildings.Templates.AirHandlersFans.Components.OutdoorReliefReturnSection.MixedAirWithDamper secOutRel( redeclare final package MediumAir = MediumAir, final typCtlFanRet=ctl.typCtlFanRet, final typCtlEco=ctl.typCtlEco, final energyDynamics=energyDynamics, final allowFlowReversal=allowFlowReversalAir, dat( final mOutMin_flow_nominal=dat.mOutMin_flow_nominal, final damOut=dat.damOut, final damOutMin=dat.damOutMin, final damRel=dat.damRel, final damRet=dat.damRet, final fanRel=dat.fanRel, final fanRet=dat.fanRet)) "Outdoor/relief/return air section"; Buildings.Templates.Components.Sensors.Temperature TAirMix( redeclare final package Medium = MediumAir, final have_sen=ctl.use_TMix, final typ=Buildings.Templates.Components.Types.SensorTemperature.Averaging, final m_flow_nominal=mAirSup_flow_nominal, final allowFlowReversal=allowFlowReversalAir) "Mixed air temperature sensor"; inner replaceable Buildings.Templates.Components.Fans.None fanSupBlo constrainedby Buildings.Templates.Components.Interfaces.PartialFan( redeclare final package Medium = MediumAir, final energyDynamics=energyDynamics, final allowFlowReversal=allowFlowReversalAir, final dat=dat.fanSup, final have_senFlo=ctl.typCtlFanRet== Buildings.Templates.AirHandlersFans.Types.ControlFanReturn.AirflowMeasured) "Supply fan - Blow through"; Buildings.Templates.Components.Sensors.Temperature TAirCoiHeaLvg( redeclare final package Medium = MediumAir, final have_sen=coiHeaPre.typ <> Buildings.Templates.Components.Types.Coil.None and coiCoo.typ <> Buildings.Templates.Components.Types.Coil.None, final typ=Buildings.Templates.Components.Types.SensorTemperature.Averaging, final m_flow_nominal=mAirSup_flow_nominal, final allowFlowReversal=allowFlowReversalAir) "Heating coil leaving air temperature sensor"; Buildings.Templates.Components.Sensors.Temperature TAirCoiCooLvg( redeclare final package Medium = MediumAir, final have_sen=coiCoo.typ <> Buildings.Templates.Components.Types.Coil.None and coiHeaReh.typ <> Buildings.Templates.Components.Types.Coil.None, final typ=Buildings.Templates.Components.Types.SensorTemperature.Averaging, final m_flow_nominal=mAirSup_flow_nominal, final allowFlowReversal=allowFlowReversalAir) "Cooling coil leaving air temperature sensor"; inner replaceable Buildings.Templates.Components.Fans.SingleVariable fanSupDra constrainedby Buildings.Templates.Components.Interfaces.PartialFan( redeclare final package Medium = MediumAir, final energyDynamics=energyDynamics, final allowFlowReversal=allowFlowReversalAir, final dat=dat.fanSup, final have_senFlo=ctl.typCtlFanRet== Buildings.Templates.AirHandlersFans.Types.ControlFanReturn.AirflowMeasured) "Supply fan - Draw through"; Buildings.Templates.Components.Sensors.Temperature TAirSup( redeclare final package Medium = MediumAir, final have_sen=true, final typ=Buildings.Templates.Components.Types.SensorTemperature.Standard, final m_flow_nominal=mAirSup_flow_nominal, final allowFlowReversal=allowFlowReversalAir) "Supply air temperature sensor"; Buildings.Templates.Components.Sensors.DifferentialPressure pBui_rel( redeclare final package Medium = MediumAir, final have_sen=have_senPreBui, final text_flip=true) "Building static pressure"; Buildings.Fluid.Sources.Outside out( redeclare final package Medium=MediumAir, final nPorts=3) "Outdoor conditions"; Buildings.Fluid.Sources.Boundary_pT bui( redeclare final package Medium = MediumAir, final use_p_in=have_senPreBui, final nPorts=1) "Building absolute pressure in representative space"; Buildings.Templates.Components.Sensors.Temperature TAirRet( redeclare final package Medium = MediumAir, final allowFlowReversal=allowFlowReversalAir, final have_sen= secOutRel.have_eco and (ctl.typCtlEco==Buildings.Controls.OBC.ASHRAE.G36.Types.ControlEconomizer.DifferentialDryBulb or ctl.typCtlEco==Buildings.Controls.OBC.ASHRAE.G36.Types.ControlEconomizer.FixedDryBulbWithDifferentialDryBulb), final typ=Buildings.Templates.Components.Types.SensorTemperature.Standard, final m_flow_nominal=mAirRet_flow_nominal) "Return air temperature sensor"; Buildings.Templates.Components.Sensors.SpecificEnthalpy hAirRet( redeclare final package Medium = MediumAir, final allowFlowReversal=allowFlowReversalAir, final have_sen= secOutRel.have_eco and ctl.typCtlEco==Buildings.Controls.OBC.ASHRAE.G36.Types.ControlEconomizer.DifferentialEnthalpyWithFixedDryBulb, final m_flow_nominal=mAirRet_flow_nominal) "Return air enthalpy sensor"; Buildings.Templates.Components.Sensors.DifferentialPressure pAirSup_rel( redeclare final package Medium = MediumAir, final have_sen=true) "Duct static pressure sensor"; inner replaceable Buildings.Templates.Components.Coils.WaterBasedHeating coiHeaPre( redeclare final package MediumHeaWat=MediumHeaWat, final typVal=Buildings.Templates.Components.Types.Valve.TwoWayModulating) constrainedby Buildings.Templates.Components.Interfaces.PartialCoil( final dat=dat.coiHeaPre, redeclare final package MediumAir=MediumAir, final energyDynamics=energyDynamics, final allowFlowReversalAir=allowFlowReversalAir, final allowFlowReversalLiq=allowFlowReversalLiq, final show_T=show_T) "Heating coil in preheat position"; inner replaceable Buildings.Templates.Components.Coils.WaterBasedCooling coiCoo( redeclare final package MediumChiWat=MediumChiWat, final typVal=Buildings.Templates.Components.Types.Valve.TwoWayModulating) constrainedby Buildings.Templates.Components.Interfaces.PartialCoil( final dat=dat.coiCoo, redeclare final package MediumAir=MediumAir, final energyDynamics=energyDynamics, final allowFlowReversalAir=allowFlowReversalAir, final allowFlowReversalLiq=allowFlowReversalLiq, final show_T=show_T) "Cooling coil"; inner replaceable Buildings.Templates.Components.Coils.None coiHeaReh constrainedby Buildings.Templates.Components.Interfaces.PartialCoil( final dat=dat.coiHeaReh, redeclare final package MediumAir=MediumAir, final energyDynamics=energyDynamics, final allowFlowReversalAir=allowFlowReversalAir, final allowFlowReversalLiq=allowFlowReversalLiq, final show_T=show_T) "Heating coil in reheat position"; Buildings.Fluid.FixedResistances.Junction junHeaWatSup( redeclare final package Medium = MediumHeaWat, final m_flow_nominal=mHeaWat_flow_nominal*{1,-1,-1}, energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, dp_nominal=fill(0, 3), final portFlowDirection_1=if allowFlowReversalLiq then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Entering, final portFlowDirection_2=if allowFlowReversalLiq then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Leaving, final portFlowDirection_3=if allowFlowReversalLiq then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Leaving) if have_souHeaWat "HHW supply junction"; Buildings.Fluid.FixedResistances.Junction junHeaWatRet( redeclare final package Medium = MediumHeaWat, final m_flow_nominal=mHeaWat_flow_nominal*{1,-1,1}, energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, dp_nominal=fill(0, 3), final portFlowDirection_1=if allowFlowReversalLiq then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Entering, final portFlowDirection_2=if allowFlowReversalLiq then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Entering, final portFlowDirection_3=if allowFlowReversalLiq then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Leaving) if have_souHeaWat "HHW return junction"; inner replaceable Buildings.Templates.AirHandlersFans.Components.Controls.G36VAVMultiZone ctl constrainedby Buildings.Templates.AirHandlersFans.Components.Interfaces.PartialControllerVAVMultizone ( final dat=dat.ctl, final nZon=nZon, final typFanSup=typFanSup, final typFanRel=typFanRel, final typFanRet=typFanRet, final nFanSup=nFanSup, final nFanRel=nFanRel, final nFanRet=nFanRet) "Control selections"; initial equation assert(typFanSup<>Buildings.Templates.Components.Types.Fan.None, "In "+ getInstanceName() + ": "+ "The template is configured with no supply fan, which is not supported."); assert(not (fanSupBlo.typ<>Buildings.Templates.Components.Types.Fan.None and fanSupDra.typ<>Buildings.Templates.Components.Types.Fan.None), "In "+ getInstanceName() + ": "+ "The template is configured with both a blow-through fan and a draw-through fan, which is not supported."); equation /* Control point connection - start */ connect(TAirMix.y, bus.TAirMix); connect(TAirCoiHeaLvg.y, bus.TAirCoiHeaLvg); connect(TAirSup.y, bus.TAirSup); connect(pAirSup_rel.y, bus.pAirSup_rel); connect(hAirRet.y, bus.hAirRet); connect(TAirRet.y, bus.TAirRet); connect(fanSupDra.bus, bus.fanSup); connect(fanSupBlo.bus, bus.fanSup); connect(coiHeaPre.bus, bus.coiHea); connect(coiCoo.bus, bus.coiCoo); connect(coiHeaReh.bus, bus.coiHea); connect(secOutRel.bus, bus); connect(bui.p_in, bus.pBui); connect(pBui_rel.y, bus.pBui_rel); /* Control point connection - stop */ connect(port_aChiWat, coiCoo.port_aSou); connect(coiCoo.port_bSou, port_bChiWat); connect(busWea,coiCoo.busWea); connect(TAirMix.port_b, fanSupBlo.port_a); connect(coiHeaReh.port_b, fanSupDra.port_a); connect(busWea, out.weaBus); connect(pBui_rel.port_b, out.ports[1]); connect(bui.ports[1], pBui_rel.port_a); connect(ctl.busTer, busTer); connect(ctl.bus, bus); connect(port_Ret, hAirRet.port_a); connect(hAirRet.port_b, TAirRet.port_a); connect(coiHeaPre.port_b, TAirCoiHeaLvg.port_a); connect(TAirCoiHeaLvg.port_b, coiCoo.port_a); connect(coiCoo.port_b, TAirCoiCooLvg.port_a); connect(TAirCoiCooLvg.port_b, coiHeaReh.port_a); connect(secOutRel.port_Sup, TAirMix.port_a); connect(secOutRel.port_bPre, out.ports[2]); connect(port_Rel, secOutRel.port_Rel); connect(port_Out, secOutRel.port_Out); connect(TAirSup.port_b, port_Sup); connect(TAirSup.port_b, pAirSup_rel.port_a); connect(fanSupDra.port_b, TAirSup.port_a); connect(port_aHeaWat, junHeaWatSup.port_1); connect(port_bHeaWat, junHeaWatRet.port_2); connect(junHeaWatSup.port_3, coiHeaReh.port_aSou); connect(coiHeaReh.port_bSou, junHeaWatRet.port_3); connect(coiHeaPre.port_bSou, junHeaWatRet.port_1); connect(junHeaWatSup.port_2, coiHeaPre.port_aSou); connect(out.ports[3], pAirSup_rel.port_b); connect(secOutRel.port_Ret, TAirRet.port_b); connect(fanSupBlo.port_b, coiHeaPre.port_a); end VAVMultiZone;