Buildings.Controls.OBC.ASHRAE.G36.AHUs.MultiZone.VAV.SetPoints.OutdoorAirFlow.Title24

Complying California Title 24

Information

This package contains sequences to set the minimum outdoor airflow setpoint for compliance with the ventilation rate procedure of California Title 24. It is implemented according to Section 5.16.3.2 of ASHRAE Guideline G36, May 2020.

Package Content

Name Description
Buildings.Controls.OBC.ASHRAE.G36.AHUs.MultiZone.VAV.SetPoints.OutdoorAirFlow.Title24.AHU AHU AHU level setpoint calculation
Buildings.Controls.OBC.ASHRAE.G36.AHUs.MultiZone.VAV.SetPoints.OutdoorAirFlow.Title24.SumZone SumZone Sum of the zone level setpoints calculation
Buildings.Controls.OBC.ASHRAE.G36.AHUs.MultiZone.VAV.SetPoints.OutdoorAirFlow.Title24.Validation Validation Collection of validation models

Buildings.Controls.OBC.ASHRAE.G36.AHUs.MultiZone.VAV.SetPoints.OutdoorAirFlow.Title24.AHU Buildings.Controls.OBC.ASHRAE.G36.AHUs.MultiZone.VAV.SetPoints.OutdoorAirFlow.Title24.AHU

AHU level setpoint calculation

Buildings.Controls.OBC.ASHRAE.G36.AHUs.MultiZone.VAV.SetPoints.OutdoorAirFlow.Title24.AHU

Information

This sequence outputs AHU level effective outdoor air absolute minimum and design minimum setpoints VEffAbsOutAir_flow, VEffDesOutAir_flow and the nomalized minimum setpoint effOutAir_normalized when complying with California Title 24 ventilation requirements. It is implemented according to Section 5.16.3.2 of ASHRAE Guideline G36, May 2020.

It calculates as below:

  1. See the sum of zone absolute and design minimum outdoor airflow setpoint VSumZonAbsMin_flow and VSumZonDesMin_flow from Buildings.Controls.OBC.ASHRAE.G36.AHUs.MultiZone.VAV.SetPoints.OutdoorAirFlow.Title24.SumZone for the detailed description.
  2. Effective outdoor air absolute minimum and design minimum setpoints (VEffAbsOutAir_flow and VEffDesOutAir_flow) are recalculated continuously based on the mode of the zones being served.
    • Effective outdoor air absolute minimum setpoint VEffAbsOutAir_flow is the sum of VZonAbsMin_flow for all zones in all zone groups that are in occupied mode but shall be no larger than the absolute minimum outdoor airflow VAbsOutAir_flow.
    • Effective outdoor air design minimum setpoint VEffDesOutAir_flow is the sum of VZonDesMin_flow for all zones in all zone groups that are in occupied mode but shall be no larger than the absolute minimum outdoor airflow VDesOutAir_flow.
  3. According to section 5.16.4, 5.16.5 and 5.16.6, the effective minimum outdoor airflow setpoint should be reset based on the highest zone CO2 control- loop signal from VEffAbsOutAir_flow at 50% signal to VEffDesOutAir_flow at 100% signal. When there is no CO2 sensor in any zone, the effective minimum outdoor airflow setpoint should be equal to the VEffDesOutAir_flow.

Parameters

TypeNameDefaultDescription
Booleanhave_CO2Sen True: there are zones have CO2 sensor
Economizer design
OutdoorAirSectionminOADes Type of outdoor air section
Nominal condition
RealVAbsOutAir_flow Design outdoor airflow rate when all zones with CO2 sensors or occupancy sensors are unpopulated [m3/s]
RealVDesOutAir_flow Design minimum outdoor airflow rate with the areas served by the system are occupied at their design population, including diversity where applicable [m3/s]

Connectors

TypeNameDescription
input RealInputVSumZonAbsMin_flowSum of the zone absolute minimum outdoor airflow setpoint [m3/s]
input RealInputVSumZonDesMin_flowSum of the zone design minimum outdoor airflow setpoint [m3/s]
input RealInputuCO2Loo_maxMaximum Zone CO2 control loop [1]
input RealInputVAirOut_flowMeasured outdoor air volumetric flow rate [m3/s]
output RealOutputVEffAbsOutAir_flowEffective outdoor air absolute minimum setpoint [m3/s]
output RealOutputeffAbsOutAir_normalizedEffective minimum outdoor airflow setpoint, normalized by the absolute outdoor airflow rate [1]
output RealOutputVEffDesOutAir_flowEffective outdoor air design minimum setpoint [m3/s]
output RealOutputeffDesOutAir_normalizedEffective minimum outdoor airflow setpoint, normalized by the design outdoor airflow rate [1]
output RealOutputeffOutAir_normalizedEffective minimum outdoor airflow setpoint, normalized by the design total outdoor airflow rate [1]
output RealOutputoutAir_normalizedNormalized outdoor airflow rate [1]

