Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.CoolingOnly.Subsequences

Package of subsequences for cooling only box control

Information

This package contains subsequences for VAV cooling only unit. They are created according to Section 5.5 of ASHRAE Guideline 36, May 2020.

Package Content

Name Description
Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.CoolingOnly.Subsequences.ActiveAirFlow ActiveAirFlow Active maximum and minimum setpoints for cooling only terminal unit
Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.CoolingOnly.Subsequences.Alarms Alarms Generate alarms of cooling only terminal unit
Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.CoolingOnly.Subsequences.Dampers Dampers Output signals for controlling VAV cooling only box damper position
Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.CoolingOnly.Subsequences.SystemRequests SystemRequests Output system requests for VAV cooling only terminal unit
Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.CoolingOnly.Subsequences.Validation Validation Collection of validation models

Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.CoolingOnly.Subsequences.ActiveAirFlow Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.CoolingOnly.Subsequences.ActiveAirFlow

Active maximum and minimum setpoints for cooling only terminal unit

Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.CoolingOnly.Subsequences.ActiveAirFlow

Information

This block outputs the active maximum and minimum airflow setpoint for cooling only terminal unit. The implementation is according to the Section 5.5.4 of ASHRAE Guideline 36, May 2020.

The setpoints shall vary depending on the mode of the zone group.

Setpoint OccupiedCooldown SetupWarm-upSetbackUnoccupied
Cooling maximum (VActCooMax_flow)VCooMax_flow VCooMax_flowVCooMax_flow 000
Minimum (VActMin_flow)VOccMin_flow 00000
Heating maximum (VActHeaMax_flow)VOccMin_flow 00000

Parameters

TypeNameDefaultDescription
RealVCooMax_flow Design zone cooling maximum airflow rate [m3/s]

Connectors

TypeNameDescription
input IntegerInputuOpeModZone operation mode
input RealInputVOccMin_flowOccupied minimum airflow setpoint [m3/s]
output RealOutputVActCooMax_flowActive cooling maximum airflow setpoint [m3/s]
output RealOutputVActMin_flowActive minimum airflow setpoint [m3/s]
output RealOutputVActHeaMax_flowActive heating maximum airflow [m3/s]

Modelica definition

block ActiveAirFlow "Active maximum and minimum setpoints for cooling only terminal unit" parameter Real VCooMax_flow( final quantity="VolumeFlowRate", final unit="m3/s") "Design zone cooling maximum airflow rate"; Buildings.Controls.OBC.CDL.Interfaces.IntegerInput uOpeMod "Zone operation mode"; Buildings.Controls.OBC.CDL.Interfaces.RealInput VOccMin_flow( final unit="m3/s", final quantity="VolumeFlowRate") "Occupied minimum airflow setpoint"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput VActCooMax_flow( final min=0, final unit="m3/s", final quantity="VolumeFlowRate") "Active cooling maximum airflow setpoint"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput VActMin_flow( final min=0, final unit="m3/s", final quantity="VolumeFlowRate") "Active minimum airflow setpoint"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput VActHeaMax_flow( final min=0, final unit="m3/s", final quantity="VolumeFlowRate") "Active heating maximum airflow"; protected Buildings.Controls.OBC.CDL.Conversions.BooleanToReal actCooMax( final realTrue=VCooMax_flow) "Active cooling maximum airflow setpoint"; Buildings.Controls.OBC.CDL.Logical.Or or3 "Check if it is in occupied, cooldown, or setup mode"; Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToRea( final realTrue=1) "Convert boolean to real"; Buildings.Controls.OBC.CDL.Reals.Multiply actMin "Active minimum 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.Equal intEqu "Check if current operation mode is occupied mode"; Buildings.Controls.OBC.CDL.Integers.Sources.Constant cooDowMod( final k=Buildings.Controls.OBC.ASHRAE.G36.Types.OperationModes.coolDown) "Cool down mode"; Buildings.Controls.OBC.CDL.Integers.Sources.Constant setUpMod( final k=Buildings.Controls.OBC.ASHRAE.G36.Types.OperationModes.setUp) "Setup mode"; Buildings.Controls.OBC.CDL.Integers.Equal intEqu2 "Check if current operation mode is setup mode"; Buildings.Controls.OBC.CDL.Integers.Equal intEqu1 "Check if current operation mode is cool-down mode"; Buildings.Controls.OBC.CDL.Logical.Or or2 "Check if it is in occupied, cooldown, or setup mode"; equation connect(occMod.y, intEqu.u1); connect(intEqu2.u1, setUpMod.y); connect(cooDowMod.y, intEqu1.u1); connect(uOpeMod, intEqu.u2); connect(uOpeMod, intEqu1.u2); connect(uOpeMod, intEqu2.u2); connect(intEqu.y, or3.u1); connect(intEqu1.y, or3.u2); connect(intEqu.y, booToRea.u); connect(booToRea.y, actMin.u1); connect(VOccMin_flow, actMin.u2); connect(actCooMax.y, VActCooMax_flow); connect(actMin.y, VActHeaMax_flow); connect(actMin.y, VActMin_flow); connect(or3.y, or2.u1); connect(intEqu2.y, or2.u2); connect(or2.y, actCooMax.u); end ActiveAirFlow;

Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.CoolingOnly.Subsequences.Alarms Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.CoolingOnly.Subsequences.Alarms

