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

Package of subsequences for snap-acting controlled dual-duct terminal unit

Information

This package contains subsequences for snap-acting controlled dual-duct terminal unit. They are created according to Section 5.11 of ASHRAE Guideline 36, May 2020.

Package Content

Name Description
Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctSnapActing.Subsequences.ActiveAirFlow ActiveAirFlow Output the active airflow setpoint for snap-acting controlled dual-duct terminal unit
Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctSnapActing.Subsequences.Alarms Alarms Generate alarms of snap-acting controlled dual-duct terminal unit
Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctSnapActing.Subsequences.DampersDualSensors DampersDualSensors Output signals for controlling dampers of snap-acting controlled dual-duct terminal unit with dual inlet airflow sensors
Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctSnapActing.Subsequences.DampersSingleSensors DampersSingleSensors Output signals for controlling dampers of snap-acting controlled dual-duct terminal unit with single discharge airflow sensors
Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctSnapActing.Subsequences.Overrides Overrides Software switches to override setpoints
Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctSnapActing.Subsequences.SystemRequests SystemRequests Output system requests for VAV terminal unit with reheat
Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctSnapActing.Subsequences.Validation Validation Collection of validation models

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

Output the active airflow setpoint for snap-acting controlled dual-duct terminal unit

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

Information

This sequence sets the active cooling and heating maximum and the active minimum setpoints for snap-acting controlled dual-duct terminal unit. The implementation is according to the Section 5.11.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_flow0 0000
Heating maximum (VActHeaMax_flow)VHeaMax_flow 00VHeaMax_flowVHeaMax_flow 0

Parameters

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

Connectors

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

Modelica definition

block ActiveAirFlow "Output the active airflow setpoint for snap-acting controlled dual-duct terminal unit" parameter Real VCooMax_flow( final quantity="VolumeFlowRate", final unit="m3/s") "Design zone cooling maximum airflow rate"; parameter Real VHeaMax_flow( final quantity="VolumeFlowRate", final unit="m3/s") "Design zone heating maximum airflow rate"; Buildings.Controls.OBC.CDL.Interfaces.RealInput VOccMin_flow( final unit="m3/s", final quantity="VolumeFlowRate") "Occupied minimum airflow setpoint"; Buildings.Controls.OBC.CDL.Interfaces.IntegerInput uOpeMod "Zone operation mode"; 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 setpoint"; protected 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 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.Logical.Or3 or3 "Check if it is in occupied, cooldown, or setup mode"; Buildings.Controls.OBC.CDL.Conversions.BooleanToReal actCooMax( final realTrue=VCooMax_flow) "Active cooling maximum flow"; Buildings.Controls.OBC.CDL.Conversions.BooleanToReal occModInd( final realTrue=1) "If in occupied mode, output 1"; Buildings.Controls.OBC.CDL.Reals.Multiply pro "Active cooling minimum, minimum airflow setpoint"; Buildings.Controls.OBC.CDL.Conversions.BooleanToReal heaMaxFlo( final realTrue=VHeaMax_flow) "Heating maximum flow when input is true"; Buildings.Controls.OBC.CDL.Integers.Sources.Constant setBacMod( final k=Buildings.Controls.OBC.ASHRAE.G36.Types.OperationModes.setBack) "Setback mode"; Buildings.Controls.OBC.CDL.Integers.Sources.Constant warUpMod( final k=Buildings.Controls.OBC.ASHRAE.G36.Types.OperationModes.warmUp) "Warm up mode"; Buildings.Controls.OBC.CDL.Integers.Equal ifOcc "Check if current operation mode is occupied mode"; Buildings.Controls.OBC.CDL.Integers.Equal ifCooDow "Check if current operation mode is cooldown mode"; Buildings.Controls.OBC.CDL.Integers.Equal ifSetUp "Check if current operation mode is setup mode"; Buildings.Controls.OBC.CDL.Integers.Equal ifWarUp "Check if current operation mode is warm-up mode"; Buildings.Controls.OBC.CDL.Integers.Equal ifSetBac "Check if current operation mode is setback mode"; Buildings.Controls.OBC.CDL.Logical.Or3 or1 "Check if it is in occupied, warm-up, or setback mode"; equation connect(occMod.y, ifOcc.u1); connect(cooDowMod.y, ifCooDow.u1); connect(setUpMod.y, ifSetUp.u1); connect(warUpMod.y, ifWarUp.u1); connect(uOpeMod, ifOcc.u2); connect(uOpeMod, ifCooDow.u2); connect(uOpeMod, ifSetUp.u2); connect(uOpeMod, ifWarUp.u2); connect(uOpeMod, ifSetBac.u2); connect(setBacMod.y, ifSetBac.u1); connect(ifOcc.y, or3.u1); connect(ifCooDow.y, or3.u2); connect(ifSetUp.y, or3.u3); connect(or3.y, actCooMax.u); connect(ifOcc.y, occModInd.u); connect(VOccMin_flow, pro.u2); connect(occModInd.y, pro.u1); connect(actCooMax.y, VActCooMax_flow); connect(pro.y, VActMin_flow); connect(ifOcc.y, or1.u1); connect(ifWarUp.y, or1.u2); connect(ifSetBac.y, or1.u3); connect(or1.y, heaMaxFlo.u); connect(heaMaxFlo.y, VActHeaMax_flow); end ActiveAirFlow;

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

Generate alarms of snap-acting controlled dual-duct terminal unit

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

Information

This block outputs alarms of snap-acting controlled dual-duct terminal unit. The implementation is according to the Section 5.11.6 of ASHRAE Guideline 36, May 2020.

Low airflow

  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

Leaking damper

Parameters

TypeNameDefaultDescription
Booleanhave_duaSen True: the unit have dual inlet flow sensor
RealstaPreMul Importance multiplier for the zone static pressure reset control loop
RealVCooMax_flow Design zone cooling maximum airflow rate [m3/s]
RealVHeaMax_flow Design zone heating maximum airflow rate [m3/s]
ReallowFloTim300Threshold time to check low flow rate [s]
RealfanOffTim600Threshold time to check fan off [s]
RealleaFloTim600Threshold time to check damper leaking airflow [s]
Advanced
RealfloHys0.05Near zero flow rate, below which the flow rate or difference will be seen as zero [m3/s]
RealdamPosHys0.05Near 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 IntegerInputuOpeModZone operation mode
input RealInputVColDucDis_flowMeasured cold-duct discharge airflow rate [m3/s]
input BooleanInputu1CooFanCooling air handler supply fan status
input RealInputuCooDamCooling damper position setpoint [1]
input RealInputVHotDucDis_flowMeasured hot-duct discharge airflow rate [m3/s]
input BooleanInputu1HeaFanHeating air handler supply fan status
input RealInputuHeaDamHeating damper position setpoint [1]
output IntegerOutputyLowFloAlaLow airflow alarms
output IntegerOutputyFloSenAlaAirflow sensor calibration alarm
output IntegerOutputyLeaDamAlaLeaking dampers alarm, could be heating or cooling damper
output IntegerOutputyColFloSenAlaCold-duct airflow sensor calibration alarm
output IntegerOutputyColLeaDamAlaLeaking cold-duct damper alarm
output IntegerOutputyHotFloSenAlaHot-duct airflow sensor calibration alarm
output IntegerOutputyHotLeaDamAlaLeaking hot-duct damper alarm

Modelica definition