Modelica definition

block AHU "AHU level setpoint calculation" parameter Buildings.Controls.OBC.ASHRAE.G36.Types.OutdoorAirSection minOADes "Type of outdoor air section"; parameter Boolean have_CO2Sen "True: there are zones have CO2 sensor"; parameter Real VAbsOutAir_flow(unit="m3/s") "Design outdoor airflow rate when all zones with CO2 sensors or occupancy sensors are unpopulated"; parameter Real VDesOutAir_flow(unit="m3/s") "Design minimum outdoor airflow rate with the areas served by the system are occupied at their design population, including diversity where applicable"; Buildings.Controls.OBC.CDL.Interfaces.RealInput VSumZonAbsMin_flow( final min=0, final unit="m3/s", final quantity="VolumeFlowRate") "Sum of the zone absolute minimum outdoor airflow setpoint"; Buildings.Controls.OBC.CDL.Interfaces.RealInput VSumZonDesMin_flow( final min=0, final unit="m3/s", final quantity="VolumeFlowRate") "Sum of the zone design minimum outdoor airflow setpoint"; Buildings.Controls.OBC.CDL.Interfaces.RealInput uCO2Loo_max( final unit="1") if have_CO2Sen "Maximum Zone CO2 control loop"; Buildings.Controls.OBC.CDL.Interfaces.RealInput VAirOut_flow( final min=0, final unit="m3/s", final quantity="VolumeFlowRate") if (minOADes == Buildings.Controls.OBC.ASHRAE.G36.Types.OutdoorAirSection.DedicatedDampersAirflow or minOADes == Buildings.Controls.OBC.ASHRAE.G36.Types.OutdoorAirSection.SingleDamper) "Measured outdoor air volumetric flow rate"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput VEffAbsOutAir_flow( final min=0, final unit="m3/s", final quantity="VolumeFlowRate") "Effective outdoor air absolute minimum setpoint"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput effAbsOutAir_normalized( final unit="1") "Effective minimum outdoor airflow setpoint, normalized by the absolute outdoor airflow rate "; Buildings.Controls.OBC.CDL.Interfaces.RealOutput VEffDesOutAir_flow( final min=0, final unit="m3/s", final quantity="VolumeFlowRate") "Effective outdoor air design minimum setpoint"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput effDesOutAir_normalized( final unit="1") "Effective minimum outdoor airflow setpoint, normalized by the design outdoor airflow rate "; Buildings.Controls.OBC.CDL.Interfaces.RealOutput effOutAir_normalized( final unit="1") "Effective minimum outdoor airflow setpoint, normalized by the design total outdoor airflow rate "; Buildings.Controls.OBC.CDL.Interfaces.RealOutput outAir_normalized( final unit="1") if (minOADes == Buildings.Controls.OBC.ASHRAE.G36.Types.OutdoorAirSection.DedicatedDampersAirflow or minOADes == Buildings.Controls.OBC.ASHRAE.G36.Types.OutdoorAirSection.SingleDamper) "Normalized outdoor airflow rate"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant absOutAir( final k=VAbsOutAir_flow) "Design outdoor airflow rate when all zones with CO2 sensors or occupancy sensors are unpopulated"; Buildings.Controls.OBC.CDL.Reals.Min min1 "Effective outdoor air absolute minimum setpoint"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant desOutAir( final k=VDesOutAir_flow) "Design minimum outdoor airflow with areas served by the system are occupied at their design population, including diversity where applicable"; Buildings.Controls.OBC.CDL.Reals.Min min2 "Effective outdoor air design minimum setpoint"; Buildings.Controls.OBC.CDL.Reals.Divide norVOutMin "Normalization for minimum outdoor air flow rate"; Buildings.Controls.OBC.CDL.Reals.Divide norVOutMin1 "Normalization for minimum outdoor air flow rate"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant con( final k=0.5) if have_CO2Sen "Constant value"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant con1( final k=1) if have_CO2Sen "Constant value"; Buildings.Controls.OBC.CDL.Reals.Line effOutAir( final limitBelow=false, final limitAbove=true) if have_CO2Sen "Normalized effective outdoor air setpoint"; Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai( final k=1) if not have_CO2Sen "When there is no zone has CO2 sensor, design setpoint will be applied"; Buildings.Controls.OBC.CDL.Reals.Divide norVOutMin2 if have_CO2Sen "Normalization for minimum outdoor air flow rate"; Buildings.Controls.OBC.CDL.Reals.Divide norVOut if (minOADes == Buildings.Controls.OBC.ASHRAE.G36.Types.OutdoorAirSection.DedicatedDampersAirflow or minOADes == Buildings.Controls.OBC.ASHRAE.G36.Types.OutdoorAirSection.SingleDamper) "Normalization for outdoor air flow rate"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant neaZer( final k=1E-4) "Near zero value"; Buildings.Controls.OBC.CDL.Reals.Max max2 "Avoid devide by zero"; Buildings.Controls.OBC.CDL.Reals.Max max1 "Avoid devide by zero"; equation connect(absOutAir.y, min1.u1); connect(min1.y, VEffAbsOutAir_flow); connect(desOutAir.y, min2.u1); connect(min2.y, VEffDesOutAir_flow); connect(VSumZonDesMin_flow, min2.u2); connect(VSumZonAbsMin_flow, min1.u2); connect(min1.y, norVOutMin1.u1); connect(min2.y, norVOutMin.u1); connect(norVOutMin1.y, effAbsOutAir_normalized); connect(norVOutMin.y, effDesOutAir_normalized); connect(uCO2Loo_max, effOutAir.u); connect(con.y, effOutAir.x1); connect(con1.y, effOutAir.x2); connect(gai.y, effOutAir_normalized); connect(min2.y, effOutAir.f2); connect(min1.y, effOutAir.f1); connect(norVOutMin.y, gai.u); connect(effOutAir.y, norVOutMin2.u1); connect(norVOutMin2.y, effOutAir_normalized); connect(VAirOut_flow, norVOut.u1); connect(norVOut.y, outAir_normalized); connect(max2.y, norVOutMin1.u2); connect(neaZer.y, max2.u2); connect(absOutAir.y, max2.u1); connect(neaZer.y, max1.u2); connect(desOutAir.y, max1.u1); connect(max1.y, norVOutMin.u2); connect(max1.y, norVOutMin2.u2); connect(max1.y, norVOut.u2); end AHU;