Generate alarms of cooling only terminal unit

Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.CoolingOnly.Subsequences.Alarms

Information

This block outputs alarms of cooling only terminal unit. The implementation is according to the Section 5.5.6 of ASHRAE Guideline 36, May 2020.

Low airflow alarm

  1. If the zone is in occupied mode and after the AHU supply fan has been enabled for staTim, if the measured airflow VDis_flow is less than 70% of setpoint VActSet_flow for 5 minutes (lowFloTim) while the setpoint is greater than zero, generate a Level 3 alarm.
  2. If the zone is in occupied mode and after the AHU supply fan has been enabled for staTim, if the measured airflow VDis_flow is less than 50% of setpoint VActSet_flow for 5 minutes (lowFloTim) while the setpoint is greater than zero, generate a Level 2 alarm.
  3. If a zone has an importance multiplier (staPreMul) of 0 for its static pressure reset Trim-Respond control loop, low airflow alarms shall be suppressed for that zone.

Airflow sensor calibration

If the fan serving the zone has been OFF (uFan=false) for 10 minutes (fanOffTim), and airflow sensor reading VDis_flow is above 10% of the cooling maximum airflow setpoint VCooMax_flow, generate a Level 3 alarm.

Leaking damper

If the damper position (uDam) is 0% and airflow sensor reading VDis_flow is above 10% of the cooling maximum airflow setpoint VCooMax_flow for 10 minutes (leaFloTim) while the fan serving the zone is proven on (uFan=true), generate a Level 4 alarm.

Parameters

TypeNameDefaultDescription
RealstaPreMul Importance multiplier for the zone static pressure reset control loop
RealVCooMax_flow Design zone cooling maximum airflow rate [m3/s]
ReallowFloTim300Threshold time to check low flow rate [s]
RealfanOffTim600Threshold time to check fan off [s]
RealleaFloTim600Threshold time to check leaking flow [s]
Advanced
RealfloHys Near zero flow rate, below which the flow rate or difference will be seen as zero [m3/s]
RealdamPosHys Near zero damper position, below which the damper will be seen as closed [1]
RealstaTim1800Delay triggering alarms after enabling AHU supply fan [s]

Connectors

TypeNameDescription
input RealInputVDis_flowMeasured discharge airflow rate [m3/s]
input RealInputVActSet_flowActive airflow setpoint [m3/s]
input BooleanInputu1FanAHU supply fan status
input IntegerInputuOpeModZone operation mode
input RealInputuDamDamper position setpoint [1]
output IntegerOutputyLowFloAlaLow airflow alarms
output IntegerOutputyFloSenAlaAirflow sensor calibration alarm
output IntegerOutputyLeaDamAlaLeaking damper alarm

Modelica definition