block Alarms "Generate alarms of snap-acting controlled dual-duct terminal unit" parameter Boolean have_duaSen "True: the unit have dual inlet flow sensor"; 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 VHeaMax_flow( final quantity="VolumeFlowRate", final unit="m3/s") "Design zone heating 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 damper leaking airflow"; parameter Real floHys( final quantity="VolumeFlowRate", final unit="m3/s")=0.05 "Near zero flow rate, below which the flow rate or difference will be seen as zero"; parameter Real damPosHys( final unit="1")=0.05 "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") if not have_duaSen "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.IntegerInput uOpeMod "Zone operation mode"; Buildings.Controls.OBC.CDL.Interfaces.RealInput VColDucDis_flow( final min=0, final unit="m3/s", final quantity="VolumeFlowRate") if have_duaSen "Measured cold-duct discharge airflow rate"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1CooFan "Cooling air handler supply fan status"; Buildings.Controls.OBC.CDL.Interfaces.RealInput uCooDam( final min=0, final unit="1") "Cooling damper position setpoint"; Buildings.Controls.OBC.CDL.Interfaces.RealInput VHotDucDis_flow( final min=0, final unit="m3/s", final quantity="VolumeFlowRate") if have_duaSen "Measured hot-duct discharge airflow rate"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1HeaFan "Heating air handler supply fan status"; Buildings.Controls.OBC.CDL.Interfaces.RealInput uHeaDam( final min=0, final unit="1") "Heating damper position setpoint"; Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yLowFloAla "Low airflow alarms"; Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yFloSenAla if not have_duaSen "Airflow sensor calibration alarm"; Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yLeaDamAla if not have_duaSen "Leaking dampers alarm, could be heating or cooling damper"; Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yColFloSenAla if have_duaSen "Cold-duct airflow sensor calibration alarm"; Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yColLeaDamAla if have_duaSen "Leaking cold-duct damper alarm"; Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yHotFloSenAla if have_duaSen "Hot-duct airflow sensor calibration alarm"; Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yHotLeaDamAla if have_duaSen "Leaking hot-duct 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) if have_duaSen "Cooling maximum airflow setpoint"; Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai2( final k=0.1) if have_duaSen "Percentage of the setpoint"; Buildings.Controls.OBC.CDL.Logical.Not not3 if have_duaSen "Logical not"; Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel2( final delayTime=fanOffTim) if have_duaSen "Check if the input has been true for more than threshold time"; Buildings.Controls.OBC.CDL.Reals.Greater gre1( final h=floHys) if have_duaSen "Check if measured airflow is greater than threshold"; Buildings.Controls.OBC.CDL.Logical.And and5 if have_duaSen "Check if the measured airflow is greater than the threshold and the supply fan is OFF"; Buildings.Controls.OBC.CDL.Logical.Not not4 if have_duaSen "Logical not"; Buildings.Controls.OBC.CDL.Utilities.Assert assMes2( final message="Warning: cold-duct airflow sensor should be calibrated.") if have_duaSen "Level 3 airflow sensor alarm"; Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt2( final integerTrue=3) if have_duaSen "Convert boolean true to level 3 alarm"; Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel3( final delayTime=leaFloTim) if have_duaSen "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 leaDamAla if have_duaSen "Check if generating leak damper alarms"; Buildings.Controls.OBC.CDL.Logical.Not not5 if have_duaSen "Logical not"; Buildings.Controls.OBC.CDL.Utilities.Assert assMes3( final message="Warning: the cold-duct damper is leaking.") if have_duaSen "Level 4 leaking damper alarm"; Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt3( final integerTrue=4) if have_duaSen "Convert boolean true to level 4 alarm"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant heaMaxFlo( final k=VHeaMax_flow) if have_duaSen "Heating maximum airflow setpoint"; Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai3(final k=0.1) if have_duaSen "Percentage of the setpoint"; Buildings.Controls.OBC.CDL.Logical.Not not6 if have_duaSen "Logical not"; Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel4( final delayTime=fanOffTim) if have_duaSen "Check if the input has been true for more than threshold time"; Buildings.Controls.OBC.CDL.Reals.Greater gre2( final h=floHys) if have_duaSen "Check if measured airflow is greater than threshold"; Buildings.Controls.OBC.CDL.Logical.And and6 if have_duaSen "Check if the measured airflow is greater than the threshold and the supply fan is OFF"; Buildings.Controls.OBC.CDL.Logical.Not not7 if have_duaSen "Logical not"; Buildings.Controls.OBC.CDL.Utilities.Assert assMes4( final message="Warning: hot-duct airflow sensor should be calibrated.") if have_duaSen "Level 3 airflow sensor alarm"; Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt4( final integerTrue=3) if have_duaSen "Convert boolean true to level 3 alarm"; Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel5( final delayTime=leaFloTim) if have_duaSen "Check if the input has been true for more than threshold time"; Buildings.Controls.OBC.CDL.Reals.LessThreshold cloDam1( final t=damPosHys, final h=0.5*damPosHys) "Check if damper position is near zero"; Buildings.Controls.OBC.CDL.Logical.And leaDamAla1 if have_duaSen "Check if generating leak damper alarms"; Buildings.Controls.OBC.CDL.Logical.Not not8 if have_duaSen "Logical not"; Buildings.Controls.OBC.CDL.Utilities.Assert assMes5( final message="Warning: the hot-duct damper is leaking.") if have_duaSen "Level 4 leaking damper alarm"; Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt5( final integerTrue=4) if have_duaSen "Convert boolean true to level 4 alarm"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant cooMaxFlo1( final k=VCooMax_flow) if not have_duaSen "Cooling maximum airflow setpoint"; Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai4( final k=0.1) if not have_duaSen "Percentage of the setpoint"; Buildings.Controls.OBC.CDL.Reals.Greater gre3( final h=floHys) if not have_duaSen "Check if measured airflow is greater than threshold"; Buildings.Controls.OBC.CDL.Logical.And and7 if not have_duaSen "Check if the measured airflow is greater than the threshold and the supply fan is OFF"; Buildings.Controls.OBC.CDL.Logical.Not not9 if not have_duaSen "Logical not"; Buildings.Controls.OBC.CDL.Utilities.Assert assMes6( final message="Warning: airflow sensor should be calibrated.") if not have_duaSen "Level 3 airflow sensor alarm"; Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt6( final integerTrue=3) if not have_duaSen "Convert boolean true to level 3 alarm"; Buildings.Controls.OBC.CDL.Logical.Or or2 if not have_duaSen "Check if there is any supply fan proven on"; Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel6( final delayTime=fanOffTim) if not have_duaSen "Check if the input has been true for more than threshold time"; Buildings.Controls.OBC.CDL.Logical.Not not10 if not have_duaSen "Logical not"; Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel7( final delayTime=leaFloTim) if not have_duaSen "Check if the input has been true for more than threshold time"; Buildings.Controls.OBC.CDL.Logical.And leaDamAla2 if not have_duaSen "Check if generating leak damper alarms"; Buildings.Controls.OBC.CDL.Logical.And cloBotDam if not have_duaSen "Both heating and cooling dampers are closed"; Buildings.Controls.OBC.CDL.Logical.Not not11 if not have_duaSen "Logical not"; Buildings.Controls.OBC.CDL.Utilities.Assert assMes7( final message="Warning: the cold-duct or hot-dcut damper is leaking.") if not have_duaSen "Level 4 leaking damper alarm"; Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt7( final integerTrue=4) if not have_duaSen "Convert boolean true to level 4 alarm"; Buildings.Controls.OBC.CDL.Reals.Add add2 if have_duaSen "Total discharge airflow"; Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel8( final delayTime=lowFloTim) "Check if the active flow setpoint has been greater than zero for the threshold time"; 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.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.Or or1 "Check if there is any supply fan proven on"; 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 and3 "Logical and"; Buildings.Controls.OBC.CDL.Logical.And and9 "Logical and"; Buildings.Controls.OBC.CDL.Logical.And leaDamAla3 if not have_duaSen "Check if generating leak damper alarms"; Buildings.Controls.OBC.CDL.Logical.And leaDamAla4 if have_duaSen "Check if generating leak damper alarms"; Buildings.Controls.OBC.CDL.Logical.And leaDamAla5 if have_duaSen "Check if generating leak damper alarms"; 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(u1CooFan, not3.u); connect(gai2.y, gre1.u2); connect(gre1.y, and5.u1); connect(not4.y, assMes2.u); connect(booToInt2.y, yColFloSenAla); connect(proInt.y, yLowFloAla); connect(uCooDam, cloDam.u); connect(u1CooFan, leaDamAla.u2); connect(not5.y, assMes3.u); connect(booToInt3.y, yColLeaDamAla); connect(VColDucDis_flow, gre1.u1); connect(heaMaxFlo.y, gai3.u); connect(u1HeaFan, not6.u); connect(gai3.y,gre2. u2); connect(gre2.y,and6. u1); connect(not7.y,assMes4. u); connect(booToInt4.y, yHotFloSenAla); connect(uHeaDam, cloDam1.u); connect(u1HeaFan, leaDamAla1.u2); connect(not8.y,assMes5. u); connect(booToInt5.y, yHotLeaDamAla); connect(VHotDucDis_flow, gre2.u1); connect(VDis_flow, gre3.u1); connect(u1CooFan, or2.u1); connect(u1HeaFan, or2.u2); connect(or2.y, not10.u); connect(not9.y, assMes6.u); connect(booToInt6.y, yFloSenAla); connect(gai4.y, gre3.u2); connect(cooMaxFlo1.y, gai4.u); connect(or2.y, leaDamAla2.u2); connect(cloDam.y, cloBotDam.u1); connect(cloDam1.y, cloBotDam.u2); connect(not11.y, assMes7.u); connect(booToInt7.y, yLeaDamAla); connect(VColDucDis_flow, add2.u1); connect(VHotDucDis_flow, add2.u2); connect(add2.y, les.u1); connect(add2.y, gre.u2); connect(add2.y, gre3.u1); connect(greThr.y, truDel8.u); connect(truDel8.y, and1.u1); connect(truDel8.y, and2.u2); connect(gre3.y, and7.u1); connect(not10.y, and7.u2); connect(and7.y, truDel6.u); connect(truDel6.y, booToInt6.u); connect(truDel6.y, not9.u); connect(truDel7.y, booToInt7.u); connect(truDel7.y, not11.u); connect(gre3.y, leaDamAla2.u1); connect(not3.y, and5.u2); connect(and5.y, truDel2.u); connect(truDel2.y, booToInt2.u); connect(truDel2.y, not4.u); connect(gre1.y, leaDamAla.u1); connect(truDel3.y, booToInt3.u); connect(truDel3.y, not5.u); connect(and6.y, truDel4.u); connect(truDel4.y, booToInt4.u); connect(not6.y, and6.u2); connect(truDel4.y, not7.u); connect(truDel5.y, booToInt5.u); connect(truDel5.y, not8.u); connect(gre2.y, leaDamAla1.u1); connect(les.y, and10.u1); connect(and10.y, truDel.u); connect(gre.y, and11.u1); connect(and11.y, truDel1.u); connect(fanIni.y, and10.u2); connect(u1CooFan, or1.u1); connect(u1HeaFan, or1.u2); connect(or1.y, fanIni.u); connect(occMod.y,isOcc. u2); connect(uOpeMod,isOcc. u1); connect(fanIni.y, and11.u2); connect(gai.y, les.u2); connect(and8.y, and9.u1); connect(and9.y, lowFloAla.u2); connect(booToInt.u, and3.y); connect(and9.y, not1.u); connect(and3.y, not2.u); connect(and4.y, and3.u1); connect(isOcc.y, and9.u2); connect(isOcc.y, and3.u2); connect(leaDamAla2.y, leaDamAla3.u1); connect(leaDamAla3.y, truDel7.u); connect(cloBotDam.y, leaDamAla3.u2); connect(leaDamAla.y, leaDamAla4.u1); connect(leaDamAla4.y, truDel3.u); connect(cloDam.y, leaDamAla4.u2); connect(leaDamAla1.y, leaDamAla5.u1); connect(leaDamAla5.y, truDel5.u); connect(cloDam1.y, leaDamAla5.u2); end Alarms;

Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctSnapActing.Subsequences.DampersDualSensors Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctSnapActing.Subsequences.DampersDualSensors

