Buildings.Controls.OBC.ASHRAE.G36.VentilationZones.Title24

Sequences complying California Title 24

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 Title 24.

Package Content

Name Description
Buildings.Controls.OBC.ASHRAE.G36.VentilationZones.Title24.Setpoints Setpoints Specify zone minimum outdoor air and minimum airflow set points for compliance with California Title 24
Buildings.Controls.OBC.ASHRAE.G36.VentilationZones.Title24.Validation Validation Collection of validation models

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

Specify zone minimum outdoor air and minimum airflow set points for compliance with California Title 24

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

Information

This sequence sets the zone minimum outdoor air and minimum airflow setpoints, for compliance with the ventilation rate procedure of California Title 24. The implementation is according to Section 5.2.1.4 of ASHRAE Guideline36, May 2020. 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 and the zone cooling maximum setpoint VCooMax_flow should be provided by designer.

Zone ventilation set points

According to Section 3.1.1.2.b of Guideline 36,

Zone minimum outdoor air setpoints

The zone absolute minimum outdoor airflow setpoint VZonAbsMin_flow is used in terminal-unit sequences and air-handler sequences. The zone design minimum outdoor airflow setpoint VZonDesMin_flow is used in air-handler sequences only.

Occupied minimum airflow

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

Occupied minimum airflow modification

  1. If the zone has an occupancy sensor, the minimum airflow VOccZonMin_flow shall be equal to 25% of the VAreMin_flow when the room is unpopulated.
  2. If the zone has a window switch, the minimum airflow VOccZonMin_flow shall be zero when the window is open.
  3. 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 the occupied minimum airflow setpoint VOccZonMin_flow from the zone minimum airflow setpoint VMin_flow at 0% loop output up to maximum cooling airflow setpoint VCooMax_flow at 50% loop output. The loop output from 50% to 100% will be used at the system level to reset outdoor air minimum.

      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 CO2 control loop ouput shall reset the occupied minimum airflow setpoint from the zone minimum airflow setpoint VMin_flow at 0% loop output up to maximum cooling airflow setpoint for CO2 control at 50% loop output. The loop output from 50% to 100% will be used at the system level to reset outdoor air minimum.

      Image of airflow setpoint for VAV parallel-fan terminal unit

Minimum outdoor airflow for single zone VAV air handler unit

The minimum outdoor air setpoint shall be reset based on the zone CO2 control-llop signal from VZonAbsMin_flow at 0% signal to VZonDesMin_flow at 100% signal.

Image of airflow setpoint for single zone VAV AHU

If there is no CO2 sensor, the minimum outdoor air setpoint should be VZonDesMin_flow.

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
Design conditions
RealVOccMin_flow Zone minimum outdoor airflow for occupants [m3/s]
RealVAreMin_flow Zone minimum outdoor airflow for building area [m3/s]
RealVMin_flow Design zone minimum airflow setpoint [m3/s]
RealVCooMax_flow0.025Design zone cooling maximum airflow rate [m3/s]

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]
output RealOutputVZonAbsMin_flowZone absolute minimum outdoor airflow setpoint [m3/s]
output RealOutputVZonDesMin_flowZone design minimum outdoor airflow setpoint [m3/s]
output RealOutputVOccZonMin_flowOccupied zone minimum airflow setpoint [m3/s]
output RealOutputyCO2CO2 control loop signal [1]
output RealOutputVMinOA_flowZone minimum outdoor airflow setpoint [m3/s]

Modelica definition