block Alarms "Generate alarms of cooling only terminal unit" parameter Real staPreMul "Importance multiplier for the zone static pressure reset control loop"; parameter Real VCooMax_flow( final quantity="VolumeFlowRate", final unit="m3/s") "Design zone cooling maximum airflow rate"; parameter Real lowFloTim( final unit="s", final quantity="Time")=300 "Threshold time to check low flow rate"; parameter Real fanOffTim( final unit="s", final quantity="Time")=600 "Threshold time to check fan off"; parameter Real leaFloTim( final unit="s", final quantity="Time")=600 "Threshold time to check leaking flow"; parameter Real floHys( final quantity="VolumeFlowRate", final unit="m3/s") "Near zero flow rate, below which the flow rate or difference will be seen as zero"; parameter Real damPosHys( final unit="1") "Near zero damper position, below which the damper will be seen as closed"; parameter Real staTim( final unit="s", final quantity="Time")=1800 "Delay triggering alarms after enabling AHU supply fan"; Buildings.Controls.OBC.CDL.Interfaces.RealInput VDis_flow( final min=0, final unit="m3/s", final quantity="VolumeFlowRate") "Measured discharge airflow rate"; Buildings.Controls.OBC.CDL.Interfaces.RealInput VActSet_flow( final min=0, final unit="m3/s", final quantity="VolumeFlowRate") "Active airflow setpoint"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1Fan "AHU supply fan status"; Buildings.Controls.OBC.CDL.Interfaces.IntegerInput uOpeMod "Zone operation mode"; Buildings.Controls.OBC.CDL.Interfaces.RealInput uDam( final min=0, final unit="1") "Damper position setpoint"; Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yLowFloAla "Low airflow alarms"; Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yFloSenAla "Airflow sensor calibration alarm"; Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yLeaDamAla "Leaking damper alarm"; Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai( final k=0.5) "Percentage of the setpoint"; Buildings.Controls.OBC.CDL.Reals.Less les( final h=floHys) "Check if measured airflow is less than threshold"; Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel( final delayTime=lowFloTim) "Check if the measured airflow has been less than threshold value for threshold time"; Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr( final t=floHys, final h=0.5*floHys) "Check if setpoint airflow is greater than zero"; Buildings.Controls.OBC.CDL.Reals.Greater gre( final h=floHys) "Check if measured airflow is less than threshold"; Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai1( final k=0.7) "Percentage of the setpoint"; Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel1( final delayTime=lowFloTim) "Check if the measured airflow has been less than threshold value for threshold time"; Buildings.Controls.OBC.CDL.Logical.And and2 "Measured airflow has been less than threshold value for sufficient time"; Buildings.Controls.OBC.CDL.Logical.And and1 "Measured airflow has been less than threshold value for sufficient time"; Buildings.Controls.OBC.CDL.Integers.Switch lowFloAla "Low airflow alarm"; Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt( final k=2) "Level 2 alarm"; Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt( final integerTrue=3) "Convert boolean true to level 3 alarm"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant conInt1( final k=staPreMul) "Importance multiplier for zone static pressure reset"; Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr1 "Check if the multiplier is greater than zero"; Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt1 "Suppress the alarm when multiplier is zero"; Buildings.Controls.OBC.CDL.Integers.Multiply proInt "Low flow alarms"; Buildings.Controls.OBC.CDL.Logical.And and8 "Logical and"; Buildings.Controls.OBC.CDL.Logical.Not not1 "Logical not"; Buildings.Controls.OBC.CDL.Utilities.Assert assMes( final message="Warning: airflow is less than 50% of the setpoint.") "Level 2 low airflow alarm"; Buildings.Controls.OBC.CDL.Logical.And and4 "Logical and"; Buildings.Controls.OBC.CDL.Logical.Not not2 "Logical not"; Buildings.Controls.OBC.CDL.Utilities.Assert assMes1( final message="Warning: airflow is less than 70% of the setpoint.") "Level 3 low airflow alarm"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant cooMaxFlo( final k=VCooMax_flow) "Cooling maximum airflow setpoint"; Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai2( final k=0.1) "Percentage of the setpoint"; Buildings.Controls.OBC.CDL.Logical.Not not3 "Logical not"; Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel2( final delayTime=fanOffTim) "Check if the input has been true for more than threshold time"; Buildings.Controls.OBC.CDL.Reals.Greater gre1( final h=floHys) "Check if measured airflow is greater than threshold"; Buildings.Controls.OBC.CDL.Logical.And and5 "Check if the measured airflow is greater than the threshold and the supply fan is OFF"; Buildings.Controls.OBC.CDL.Logical.Not not4 "Logical not"; Buildings.Controls.OBC.CDL.Utilities.Assert assMes2( final message="Warning: airflow sensor should be calibrated.") "Level 3 airflow sensor alarm"; Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt2( final integerTrue=3) "Convert boolean true to level 3 alarm"; Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel3( final delayTime=leaFloTim) "Check if the input has been true for more than threshold time"; Buildings.Controls.OBC.CDL.Reals.LessThreshold cloDam( final t=damPosHys, final h=0.5*damPosHys) "Check if damper position is near zero"; Buildings.Controls.OBC.CDL.Logical.And leaDamAla1 "Check if generating leak damper alarms, one of two stacked And blocks"; Buildings.Controls.OBC.CDL.Logical.And leaDamAla2 "Check if generating leak damper alarms, one of two stacked And blocks"; Buildings.Controls.OBC.CDL.Logical.Not not5 "Logical not"; Buildings.Controls.OBC.CDL.Utilities.Assert assMes3( final message="Warning: the damper is leaking.") "Level 4 leaking damper alarm"; Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt3( final integerTrue=4) "Convert boolean true to level 4 alarm"; Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel4( final delayTime=lowFloTim) "Check if the active flow setpoint has been greater than zero for the threshold time"; Buildings.Controls.OBC.CDL.Logical.And and11 "True: AHU fan is enabled and the discharge flow is lower than the threshold"; Buildings.Controls.OBC.CDL.Logical.And and10 "True: AHU fan is enabled and the discharge flow is lower than the threshold"; Buildings.Controls.OBC.CDL.Logical.TrueDelay fanIni( final delayTime=staTim) "Check if the AHU supply fan has been enabled for threshold time"; 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.Equal isOcc "Check if current operation mode is occupied mode"; Buildings.Controls.OBC.CDL.Logical.And and6 "Check if the measured airflow is greater than the threshold and the supply fan is OFF"; Buildings.Controls.OBC.CDL.Logical.And and7 "Measured airflow has been less than threshold value for sufficient time"; Buildings.Controls.OBC.CDL.Logical.And and3 "Measured airflow has been less than threshold value for sufficient time"; equation connect(VActSet_flow, gai.u); connect(VDis_flow, les.u1); connect(VActSet_flow, greThr.u); connect(VActSet_flow, gai1.u); connect(VDis_flow, gre.u2); connect(gai1.y, gre.u1); connect(truDel.y, and2.u1); connect(truDel1.y, and1.u2); connect(conInt.y, lowFloAla.u1); connect(booToInt.y, lowFloAla.u3); connect(conInt1.y, greThr1.u); connect(greThr1.y, booToInt1.u); connect(lowFloAla.y, proInt.u1); connect(booToInt1.y, proInt.u2); connect(not1.y, assMes.u); connect(and2.y,and8. u1); connect(greThr1.y,and8. u2); connect(and1.y, and4.u1); connect(greThr1.y, and4.u2); connect(not2.y, assMes1.u); connect(cooMaxFlo.y, gai2.u); connect(u1Fan, not3.u); connect(gai2.y, gre1.u2); connect(VDis_flow, gre1.u1); connect(not4.y, assMes2.u); connect(booToInt2.y, yFloSenAla); connect(proInt.y, yLowFloAla); connect(uDam, cloDam.u); connect(not5.y, assMes3.u); connect(booToInt3.y, yLeaDamAla); connect(greThr.y, truDel4.u); connect(truDel4.y, and1.u1); connect(truDel4.y, and2.u2); connect(and5.y, truDel2.u); connect(gre1.y, and5.u1); connect(not3.y, and5.u2); connect(truDel3.y, booToInt3.u); connect(truDel3.y, not5.u); connect(les.y, and10.u1); connect(and10.y, truDel.u); connect(gre.y, and11.u1); connect(and11.y, truDel1.u); connect(u1Fan, fanIni.u); connect(fanIni.y, and11.u2); connect(fanIni.y, and10.u2); connect(occMod.y,isOcc. u2); connect(uOpeMod,isOcc. u1); connect(and6.y, booToInt2.u); connect(and6.y, not4.u); connect(truDel2.y, and6.u1); connect(isOcc.y, and6.u2); connect(gai.y, les.u2); connect(and8.y, and7.u1); connect(and7.y, lowFloAla.u2); connect(and7.y, not1.u); connect(and3.y, booToInt.u); connect(and3.y, not2.u); connect(and4.y, and3.u1); connect(isOcc.y, and7.u2); connect(isOcc.y, and3.u2); connect(u1Fan, leaDamAla1.u1); connect(cloDam.y, leaDamAla1.u2); connect(leaDamAla1.y, leaDamAla2.u1); connect(gre1.y, leaDamAla2.u2); connect(leaDamAla2.y, truDel3.u); end Alarms;

Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.CoolingOnly.Subsequences.Dampers Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.CoolingOnly.Subsequences.Dampers