Output signals for controlling dampers of snap-acting controlled dual-duct terminal unit with dual inlet airflow sensors

Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctSnapActing.Subsequences.DampersDualSensors

Information

This sequence sets the dampers for snap-acting controlled dual-duct terminal unit with dual inlet airflow sensors. The implementation is according to Section 5.11.5.1 of ASHRAE Guideline 36, May 2020. The calculation is done following the steps below.

  1. When the zone state is cooling (uCoo > 0), then the cooling loop output uCoo shall reset the cooling supply airflow setpoint VColDucDis_flow_Set from the minimum VActMin_flow to cooling maximum setpoint VActCooMax_flow. The cooling damper shall be modulated by a control loop to maintain the measured cooling aiflow VColDucDis_flow at setpoint. The heating damper shall be closed yHeaDam=0.
    • If the cold-deck supply air temperature TColSup from the cooling 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 (uCoo=0 and uHea=0), the cooling and heating airflow set points shall be their last set points just before entering deadband. In other words, when going from cooling to deadband, the cooling airflow set point is equal to the zone minimum VActMin_flow, and the heating set point is zero When going from heating to deadband, the heating airflow set point is equal to the zone minimum VActMin_flow, and the cooling set point is zero.
  3. When the zone state is heating (uHea > 0), then the heating loop output uHea shall reset the heating supply airflow setpoint VHotDucDis_flow_Set from the minimum VActMin_flow to heating maximum setpoint VActHeaMax_flow. The heating damper shall be modulated by a control loop to maintain the measured heating aiflow VHotDucDis_flow at setpoint. The cooling damper shall be closed yCooDam=0.
    • If the hot-deck supply air temperature THotSup from the heating air handler is less than room temperature TZon, heating supply airflow setpoint shall be no higher than the minimum.
  4. Overriding above controls:
    • If heating air handler is not proven ON (u1HeaAHU=false), the heating damper shall be closed (yHeaDam=0).
    • If cooling air handler is not proven ON (u1CooAHU=false), the cooling damper shall be closed (yCooDam=0).

The sequences of controlling dampers position for snap-acting controlled dual-duct terminal unit with dual inlet airflow sensors are described in the following figure below.

Image of damper control for snap-acting controlled dual-duct terminal unit

Parameters

TypeNameDefaultDescription
RealVCooMax_flow Design zone cooling maximum airflow rate [m3/s]
RealVHeaMax_flow Design zone heating maximum airflow rate [m3/s]
SimpleControllercontrollerTypeDamBuildings.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
RealsamplePeriod Sample period of component [s]
RealdTHys0.25Temperature difference hysteresis below which the temperature difference will be seen as zero [K]
ReallooHys0.05Loop output hysteresis below which the output will be seen as zero [1]
RealiniDam0.01Initial damper position when the damper control is enabled [1]

Connectors

TypeNameDescription
input RealInputuCooCooling control signal [1]
input RealInputVActCooMax_flowActive cooling maximum airflow rate [m3/s]
input RealInputTColSupCold duct supply air temperature from central air handler [K]
input RealInputVColDucDis_flowMeasured cold-duct discharge airflow rate airflow rate [m3/s]
input BooleanInputu1CooAHUCooling air handler status
input RealInputVActMin_flowActive minimum airflow rate [m3/s]
input RealInputTZonMeasured zone temperature [K]
input RealInputTHotSupHot duct supply air temperature from central air handler [K]
input RealInputuHeaHeating control signal [1]
input RealInputVActHeaMax_flowActive heating maximum airflow rate [m3/s]
input RealInputVHotDucDis_flowMeasured hot-duct discharge airflow rate airflow rate [m3/s]
input BooleanInputu1HeaAHUHeating air handler status
output RealOutputVDis_flow_SetDischarge airflow setpoint [m3/s]
output RealOutputVColDucDis_flow_SetCold duct discharge airflow setpoint [m3/s]
output RealOutputyCooDamCold duct damper commanded position [1]
output RealOutputVHotDucDis_flow_SetHot duct discharge airflow setpoint [m3/s]
output RealOutputyHeaDamHot duct damper commanded position [1]

Modelica definition