Buildings.Controls.OBC.ASHRAE.G36.AHUs.MultiZone.VAV.SetPoints.OutdoorAirFlow.Title24.SumZone Buildings.Controls.OBC.ASHRAE.G36.AHUs.MultiZone.VAV.SetPoints.OutdoorAirFlow.Title24.SumZone

Sum of the zone level setpoints calculation

Buildings.Controls.OBC.ASHRAE.G36.AHUs.MultiZone.VAV.SetPoints.OutdoorAirFlow.Title24.SumZone

Information

This sequence sums up zone level minimum outdoor airflow setpoints when complying with California Title 24 ventilation requirements. It is implemented according to Section 5.16.3.2 of ASHRAE Guideline G36, May 2020.

It calculates following values:

  1. Sum of the zone absolute minimum outdoor airflow setpoint VZonAbsMin_flow for all zones in all zone groups that are in occupied mode.
  2. Sum of the zone design minimum outdoor airflow setpoint VZonDesMin_flow for all zones in all zone groups that are in occupied mode.
  3. Maximum zone level CO2 control loop signal yMaxCO2.

See the zone absolute and design minimum outdoor airflow setpoint VZonAbsMin_flow and VZonDesMin_flow from Buildings.Controls.OBC.ASHRAE.G36.VentilationZones.Title24.Setpoints for the detailed description.

Parameters

TypeNameDefaultDescription
IntegernZon Total number of serving zones
IntegernGro Total number of groups
IntegerzonGroMat[nGro, nZon] Zone matrix with zone group as row index and zone as column index. It flags which zone is grouped in which zone group
Booleanhave_CO2Sen True: some zones have CO2 sensor

Connectors

