Buildings.Controls.OBC.ASHRAE.G36.VentilationZones.ASHRAE62_1

Sequences complying ASHRAE62.1

Information

This package contains sequences that specify the zone minimum outdoor air and minimum airflow set points, for compliance with the Ventilation Rate Procedure of ASHRAE Standard 62.1.

Package Content

Name Description
Buildings.Controls.OBC.ASHRAE.G36.VentilationZones.ASHRAE62_1.Setpoints Setpoints Specify zone minimum outdoor air and minimum airflow set points for compliance with ASHRAE standard 62.1
Buildings.Controls.OBC.ASHRAE.G36.VentilationZones.ASHRAE62_1.Validation Validation Collection of validation models

Buildings.Controls.OBC.ASHRAE.G36.VentilationZones.ASHRAE62_1.Setpoints Buildings.Controls.OBC.ASHRAE.G36.VentilationZones.ASHRAE62_1.Setpoints

Specify zone minimum outdoor air and minimum airflow set points for compliance with ASHRAE standard 62.1

Buildings.Controls.OBC.ASHRAE.G36.VentilationZones.ASHRAE62_1.Setpoints

Information

This sequence sets the zone minimum outdoor air and minimum airflow setpoints, for compliance with the ventilation rate procedure of ASHRAE Standard 62.1. The implementation is according to ASHRAE Guideline36, Section 5.2.1.3. The calculation is done following the steps below.

1. For every zone that requires mechanical ventilation, the zone minimum outdoor airflows and set points shall be calculated depending on the governing standard or code for outdoor air requirements.

2. According to section 3.1.2 of Guideline 36, the zone minimum airflow setpoint VMin_flow should be provided by designer.

Zone ventilation set points

According to Section 3.1.1.2 of Guideline 36,

Zone air distribution effectiveness

Population component of the breathing zone outdoor airflow

The population component of the breathing zone outdoor airflow should normally equal to the value calculated above. However, it would be modified as noted in below.

Occupied minimum airflow

The occupied minimum airflow shall be equal to VMin_flow except as noted in below.

Set points modification

The required zone outdoor airflow shall be calculated as the sum of area and population components of breathing zone outdoor airflow divided by air distribution effectiveness. The normal value of the area and population components are modified if any of the following conditions are met, in order from higher to lower priority:

  1. If the zone is any mode other than occupied mode, and for zones that have window switches and the window is open: the area and population components of breathing zone outdoor airflow, and the occupied minimum airflow rate should be zero.
  2. If the zone has an occupancy sensor, is unpopulated, and occupied-standby mode is permitted: the area and population components of breathing zone outdoor airflow, and the occupied minimum airflow rate should be zero.
  3. Else, if the zone has an occupancy sensor, is unpopulated, but occupied-standby mode is not permitted: the population components of breathing zone outdoor airflow should be zero and the occupied minimum airflow rate should be VMin_flow.
  4. If the zone has a CO2 sensor:
    1. Specify CO2 setpoint ppmCO2Set according to Section 3.1.1.3 of Guideline 36.
    2. During occupied mode, a P-only loop shall maintain CO2 concentration at setpoint; reset from 0% at set point minus 200 PPM and to 100% at setpoint.
    3. Loop is disabled and output set to zero when the zone is not in occupied mode.
    4. For cooling-only VAV terminal units, reheat VAV terminal units, constant-volume series fan-powered terminal units, dual-duct VAV terminal units with mixing control and inlet airflow sensors, dual-duct VAV terminal units with mixing control and a discharge airflow sensor, or dual-duct VAV terminal units with cold-duct minimum control:
      • The CO2 control loop output shall reset both the occupied minimum airflow setpoint and the population component of the required breathing zone outdoor airflow in parallel. The occupied minimum airflow setpoint shall be reset from the zone minimum airflow setpoint VMin_flow at 0% loop output up to maximum cooling airflow setpoint VCooMax_flow at 100% loop output. The population component of breathing zone outdoor airflow shall be reset from 0 L/s at 0% loop output up to the designed population component airflow setpoint at 100% loop output.

      Image of airflow setpoint for VAV reheat terminal unit

    5. For parallel fan-powered terminal units:
      • Determin the maximum flow rate for control CO2 level: when the zone state is cooling, the maximum flow rate is equal to the maximum cooling airflow setpoint VCooMax_flow; when the zone state is heating or deadband, the maximum flow rate is equal to VCooMax_flow minus the parallel fan airflow VParFan_flow.
      • The occupied minimum airflow setpoint shall be reset from the zone minimum airflow setpoint VMin_flow at 0% loop output up to maximum cooling airflow setpoint determined by CO2 control level at 100% loop output. The population component of breathing zone outdoor airflow shall be reset from 0 L/s at 0% loop output up to the designed population component airflow setpoint at 100% loop output.

      Image of airflow setpoint for VAV parallel-fan terminal unit

  5. For single zoneVAV air handler unit: the minimum outdoor air setpoint is equal to the breathing zone outdoor airflow setpoint.
    • If the zone has CO2 sensor, the CO2 control loop output shall reset the population component of the required breathing zone outdoor airflow from 0 L/s at 0% loop output up to the designed population component airflow setpoint at 100% loop output.

      Image of airflow setpoint for single zone VAV AHU

    • If the zone dose not have CO2 sensor, the minimum outdoor air setpoint is equal to the design breathing zone outdoor airflow setpoint.