block DampersDualSensors "Output signals for controlling dampers of snap-acting controlled dual-duct terminal unit with dual inlet airflow sensors" parameter Real VCooMax_flow( final quantity="VolumeFlowRate", final unit="m3/s") "Design zone cooling maximum airflow rate"; parameter Real VHeaMax_flow( final quantity="VolumeFlowRate", final unit="m3/s") "Design zone heating maximum airflow rate"; parameter Buildings.Controls.OBC.CDL.Types.SimpleController controllerTypeDam= Buildings.Controls.OBC.CDL.Types.SimpleController.PI "Type of controller"; parameter Real kDam(final unit="1")=0.5 "Gain of controller for damper control"; parameter Real TiDam( final unit="s", final quantity="Time")=300 "Time constant of integrator block for damper control"; parameter Real TdDam( final unit="s", final quantity="Time")=0.1 "Time constant of derivative block for damper control"; parameter Real samplePeriod( final unit="s", final quantity="Time", final min=1E-3) "Sample period of component"; parameter Real dTHys( final unit="K", final quantity="TemperatureDifference")=0.25 "Temperature difference hysteresis below which the temperature difference will be seen as zero"; parameter Real looHys( final unit="1") = 0.05 "Loop output hysteresis below which the output will be seen as zero"; parameter Real iniDam(unit="1")=0.01 "Initial damper position when the damper control is enabled"; Buildings.Controls.OBC.CDL.Interfaces.RealInput uCoo( final min=0, final max=1, final unit="1") "Cooling control 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.RealInput TColSup( final unit="K", final displayUnit="degC", final quantity="ThermodynamicTemperature") "Cold duct supply air temperature from central air handler"; Buildings.Controls.OBC.CDL.Interfaces.RealInput VColDucDis_flow( final min=0, final unit="m3/s", final quantity="VolumeFlowRate") "Measured cold-duct discharge airflow rate airflow rate"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1CooAHU "Cooling air handler status"; 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 TZon( final unit="K", final displayUnit="degC", final quantity="ThermodynamicTemperature") "Measured zone temperature"; Buildings.Controls.OBC.CDL.Interfaces.RealInput THotSup( final unit="K", final displayUnit="degC", final quantity="ThermodynamicTemperature") "Hot duct supply air temperature from central air handler"; Buildings.Controls.OBC.CDL.Interfaces.RealInput uHea( final min=0, final max=1, final unit="1") "Heating control signal"; Buildings.Controls.OBC.CDL.Interfaces.RealInput VActHeaMax_flow( final min=0, final unit="m3/s", final quantity="VolumeFlowRate") "Active heating maximum airflow rate"; Buildings.Controls.OBC.CDL.Interfaces.RealInput VHotDucDis_flow( final min=0, final unit="m3/s", final quantity="VolumeFlowRate") "Measured hot-duct discharge airflow rate airflow rate"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1HeaAHU "Heating air handler status"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput VDis_flow_Set( final min=0, final unit="m3/s", final quantity="VolumeFlowRate") "Discharge airflow setpoint"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput VColDucDis_flow_Set( final min=0, final unit="m3/s", final quantity="VolumeFlowRate") "Cold duct discharge airflow setpoint"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput yCooDam( final min=0, final max=1, final unit="1") "Cold duct damper commanded position"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput VHotDucDis_flow_Set( final min=0, final unit="m3/s", final quantity="VolumeFlowRate") "Hot duct discharge airflow setpoint"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput yHeaDam( final min=0, final max=1, final unit="1") "Hot duct damper commanded position"; Buildings.Controls.OBC.CDL.Logical.And and4 "Logical and"; Buildings.Controls.OBC.CDL.Reals.Line lin "Active airflow setpoint for cooling"; Buildings.Controls.OBC.CDL.Reals.PIDWithReset conCooDam( final controllerType=controllerTypeDam, final k=kDam, final Ti=TiDam, final Td=TdDam, final yMax=1, final yMin=0, final y_reset=iniDam) "Cooling damper position controller"; Buildings.Controls.OBC.CDL.Reals.Switch swi "Output active cold duct airflow setpoint"; Buildings.Controls.OBC.CDL.Reals.Switch swi5 "Airflow setpoint when it is in cooling state"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant conZer( final k=0) "Constant zero"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant conOne( final k=1) "Constant one"; Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr1( final t=looHys, final h=0.5*looHys) "Check if it is cooling state"; Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr( final t=dTHys, final h=0.5*dTHys) "Check if supply air temperature is greater than room temperature"; Buildings.Controls.OBC.CDL.Reals.Subtract sub2 "Calculate temperature difference between AHU supply air and room "; Buildings.Controls.OBC.CDL.Reals.Switch cooDamPos "Output cooling damper position"; Buildings.Controls.OBC.CDL.Reals.Divide VDis_flowNor "Normalized discharge volume flow rate"; Buildings.Controls.OBC.CDL.Reals.Divide VDisSet_flowNor "Normalized setpoint for discharge volume flow rate"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant conZer1( final k=0) "Constant zero"; Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr2( final t=looHys, final h=0.5*looHys) "Check if it is heating state"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant conOne1( final k=1) "Constant one"; Buildings.Controls.OBC.CDL.Reals.Line lin1 "Active airflow setpoint for heating"; Buildings.Controls.OBC.CDL.Reals.Subtract sub1 "Calculate temperature difference between AHU supply air and room "; Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr3( final t=dTHys, final h=0.5*dTHys) "Check if supply air temperature is less than room temperature"; Buildings.Controls.OBC.CDL.Logical.And and1 "Logical and"; Buildings.Controls.OBC.CDL.Reals.Switch swi1 "Airflow setpoint when it is in heating state"; Buildings.Controls.OBC.CDL.Logical.Or or2 "Cooing or heating state"; Buildings.Controls.OBC.CDL.Logical.Not not1 "In deadband"; Buildings.Controls.OBC.CDL.Logical.FallingEdge falEdg "Becoming heating or cooling state"; Buildings.Controls.OBC.CDL.Logical.And and2 "Logical and"; Buildings.Controls.OBC.CDL.Logical.And and3 "Logical and"; Buildings.Controls.OBC.CDL.Discrete.Sampler samHea( final samplePeriod=samplePeriod) "Sample the heating loop output"; Buildings.Controls.OBC.CDL.Discrete.Sampler samCoo( final samplePeriod=samplePeriod) "Sample the cooling loop output"; Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr4( final t=looHys, final h=0.5*looHys) "Check if it is cooling state"; Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr5( final t=looHys, final h=0.5*looHys) "Check if it is heating state"; Buildings.Controls.OBC.CDL.Logical.Latch lat "Changing from cooling state to deadband"; Buildings.Controls.OBC.CDL.Logical.Latch lat1 "Changing from heating state to deadband"; Buildings.Controls.OBC.CDL.Reals.Switch swi2 "Cold duct airflow setpoint when it is in deadband state"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant conZer2( final k=0) "Constant zero"; Buildings.Controls.OBC.CDL.Reals.Switch swi3 "Hot duct airflow setpoint when it is in deadband state"; Buildings.Controls.OBC.CDL.Reals.Switch swi4 "Output active hot duct airflow setpoint"; Buildings.Controls.OBC.CDL.Reals.PIDWithReset conHeaDam( final controllerType=controllerTypeDam, final k=kDam, final Ti=TiDam, final Td=TdDam, final yMax=1, final yMin=0, final y_reset=iniDam) "Heating damper position controller"; Buildings.Controls.OBC.CDL.Reals.Switch heaDamPos "Output heating damper position"; Buildings.Controls.OBC.CDL.Reals.Divide VDis_flowNor1 "Normalized discharge volume flow rate"; Buildings.Controls.OBC.CDL.Reals.Divide VDisSet_flowNor1 "Normalized setpoint for discharge volume flow rate"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant conZer3( final k=0) "Constant zero"; Buildings.Controls.OBC.CDL.Logical.Not not2 "Not proven on"; Buildings.Controls.OBC.CDL.Logical.Not not3 "Not proven on"; Buildings.Controls.OBC.CDL.Reals.Multiply mul "Make sure heating damper is closed when it is in cooling state"; Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToRea( final realTrue=0, final realFalse=1) "Ensure heating damper closed when it is in cooling state"; Buildings.Controls.OBC.CDL.Reals.Multiply mul1 "Make sure heating damper is closed when it is in cooling state"; Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToRea1( final realTrue=0, final realFalse=1) "Ensure cooling damper closed when it is in heating state"; Buildings.Controls.OBC.CDL.Reals.Multiply mul2 "Make sure cooling damper is closed when it is in heating state"; Buildings.Controls.OBC.CDL.Reals.Multiply mul3 "Make sure cooling damper is closed when it is in heating state"; Buildings.Controls.OBC.CDL.Reals.Add add2 "Total discharge airflow setpoint"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant heaMax1( final k=VHeaMax_flow) "Heating maximum flow"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant cooMax1( final k=VCooMax_flow) "Cooling maximum flow"; Buildings.Controls.OBC.CDL.Reals.Max max2 "Nominal flow"; equation connect(uCoo, lin.u); connect(conZer.y, lin.x1); connect(conOne.y, lin.x2); connect(VActCooMax_flow, lin.f2); connect(uCoo, greThr1.u); connect(and4.y, swi5.u2); connect(lin.y, swi5.u3); connect(swi5.y, swi.u1); connect(TColSup, sub2.u1); connect(sub2.y, greThr.u); connect(greThr.y, and4.u2); connect(cooDamPos.y, yCooDam); connect(VColDucDis_flow, VDis_flowNor.u1); connect(VDis_flowNor.y, conCooDam.u_m); connect(VDisSet_flowNor.y, conCooDam.u_s); connect(greThr1.y, and4.u1); connect(greThr1.y, swi.u2); connect(VActMin_flow, swi5.u1); connect(VActMin_flow, lin.f1); connect(conZer1.y, lin1.x1); connect(VActMin_flow, lin1.f1); connect(conOne1.y, lin1.x2); connect(uHea, lin1.u); connect(TZon, sub2.u2); connect(uHea, greThr2.u); connect(VActHeaMax_flow, lin1.f2); connect(TZon, sub1.u1); connect(sub1.y, greThr3.u); connect(THotSup, sub1.u2); connect(greThr3.y, and1.u1); connect(greThr2.y, and1.u2); connect(and1.y, swi1.u2); connect(VActMin_flow, swi1.u1); connect(lin1.y, swi1.u3); connect(greThr1.y, or2.u1); connect(greThr2.y, or2.u2); connect(or2.y, not1.u); connect(not1.y, falEdg.u); connect(not1.y, and2.u1); connect(not1.y, and3.u2); connect(uHea, samHea.u); connect(uCoo, samCoo.u); connect(samCoo.y, greThr4.u); connect(greThr4.y, and3.u1); connect(samHea.y, greThr5.u); connect(greThr5.y, and2.u2); connect(and3.y, lat.u); connect(falEdg.y, lat.clr); connect(and2.y, lat1.u); connect(falEdg.y, lat1.clr); connect(lat.y, swi2.u2); connect(VActMin_flow, swi2.u1); connect(conZer2.y, swi2.u3); connect(lat1.y, swi3.u2); connect(VActMin_flow, swi3.u1); connect(conZer2.y, swi3.u3); connect(swi2.y, swi.u3); connect(greThr2.y, swi4.u2); connect(swi1.y, swi4.u1); connect(swi3.y, swi4.u3); connect(heaDamPos.y, yHeaDam); connect(VDis_flowNor1.y, conHeaDam.u_m); connect(VDisSet_flowNor1.y, conHeaDam.u_s); connect(VHotDucDis_flow, VDis_flowNor1.u1); connect(conZer3.y, cooDamPos.u1); connect(conZer3.y, heaDamPos.u1); connect(u1HeaAHU, not2.u); connect(not2.y, heaDamPos.u2); connect(u1HeaAHU, conHeaDam.trigger); connect(u1CooAHU, not3.u); connect(not3.y, cooDamPos.u2); connect(u1CooAHU, conCooDam.trigger); connect(greThr1.y, booToRea.u); connect(swi4.y, mul.u1); connect(booToRea.y, mul.u2); connect(mul.y, VHotDucDis_flow_Set); connect(mul.y, VDisSet_flowNor1.u1); connect(booToRea.y, mul1.u2); connect(mul1.y, heaDamPos.u3); connect(conHeaDam.y, mul1.u1); connect(greThr2.y, booToRea1.u); connect(swi.y, mul2.u1); connect(booToRea1.y, mul2.u2); connect(mul2.y, VColDucDis_flow_Set); connect(mul2.y, VDisSet_flowNor.u1); connect(booToRea1.y, mul3.u2); connect(conCooDam.y, mul3.u1); connect(mul3.y, cooDamPos.u3); connect(mul2.y, add2.u2); connect(mul.y, add2.u1); connect(add2.y, VDis_flow_Set); connect(cooMax1.y,max2. u1); connect(heaMax1.y,max2. u2); connect(max2.y, VDisSet_flowNor.u2); connect(max2.y, VDis_flowNor.u2); connect(max2.y, VDisSet_flowNor1.u2); connect(max2.y, VDis_flowNor1.u2); end DampersDualSensors;

Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctSnapActing.Subsequences.DampersSingleSensors Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctSnapActing.Subsequences.DampersSingleSensors