Output signals for controlling VAV cooling only box damper position

Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.CoolingOnly.Subsequences.Dampers

Information

This sequence sets the damper position for VAV cooling only terminal unit. The implementation is according to Section 5.5.5 and 5.5.7 of ASHRAE Guideline 36 (G36), May 2020.

  1. When the zone state (uZonSta) is cooling, the cooling-loop output (uCoo) shall be mapped to the active airflow setpoint from the minimum (VActMin_flow) to the cooling maximum airflow setpoints (VActCooMax_flow).
    • If supply air temperature TSup from the air handler is greater than room temperature TZon, cooling supply airflow setpoint shall be no higher than the minimum.
  2. When the zone state is deadband or heating, the active airflow setpoint shall be the minimum airflow setpoint.
  3. The VAV damper yDam shall be modulated by a control loop to maintain the measured airflow VDis_flow at the active setpoint.

The sequences of controlling damper position for the cooling only terminal unit are described in the following figure below.

Image of damper control for VAV cooling only unit

Override the airflow setpoint and the damper position setpoint by providing software switches that interlock to a system-level point to:

  1. when oveFloSet equals to 1, force the zone airflow setpoint VSet_flow to zero,
  2. when oveFloSet equals to 2, force the zone airflow setpoint VSet_flow to zone cooling maximum airflow rate VCooMax_flow,
  3. when oveFloSet equals to 3, force the zone airflow setpoint VSet_flow to zone minimum airflow setpoint VMin_flow.
  4. when oveDamPos equals to 1, force the damper to full closed by setting yDam to 0,
  5. when oveDamPos equals to 2, force the damper to full open by setting yDam to 1.

Parameters

TypeNameDefaultDescription
RealVMin_flow Design zone minimum airflow setpoint [m3/s]
RealVCooMax_flow Design zone cooling maximum airflow rate [m3/s]
SimpleControllerdamConBuildings.Controls.OBC.CDL.T...Type of controller
RealkDam0.5Gain of controller for damper control [1]
RealTiDam300Time constant of integrator block for damper control [s]
RealTdDam0.1Time constant of derivative block for damper control [s]
Advanced
RealdTHys0.25Delta between the temperature hysteresis high and low limit [K]
RealiniDam0.01Initial damper position when the damper control is enabled [1]

Connectors

TypeNameDescription
input RealInputVActMin_flowActive minimum airflow rate [m3/s]
input RealInputTSupTemperature of the air supplied from central air handler [K]
input RealInputTZonMeasured zone temperature [K]
input RealInputuCooCooling loop signal [1]
input RealInputVActCooMax_flowActive cooling maximum airflow rate [m3/s]
input IntegerInputuZonStaCurrent zone state
input IntegerInputoveFloSetIndex of overriding flow setpoint, 1: set to zero; 2: set to cooling maximum; 3: set to minimum flow
input BooleanInputu1FanAHU supply fan status
input RealInputVDis_flowMeasured primary discharge airflow rate [m3/s]
input IntegerInputoveDamPosIndex of overriding damper position, 1: set to close; 2: set to open
output RealOutputVSet_flowAirflow setpoint after considering override [m3/s]
output RealOutputyDamCommanded damper position after considering override [1]

Modelica definition