block Setpoints "Specify zone minimum outdoor air and minimum airflow set points for compliance with California Title 24" 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 Real VOccMin_flow(unit="m3/s") "Zone minimum outdoor airflow for occupants"; parameter Real VAreMin_flow(unit="m3/s") "Zone minimum outdoor airflow for building area"; parameter Real VMin_flow(unit="m3/s") "Design zone minimum airflow setpoint"; parameter Real VCooMax_flow(unit="m3/s")=0.025 "Design zone cooling maximum airflow rate"; 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 if have_CO2Sen "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.RealOutput VZonAbsMin_flow( final quantity="VolumeFlowRate", final unit="m3/s") "Zone absolute minimum outdoor airflow setpoint"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput VZonDesMin_flow( final quantity="VolumeFlowRate", final unit="m3/s") "Zone design minimum outdoor airflow setpoint"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput VOccZonMin_flow( final quantity="VolumeFlowRate", final unit="m3/s") if not have_SZVAV "Occupied zone minimum airflow setpoint"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput yCO2( final unit="1") "CO2 control loop signal"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput VMinOA_flow( final quantity="VolumeFlowRate", final unit="m3/s") if have_SZVAV "Zone minimum outdoor airflow setpoint"; protected Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai( final k=0.25) "Gain factor"; Buildings.Controls.OBC.CDL.Reals.Max max1 "Find the larger input value"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant zonOccOAMin( final k=VOccMin_flow) "Zone minimum outdoor airflow for occupants"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant zonAreOAMin( final k=VAreMin_flow) "Zone minimum outdoor airflow for building area"; Buildings.Controls.OBC.CDL.Reals.Switch zonAbsMin "Zone absolute outdoor air minimum flow"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant zer1( final k=0) "Constant zero"; Buildings.Controls.OBC.CDL.Logical.Not notOcc "Not occupied"; Buildings.Controls.OBC.CDL.Reals.Switch zonAbsMin1 "Zone absolute outdoor air minimum flow"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant havCO2Sen( final k=have_CO2Sen) "Check if the zone has CO2 sensor"; Buildings.Controls.OBC.CDL.Reals.Switch zonAbsMin2 "Zone absolute outdoor air minimum flow"; Buildings.Controls.OBC.CDL.Reals.Switch zonDesMin "Zone design outdoor air minimum flow"; Buildings.Controls.OBC.CDL.Reals.Switch zonDesMin1 "Zone design outdoor air minimum flow"; Buildings.Controls.OBC.CDL.Reals.Switch zonOccMin if not have_SZVAV "Zone occupied minimum flow"; Buildings.Controls.OBC.CDL.Reals.Switch zonOccMin1 if not have_SZVAV "Zone occupied minimum flow"; Buildings.Controls.OBC.CDL.Integers.Sources.Constant occMod( final k=Buildings.Controls.OBC.ASHRAE.G36.Types.OperationModes.occupied) if have_CO2Sen "Occupied mode"; Buildings.Controls.OBC.CDL.Integers.Equal inOccMod if have_CO2Sen "Check if it is in occupied mode"; Buildings.Controls.OBC.CDL.Reals.AddParameter addPar(final p=-200) if have_CO2Sen "Lower threshold of CO2 setpoint"; Buildings.Controls.OBC.CDL.Reals.Line lin if have_CO2Sen "CO2 control loop"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant zer(final k=0) "Constant zero"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant one(final k=1) "Constant one"; Buildings.Controls.OBC.CDL.Reals.Multiply co2Con if have_CO2Sen "Corrected CO2 control loop output"; Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToRea if have_CO2Sen "Convert boolean to real"; Buildings.Controls.OBC.CDL.Reals.Line zonOccMin2 if have_CO2Sen and have_typTerUni "Zone occupied minimum flow when the system has typical terminal units"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant zonMinFlo( final k=VMin_flow) "Zone minimum airflow"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant zonCooMaxFlo( final k=VCooMax_flow) if have_CO2Sen and (have_typTerUni or have_parFanPowUni) "Zone cooling maximum airflow"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant hal( final k=0.5) if have_CO2Sen and (have_typTerUni or have_parFanPowUni) "Constant value"; 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.Integers.Equal inCooSta if have_CO2Sen and have_parFanPowUni "Check if it is in cooling state"; 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.Reals.Switch maxFloCO2 if have_CO2Sen and have_parFanPowUni "Maximum airflow set point for CO2"; Buildings.Controls.OBC.CDL.Reals.Line zonOccMin3 if have_CO2Sen and have_parFanPowUni "Zone occupied minimum flow when the system has parallel fan-powered terminal unit"; Buildings.Controls.OBC.CDL.Reals.Line zonOccMin4 if have_SZVAV "Zone minimum outdoor flow when it is the single zone VAV system"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant con( final k=false) if not have_winSen "Constant false"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant con1( final k=true) if not have_occSen "Constant true"; Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai1( final k=1) if not have_CO2Sen "Dummy gain for conditional input"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant one2(final k=1) if not have_CO2Sen "Constant one"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant zer3(final k=0) if not have_CO2Sen "Constant zero"; Buildings.Controls.OBC.CDL.Logical.Not winOpe if have_winSen "Window is open"; equation connect(zer1.y, zonAbsMin.u1); connect(u1Occ, notOcc.u); connect(notOcc.y, zonAbsMin1.u2); connect(zonAreOAMin.y, gai.u); connect(gai.y, zonAbsMin1.u1); connect(zonAbsMin1.y, zonAbsMin.u3); connect(havCO2Sen.y, zonAbsMin2.u2); connect(zonAbsMin2.y, zonAbsMin1.u3); connect(zer1.y, zonDesMin.u1); connect(zonDesMin1.y, zonDesMin.u3); connect(notOcc.y, zonDesMin1.u2); connect(gai.y, zonDesMin1.u1); connect(zonAreOAMin.y, max1.u2); connect(zonOccOAMin.y, max1.u1); connect(max1.y, zonDesMin1.u3); connect(zonDesMin.y, zonAbsMin2.u3); connect(zonDesMin.y, VZonDesMin_flow); connect(zonAbsMin.y, VZonAbsMin_flow); connect(notOcc.y, zonOccMin.u2); connect(gai.y, zonOccMin.u1); connect(zer1.y, zonOccMin1.u1); connect(zonOccMin1.y, zonOccMin.u3); connect(uOpeMod, inOccMod.u1); connect(occMod.y, inOccMod.u2); connect(inOccMod.y, booToRea.u); connect(booToRea.y, co2Con.u1); connect(ppmCO2Set, addPar.u); connect(addPar.y, lin.x1); connect(zer.y, lin.f1); connect(ppmCO2, lin.u); connect(ppmCO2Set, lin.x2); connect(one.y, lin.f2); connect(lin.y, co2Con.u2); connect(co2Con.y, zonOccMin2.u); connect(zer.y, zonOccMin2.x1); connect(zonMinFlo.y, zonOccMin2.f1); connect(hal.y, zonOccMin2.x2); connect(uZonSta, inCooSta.u1); connect(cooSta.y, inCooSta.u2); connect(inCooSta.y, maxFloCO2.u2); connect(zonCooMaxFlo.y, zonOccMin2.f2); connect(zonCooMaxFlo.y, maxFloCO2.u1); connect(difCooMax.y, maxFloCO2.u3); connect(zonCooMaxFlo.y, difCooMax.u1); connect(VParFan_flow, difCooMax.u2); connect(co2Con.y, zonOccMin3.u); connect(zer.y, zonOccMin3.x1); connect(zonMinFlo.y, zonOccMin3.f1); connect(hal.y, zonOccMin3.x2); connect(maxFloCO2.y, zonOccMin3.f2); connect(co2Con.y, zonOccMin4.u); connect(zer.y, zonOccMin4.x1); connect(one.y, zonOccMin4.x2); connect(zonAbsMin.y, zonOccMin4.f1); connect(zonDesMin.y, zonOccMin4.f2); connect(zonAreOAMin.y, zonAbsMin2.u1); connect(zonOccMin2.y, zonOccMin1.u3); connect(zonOccMin3.y, zonOccMin1.u3); connect(zonOccMin.y, VOccZonMin_flow); connect(con.y, zonAbsMin.u2); connect(con.y, zonDesMin.u2); connect(con.y, zonOccMin1.u2); connect(con1.y, notOcc.u); connect(zonMinFlo.y, gai1.u); connect(gai1.y, zonOccMin1.u3); connect(one2.y, zonOccMin4.u); connect(zonOccMin4.y, VMinOA_flow); connect(co2Con.y, yCO2); connect(zer3.y, yCO2); connect(u1Win, winOpe.u); connect(winOpe.y, zonAbsMin.u2); connect(winOpe.y, zonDesMin.u2); connect(winOpe.y, zonOccMin1.u2); end Setpoints;