Output signals for controlling dampers of snap-acting controlled dual-duct terminal unit with single discharge airflow sensors

Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctSnapActing.Subsequences.DampersSingleSensors

Information

This sequence sets the dampers for snap-acting controlled dual-duct terminal unit with single discharge airflow sensors. The implementation is according to Section 5.11.5.2 of ASHRAE Guideline 36, May 2020. The calculation is done following the steps below.

  1. When the zone state is cooling (uCoo > 0), then the cooling loop output uCoo shall reset the discharge airflow setpoint VDis_flow_Set from the minimum VActMin_flow to cooling maximum setpoint VActCooMax_flow. The cooling damper shall be modulated by a control loop to maintain the measured discharge aiflow VDis_flow at setpoint. The heating damper shall be closed yHeaDam=0.
  2. When the zone state is deadband (uCoo=0 and uHea=0), the discharge airflow set point VDis_flow_Set shall be the zone minimum VActMin_flow, maintained by the damper that was operative just before entering deadband. The other damper shall remain closed. In other words, when going from cooling to deadband, the cooling damper shall maintain the discharge airflow at the zone minimum set point, and the heating damper shall be closed. When going from heating to deadband, the heating damper shall maintain the discharge airflow at the zone minimum set point, and the cooling damper shall be closed.
  3. When the zone state is heating (uHea > 0), then the heating loop output uHea shall reset the discharge airflow setpoint VDis_flow_Set from the minimum VActMin_flow to heating maximum setpoint VActHeaMax_flow. The heating damper shall be modulated by a control loop to maintain the measured discharge aiflow VDis_flow at setpoint. The cooling damper shall be closed yCooDam=0.
  4. Overriding above controls:
    • If heating air handler is not proven ON (u1HeaAHU=false), the heating damper shall be closed (yHeaDam=0).
    • If cooling air handler is not proven ON (u1CooAHU=false), the cooling damper shall be closed (yCooDam=0).

The sequences of controlling dampers position for snap-acting controlled dual-duct terminal unit with single discharge airflow sensors are described in the following figure below.

Image of damper control for snap-acting controlled dual-duct terminal unit

Parameters

TypeNameDefaultDescription
RealVCooMax_flow Design zone cooling maximum airflow rate [m3/s]
RealVHeaMax_flow Design zone heating maximum airflow rate [m3/s]
SimpleControllercontrollerTypeDamBuildings.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
RealsamplePeriod Sample period of component [s]
ReallooHys0.05Loop output hysteresis below which the output will be seen as zero [1]
RealiniDam0.01Initial damper position when the damper control is enabled [1]

Connectors

TypeNameDescription
input RealInputuCooCooling control signal [1]
input RealInputVActCooMax_flowActive cooling maximum airflow rate [m3/s]
input RealInputVActMin_flowActive minimum airflow rate [m3/s]
input RealInputuHeaHeating control signal [1]
input RealInputVActHeaMax_flowActive heating maximum airflow rate [m3/s]
input RealInputVDis_flowMeasured discharge airflow rate airflow rate [m3/s]
input BooleanInputu1CooAHUCooling air handler status
input BooleanInputu1HeaAHUHeating air handler status
output RealOutputVDis_flow_SetDischarge airflow setpoint [m3/s]
output BooleanOutputy1CooDamCooling damper command open
output RealOutputyCooDamCold duct damper commanded position [1]
output BooleanOutputy1HeaDamHeating damper command open
output RealOutputyHeaDamHot duct damper commanded position [1]

Modelica definition