block Dampers "Output signals for controlling VAV cooling only box damper position" parameter Real VMin_flow(unit="m3/s") "Design zone minimum airflow setpoint"; parameter Real VCooMax_flow(unit="m3/s") "Design zone cooling maximum airflow rate"; parameter Buildings.Controls.OBC.CDL.Types.SimpleController damCon= Buildings.Controls.OBC.CDL.Types.SimpleController.PI "Type of controller"; parameter Real kDam(unit="1")=0.5 "Gain of controller for damper control"; parameter Real TiDam(unit="s")=300 "Time constant of integrator block for damper control"; parameter Real TdDam(unit="s")=0.1 "Time constant of derivative block for damper control"; parameter Real dTHys(unit="K")=0.25 "Delta between the temperature hysteresis high and low limit"; parameter Real iniDam(unit="1")=0.01 "Initial damper position when the damper control is enabled"; Buildings.Controls.OBC.CDL.Interfaces.RealInput VActMin_flow( final min=0, final unit="m3/s", final quantity="VolumeFlowRate") "Active minimum airflow rate"; Buildings.Controls.OBC.CDL.Interfaces.RealInput TSup( final quantity="ThermodynamicTemperature", final unit="K", final displayUnit="degC") "Temperature of the air supplied from central air handler"; Buildings.Controls.OBC.CDL.Interfaces.RealInput TZon( final quantity="ThermodynamicTemperature", final unit="K", final displayUnit="degC") "Measured zone temperature"; Buildings.Controls.OBC.CDL.Interfaces.RealInput uCoo( final min=0, final max=1, final unit="1") "Cooling loop signal"; Buildings.Controls.OBC.CDL.Interfaces.RealInput VActCooMax_flow( final min=0, final unit="m3/s", final quantity="VolumeFlowRate") "Active cooling maximum airflow rate"; Buildings.Controls.OBC.CDL.Interfaces.IntegerInput uZonSta "Current zone state"; Buildings.Controls.OBC.CDL.Interfaces.IntegerInput oveFloSet "Index of overriding flow setpoint, 1: set to zero; 2: set to cooling maximum; 3: set to minimum flow"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1Fan "AHU supply fan status"; Buildings.Controls.OBC.CDL.Interfaces.RealInput VDis_flow( final min=0, final unit="m3/s", final quantity="VolumeFlowRate") "Measured primary discharge airflow rate"; Buildings.Controls.OBC.CDL.Interfaces.IntegerInput oveDamPos "Index of overriding damper position, 1: set to close; 2: set to open"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput VSet_flow( final min=0, final unit="m3/s", final quantity="VolumeFlowRate") "Airflow setpoint after considering override"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput yDam( final min=0, final unit="1") "Commanded damper position after considering override"; protected Buildings.Controls.OBC.CDL.Reals.Sources.Constant con( final k=0) "Constant zero"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant con1( final k=1) "Constant one"; Buildings.Controls.OBC.CDL.Reals.Line lin "Map cooling loop output to the active airflow setpoint"; Buildings.Controls.OBC.CDL.Reals.Greater gre( final h=dTHys) "Check if supplyair temperature from the air handler is greater than room temperature"; Buildings.Controls.OBC.CDL.Reals.Switch swi "Select active airfow setpoint based on difference between supply and zone temperature"; Buildings.Controls.OBC.CDL.Reals.Switch actFlo "Specify active flow setpoint based on the zone status"; Buildings.Controls.OBC.CDL.Reals.PIDWithReset conPID( final controllerType=damCon, final k=kDam, final Ti=TiDam, final Td=TdDam, final y_reset=iniDam) "Damper controller"; Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt( final k=Buildings.Controls.OBC.ASHRAE.G36.Types.ZoneStates.cooling) "Cooling state value"; Buildings.Controls.OBC.CDL.Integers.Equal cooSta "Check if zone is in cooling state"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant nomFlow( final k=VCooMax_flow) "Nominal volume flow rate"; Buildings.Controls.OBC.CDL.Reals.Divide VDisSet_flowNor "Normalized setpoint for discharge volume flow rate"; Buildings.Controls.OBC.CDL.Reals.Divide VDis_flowNor "Normalized discharge volume flow rate"; Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt1( final k=1) "Constant 1"; Buildings.Controls.OBC.CDL.Integers.Equal forZerFlo "Check if forcing zone airflow setpoint to zero"; Buildings.Controls.OBC.CDL.Integers.Equal forCooMax "Check if forcing zone airflow setpoint to cooling maximum"; Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt2( final k=2) "Constant 2"; Buildings.Controls.OBC.CDL.Integers.Equal forMinFlo "Check if forcing zone airflow setpoint to minimum flow"; Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt3( final k=3) "Constant 3"; Buildings.Controls.OBC.CDL.Conversions.BooleanToReal zerFlo( final realTrue=0) "Force zone airflow setpoint to zero"; Buildings.Controls.OBC.CDL.Conversions.BooleanToReal cooMax( final realTrue=VCooMax_flow) "Force zone airflow setpoint to cooling maximum"; Buildings.Controls.OBC.CDL.Conversions.BooleanToReal minFlo( final realTrue=VMin_flow) "Force zone airflow setpoint to zone minimum flow"; Buildings.Controls.OBC.CDL.Reals.Add add2 "Add up two inputs"; Buildings.Controls.OBC.CDL.Reals.Add add1 "Add up inputs"; Buildings.Controls.OBC.CDL.Reals.Switch swi1 "Airflow setpoint after considering override"; Buildings.Controls.OBC.CDL.Logical.Or or3 "Check if the airflow setpoint should be overrided"; Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt4( final k=1) "Constant 1"; Buildings.Controls.OBC.CDL.Integers.Equal intEqu3 "Check if forcing damper to full close"; Buildings.Controls.OBC.CDL.Integers.Equal intEqu4 "Check if forcing damper to full open"; Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt5(final k=2) "Constant 2"; Buildings.Controls.OBC.CDL.Conversions.BooleanToReal cloDam( final realTrue=0) "Full closed damper position"; Buildings.Controls.OBC.CDL.Conversions.BooleanToReal opeDam( final realTrue=1) "Full open damper position"; Buildings.Controls.OBC.CDL.Reals.Add add3 "Add up inputs"; Buildings.Controls.OBC.CDL.Logical.Or or2 "Check if the damper setpoint position should be overrided"; Buildings.Controls.OBC.CDL.Reals.Switch swi2 "Damper setpoint position after considering override"; Buildings.Controls.OBC.CDL.Logical.Or or1 "Check if the airflow setpoint should be overrided"; equation connect(conInt.y, cooSta.u1); connect(uZonSta, cooSta.u2); connect(con.y, lin.x1); connect(con1.y, lin.x2); connect(uCoo, lin.u); connect(TSup, gre.u1); connect(TZon, gre.u2); connect(gre.y, swi.u2); connect(lin.y, swi.u3); connect(VActMin_flow, lin.f1); connect(VActMin_flow, swi.u1); connect(VActCooMax_flow, lin.f2); connect(cooSta.y, actFlo.u2); connect(VActMin_flow, actFlo.u3); connect(swi.y, actFlo.u1); connect(nomFlow.y, VDisSet_flowNor.u2); connect(nomFlow.y, VDis_flowNor.u2); connect(VDis_flow, VDis_flowNor.u1); connect(VDisSet_flowNor.y, conPID.u_s); connect(VDis_flowNor.y, conPID.u_m); connect(oveFloSet,forZerFlo. u1); connect(conInt1.y, forZerFlo.u2); connect(oveFloSet,forCooMax. u1); connect(conInt2.y,forCooMax. u2); connect(oveFloSet,forMinFlo. u1); connect(conInt3.y,forMinFlo. u2); connect(forZerFlo.y,zerFlo. u); connect(forCooMax.y,cooMax. u); connect(forMinFlo.y,minFlo. u); connect(cooMax.y,add2. u1); connect(minFlo.y,add2. u2); connect(zerFlo.y,add1. u1); connect(add2.y,add1. u2); connect(add1.y, swi1.u1); connect(swi1.y, VSet_flow); connect(actFlo.y, swi1.u3); connect(swi1.y, VDisSet_flowNor.u1); connect(oveDamPos,intEqu3. u1); connect(oveDamPos,intEqu4. u1); connect(intEqu3.y,cloDam. u); connect(intEqu4.y,opeDam. u); connect(cloDam.y,add3. u1); connect(opeDam.y,add3. u2); connect(intEqu3.y,or2. u1); connect(intEqu4.y,or2. u2); connect(or2.y,swi2. u2); connect(swi2.y, yDam); connect(conPID.y, swi2.u3); connect(conInt5.y, intEqu4.u2); connect(conInt4.y, intEqu3.u2); connect(add3.y, swi2.u1); connect(u1Fan, conPID.trigger); connect(or1.y, swi1.u2); connect(or3.y, or1.u2); connect(forMinFlo.y, or1.u1); connect(forCooMax.y, or3.u1); connect(forZerFlo.y, or3.u2); end Dampers;

Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.CoolingOnly.Subsequences.SystemRequests Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.CoolingOnly.Subsequences.SystemRequests