Parameters

TypeNameDefaultDescription
Booleanhave_winSenfalseTrue: the zone has window sensor
Booleanhave_occSenfalseTrue: the zone has occupancy sensor
Booleanhave_CO2SenfalseTrue: the zone has CO2 sensor
Booleanhave_typTerUnifalseTrue: the zone has typical terminal units and CO2 sensor
Booleanhave_parFanPowUnifalseTrue: the zone has parallel fan-powered terminal unit and CO2 sensor
Booleanhave_SZVAVfalseTrue: it is single zone VAV AHU system with CO2 sensor
Booleanpermit_occStandbytrueTrue: occupied-standby mode is permitted
Design conditions
RealVAreBreZon_flow Design area component of the breathing zone outdoor airflow [m3/s]
RealVPopBreZon_flow Design population component of the breathing zone outdoor airflow [m3/s]
RealVMin_flow Design zone minimum airflow setpoint [m3/s]
RealVCooMax_flow0.025Design zone cooling maximum airflow rate [m3/s]
Advanced
Distribution effectiveness
RealzonDisEff_cool1.0Zone cooling air distribution effectiveness
RealzonDisEff_heat0.8Zone heating air distribution effectiveness
RealdTHys0.25Temperature difference hysteresis below which the temperature difference will be seen as zero [K]

Connectors

TypeNameDescription
input BooleanInputu1WinWindow status, normally closed (true), when windows open, it becomes false
input BooleanInputu1OccTrue: the zone is populated
input IntegerInputuOpeModZone operation mode
input RealInputppmCO2SetCO2 concentration setpoint, in PPM
input RealInputppmCO2Detected CO2 concentration
input IntegerInputuZonStaZone state
input RealInputVParFan_flowParallel fan airflow rate [m3/s]
input RealInputTZonMeasured room temperature [K]
input RealInputTDisMeasured discharge air temperature [K]
output RealOutputVAdjPopBreZon_flowAdjusted population component breathing zone flow rate [m3/s]
output RealOutputVOccZonMin_flowOccupied minimum airflow setpoint [m3/s]
output RealOutputVAdjAreBreZon_flowAdjusted area component breathing zone flow rate [m3/s]
output RealOutputVMinOA_flowMinimum outdoor airflow setpoint [m3/s]

Modelica definition