block DampersSingleSensors "Output signals for controlling dampers of snap-acting controlled dual-duct terminal unit with single discharge airflow sensors" parameter Real VCooMax_flow( final quantity="VolumeFlowRate", final unit="m3/s") "Design zone cooling maximum airflow rate"; parameter Real VHeaMax_flow( final quantity="VolumeFlowRate", final unit="m3/s") "Design zone heating maximum airflow rate"; parameter Buildings.Controls.OBC.CDL.Types.SimpleController controllerTypeDam= Buildings.Controls.OBC.CDL.Types.SimpleController.PI "Type of controller"; parameter Real kDam(final unit="1")=0.5 "Gain of controller for damper control"; parameter Real TiDam( final unit="s", final quantity="Time")=300 "Time constant of integrator block for damper control"; parameter Real TdDam( final unit="s", final quantity="Time")=0.1 "Time constant of derivative block for damper control"; parameter Real samplePeriod( final unit="s", final quantity="Time", final min=1E-3) "Sample period of component"; parameter Real looHys( final unit="1") = 0.05 "Loop output hysteresis below which the output will be seen as zero"; parameter Real iniDam(unit="1")=0.01 "Initial damper position when the damper control is enabled"; Buildings.Controls.OBC.CDL.Interfaces.RealInput uCoo( final min=0, final max=1, final unit="1") "Cooling control 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.RealInput VActMin_flow( final min=0, final unit="m3/s", final quantity="VolumeFlowRate") "Active minimum airflow rate"; Buildings.Controls.OBC.CDL.Interfaces.RealInput uHea( final min=0, final max=1, final unit="1") "Heating control signal"; Buildings.Controls.OBC.CDL.Interfaces.RealInput VActHeaMax_flow( final min=0, final unit="m3/s", final quantity="VolumeFlowRate") "Active heating maximum airflow rate"; Buildings.Controls.OBC.CDL.Interfaces.RealInput VDis_flow( final min=0, final unit="m3/s", final quantity="VolumeFlowRate") "Measured discharge airflow rate airflow rate"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1CooAHU "Cooling air handler status"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1HeaAHU "Heating air handler status"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput VDis_flow_Set( final min=0, final unit="m3/s", final quantity="VolumeFlowRate") "Discharge airflow setpoint"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput y1CooDam "Cooling damper command open"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput yCooDam( final min=0, final max=1, final unit="1") "Cold duct damper commanded position"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput y1HeaDam "Heating damper command open"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput yHeaDam( final min=0, final max=1, final unit="1") "Hot duct damper commanded position"; Buildings.Controls.OBC.CDL.Reals.Line lin "Active airflow setpoint for cooling"; Buildings.Controls.OBC.CDL.Reals.PIDWithReset conCooDam( final controllerType=controllerTypeDam, final k=kDam, final Ti=TiDam, final Td=TdDam, final yMax=1, final yMin=0, final y_reset=iniDam) "Cooling damper position controller"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant conZer( final k=0) "Constant zero"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant conOne( final k=1) "Constant one"; Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr1( final t=looHys, final h=0.5*looHys) "Check if it is cooling state"; Buildings.Controls.OBC.CDL.Reals.Switch damPos "Output damper position"; Buildings.Controls.OBC.CDL.Reals.Divide VDis_flowNor "Normalized discharge volume flow rate"; Buildings.Controls.OBC.CDL.Reals.Divide VDisSet_flowNor "Normalized setpoint for discharge volume flow rate"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant conZer1( final k=0) "Constant zero"; Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr2( final t=looHys, final h=0.5*looHys) "Check if it is heating state"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant conOne1( final k=1) "Constant one"; Buildings.Controls.OBC.CDL.Reals.Line lin1 "Active airflow setpoint for heating"; Buildings.Controls.OBC.CDL.Logical.Or or2 "Cooing or heating state"; Buildings.Controls.OBC.CDL.Logical.Not not1 "In deadband"; Buildings.Controls.OBC.CDL.Logical.FallingEdge falEdg "Becoming heating or cooling state"; Buildings.Controls.OBC.CDL.Logical.And and2 "Logical and"; Buildings.Controls.OBC.CDL.Logical.And and3 "Logical and"; Buildings.Controls.OBC.CDL.Discrete.Sampler samHea( final samplePeriod=samplePeriod) "Sample the heating loop output"; Buildings.Controls.OBC.CDL.Discrete.Sampler samCoo( final samplePeriod=samplePeriod) "Sample the cooling loop output"; Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr4( final t=looHys, final h=0.5*looHys) "Check if it is cooling state"; Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr5( final t=looHys, final h=0.5*looHys) "Check if it is heating state"; Buildings.Controls.OBC.CDL.Logical.Latch lat "Changing from cooling state to deadband"; Buildings.Controls.OBC.CDL.Logical.Latch lat1 "Changing from heating state to deadband"; Buildings.Controls.OBC.CDL.Reals.Switch cooFloSet "Flow setpoint when it is in cooling state"; Buildings.Controls.OBC.CDL.Reals.Switch heaFloSet "Flow setpoint when it is in heating state"; Buildings.Controls.OBC.CDL.Logical.Or or1 "Check if any air handler is proven on"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant conZer3( final k=0) "Constant zero"; Buildings.Controls.OBC.CDL.Logical.Or or3 "Check if it is in cooling state or in deadband that switched from cooling state"; Buildings.Controls.OBC.CDL.Reals.Switch cooDamPos "Cooling damper position"; Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToRea( final realTrue=0, final realFalse=1) "Ensure cooling damper closed when the cooling air handler is not proven on"; Buildings.Controls.OBC.CDL.Reals.Multiply mul1 "Make sure cooling damper is closed when the cooling air handler is not proven on"; Buildings.Controls.OBC.CDL.Logical.Or or4 "Check if it is in heating state or in deadband that switched from heating state"; Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToRea1( final realTrue=0, final realFalse=1) "Ensure heating damper closed when the heating air handler is not proven on"; Buildings.Controls.OBC.CDL.Reals.Multiply mul2 "Make sure heating damper is closed when the heating air handler is not proven on"; Buildings.Controls.OBC.CDL.Reals.Switch heaDamPos "Heating damper position"; Buildings.Controls.OBC.CDL.Logical.And and1 "Check if cooling damper is opening"; Buildings.Controls.OBC.CDL.Logical.And and4 "Check if heating damper is opening"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant heaMax1( final k=VHeaMax_flow) "Heating maximum flow"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant cooMax1( final k=VCooMax_flow) "Cooling maximum flow"; Buildings.Controls.OBC.CDL.Reals.Max max2 "Nominal flow"; equation connect(uCoo, lin.u); connect(conZer.y, lin.x1); connect(conOne.y, lin.x2); connect(VActCooMax_flow, lin.f2); connect(uCoo, greThr1.u); connect(VDis_flowNor.y, conCooDam.u_m); connect(VDisSet_flowNor.y, conCooDam.u_s); connect(VActMin_flow, lin.f1); connect(conZer1.y, lin1.x1); connect(VActMin_flow, lin1.f1); connect(conOne1.y, lin1.x2); connect(uHea, lin1.u); connect(uHea, greThr2.u); connect(VActHeaMax_flow, lin1.f2); connect(greThr1.y, or2.u1); connect(greThr2.y, or2.u2); connect(or2.y, not1.u); connect(not1.y, falEdg.u); connect(not1.y, and2.u1); connect(not1.y, and3.u2); connect(uHea, samHea.u); connect(uCoo, samCoo.u); connect(samCoo.y, greThr4.u); connect(greThr4.y, and3.u1); connect(samHea.y, greThr5.u); connect(greThr5.y, and2.u2); connect(and3.y, lat.u); connect(falEdg.y, lat.clr); connect(and2.y, lat1.u); connect(falEdg.y, lat1.clr); connect(greThr1.y, cooFloSet.u2); connect(lin.y, cooFloSet.u1); connect(heaFloSet.y, cooFloSet.u3); connect(greThr2.y, heaFloSet.u2); connect(lin1.y, heaFloSet.u1); connect(VActMin_flow, heaFloSet.u3); connect(cooFloSet.y, VDis_flow_Set); connect(cooFloSet.y, VDisSet_flowNor.u1); connect(VDis_flow, VDis_flowNor.u1); connect(u1CooAHU, or1.u1); connect(u1HeaAHU, or1.u2); connect(or1.y, conCooDam.trigger); connect(or1.y, damPos.u2); connect(conCooDam.y, damPos.u1); connect(conZer3.y, damPos.u3); connect(greThr1.y, or3.u1); connect(lat.y, or3.u2); connect(u1CooAHU, booToRea.u); connect(damPos.y, mul1.u1); connect(booToRea.y, mul1.u2); connect(or3.y, cooDamPos.u2); connect(mul1.y, cooDamPos.u1); connect(conZer3.y, cooDamPos.u3); connect(greThr2.y, or4.u1); connect(lat1.y, or4.u2); connect(u1HeaAHU, booToRea1.u); connect(or4.y, heaDamPos.u2); connect(damPos.y, mul2.u1); connect(booToRea1.y, mul2.u2); connect(mul2.y, heaDamPos.u1); connect(conZer3.y, heaDamPos.u3); connect(u1CooAHU, and1.u1); connect(or3.y, and1.u2); connect(and1.y, y1CooDam); connect(or4.y, and4.u2); connect(u1HeaAHU, and4.u1); connect(and4.y, y1HeaDam); connect(cooDamPos.y, yCooDam); connect(heaDamPos.y, yHeaDam); connect(heaMax1.y,max2. u2); connect(cooMax1.y,max2. u1); connect(max2.y, VDisSet_flowNor.u2); connect(max2.y, VDis_flowNor.u2); end DampersSingleSensors;

Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctSnapActing.Subsequences.Overrides Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctSnapActing.Subsequences.Overrides

Software switches to override setpoints

Buildings.Controls.OBC.ASHRAE.G36.TerminalUnits.DualDuctSnapActing.Subsequences.Overrides

Information

This block considers the overrides to the setpoints for snap-acting controlled dual-duct terminal unit. The implementation is according to the Section 5.11.7 of ASHRAE Guideline 36, May 2020.

Provide 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 oveFloSet equals to 4, force the zone airflow setpoint VSet_flow to zone heating maximum airflow setpoint VHeaMax_flow.
  5. when oveCooDamPos equals to 1, force the cooling damper to full closed by setting yCooDam to 0,
  6. when oveCooDamPos equals to 2, force the cooling damper to full open by setting yCooDam to 1.
  7. when oveHeaDamPos equals to 1, force the heating damper to full closed by setting yHeaDam to 0,
  8. when oveHeaDamPos equals to 2, force the heating damper to full open by setting yHeaDam to 1.

Parameters

TypeNameDefaultDescription
RealVMin_flow Design zone minimum airflow setpoint [m3/s]
RealVCooMax_flow Design zone cooling maximum airflow rate [m3/s]
RealVHeaMax_flow Design zone heating maximum airflow rate [m3/s]

Connectors

TypeNameDescription
input IntegerInputoveFloSetIndex of overriding flow setpoint, 1: set to zero; 2: set to cooling maximum; 3: set to minimum flow; 4: set to heating maximum
input RealInputVActSet_flowActive airflow setpoint [m3/s]
input IntegerInputoveCooDamPosIndex of overriding cooling damper position, 1: set to close; 2: set to open
input RealInputuCooDamCooling damper commanded position [1]
input IntegerInputoveHeaDamPosIndex of overriding heating damper position, 1: set to close; 2: set to open
input RealInputuHeaDamHeating damper commanded position [1]
output RealOutputVSet_flowAirflow setpoint after considering override [m3/s]
output RealOutputyCooDamCooling damper commanded position, after considering override [1]
output RealOutputyHeaDamHeating damper commanded position, after considering override [1]