Output system requests for VAV cooling only terminal unit

Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.CoolingOnly.Subsequences.SystemRequests

Information

This sequence outputs the system reset requests for cooling only terminal unit. The implementation is according to the Section 5.5.8 of ASHRAE Guideline 36, May 2020.

Cooling SAT reset requests yZonTemResReq

  1. If the zone temperature TZon exceeds the zone cooling setpoint TZonCooSet by 3 °C (5 °F)) for 2 minutes and after suppression period (uAftSup=true) due to setpoint change per G36 Part 5.1.20, send 3 requests (yZonTemResReq=3).
  2. Else if the zone temperature TZon exceeds the zone cooling setpoint TZonCooSet by 2 °C (3 °F) for 2 minutes and after suppression period (uAftSup=true) due to setpoint change per G36 Part 5.1.20, send 2 requests (yZonTemResReq=2).
  3. Else if the cooling loop uCoo is greater than 95%, send 1 request (yZonTemResReq=1) until uCoo is less than 85%.
  4. Else if uCoo is less than 95%, send 0 request (yZonTemResReq=0).

Static pressure reset requests yZonPreResReq

  1. If the measured airflow VDis_flow is less than 50% of setpoint VSet_flow while the setpoint is greater than zero and the damper position uDam is greater than 95% for 1 minute, send 3 requests (yZonPreResReq=3).
  2. Else if the measured airflow VDis_flow is less than 70% of setpoint VSet_flow while the setpoint is greater than zero and the damper position uDam is greater than 95% for 1 minute, send 2 requests (yZonPreResReq=2).
  3. Else if the damper position uDam is greater than 95%, send 1 request (yZonPreResReq=1) until uDam is less than 85%.
  4. Else if the damper position uDam is less than 95%, send 0 request (yZonPreResReq=0).