TypeNameDescription
input IntegerInputuOpeMod[nGro]Groups operation mode
input RealInputVZonAbsMin_flow[nZon]Zone absolute minimum outdoor airflow setpoint [m3/s]
input RealInputVZonDesMin_flow[nZon]Zone design minimum outdoor airflow setpoint [m3/s]
input RealInputuCO2[nZon]Zone CO2 control loop [1]
output RealOutputVSumZonAbsMin_flowSum of the zone absolute minimum outdoor airflow setpoint [m3/s]
output RealOutputVSumZonDesMin_flowSum of the zone design minimum outdoor airflow setpoint [m3/s]
output RealOutputyMaxCO2Maximum CO2 control loop signal [1]

Modelica definition

block SumZone "Sum of the zone level setpoints calculation" parameter Integer nZon "Total number of serving zones"; parameter Integer nGro "Total number of groups"; parameter Integer zonGroMat[nGro, nZon] "Zone matrix with zone group as row index and zone as column index. It flags which zone is grouped in which zone group"; parameter Boolean have_CO2Sen "True: some zones have CO2 sensor"; Buildings.Controls.OBC.CDL.Interfaces.IntegerInput uOpeMod[nGro] "Groups operation mode"; Buildings.Controls.OBC.CDL.Interfaces.RealInput VZonAbsMin_flow[nZon]( final min=fill(0,nZon), final unit=fill("m3/s",nZon), final quantity=fill("VolumeFlowRate",nZon)) "Zone absolute minimum outdoor airflow setpoint"; Buildings.Controls.OBC.CDL.Interfaces.RealInput VZonDesMin_flow[nZon]( final min=fill(0,nZon), final unit=fill("m3/s",nZon), final quantity=fill("VolumeFlowRate",nZon)) "Zone design minimum outdoor airflow setpoint"; Buildings.Controls.OBC.CDL.Interfaces.RealInput uCO2[nZon]( final unit=fill("1",nZon)) if have_CO2Sen "Zone CO2 control loop"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput VSumZonAbsMin_flow( final min=0, final unit="m3/s", final quantity="VolumeFlowRate") "Sum of the zone absolute minimum outdoor airflow setpoint"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput VSumZonDesMin_flow( final min=0, final unit="m3/s", final quantity="VolumeFlowRate") "Sum of the zone design minimum outdoor airflow setpoint"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput yMaxCO2( final unit="1") if have_CO2Sen "Maximum CO2 control loop signal"; Buildings.Controls.OBC.CDL.Reals.MatrixGain groFlo( final K=zonGroMat) "Vector of total zone flow of each group"; Buildings.Controls.OBC.CDL.Reals.MatrixGain groFlo1( final K=zonGroMat) "Vector of total zone flow of each group"; Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToRea[nGro] "Convert boolean to real"; Buildings.Controls.OBC.CDL.Reals.Multiply mul[nGro] "Find the total flow of zone group"; Buildings.Controls.OBC.CDL.Reals.Multiply mul1[nGro] "Find the total flow of zone group"; Buildings.Controls.OBC.CDL.Reals.MultiSum mulSum( final nin=nGro) "Sum of the zone absolute minimum outdoor airflow setpoint"; Buildings.Controls.OBC.CDL.Reals.MultiSum mulSum1( final nin=nGro) "Sum of the zone design minimum outdoor airflow setpoint"; Buildings.Controls.OBC.CDL.Integers.Sources.Constant occMod[nGro]( final k=fill(Buildings.Controls.OBC.ASHRAE.G36.Types.OperationModes.occupied,nGro)) "Occupied mode index"; Buildings.Controls.OBC.CDL.Integers.Equal intEqu1[nGro] "Check if operation mode is occupied"; Buildings.Controls.OBC.CDL.Reals.MultiMax mulMax( final nin=nZon) if have_CO2Sen "Maximum CO2 loop signal"; equation connect(uOpeMod, intEqu1.u1); connect(occMod.y, intEqu1.u2); connect(VZonAbsMin_flow, groFlo.u); connect(intEqu1.y, booToRea.u); connect(groFlo.y, mul.u2); connect(booToRea.y, mul.u1); connect(booToRea.y, mul1.u1); connect(groFlo1.y, mul1.u2); connect(mul.y, mulSum.u); connect(mul1.y, mulSum1.u); connect(VZonDesMin_flow, groFlo1.u); connect(mulSum.y, VSumZonAbsMin_flow); connect(mulSum1.y, VSumZonDesMin_flow); connect(uCO2, mulMax.u); connect(mulMax.y, yMaxCO2); end SumZone;