Modelica definition

block Overrides "Software switches to override setpoints" 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") "Design zone cooling maximum airflow rate"; parameter Real VHeaMax_flow( final quantity="VolumeFlowRate", final unit="m3/s") "Design zone heating maximum airflow rate"; 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; 4: set to heating maximum"; 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.IntegerInput oveCooDamPos "Index of overriding cooling damper position, 1: set to close; 2: set to open"; Buildings.Controls.OBC.CDL.Interfaces.RealInput uCooDam( final min=0, final unit="1") "Cooling damper commanded position"; Buildings.Controls.OBC.CDL.Interfaces.IntegerInput oveHeaDamPos "Index of overriding heating damper position, 1: set to close; 2: set to open"; Buildings.Controls.OBC.CDL.Interfaces.RealInput uHeaDam( final min=0, final unit="1") "Heating damper commanded position"; 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 yCooDam( final min=0, final unit="1") "Cooling damper commanded position, after considering override"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput yHeaDam( final min=0, final unit="1") "Heating damper commanded position, after considering override"; Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt( 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 conInt1( 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 conInt2( 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 swi "Airflow setpoint after considering override"; Buildings.Controls.OBC.CDL.Logical.Or3 or3 "Check if the airflow setpoint should be overrided"; Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt3( 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 conInt4( 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 swi1 "Damper setpoint position after considering override"; Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt5( final k=4) "Constant 4"; Buildings.Controls.OBC.CDL.Integers.Equal forMinFlo1 "Check if forcing zone airflow setpoint to minimum flow"; Buildings.Controls.OBC.CDL.Conversions.BooleanToReal heaMax( final realTrue=VHeaMax_flow) "Force zone airflow setpoint to zone heating maximum flow"; Buildings.Controls.OBC.CDL.Reals.Add add4 "Add up two inputs"; Buildings.Controls.OBC.CDL.Logical.Or or1 "Check if the airflow setpoint should be overrided"; Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt6( final k=1) "Constant 1"; Buildings.Controls.OBC.CDL.Integers.Equal intEqu1 "Check if forcing damper to full close"; Buildings.Controls.OBC.CDL.Integers.Equal intEqu2 "Check if forcing damper to full open"; Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt7( final k=2) "Constant 2"; Buildings.Controls.OBC.CDL.Conversions.BooleanToReal cloDam1( final realTrue=0) "Full closed damper position"; Buildings.Controls.OBC.CDL.Conversions.BooleanToReal opeDam1( final realTrue=1) "Full open damper position"; Buildings.Controls.OBC.CDL.Reals.Add add5 "Add up inputs"; Buildings.Controls.OBC.CDL.Logical.Or or4 "Check if the damper setpoint position should be overrided"; Buildings.Controls.OBC.CDL.Reals.Switch swi2 "Damper setpoint position after considering override"; equation connect(oveFloSet, forZerFlo.u1); connect(conInt.y, forZerFlo.u2); connect(oveFloSet, forCooMax.u1); connect(conInt1.y, forCooMax.u2); connect(oveFloSet, forMinFlo.u1); connect(conInt2.y, forMinFlo.u2); connect(forZerFlo.y, zerFlo.u); connect(forCooMax.y, cooMax.u); connect(forMinFlo.y, minFlo.u); connect(cooMax.y, add2.u1); connect(zerFlo.y, add1.u1); connect(forZerFlo.y, or3.u1); connect(forCooMax.y, or3.u2); connect(forMinFlo.y, or3.u3); connect(add1.y, swi.u1); connect(VActSet_flow, swi.u3); connect(swi.y, VSet_flow); connect(conInt3.y, intEqu3.u2); connect(conInt4.y,intEqu4. u2); connect(oveCooDamPos, intEqu3.u1); connect(oveCooDamPos, 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(add3.y, swi1.u1); connect(or2.y, swi1.u2); connect(uCooDam, swi1.u3); connect(swi1.y, yCooDam); connect(oveFloSet, forMinFlo1.u1); connect(conInt5.y, forMinFlo1.u2); connect(forMinFlo1.y, heaMax.u); connect(add2.y, add1.u2); connect(minFlo.y, add4.u1); connect(heaMax.y, add4.u2); connect(add4.y, add2.u2); connect(or3.y, or1.u1); connect(forMinFlo1.y, or1.u2); connect(or1.y, swi.u2); connect(conInt6.y,intEqu1. u2); connect(conInt7.y,intEqu2. u2); connect(oveHeaDamPos, intEqu1.u1); connect(oveHeaDamPos, intEqu2.u1); connect(intEqu1.y, cloDam1.u); connect(intEqu2.y, opeDam1.u); connect(cloDam1.y, add5.u1); connect(opeDam1.y, add5.u2); connect(intEqu1.y,or4. u1); connect(intEqu2.y,or4. u2); connect(add5.y,swi2. u1); connect(or4.y,swi2. u2); connect(uHeaDam, swi2.u3); connect(swi2.y, yHeaDam); end Overrides;

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

Output system requests for VAV terminal unit with reheat

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

Information

This sequence outputs the system reset requests for snap-acting controlled dual-duct terminal unit. The implementation is according to the Section 5.11.8 of ASHRAE Guideline 36, May 2020.

Cooling SAT reset requests yZonCooTemResReq

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

Cold-duct static pressure reset requests yColDucPreResReq

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

Heating SAT reset requests yZonHeaTemResReq

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

Hot-duct static pressure reset requests yHotDucPreResReq

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

Heating-fan requests

Send the heating fan that serves the zone a heating-fan request as follows:

  1. If the heating loop is greater than 15%, send 1 request until the heating loop is less than 1%.
  2. Else if the heatling loop is less than 15%, send 0 requests.

Parameters

TypeNameDefaultDescription
Booleanhave_duaSen True: the unit has dual inlet sensors
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]

Connectors

TypeNameDescription
input BooleanInputuAftSupCooAfter suppression period due to the cooling setpoint change
input RealInputTCooSetZone cooling setpoint temperature [K]
input RealInputTZonZone temperature [K]
input RealInputuCooCooling loop signal [1]
input RealInputVColDuc_flow_SetCold duct discharge airflow rate setpoint [m3/s]
input RealInputVColDucDis_flowMeasured cold duct discharge airflow rate [m3/s]
input RealInputuCooDamCooling damper position setpoint [1]
input BooleanInputu1CooDamCold duct damper proven on
input BooleanInputuAftSupHeaAfter suppression period due to the heating setpoint change
input RealInputTHeaSetZone heating setpoint temperature [K]
input RealInputuHeaHeating loop signal [1]
input RealInputVHotDuc_flow_SetHot duct discharge airflow rate setpoint [m3/s]
input RealInputVHotDucDis_flowMeasured hot duct discharge airflow rate [m3/s]
input RealInputuHeaDamHeating damper position setpoint [1]
input BooleanInputu1HeaDamHot duct damper proven on
output IntegerOutputyZonCooTemResReqZone cooling supply air temperature reset request
output IntegerOutputyColDucPreResReqCold duct static pressure reset requests
output IntegerOutputyZonHeaTemResReqZone heating supply air temperature reset request
output IntegerOutputyHotDucPreResReqHot duct static pressure reset requests
output IntegerOutputyHeaFanReqHeating fan request

Modelica definition

block SystemRequests "Output system requests for VAV terminal unit with reheat" parameter Boolean have_duaSen "True: the unit has dual inlet sensors"; 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"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput uAftSupCoo "After suppression period due to the cooling 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 VColDuc_flow_Set( final min=0, final unit="m3/s", quantity="VolumeFlowRate") "Cold duct discharge airflow rate setpoint"; Buildings.Controls.OBC.CDL.Interfaces.RealInput VColDucDis_flow( final min=0, final unit="m3/s", final quantity="VolumeFlowRate") "Measured cold duct discharge airflow rate"; Buildings.Controls.OBC.CDL.Interfaces.RealInput uCooDam( final min=0, final max=1, final unit="1") "Cooling damper position setpoint"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1CooDam if not have_duaSen "Cold duct damper proven on"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput uAftSupHea "After suppression period due to the heating setpoint change"; Buildings.Controls.OBC.CDL.Interfaces.RealInput THeaSet( final unit="K", final displayUnit="degC", final quantity="ThermodynamicTemperature") "Zone heating setpoint temperature"; Buildings.Controls.OBC.CDL.Interfaces.RealInput uHea( final min=0, final max=1, final unit="1") "Heating loop signal"; Buildings.Controls.OBC.CDL.Interfaces.RealInput VHotDuc_flow_Set( final min=0, final unit="m3/s", quantity="VolumeFlowRate") "Hot duct discharge airflow rate setpoint"; Buildings.Controls.OBC.CDL.Interfaces.RealInput VHotDucDis_flow( final min=0, final unit="m3/s", final quantity="VolumeFlowRate") "Measured hot duct discharge airflow rate"; Buildings.Controls.OBC.CDL.Interfaces.RealInput uHeaDam( final min=0, final max=1, final unit="1") "Heating damper position setpoint"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1HeaDam if not have_duaSen "Hot duct damper proven on"; Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yZonCooTemResReq "Zone cooling supply air temperature reset request"; Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yColDucPreResReq "Cold duct static pressure reset requests"; Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yZonHeaTemResReq "Zone heating supply air temperature reset request"; Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yHotDucPreResReq "Hot duct static pressure reset requests"; Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yHeaFanReq "Heating fan request"; 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.Reals.GreaterThreshold greThr7( final t=thrTemDif, final h=dTHys) "Check if zone temperature is less than heating setpoint by threshold"; Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr8( final t=twoTemDif, final h=dTHys) "Check if zone temperature is less than heating setpoint by threshold"; Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr9( final t=0.95, final h=damPosHys) "Check if damper position is greater than 0.95"; Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr10( final t=0.95, final h=looHys) "Check if heating loop signal is greater than 0.95"; Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr11( final t=floHys, final h=0.5*floHys) "Check if discharge airflow setpoint is greater than 0"; Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt4 "Convert boolean to integer"; Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt5 "Convert boolean to integer"; Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai3( final k=0.5) "50% of setpoint"; Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai4( final k=0.7) "70% of setpoint"; Buildings.Controls.OBC.CDL.Reals.Subtract sub1 "Calculate difference between zone temperature and heating setpoint"; Buildings.Controls.OBC.CDL.Reals.Subtract sub4 "Calculate difference between zone temperature and heating setpoint"; Buildings.Controls.OBC.CDL.Logical.And and6 "Logical and"; Buildings.Controls.OBC.CDL.Logical.And and7 "Logical and"; Buildings.Controls.OBC.CDL.Logical.And and8 "Logical and"; Buildings.Controls.OBC.CDL.Logical.And and9 "Logical and"; Buildings.Controls.OBC.CDL.Integers.Sources.Constant thrCooResReq1( final k=3) "Constant 3"; Buildings.Controls.OBC.CDL.Integers.Sources.Constant twoCooResReq1( final k=2) "Constant 2"; Buildings.Controls.OBC.CDL.Integers.Sources.Constant thrPreResReq1( final k=3) "Constant 3"; Buildings.Controls.OBC.CDL.Integers.Sources.Constant twoPreResReq1( final k=2) "Constant 2"; Buildings.Controls.OBC.CDL.Integers.Switch intSwi4 "Output 3 or other request "; Buildings.Controls.OBC.CDL.Integers.Switch intSwi5 "Output 2 or other request "; Buildings.Controls.OBC.CDL.Integers.Switch swi1 "Output 3 or other request "; Buildings.Controls.OBC.CDL.Integers.Switch swi2 "Output 2 or other request "; Buildings.Controls.OBC.CDL.Logical.TrueDelay tim6( final delayTime=durTimTem) "Check if it is more than threshold time"; Buildings.Controls.OBC.CDL.Logical.TrueDelay tim7( final delayTime=durTimTem) "Check if it is more than threshold time"; Buildings.Controls.OBC.CDL.Logical.TrueDelay tim8( final delayTime=durTimFlo) "Check if it is more than threshold time"; Buildings.Controls.OBC.CDL.Reals.Greater greEqu2(final h=floHys) "Check if discharge airflow is less than 50% of setpoint"; Buildings.Controls.OBC.CDL.Reals.Greater greEqu3(final h=floHys) "Check if discharge airflow is less than 70% of setpoint"; Buildings.Controls.OBC.CDL.Logical.And and10 "Logical and"; Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr12( final t=0.15, final h=looHys) "Check if heating loop signal is greater than 0.15"; Buildings.Controls.OBC.CDL.Logical.Latch lat "Hold the true input"; Buildings.Controls.OBC.CDL.Reals.LessThreshold lesThr( final t=0.01, final h=looHys) "Check if the heating loop output is less than threshold"; Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt6 "Heating fan request"; Buildings.Controls.OBC.CDL.Integers.Sources.Constant conOne( final k=1) if have_duaSen "Constant 1"; Buildings.Controls.OBC.CDL.Integers.Sources.Constant conOne1( final k=1) if have_duaSen "Constant 1"; Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt2 if not have_duaSen "Convert boolean to integer"; Buildings.Controls.OBC.CDL.Integers.Multiply mulInt if not have_duaSen "Ensure zero request when the damper is not opening"; Buildings.Controls.OBC.CDL.Integers.Multiply mulInt1 if have_duaSen "Two inputs product"; Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt3 if not have_duaSen "Convert boolean to integer"; Buildings.Controls.OBC.CDL.Integers.Multiply mulInt2 if not have_duaSen "Ensure zero request when the damper is not opening"; Buildings.Controls.OBC.CDL.Integers.Multiply mulInt3 if have_duaSen "Two inputs product"; 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(greThr4.u, VColDuc_flow_Set); connect(greEqu.u1, gai1.y); connect(greEqu.y, and3.u2); connect(gai2.y, greEqu1.u1); connect(greEqu1.y, and4.u2); connect(uCoo, greThr.u); connect(uAftSupCoo, and2.u1); connect(uAftSupCoo, and1.u1); connect(thrCooResReq.y, intSwi.u1); connect(twoCooResReq.y, intSwi1.u1); connect(intSwi1.y, intSwi.u3); connect(intSwi.y, yZonCooTemResReq); connect(greThr.y, booToInt.u); connect(booToInt.y, intSwi1.u3); connect(uCooDam, greThr3.u); connect(VColDuc_flow_Set, gai1.u); connect(VColDuc_flow_Set, gai2.u); connect(VColDucDis_flow, greEqu.u2); connect(VColDucDis_flow, greEqu1.u2); 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(TCooSet, sub3.u2); connect(TCooSet, sub2.u2); connect(TZon, sub2.u1); connect(TZon, sub3.u1); connect(sub1.y,greThr7. u); connect(and7.y, intSwi4.u2); connect(sub4.y,greThr8. u); connect(and6.y,intSwi5. u2); connect(and8.y,swi1. u2); connect(and9.y,swi2. u2); connect(greThr8.y,tim7. u); connect(tim7.y,and6. u2); connect(greThr7.y,tim6. u); connect(tim6.y,and7. u2); connect(greThr11.u, VHotDuc_flow_Set); connect(greEqu2.u1, gai3.y); connect(greEqu2.y, and8.u2); connect(gai4.y,greEqu3. u1); connect(greEqu3.y,and9. u2); connect(uHea, greThr10.u); connect(uAftSupHea, and7.u1); connect(uAftSupHea, and6.u1); connect(thrCooResReq1.y, intSwi4.u1); connect(twoCooResReq1.y, intSwi5.u1); connect(intSwi5.y, intSwi4.u3); connect(intSwi4.y, yZonHeaTemResReq); connect(greThr10.y, booToInt4.u); connect(booToInt4.y, intSwi5.u3); connect(uHeaDam, greThr9.u); connect(VHotDuc_flow_Set, gai3.u); connect(VHotDuc_flow_Set, gai4.u); connect(VHotDucDis_flow, greEqu2.u2); connect(VHotDucDis_flow, greEqu3.u2); connect(greThr9.y,tim8. u); connect(greThr11.y, and10.u1); connect(tim8.y, and10.u2); connect(and10.y, and8.u1); connect(and10.y, and9.u1); connect(greThr9.y,booToInt5. u); connect(booToInt5.y,swi2. u3); connect(twoPreResReq1.y, swi2.u1); connect(thrPreResReq1.y, swi1.u1); connect(swi2.y,swi1. u3); connect(THeaSet, sub1.u1); connect(THeaSet, sub4.u1); connect(TZon, sub1.u2); connect(TZon, sub4.u2); connect(uHea, greThr12.u); connect(greThr12.y, lat.u); connect(uHea, lesThr.u); connect(lesThr.y, lat.clr); connect(lat.y, booToInt6.u); connect(booToInt6.y, yHeaFanReq); connect(u1CooDam, booToInt2.u); connect(booToInt2.y, mulInt.u2); connect(swi4.y, mulInt.u1); connect(swi4.y, mulInt1.u1); connect(conOne.y, mulInt1.u2); connect(mulInt1.y, yColDucPreResReq); connect(mulInt.y, yColDucPreResReq); connect(u1HeaDam, booToInt3.u); connect(booToInt3.y, mulInt2.u2); connect(conOne1.y, mulInt3.u2); connect(swi1.y, mulInt3.u1); connect(swi1.y, mulInt2.u1); connect(mulInt3.y, yHotDucPreResReq); connect(mulInt2.y, yHotDucPreResReq); end SystemRequests;