Parameters

TypeNameDefaultDescription
RealthrTemDif3Threshold difference between zone temperature and cooling setpoint for generating 3 cooling SAT reset requests [K]
RealtwoTemDif2Threshold difference between zone temperature and cooling setpoint for generating 2 cooling SAT reset requests [K]
Duration times
RealdurTimTem120Duration time of zone temperature exceeds setpoint [s]
RealdurTimFlo60Duration time of airflow rate less than setpoint [s]
Advanced
RealdTHys0.25Near zero temperature difference, below which the difference will be seen as zero [K]
RealfloHys Near zero flow rate, below which the flow rate or difference will be seen as zero [m3/s]
ReallooHys Loop output hysteresis below which the output will be seen as zero [1]
RealdamPosHys Near zero damper position, below which the damper will be seen as closed [1]
RealsamplePeriod120Sample period of component, set to the same value as the trim and respond that process yPreSetReq [s]

Connectors

TypeNameDescription
input BooleanInputuAftSupAfter suppression period due to the setpoint change
input RealInputTCooSetZone cooling setpoint temperature [K]
input RealInputTZonZone temperature [K]
input RealInputuCooCooling loop signal [1]
input RealInputVSet_flowDischarge airflow rate setpoint [m3/s]
input RealInputVDis_flowMeasured discharge airflow rate [m3/s]
input RealInputuDamDamper position setpoint [1]
output IntegerOutputyZonTemResReqZone cooling supply air temperature reset request
output IntegerOutputyZonPreResReqZone static pressure reset requests

Modelica definition