block Setpoints "Specify zone minimum outdoor air and minimum airflow set points for compliance with ASHRAE standard 62.1" parameter Boolean have_winSen=false "True: the zone has window sensor"; parameter Boolean have_occSen=false "True: the zone has occupancy sensor"; parameter Boolean have_CO2Sen=false "True: the zone has CO2 sensor"; parameter Boolean have_typTerUni=false "True: the zone has typical terminal units and CO2 sensor"; parameter Boolean have_parFanPowUni=false "True: the zone has parallel fan-powered terminal unit and CO2 sensor"; parameter Boolean have_SZVAV=false "True: it is single zone VAV AHU system with CO2 sensor"; parameter Boolean permit_occStandby=true "True: occupied-standby mode is permitted"; parameter Real VAreBreZon_flow( final quantity="VolumeFlowRate", final unit="m3/s") "Design area component of the breathing zone outdoor airflow"; parameter Real VPopBreZon_flow( final quantity="VolumeFlowRate", final unit="m3/s") "Design population component of the breathing zone outdoor airflow"; parameter Real VMin_flow( final quantity="VolumeFlowRate", final unit="m3/s") "Design zone minimum airflow setpoint"; parameter Real VCooMax_flow( final quantity="VolumeFlowRate", final unit="m3/s")=0.025 "Design zone cooling maximum airflow rate"; parameter Real zonDisEff_cool=1.0 "Zone cooling air distribution effectiveness"; parameter Real zonDisEff_heat=0.8 "Zone heating air distribution effectiveness"; parameter Real dTHys( final unit="K", final quantity="TemperatureDifference")=0.25 "Temperature difference hysteresis below which the temperature difference will be seen as zero"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1Win if have_winSen "Window status, normally closed (true), when windows open, it becomes false"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1Occ if have_occSen "True: the zone is populated"; Buildings.Controls.OBC.CDL.Interfaces.IntegerInput uOpeMod "Zone operation mode"; Buildings.Controls.OBC.CDL.Interfaces.RealInput ppmCO2Set if have_CO2Sen "CO2 concentration setpoint, in PPM"; Buildings.Controls.OBC.CDL.Interfaces.RealInput ppmCO2 if have_CO2Sen "Detected CO2 concentration"; Buildings.Controls.OBC.CDL.Interfaces.IntegerInput uZonSta if have_CO2Sen and have_parFanPowUni "Zone state"; Buildings.Controls.OBC.CDL.Interfaces.RealInput VParFan_flow( final quantity="VolumeFlowRate", final unit="m3/s") if have_CO2Sen and have_parFanPowUni "Parallel fan airflow rate"; Buildings.Controls.OBC.CDL.Interfaces.RealInput TZon( final quantity="ThermodynamicTemperature", final unit="K", final displayUnit="degC") "Measured room temperature"; Buildings.Controls.OBC.CDL.Interfaces.RealInput TDis( final quantity="ThermodynamicTemperature", final unit="K", final displayUnit="degC") "Measured discharge air temperature"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput VAdjPopBreZon_flow( final quantity="VolumeFlowRate", final unit="m3/s") "Adjusted population component breathing zone flow rate"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput VOccZonMin_flow( final quantity="VolumeFlowRate", final unit="m3/s") if not have_SZVAV "Occupied minimum airflow setpoint"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput VAdjAreBreZon_flow( final quantity="VolumeFlowRate", final unit="m3/s") "Adjusted area component breathing zone flow rate"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput VMinOA_flow( final quantity="VolumeFlowRate", final unit="m3/s") "Minimum outdoor airflow setpoint"; protected Buildings.Controls.OBC.CDL.Conversions.BooleanToReal airDisEff( final realTrue=zonDisEff_cool, final realFalse=zonDisEff_heat) "Air distribution effectiveness"; Buildings.Controls.OBC.CDL.Reals.Line lin if have_CO2Sen "CO2 control loop"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant zer( final k=0) if have_CO2Sen "Constant zero"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant one( final k=1) if have_CO2Sen "Constant one"; Buildings.Controls.OBC.CDL.Reals.AddParameter addPar( final p=-200) if have_CO2Sen "Lower threshold of CO2 setpoint"; Buildings.Controls.OBC.CDL.Integers.Equal inOccMod "Check if it is in occupied mode"; Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToRea if have_CO2Sen "Convert boolean to real"; Buildings.Controls.OBC.CDL.Reals.Multiply co2Con if have_CO2Sen "Corrected CO2 control loop output"; Buildings.Controls.OBC.CDL.Reals.Line occMinAirSet if have_CO2Sen and not have_SZVAV "Modified occupied minimum airflow setpoint"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant zonMinFlo( final k=VMin_flow) if not have_SZVAV "Zone minimum airflow setpoint Vmin"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant zonCooMaxFlo( final k=VCooMax_flow) if have_CO2Sen and not have_SZVAV "Maximum cooling airflow setpoint"; Buildings.Controls.OBC.CDL.Reals.Line popBreOutAir if have_CO2Sen "Modified population componenet of the required breathing zone outdoor airflow"; Buildings.Controls.OBC.CDL.Integers.Equal inCooSta if have_CO2Sen and have_parFanPowUni "Check if it is in cooling state"; Buildings.Controls.OBC.CDL.Reals.Switch maxFloCO2 if have_CO2Sen and have_parFanPowUni "Maximum airflow set point for CO2"; Buildings.Controls.OBC.CDL.Reals.Subtract difCooMax if have_CO2Sen and have_parFanPowUni "Maximum cooling airflw set point minus parallel fan airflow"; Buildings.Controls.OBC.CDL.Logical.Or or2 "Check if it is not in occupied mode or the window is open"; Buildings.Controls.OBC.CDL.Logical.Not notOccMod "Not in occupied mode"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant con( final k=false) if not have_winSen "Constant false"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant perOccSta( final k=permit_occStandby) if have_occSen "Permit occupied-standby mode"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant zer1( final k=0) "Constant zero"; Buildings.Controls.OBC.CDL.Reals.Switch modPopBreAir "Modified popuplation component of the breathing zone airflow"; Buildings.Controls.OBC.CDL.Reals.Switch modAreBreAir "Modified area component of the breathing zone airflow"; Buildings.Controls.OBC.CDL.Reals.Switch occMinAir if not have_SZVAV "Occupied minimum airflow setpoint"; Buildings.Controls.OBC.CDL.Logical.Not notOcc if have_occSen "Not occupied"; Buildings.Controls.OBC.CDL.Reals.Switch unpPopBreAir "Population component of the required breathing zone outdoor airflow when it is unpopulated"; Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToRea1( final realTrue=0, final realFalse=1) if have_occSen "Convert boolean to real"; Buildings.Controls.OBC.CDL.Reals.Multiply unPopAreBreAir if have_occSen "Area component of the required breathing zone outdoor airflow when it is unpopulated"; Buildings.Controls.OBC.CDL.Reals.Multiply unpMinZonFlo if have_occSen and not have_SZVAV "Minimum zone airflow when it is unpopulated"; Buildings.Controls.OBC.CDL.Reals.Switch unpAreBreAir "Area component of the required breathing zone outdoor airflow when it is unpopulated"; Buildings.Controls.OBC.CDL.Reals.Switch unpMinZonAir if not have_SZVAV "Minimum zone airflow when it is unpopulated"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant con1( final k=false) if not have_occSen "Constant false"; Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai( final k=1) if not have_CO2Sen and not have_SZVAV "Dummy gain for conditional input"; Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai1( final k=1) if not have_CO2Sen "Dummy gain for conditional input"; Buildings.Controls.OBC.CDL.Reals.Add reqBreAir "Required breathing zone outdoor airflow"; Buildings.Controls.OBC.CDL.Reals.Divide minOA "Minimum outdoor airflow setpoint"; Buildings.Controls.OBC.CDL.Integers.Sources.Constant occMod( final k=Buildings.Controls.OBC.ASHRAE.G36.Types.OperationModes.occupied) "Occupied mode"; Buildings.Controls.OBC.CDL.Integers.Sources.Constant cooSta( final k=Buildings.Controls.OBC.ASHRAE.G36.Types.ZoneStates.cooling) if have_CO2Sen and have_parFanPowUni "Cooling state"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant zer2( final k=0) if not have_occSen "Constant zero"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant zer3( final k=0) if not have_occSen or have_SZVAV "Constant zero"; Buildings.Controls.OBC.CDL.Reals.Greater cooSup( final h=dTHys) "Check if it is supplying cooling"; Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai2( final k=1) if have_CO2Sen and not have_SZVAV and not have_parFanPowUni "Dummy gain for conditional input"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant desAreAir( final k=VAreBreZon_flow) "Design area component of the breathing zone outdoor airflow"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant desPopAir( final k=VPopBreZon_flow) "Design population component of the breathing zone outdoor airflow"; CDL.Logical.Not winOpe if have_winSen "Window is open"; equation connect(addPar.y, lin.x1); connect(zer.y, lin.f1); connect(ppmCO2, lin.u); connect(one.y, lin.f2); connect(uOpeMod, inOccMod.u1); connect(occMod.y, inOccMod.u2); connect(inOccMod.y, booToRea.u); connect(zer.y, occMinAirSet.x1); connect(zonMinFlo.y, occMinAirSet.f1); connect(one.y, occMinAirSet.x2); connect(co2Con.y, occMinAirSet.u); connect(zer.y, popBreOutAir.x1); connect(zer.y, popBreOutAir.f1); connect(one.y, popBreOutAir.x2); connect(co2Con.y, popBreOutAir.u); connect(uZonSta, inCooSta.u1); connect(cooSta.y, inCooSta.u2); connect(inCooSta.y, maxFloCO2.u2); connect(zonCooMaxFlo.y, maxFloCO2.u1); connect(zonCooMaxFlo.y, difCooMax.u1); connect(difCooMax.y, maxFloCO2.u3); connect(maxFloCO2.y, occMinAirSet.f2); connect(lin.y, co2Con.u2); connect(booToRea.y, co2Con.u1); connect(inOccMod.y, notOccMod.u); connect(notOccMod.y, or2.u2); connect(con.y, or2.u1); connect(zer1.y, modPopBreAir.u1); connect(or2.y, modPopBreAir.u2); connect(or2.y, modAreBreAir.u2); connect(zer1.y, modAreBreAir.u1); connect(or2.y, occMinAir.u2); connect(zer1.y, occMinAir.u1); connect(u1Occ, notOcc.u); connect(perOccSta.y, booToRea1.u); connect(booToRea1.y, unPopAreBreAir.u2); connect(booToRea1.y, unpMinZonFlo.u1); connect(zonMinFlo.y, unpMinZonFlo.u2); connect(notOcc.y, unpPopBreAir.u2); connect(zer1.y, unpPopBreAir.u1); connect(notOcc.y, unpAreBreAir.u2); connect(unPopAreBreAir.y, unpAreBreAir.u1); connect(notOcc.y, unpMinZonAir.u2); connect(unpMinZonFlo.y, unpMinZonAir.u1); connect(unpPopBreAir.y, modPopBreAir.u3); connect(unpAreBreAir.y, modAreBreAir.u3); connect(unpMinZonAir.y, occMinAir.u3); connect(occMinAirSet.y, unpMinZonAir.u3); connect(popBreOutAir.y, unpPopBreAir.u3); connect(con1.y, unpPopBreAir.u2); connect(con1.y, unpAreBreAir.u2); connect(con1.y, unpMinZonAir.u2); connect(zonMinFlo.y, gai.u); connect(gai.y, unpMinZonAir.u3); connect(gai1.y, unpPopBreAir.u3); connect(modAreBreAir.y, reqBreAir.u2); connect(modPopBreAir.y, reqBreAir.u1); connect(reqBreAir.y, minOA.u1); connect(airDisEff.y, minOA.u2); connect(occMinAir.y, VOccZonMin_flow); connect(minOA.y, VMinOA_flow); connect(zer2.y, unpAreBreAir.u1); connect(zer3.y, unpMinZonAir.u1); connect(TZon, cooSup.u1); connect(TDis, cooSup.u2); connect(cooSup.y, airDisEff.u); connect(VParFan_flow, difCooMax.u2); connect(zonCooMaxFlo.y, gai2.u); connect(gai2.y, occMinAirSet.f2); connect(ppmCO2Set, addPar.u); connect(ppmCO2Set, lin.x2); connect(modAreBreAir.y, VAdjAreBreZon_flow); connect(modPopBreAir.y, VAdjPopBreZon_flow); connect(desAreAir.y, unpAreBreAir.u3); connect(desAreAir.y, unPopAreBreAir.u1); connect(desPopAir.y, gai1.u); connect(desPopAir.y, popBreOutAir.f2); connect(u1Win, winOpe.u); connect(winOpe.y, or2.u1); end Setpoints;