block SystemRequests "Output system requests for VAV cooling only terminal unit" parameter Real thrTemDif( final unit="K", final quantity="TemperatureDifference")=3 "Threshold difference between zone temperature and cooling setpoint for generating 3 cooling SAT reset requests"; parameter Real twoTemDif( final unit="K", final quantity="TemperatureDifference")=2 "Threshold difference between zone temperature and cooling setpoint for generating 2 cooling SAT reset requests"; parameter Real durTimTem( final unit="s", final quantity="Time")=120 "Duration time of zone temperature exceeds setpoint"; parameter Real durTimFlo( final unit="s", final quantity="Time")=60 "Duration time of airflow rate less than setpoint"; parameter Real dTHys( final unit="K", final quantity="TemperatureDifference")=0.25 "Near zero temperature difference, below which the difference will be seen as zero"; parameter Real floHys( final quantity="VolumeFlowRate", final unit="m3/s") "Near zero flow rate, below which the flow rate or difference will be seen as zero"; parameter Real looHys(unit="1") "Loop output hysteresis below which the output will be seen as zero"; parameter Real damPosHys( final unit="1") "Near zero damper position, below which the damper will be seen as closed"; parameter Real samplePeriod( final unit="s", final quantity="Time")=120 "Sample period of component, set to the same value as the trim and respond that process yPreSetReq"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput uAftSup "After suppression period due to the setpoint change"; Buildings.Controls.OBC.CDL.Interfaces.RealInput TCooSet( final unit="K", final displayUnit="degC", final quantity="ThermodynamicTemperature") "Zone cooling setpoint temperature"; Buildings.Controls.OBC.CDL.Interfaces.RealInput TZon( final unit="K", final displayUnit="degC", final quantity="ThermodynamicTemperature") "Zone temperature"; Buildings.Controls.OBC.CDL.Interfaces.RealInput uCoo( final min=0, final max=1, final unit="1") "Cooling loop signal"; Buildings.Controls.OBC.CDL.Interfaces.RealInput VSet_flow( final min=0, final unit="m3/s", quantity="VolumeFlowRate") "Discharge airflow rate setpoint"; Buildings.Controls.OBC.CDL.Interfaces.RealInput VDis_flow( final min=0, final unit="m3/s", final quantity="VolumeFlowRate") "Measured discharge airflow rate"; Buildings.Controls.OBC.CDL.Interfaces.RealInput uDam( final min=0, final max=1, final unit="1") "Damper position setpoint"; Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yZonTemResReq "Zone cooling supply air temperature reset request"; Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yZonPreResReq "Zone static pressure reset requests"; protected Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr1( final t=thrTemDif, final h=dTHys) "Check if zone temperature is greater than cooling setpoint by threshold"; Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr2( final t=twoTemDif, final h=dTHys) "Check if zone temperature is greater than cooling setpoint by threshold"; Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr3( final t=0.95, final h=damPosHys) "Check if damper position is greater than 0.95"; Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr( final t=0.95, final h=looHys) "Check if cooling loop signal is greater than 0.95"; Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr4( final t=floHys, final h=0.5*floHys) "Check if discharge airflow setpoint is greater than 0"; Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt "Convert boolean to integer"; Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt1 "Convert boolean to integer"; Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai1( final k=0.5) "50% of setpoint"; Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai2( final k=0.7) "70% of setpoint"; Buildings.Controls.OBC.CDL.Reals.Subtract sub2 "Calculate difference between zone temperature and cooling setpoint"; Buildings.Controls.OBC.CDL.Reals.Subtract sub3 "Calculate difference between zone temperature and cooling setpoint"; Buildings.Controls.OBC.CDL.Logical.And and1 "Logical and"; Buildings.Controls.OBC.CDL.Logical.And and2 "Logical and"; Buildings.Controls.OBC.CDL.Logical.And and3 "Logical and"; Buildings.Controls.OBC.CDL.Logical.And and4 "Logical and"; Buildings.Controls.OBC.CDL.Integers.Sources.Constant thrCooResReq( final k=3) "Constant 3"; Buildings.Controls.OBC.CDL.Integers.Sources.Constant twoCooResReq( final k=2) "Constant 2"; Buildings.Controls.OBC.CDL.Integers.Sources.Constant thrPreResReq( final k=3) "Constant 3"; Buildings.Controls.OBC.CDL.Integers.Sources.Constant twoPreResReq( final k=2) "Constant 2"; Buildings.Controls.OBC.CDL.Integers.Switch intSwi "Output 3 or other request "; Buildings.Controls.OBC.CDL.Integers.Switch intSwi1 "Output 2 or other request "; Buildings.Controls.OBC.CDL.Integers.Switch swi4 "Output 3 or other request "; Buildings.Controls.OBC.CDL.Integers.Switch swi5 "Output 2 or other request "; Buildings.Controls.OBC.CDL.Logical.TrueDelay tim1( final delayTime=durTimTem) "Check if it is more than threshold time"; Buildings.Controls.OBC.CDL.Logical.TrueDelay tim2( final delayTime=durTimTem) "Check if it is more than threshold time"; Buildings.Controls.OBC.CDL.Logical.TrueDelay tim3( final delayTime=durTimFlo) "Check if it is more than threshold time"; Buildings.Controls.OBC.CDL.Reals.Greater greEqu(final h=floHys) "Check if discharge airflow is less than 50% of setpoint"; Buildings.Controls.OBC.CDL.Reals.Greater greEqu1(final h=floHys) "Check if discharge airflow is less than 70% of setpoint"; Buildings.Controls.OBC.CDL.Logical.And and5 "Logical and"; Buildings.Controls.OBC.CDL.Discrete.Sampler sampler( final samplePeriod=samplePeriod) "Sample input signal, as the output signal will go to the trim and respond which also samples at samplePeriod"; Buildings.Controls.OBC.CDL.Discrete.Sampler sampler1( final samplePeriod=samplePeriod) "Sample input signal, as the output signal will go to the trim and respond which also samples at samplePeriod"; Buildings.Controls.OBC.CDL.Discrete.Sampler sampler2( final samplePeriod=samplePeriod) "Sample input signal, as the output signal will go to the trim and respond which also samples at samplePeriod"; Buildings.Controls.OBC.CDL.Discrete.Sampler sampler3( final samplePeriod=samplePeriod) "Sample input signal, as the output signal will go to the trim and respond which also samples at samplePeriod"; equation connect(sub2.y, greThr1.u); connect(and2.y, intSwi.u2); connect(sub3.y, greThr2.u); connect(and1.y, intSwi1.u2); connect(and3.y, swi4.u2); connect(and4.y, swi5.u2); connect(greThr2.y, tim2.u); connect(tim2.y, and1.u2); connect(greThr1.y, tim1.u); connect(tim1.y, and2.u2); connect(greEqu.u1, gai1.y); connect(greEqu.y, and3.u2); connect(gai2.y, greEqu1.u1); connect(greEqu1.y, and4.u2); connect(uAftSup, and2.u1); connect(uAftSup, and1.u1); connect(thrCooResReq.y, intSwi.u1); connect(twoCooResReq.y, intSwi1.u1); connect(intSwi1.y, intSwi.u3); connect(intSwi.y, yZonTemResReq); connect(greThr.y, booToInt.u); connect(booToInt.y, intSwi1.u3); connect(greThr3.y, tim3.u); connect(greThr4.y, and5.u1); connect(tim3.y, and5.u2); connect(and5.y, and3.u1); connect(and5.y, and4.u1); connect(greThr3.y, booToInt1.u); connect(booToInt1.y, swi5.u3); connect(twoPreResReq.y, swi5.u1); connect(thrPreResReq.y, swi4.u1); connect(swi5.y, swi4.u3); connect(swi4.y, yZonPreResReq); connect(TCooSet, sub2.u2); connect(TCooSet, sub3.u2); connect(TZon, sub2.u1); connect(TZon, sub3.u1); connect(uCoo, sampler.u); connect(sampler.y, greThr.u); connect(uDam, sampler1.u); connect(sampler1.y, greThr3.u); connect(VDis_flow, sampler2.u); connect(sampler2.y, greEqu.u2); connect(sampler2.y, greEqu1.u2); connect(greThr4.u, sampler3.y); connect(sampler3.u, VSet_flow); connect(sampler3.y, gai1.u); connect(sampler3.y, gai2.u); end SystemRequests;