Buildings.Controls.OBC.ASHRAE.G36.Generic

Generic control sequences

Information

This package contains generic sequences that would be needed for both AHU and terminal units control.

Package Content

Name Description
Buildings.Controls.OBC.ASHRAE.G36.Generic.AirEconomizerHighLimits AirEconomizerHighLimits Specify the economizer high liimits
Buildings.Controls.OBC.ASHRAE.G36.Generic.TimeSuppression TimeSuppression Calculate a time-delay period after change in set point
Buildings.Controls.OBC.ASHRAE.G36.Generic.TrimAndRespond TrimAndRespond Block to inplement trim and respond logic
Buildings.Controls.OBC.ASHRAE.G36.Generic.Validation Validation Collection of validation models

Buildings.Controls.OBC.ASHRAE.G36.Generic.AirEconomizerHighLimits Buildings.Controls.OBC.ASHRAE.G36.Generic.AirEconomizerHighLimits

Specify the economizer high liimits

Buildings.Controls.OBC.ASHRAE.G36.Generic.AirEconomizerHighLimits

Information

This block outputs the air economizer high limits according to the energy standard, device type and climate zone. The implementation is according to the Section 5.1.17 of ASHRAE Guideline 36, May 2020.

When ASHRAE 90.1-2016 is used.

Device type Allowed only in these ASHRAE Climate ZonesRequired High Limit (Economizer OFF when)
Fixed dry bulb1b, 2b, 3b, 3c, 4b, 4c, 5b, 5c, 6b, 7, 8 outdoor air temperature is higher than 24 °C (TCut=24°C)
5a, 6aoutdoor air temperature is higher than 21 °C (TCut=21°C)
1a, 2a, 3a, 4aoutdoor air temperature is higher than 18 °C (TCut=18°C)
Differential dry bulb1b, 2b, 3b, 3c, 4b, 4c, 5a, 5b, 5c, 6a, 6b, 7, 8 outdoor air temperature is higher than the return air temperature (TCut=TRet)
Fixed enthalpy with fixed dry bulbAll outdoor air temperature is higher than 24 °C or the enthalpy is higher than 66 kJ/kg (TCut=24°C or hCut=66kJ/kg)
Differential enthalpy with fixed dry bulbAll outdoor air temperature is higher than 24 °C or the outdoor air enthalpy is higher than the return air enthalpy (TCut=24°C or hCut=hRet)
Fixed dry bulb with differential dry bulb 1b, 2b, 3b, 3c, 4b, 4c, 5b, 5c, 6b, 7, 8 outdoor air temperature is higher than 24 °C or the return air temperature (TCut=min(24°C, TRet))
5a, 6a outdoor air temperature is higher than 21 °C or the return air temperature (TCut=min(21°C, TRet))

When California Title 24-2016 is used.

Device type California Climate ZonesRequired High Limit (Economizer OFF when)
Fixed dry bulb1, 3, 5, 11 to 16outdoor air temperature is higher than 24 °C (TCut=24°C)
2, 4, 10outdoor air temperature is higher than 23 °C (TCut=23°C)
6, 8, 9outdoor air temperature is higher than 22 °C (TCut=22°C)
7outdoor air temperature is higher than 21 °C (TCut=21°C)
Differential dry bulb1, 3, 5, 11 to 16outdoor air temperature is higher than the return air temperature (TCut=TRet)
2, 4, 10outdoor air temperature is higher than the return air temperature minus 1 °C (TCut=TRet-1°C)
6, 8, 9outdoor air temperature is higher than the return air temperature minus 2 °C (TCut=TRet-2°C)
7outdoor air temperature is higher than the return air temperature minus 3 °C (TCut=TRet-3°C)
Fixed enthalpy with fixed dry bulbAll outdoor air temperature is higher than 24 °C or the enthalpy is higher than 66 kJ/kg (TCut=24°C or hCut=66kJ/kg)
Fixed dry bulb with differential dry bulb1, 3, 5, 11 to 16 outdoor air temperature is higher than 24 °C or the return air temperature (TCut=24°C or TCut=TRet)
2, 4, 10 outdoor air temperature is higher than 23 °C or the return air temperature minus 1 °C (TCut=min(23°C, TRet-1°C))
6, 8, 9 outdoor air temperature is higher than 22 °C or the return air temperature minus 2 °C (TCut=min(22°C, TRet-2°C))
7 outdoor air temperature is higher than 21 °C or the return air temperature minus 3 °C (TCut=min(21°C, TRet-3°C))

Note that the device type Fixed dry bulb with differential dry bulb is not listed in either ASHRAE 90.1 or Title 24 standard. But it is possible to use in practice. See Section 3.1.6.2 in Guideline 36.

Parameters

TypeNameDefaultDescription
EnergyStandardeneStd Energy standard, ASHRAE 90.1 or Title 24
ControlEconomizerecoHigLimCon Economizer high limit control device
ASHRAEClimateZoneashCliZonBuildings.Controls.OBC.ASHRA...ASHRAE climate zone
Title24ClimateZonetit24CliZonBuildings.Controls.OBC.ASHRA...California Title 24 climate zone

Connectors

TypeNameDescription
input RealInputTRetReturn air temperature [K]
input RealInputhRetReturn air enthalpy. For differential enthalpy use return air enthalpy measurement [J/kg]
output RealOutputTCutOutdoor air temperature high limit cutoff [K]
output RealOutputhCutOutdoor air enthalpy high limit cutoff [J/kg]

Modelica definition

block AirEconomizerHighLimits "Specify the economizer high liimits" parameter Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard eneStd "Energy standard, ASHRAE 90.1 or Title 24"; parameter Buildings.Controls.OBC.ASHRAE.G36.Types.ControlEconomizer ecoHigLimCon "Economizer high limit control device"; parameter Buildings.Controls.OBC.ASHRAE.G36.Types.ASHRAEClimateZone ashCliZon=Buildings.Controls.OBC.ASHRAE.G36.Types.ASHRAEClimateZone.Not_Specified "ASHRAE climate zone"; parameter Buildings.Controls.OBC.ASHRAE.G36.Types.Title24ClimateZone tit24CliZon=Buildings.Controls.OBC.ASHRAE.G36.Types.Title24ClimateZone.Not_Specified "California Title 24 climate zone"; Buildings.Controls.OBC.CDL.Interfaces.RealInput TRet( final unit="K", displayUnit="degC", final quantity="ThermodynamicTemperature") if (ecoHigLimCon == Buildings.Controls.OBC.ASHRAE.G36.Types.ControlEconomizer.DifferentialDryBulb or ecoHigLimCon == Buildings.Controls.OBC.ASHRAE.G36.Types.ControlEconomizer.FixedDryBulbWithDifferentialDryBulb) "Return air temperature"; Buildings.Controls.OBC.CDL.Interfaces.RealInput hRet( final unit="J/kg", final quantity="SpecificEnergy") if (eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 and ecoHigLimCon == Buildings.Controls.OBC.ASHRAE.G36.Types.ControlEconomizer.DifferentialEnthalpyWithFixedDryBulb) "Return air enthalpy. For differential enthalpy use return air enthalpy measurement"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput TCut( final quantity="ThermodynamicTemperature", final unit="K", displayUnit="degC") "Outdoor air temperature high limit cutoff"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput hCut( final quantity="SpecificEnergy", final unit="J/kg") if (ecoHigLimCon == Buildings.Controls.OBC.ASHRAE.G36.Types.ControlEconomizer.DifferentialEnthalpyWithFixedDryBulb or ecoHigLimCon == Buildings.Controls.OBC.ASHRAE.G36.Types.ControlEconomizer.FixedEnthalpyWithFixedDryBulb) "Outdoor air enthalpy high limit cutoff"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant fixDryBul( final k=ecoHigLimCon == Buildings.Controls.OBC.ASHRAE.G36.Types.ControlEconomizer.FixedDryBulb) "Fixed dry bulb"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant difDryBul( final k=ecoHigLimCon == Buildings.Controls.OBC.ASHRAE.G36.Types.ControlEconomizer.DifferentialDryBulb) "Differential dry bulb"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant fixEntFixDryBul( final k=ecoHigLimCon == Buildings.Controls.OBC.ASHRAE.G36.Types.ControlEconomizer.FixedEnthalpyWithFixedDryBulb) "Fixed enthalpy with fixed dry bulb"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant difEntFixDryBul( final k=ecoHigLimCon == Buildings.Controls.OBC.ASHRAE.G36.Types.ControlEconomizer.DifferentialEnthalpyWithFixedDryBulb) "Differential enthalpy with fixed dry bulb"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant ash1A( final k=ashCliZon == Buildings.Controls.OBC.ASHRAE.G36.Types.ASHRAEClimateZone.Zone_1A) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "ASHRAE zone 1A"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant ash1B( final k=ashCliZon == Buildings.Controls.OBC.ASHRAE.G36.Types.ASHRAEClimateZone.Zone_1B) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "ASHRAE zone 1B"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant ash2A( final k=ashCliZon == Buildings.Controls.OBC.ASHRAE.G36.Types.ASHRAEClimateZone.Zone_2A) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "ASHRAE zone 2A"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant ash2B( final k=ashCliZon == Buildings.Controls.OBC.ASHRAE.G36.Types.ASHRAEClimateZone.Zone_2B) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "ASHRAE zone 2B"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant ash3A( final k=ashCliZon == Buildings.Controls.OBC.ASHRAE.G36.Types.ASHRAEClimateZone.Zone_3A) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "ASHRAE zone 3A"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant ash3B( final k=ashCliZon == Buildings.Controls.OBC.ASHRAE.G36.Types.ASHRAEClimateZone.Zone_3B) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "ASHRAE zone 3B"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant ash3C( final k=ashCliZon == Buildings.Controls.OBC.ASHRAE.G36.Types.ASHRAEClimateZone.Zone_3C) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "ASHRAE zone 3C"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant ash4A( final k=ashCliZon == Buildings.Controls.OBC.ASHRAE.G36.Types.ASHRAEClimateZone.Zone_4A) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "ASHRAE zone 4A"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant ash4B( final k=ashCliZon == Buildings.Controls.OBC.ASHRAE.G36.Types.ASHRAEClimateZone.Zone_4B) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "ASHRAE zone 4B"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant ash4C( final k=ashCliZon == Buildings.Controls.OBC.ASHRAE.G36.Types.ASHRAEClimateZone.Zone_4C) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "ASHRAE zone 4C"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant ash5A( final k=ashCliZon == Buildings.Controls.OBC.ASHRAE.G36.Types.ASHRAEClimateZone.Zone_5A) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "ASHRAE zone 5A"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant ash5B( final k=ashCliZon == Buildings.Controls.OBC.ASHRAE.G36.Types.ASHRAEClimateZone.Zone_5B) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "ASHRAE zone 5B"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant ash5C( final k=ashCliZon == Buildings.Controls.OBC.ASHRAE.G36.Types.ASHRAEClimateZone.Zone_5C) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "ASHRAE zone 5C"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant ash6A( final k=ashCliZon == Buildings.Controls.OBC.ASHRAE.G36.Types.ASHRAEClimateZone.Zone_6A) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "ASHRAE zone 6A"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant ash6B( final k=ashCliZon == Buildings.Controls.OBC.ASHRAE.G36.Types.ASHRAEClimateZone.Zone_6B) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "ASHRAE zone 6B"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant ash7( final k=ashCliZon == Buildings.Controls.OBC.ASHRAE.G36.Types.ASHRAEClimateZone.Zone_7) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "ASHRAE zone 7"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant ash8( final k=ashCliZon == Buildings.Controls.OBC.ASHRAE.G36.Types.ASHRAEClimateZone.Zone_8) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "ASHRAE zone 8"; Buildings.Controls.OBC.CDL.Logical.Or3 or3 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "Zone 1b, 2b or 3b"; Buildings.Controls.OBC.CDL.Logical.Or3 or1 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "Zone 3c, 4b or 4c"; Buildings.Controls.OBC.CDL.Logical.Or3 or2 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "Zone 5b, 5c or 6b"; Buildings.Controls.OBC.CDL.Logical.Or3 or4 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "Logical or"; Buildings.Controls.OBC.CDL.Logical.Or or6 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "Zone 7 or 8"; Buildings.Controls.OBC.CDL.Logical.Or or7 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "Logical or"; Buildings.Controls.OBC.CDL.Logical.Or or5 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "Zone 5a or 6a"; Buildings.Controls.OBC.CDL.Logical.And and2 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "Logical and"; Buildings.Controls.OBC.CDL.Logical.And and1 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "Logical and"; Buildings.Controls.OBC.CDL.Logical.And and3 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "Logical and"; Buildings.Controls.OBC.CDL.Reals.Switch swi if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "Cut off outdoor air temperature"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant con( final k=273.15 + 24) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "Cut off temperature"; Buildings.Controls.OBC.CDL.Reals.Switch swi1 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "Cut off outdoor air temperature"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant con1( final k=273.15 + 21) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "Cut off temperature"; Buildings.Controls.OBC.CDL.Reals.Switch swi2 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "Cut off outdoor air temperature"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant con2( final k=273.15 + 18) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "Cut off temperature"; Buildings.Controls.OBC.CDL.Logical.Or3 or10 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "Zone 1b, 2b or 3b"; Buildings.Controls.OBC.CDL.Logical.Or3 or11 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "Zone 3c, 4b or 4c"; Buildings.Controls.OBC.CDL.Logical.Or3 or12 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "Zone 5a, 5b or 5c"; Buildings.Controls.OBC.CDL.Logical.Or3 or13 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "Zone 6a, 6b or 7"; Buildings.Controls.OBC.CDL.Logical.Or3 or14 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "Logical or"; Buildings.Controls.OBC.CDL.Logical.Or3 or15 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "Logical or"; Buildings.Controls.OBC.CDL.Reals.Switch swi3 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "Cut off outdoor air temperature"; Buildings.Controls.OBC.CDL.Logical.Or3 or8 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "Zone 1a, 2a or 3a"; Buildings.Controls.OBC.CDL.Logical.Or or9 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "Zone 1a, 2a, 3a or 4a"; Buildings.Controls.OBC.CDL.Logical.And and4 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "Logical and"; Buildings.Controls.OBC.CDL.Utilities.Assert assMes( final message="Warning: Differential dry bulb high-limit-control device is not allowed in climate zone 1A, 2A, 3A and 4A!") if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "Warning when the wrong device being used"; Buildings.Controls.OBC.CDL.Logical.Not not1 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "Logical not"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant con3( final k=273.15 + 24) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "Cut off temperature"; Buildings.Controls.OBC.CDL.Reals.Switch swi4 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "Cut off outdoor air enthalpy"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant con4( final k=66000) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "Enthalpy cutoff value, J/kg"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant titZon1( final k=tit24CliZon == Buildings.Controls.OBC.ASHRAE.G36.Types.Title24ClimateZone.Zone_1) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Title 24, zone 1"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant titZon2( final k=tit24CliZon == Buildings.Controls.OBC.ASHRAE.G36.Types.Title24ClimateZone.Zone_2) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Title 24, zone 2"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant titZon3( final k=tit24CliZon == Buildings.Controls.OBC.ASHRAE.G36.Types.Title24ClimateZone.Zone_3) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Title 24, zone 3"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant titZon4( final k=tit24CliZon == Buildings.Controls.OBC.ASHRAE.G36.Types.Title24ClimateZone.Zone_4) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Title 24, zone 4"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant titZon5( final k=tit24CliZon == Buildings.Controls.OBC.ASHRAE.G36.Types.Title24ClimateZone.Zone_5) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Title 24, zone 5"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant titZon6( final k=tit24CliZon == Buildings.Controls.OBC.ASHRAE.G36.Types.Title24ClimateZone.Zone_6) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Title 24, zone 6"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant titZon8( final k=tit24CliZon == Buildings.Controls.OBC.ASHRAE.G36.Types.Title24ClimateZone.Zone_8) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Title 24, zone 8"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant titZon9( final k=tit24CliZon == Buildings.Controls.OBC.ASHRAE.G36.Types.Title24ClimateZone.Zone_9) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Title 24, zone 9"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant titZon10( final k=tit24CliZon == Buildings.Controls.OBC.ASHRAE.G36.Types.Title24ClimateZone.Zone_10) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Title 24, zone 10"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant titZon11( final k=tit24CliZon == Buildings.Controls.OBC.ASHRAE.G36.Types.Title24ClimateZone.Zone_11) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Title 24, zone 11"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant titZon12( final k=tit24CliZon == Buildings.Controls.OBC.ASHRAE.G36.Types.Title24ClimateZone.Zone_12) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Title 24, zone 12"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant titZon13( final k=tit24CliZon == Buildings.Controls.OBC.ASHRAE.G36.Types.Title24ClimateZone.Zone_13) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Title 24, zone 13"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant titZon14( final k=tit24CliZon == Buildings.Controls.OBC.ASHRAE.G36.Types.Title24ClimateZone.Zone_14) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Title 24, zone 14"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant titZon15( final k=tit24CliZon == Buildings.Controls.OBC.ASHRAE.G36.Types.Title24ClimateZone.Zone_15) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Title 24, zone 15"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant titZon16( final k=tit24CliZon == Buildings.Controls.OBC.ASHRAE.G36.Types.Title24ClimateZone.Zone_16) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Title 24, zone 16"; Buildings.Controls.OBC.CDL.Logical.Or3 or16 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Zone 1, 3 or 5"; Buildings.Controls.OBC.CDL.Logical.Or3 or17 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Zone 11, 12 or 13"; Buildings.Controls.OBC.CDL.Logical.Or3 or18 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Zone 14, 15 or 16"; Buildings.Controls.OBC.CDL.Logical.Or3 or20 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Zone 1, 3, 5, or 11 to 16"; Buildings.Controls.OBC.CDL.Logical.And and5 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Logical and"; Buildings.Controls.OBC.CDL.Reals.Switch swi5 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Cut off outdoor air temperature"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant con5( final k=273.15 + 24) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Cut off temperature"; Buildings.Controls.OBC.CDL.Logical.Or3 or19 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Zone 2, 4 or 10"; Buildings.Controls.OBC.CDL.Logical.And and6 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Logical and"; Buildings.Controls.OBC.CDL.Reals.Switch swi6 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Cut off outdoor air temperature"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant con6( final k=273.15 + 23) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Cut off temperature"; Buildings.Controls.OBC.CDL.Logical.Or3 or21 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Zone 6, 8 or 9"; Buildings.Controls.OBC.CDL.Logical.And and7 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Logical and"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant con7( final k=273.15 + 22) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Cut off temperature"; Buildings.Controls.OBC.CDL.Reals.Switch swi7 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Cut off outdoor air temperature"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant con8( final k=273.15 + 21) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Cut off temperature"; Buildings.Controls.OBC.CDL.Reals.Switch swi8 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Cut off outdoor air temperature"; Buildings.Controls.OBC.CDL.Logical.And and8 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Logical and"; Buildings.Controls.OBC.CDL.Reals.Switch swi9 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Cut off outdoor air temperature"; Buildings.Controls.OBC.CDL.Logical.And and9 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Logical and"; Buildings.Controls.OBC.CDL.Reals.Switch swi10 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Cut off outdoor air temperature"; Buildings.Controls.OBC.CDL.Reals.AddParameter addPar( final p=-1) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Cut off temperature"; Buildings.Controls.OBC.CDL.Reals.Switch swi11 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Cut off outdoor air temperature"; Buildings.Controls.OBC.CDL.Logical.And and10 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Logical and"; Buildings.Controls.OBC.CDL.Reals.AddParameter addPar1( final p=-2) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Cut off temperature"; Buildings.Controls.OBC.CDL.Reals.Switch swi12 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Cut off outdoor air temperature"; Buildings.Controls.OBC.CDL.Reals.AddParameter addPar2( final p=-3) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Cut off temperature"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant con9( final k=273.15 + 24) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Cut off temperature"; Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToRea( final realTrue=66000) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Outdoor air enthalpy cutoff"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant titEngSta( final k=eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Check if Title 24 energy standard is used"; Buildings.Controls.OBC.CDL.Logical.And and11 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Check if Title 24 energy standard is used and the device type is differential enthalpy with fixed dry bulb"; Buildings.Controls.OBC.CDL.Utilities.Assert assMes1( final message="Warning: When Title 24 energy standard is used, the device type cannot be differential enthalpy with fixed dry bulb!") if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Warning when the wrong device being used"; Buildings.Controls.OBC.CDL.Logical.Not not2 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Logical not"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant con10( final k=0) if (eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 and not ecoHigLimCon == Buildings.Controls.OBC.ASHRAE.G36.Types.ControlEconomizer.DifferentialEnthalpyWithFixedDryBulb) "Constant 0"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant con11( final k=0) if not (ecoHigLimCon == Buildings.Controls.OBC.ASHRAE.G36.Types.ControlEconomizer.DifferentialDryBulb or ecoHigLimCon == Buildings.Controls.OBC.ASHRAE.G36.Types.ControlEconomizer.FixedDryBulbWithDifferentialDryBulb) "Constant 0"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant fixDryBulDifDryBul( final k=ecoHigLimCon == Buildings.Controls.OBC.ASHRAE.G36.Types.ControlEconomizer.FixedDryBulbWithDifferentialDryBulb) "Fixed dry bulb with differential dry bulb"; Buildings.Controls.OBC.CDL.Logical.And and12 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "Logical and"; Buildings.Controls.OBC.CDL.Reals.Min min1 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "Smaller input"; Buildings.Controls.OBC.CDL.Reals.Switch swi13 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "Cut off outdoor air temperature"; Buildings.Controls.OBC.CDL.Logical.And and13 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "Logical and"; Buildings.Controls.OBC.CDL.Reals.Min min2 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "Smaller input"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant con12( final k=273.15 + 21) if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "Cut off temperature"; Buildings.Controls.OBC.CDL.Reals.Switch swi14 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "Cut off outdoor air temperature"; Buildings.Controls.OBC.CDL.Logical.And and14 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "Logical and"; Buildings.Controls.OBC.CDL.Logical.Not not3 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "Logical not"; Buildings.Controls.OBC.CDL.Utilities.Assert assMes2( final message="Warning: Fixed dry bulb with differential dry bulb high-limit-control device is not allowed in climate zone 1A, 2A, 3A and 4A!") if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.ASHRAE90_1 "Warning when the wrong device being used"; Buildings.Controls.OBC.CDL.Logical.And and15 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Logical and"; Buildings.Controls.OBC.CDL.Reals.Switch swi15 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Cut off outdoor air temperature"; Buildings.Controls.OBC.CDL.Reals.Min min3 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Smaller input"; Buildings.Controls.OBC.CDL.Logical.And and16 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Logical and"; Buildings.Controls.OBC.CDL.Reals.Min min4 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Smaller input"; Buildings.Controls.OBC.CDL.Reals.Switch swi16 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Cut off outdoor air temperature"; Buildings.Controls.OBC.CDL.Logical.And and17 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Logical and"; Buildings.Controls.OBC.CDL.Reals.Switch swi17 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Cut off outdoor air temperature"; Buildings.Controls.OBC.CDL.Reals.Min min5 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Smaller input"; Buildings.Controls.OBC.CDL.Reals.Switch swi18 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Cut off outdoor air temperature"; Buildings.Controls.OBC.CDL.Reals.Min min6 if eneStd == Buildings.Controls.OBC.ASHRAE.G36.Types.EnergyStandard.California_Title_24 "Smaller input"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant noAshCli( final k=ashCliZon == Buildings.Controls.OBC.ASHRAE.G36.Types.ASHRAEClimateZone.Not_Specified) "No ASHRAE climate zone"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant noTit24Cli( final k=tit24CliZon == Buildings.Controls.OBC.ASHRAE.G36.Types.Title24ClimateZone.Not_Specified) "No Title 24 climate zone"; Buildings.Controls.OBC.CDL.Logical.And noCli "Climate zone is not specified"; Buildings.Controls.OBC.CDL.Logical.Not not4 "Logical not"; Buildings.Controls.OBC.CDL.Utilities.Assert assMes3( final message="Warning: Climate zone is not specified!") "Warning when the climate zone is not specified"; equation connect(ash1B.y, or3.u1); connect(ash2B.y, or3.u2); connect(ash3B.y, or3.u3); connect(ash3C.y, or1.u1); connect(ash4B.y, or1.u2); connect(ash4C.y, or1.u3); connect(ash5B.y, or2.u1); connect(ash5C.y, or2.u2); connect(ash6B.y, or2.u3); connect(or3.y, or4.u1); connect(or1.y, or4.u2); connect(or2.y, or4.u3); connect(ash7.y, or6.u1); connect(ash8.y, or6.u2); connect(or4.y, or7.u1); connect(or6.y, or7.u2); connect(ash5A.y, or5.u1); connect(ash6A.y, or5.u2); connect(or7.y, and2.u1); connect(fixDryBul.y, and2.u2); connect(fixDryBul.y, and1.u2); connect(or5.y, and1.u1); connect(and2.y, swi.u2); connect(con.y, swi.u1); connect(con1.y, swi1.u1); connect(and1.y, swi1.u2); connect(fixDryBul.y, swi2.u2); connect(con2.y, swi2.u1); connect(swi2.y, swi1.u3); connect(ash1B.y, or10.u1); connect(ash2B.y, or10.u2); connect(ash3B.y, or10.u3); connect(ash3C.y, or11.u1); connect(ash4B.y, or11.u2); connect(ash4C.y, or11.u3); connect(ash5A.y, or12.u1); connect(ash5B.y, or12.u2); connect(ash5C.y, or12.u3); connect(ash6A.y, or13.u1); connect(ash6B.y, or13.u2); connect(ash7.y, or13.u3); connect(or10.y, or14.u1); connect(or11.y, or14.u2); connect(or12.y, or14.u3); connect(or14.y, or15.u1); connect(or13.y, or15.u2); connect(ash8.y, or15.u3); connect(or15.y, and3.u1); connect(difDryBul.y, and3.u2); connect(and3.y, swi3.u2); connect(TRet, swi3.u1); connect(ash1A.y, or8.u3); connect(ash2A.y, or8.u2); connect(ash3A.y, or8.u1); connect(or8.y, or9.u2); connect(ash4A.y, or9.u1); connect(or9.y, and4.u1); connect(difDryBul.y, and4.u2); connect(and4.y, not1.u); connect(not1.y, assMes.u); connect(swi1.y, swi.u3); connect(swi3.y, swi2.u3); connect(con4.y, swi4.u1); connect(fixEntFixDryBul.y, swi4.u2); connect(hRet, swi4.u3); connect(swi.y, TCut); connect(swi4.y, hCut); connect(titZon1.y, or16.u1); connect(titZon3.y, or16.u2); connect(titZon5.y, or16.u3); connect(titZon11.y, or17.u1); connect(titZon12.y, or17.u2); connect(titZon13.y, or17.u3); connect(titZon14.y, or18.u1); connect(titZon15.y, or18.u2); connect(titZon16.y, or18.u3); connect(or16.y, or20.u1); connect(or17.y, or20.u2); connect(or18.y, or20.u3); connect(or20.y, and5.u1); connect(fixDryBul.y, and5.u2); connect(and5.y, swi5.u2); connect(con5.y, swi5.u1); connect(titZon2.y, or19.u1); connect(titZon4.y, or19.u2); connect(titZon10.y, or19.u3); connect(or19.y, and6.u1); connect(fixDryBul.y, and6.u2); connect(and6.y, swi6.u2); connect(con6.y, swi6.u1); connect(swi6.y, swi5.u3); connect(and7.y, swi7.u2); connect(con7.y, swi7.u1); connect(titZon6.y, or21.u1); connect(or21.y, and7.u1); connect(titZon8.y, or21.u2); connect(titZon9.y, or21.u3); connect(fixDryBul.y, and7.u2); connect(swi7.y, swi6.u3); connect(con8.y, swi8.u1); connect(fixDryBul.y, swi8.u2); connect(or20.y, and8.u1); connect(difDryBul.y, and8.u2); connect(and8.y, swi9.u2); connect(TRet, swi9.u1); connect(swi10.y, swi9.u3); connect(or19.y, and9.u1); connect(difDryBul.y, and9.u2); connect(TRet, addPar.u); connect(and9.y, swi10.u2); connect(addPar.y, swi10.u1); connect(and10.y, swi11.u2); connect(swi11.y, swi10.u3); connect(or21.y, and10.u1); connect(difDryBul.y, and10.u2); connect(addPar1.y, swi11.u1); connect(TRet, addPar1.u); connect(addPar2.y, swi12.u1); connect(swi12.y, swi11.u3); connect(difDryBul.y, swi12.u2); connect(TRet, addPar2.u); connect(swi8.y, swi7.u3); connect(swi9.y, swi8.u3); connect(fixEntFixDryBul.y, booToRea.u); connect(swi5.y, TCut); connect(booToRea.y, hCut); connect(titEngSta.y, and11.u2); connect(difEntFixDryBul.y, and11.u1); connect(not2.y, assMes1.u); connect(and11.y, not2.u); connect(con10.y, swi4.u3); connect(con11.y, swi3.u1); connect(con11.y, swi9.u1); connect(con11.y, addPar.u); connect(con11.y, addPar1.u); connect(con11.y, addPar2.u); connect(fixDryBulDifDryBul.y, and12.u2); connect(or7.y, and12.u1); connect(and12.y, swi13.u2); connect(con3.y, min1.u1); connect(TRet, min1.u2); connect(min1.y, swi13.u1); connect(swi13.y, swi3.u3); connect(or5.y, and13.u2); connect(fixDryBulDifDryBul.y, and13.u1); connect(con12.y, min2.u1); connect(TRet, min2.u2); connect(and13.y, swi14.u2); connect(min2.y, swi14.u1); connect(con3.y, swi14.u3); connect(swi14.y, swi13.u3); connect(and14.y, not3.u); connect(or9.y, and14.u2); connect(not3.y, assMes2.u); connect(fixDryBulDifDryBul.y, and14.u1); connect(and15.y, swi15.u2); connect(con5.y, min3.u1); connect(TRet, min3.u2); connect(min3.y, swi15.u1); connect(fixDryBulDifDryBul.y, and15.u2); connect(fixDryBulDifDryBul.y, and16.u2); connect(or20.y, and15.u1); connect(or19.y, and16.u1); connect(con6.y, min4.u2); connect(addPar.y, min4.u1); connect(min4.y, swi16.u1); connect(and16.y, swi16.u2); connect(swi16.y, swi15.u3); connect(con7.y, min5.u2); connect(addPar1.y, min5.u1); connect(min5.y, swi17.u1); connect(and17.y, swi17.u2); connect(or21.y, and17.u1); connect(fixDryBulDifDryBul.y, and17.u2); connect(swi17.y, swi16.u3); connect(fixDryBulDifDryBul.y, swi18.u2); connect(con8.y, min6.u2); connect(addPar2.y, min6.u1); connect(min6.y, swi18.u1); connect(con9.y, swi18.u3); connect(swi18.y, swi17.u3); connect(swi15.y, swi12.u3); connect(con11.y, min3.u2); connect(con11.y, min1.u2); connect(con11.y, min2.u2); connect(noAshCli.y,noCli. u1); connect(noTit24Cli.y,noCli. u2); connect(noCli.y,not4. u); connect(not4.y,assMes3. u); end AirEconomizerHighLimits;

Buildings.Controls.OBC.ASHRAE.G36.Generic.TimeSuppression Buildings.Controls.OBC.ASHRAE.G36.Generic.TimeSuppression

Calculate a time-delay period after change in set point

Buildings.Controls.OBC.ASHRAE.G36.Generic.TimeSuppression

Information

This sequence checks if there is setpoint change and if the time-based suppression has finished. The implementation is according to the Section 5.1.20 of ASHRAE Guideline 36, May 2020.

Calculate a time-delay period after any change in setpoint based on the difference between the controlled variable at the time of the change and the new setpoint. The default time delay period shall be as follows:

  1. For thermal zone temperature alarms: 18 minutes per °C (10 minutes per °F) of difference (chaRat) but no longer than 120 minutes (1800).
  2. For thermal zone temperature cooling requests: 9 minutes per °C (5 minutes per °F) of difference (chaRat) but no longer than 30 minutes (1800).
  3. For thermal zone temperature heating requests: 9 minutes per °C (5 minutes per °F) of difference (chaRat) but no longer than 30 minutes (1800).

Parameters

TypeNameDefaultDescription
RealchaRat540Gain factor to calculate suppression time based on the change of the setpoint, second per degC. For cooling or heating request, it should be 540 seconds, for temperature alarms, it should be 1080 seconds [s/K]
RealmaxTim1800Maximum suppression time. For cooling or heating request, it should be 1800 seconds, for temperature alarms, it should be 7200 seconds [s]
Advanced
RealsamplePeriod120Sample period of component, set to the same value as the trim and respond that process static pressure reset [s]
RealdTHys0.25Near zero temperature difference, below which the difference will be seen as zero [K]

Connectors

TypeNameDescription
input RealInputTSetSetpoint temperature [K]
input RealInputTZonZone temperature [K]
output BooleanOutputyAftSupTrue when there is no setpoint change, or suppression time has passed after setpoint change

Modelica definition

block TimeSuppression "Calculate a time-delay period after change in set point" parameter Real chaRat(final unit="s/K")=540 "Gain factor to calculate suppression time based on the change of the setpoint, second per degC. For cooling or heating request, it should be 540 seconds, for temperature alarms, it should be 1080 seconds"; parameter Real maxTim( final unit="s", final quantity="Time")=1800 "Maximum suppression time. For cooling or heating request, it should be 1800 seconds, for temperature alarms, it should be 7200 seconds"; 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 static pressure reset"; parameter Real dTHys( final unit="K", final quantity="TemperatureDifference")=0.25 "Near zero temperature difference, below which the difference will be seen as zero"; Buildings.Controls.OBC.CDL.Interfaces.RealInput TSet( final unit="K", final displayUnit="degC", final quantity="ThermodynamicTemperature") "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.BooleanOutput yAftSup "True when there is no setpoint change, or suppression time has passed after setpoint change"; Buildings.Controls.OBC.CDL.Reals.Min supTim "Calculated suppression time due to the setpoint change"; protected Buildings.Controls.OBC.CDL.Discrete.Sampler samSet( final samplePeriod=samplePeriod) "Sample current setpoint"; Buildings.Controls.OBC.CDL.Discrete.UnitDelay uniDel( final samplePeriod=samplePeriod) "Delay value to record input value"; Buildings.Controls.OBC.CDL.Reals.Abs abs1 "Absolute change of the setpoint temperature"; Buildings.Controls.OBC.CDL.Discrete.TriggeredSampler triSam "New setpoint temperature"; Buildings.Controls.OBC.CDL.Logical.Edge edg "Instants when input becomes true"; Buildings.Controls.OBC.CDL.Logical.Latch lat "Output true when there is setpoint change and maintain the true output until the suppresiong time has passed"; Buildings.Controls.OBC.CDL.Logical.Latch lat1 "Output true when the suppression time has passed"; Buildings.Controls.OBC.CDL.Logical.Timer tim "Time when the setpoint is being changed"; Buildings.Controls.OBC.CDL.Reals.Greater gre1 "Check if current model time is greater than the initial period equaling the sample time"; Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr( final t=dTHys, final h=0.5*dTHys) "Check if there is setpoint change"; Buildings.Controls.OBC.CDL.Reals.Sources.ModelTime modTim "Time of the model"; Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai( final k=chaRat) "Setpoint change rate"; Buildings.Controls.OBC.CDL.Reals.Subtract sub1 "Calculate difference of previous and current setpoints"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant con( final k=samplePeriod) "Sample period time"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant conZer( final k=0) "Constant zero"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant maxSupTim( final k=maxTim) "Maximum suppression time "; Buildings.Controls.OBC.CDL.Logical.Sources.Constant con5( final k=true) "Constant true"; Buildings.Controls.OBC.CDL.Reals.Switch swi "Use setpoint different value when sample period time has passed"; Buildings.Controls.OBC.CDL.Logical.TrueHoldWithReset truHol( final duration=samplePeriod) "Hold true signal for sample period of time"; Buildings.Controls.OBC.CDL.Logical.Switch pasSupTim "Check if suppression time has passed"; Buildings.Controls.OBC.CDL.Reals.Greater pasSup "Check if the change has been suppressed by sufficient time"; Buildings.Controls.OBC.CDL.Reals.Subtract temDif "Difference between setpoint and zone temperature"; Buildings.Controls.OBC.CDL.Discrete.TriggeredSampler triSam1 "Zone temperature at the moment when there is setpoint change"; Buildings.Controls.OBC.CDL.Reals.Abs abs2 "Absolute temperature difference"; equation connect(TSet, samSet.u); connect(samSet.y, uniDel.u); connect(greThr.y, lat.u); connect(lat.y,tim. u); connect(lat.y,edg. u); connect(edg.y,lat1. clr); connect(modTim.y,gre1. u1); connect(con.y,gre1. u2); connect(gre1.y,swi. u2); connect(sub1.y,swi. u1); connect(conZer.y,swi. u3); connect(swi.y, abs1.u); connect(abs1.y, greThr.u); connect(truHol.y,lat. clr); connect(gai.y,supTim. u1); connect(maxSupTim.y,supTim. u2); connect(lat.y, pasSupTim.u2); connect(lat1.y, pasSupTim.u1); connect(con5.y, pasSupTim.u3); connect(tim.y, pasSup.u1); connect(pasSup.y, lat1.u); connect(pasSup.y, truHol.u); connect(pasSupTim.y, yAftSup); connect(TSet, triSam.u); connect(TZon, triSam1.u); connect(triSam.y, temDif.u1); connect(edg.y, triSam1.trigger); connect(edg.y, triSam.trigger); connect(temDif.y, abs2.u); connect(abs2.y, gai.u); connect(supTim.y, pasSup.u2); connect(uniDel.y, sub1.u2); connect(samSet.y, sub1.u1); connect(triSam1.y, temDif.u2); end TimeSuppression;

Buildings.Controls.OBC.ASHRAE.G36.Generic.TrimAndRespond Buildings.Controls.OBC.ASHRAE.G36.Generic.TrimAndRespond

Block to inplement trim and respond logic

Buildings.Controls.OBC.ASHRAE.G36.Generic.TrimAndRespond

Information

This block implements the trim and respond logic according to ASHRAE guideline G36, Section 5.1.14.3 and 5.1.14.4.

For each upstream system or plant set point being controlled by a trim and respond loop, define the initial values in system or plant sequences. Values for trim, respond, time step, etc. shall be tuned to provide stable control.

Variable Value Definition
DeviceAHU Supply Fan Associated device
SP0iniSetInitial setpoint
SPminminSetMinimum setpoint
SPmaxmaxSetMaximum setpoint
TddelTimDelay timer
TsamplePeriodTime step
InumIgnReqNumber of ignored requests
RnumOfReqNumber of requests
SPtrimtriAmoTrim amount
SPresresAmoRespond amount
SPres_maxmaxResMaximum response per time interval

The trim and respond logic shall reset setpoint within the range minSet to maxSet. When the associated device is off (uDevSta=false), the setpoint shall be iniSet. The reset logic shall be active while the associated device is proven on (uDevSta=true), starting delTim after initial device start command. When active, every time step samplePeriod, trim the setpoint by triAmo. If there are more than numIgnReq requests, respond by changing the setpoint by resAmo*(numOfReq-numIgnReq), i.e., the number of requests minus the number of ignored requests, but no more than maxRes.

In other words, every time step samplePeriod:

Image of set point reset

Parameters

TypeNameDefaultDescription
RealiniSet Initial setpoint
RealminSet Minimum setpoint
RealmaxSet Maximum setpoint
RealdelTim Delay time [s]
RealsamplePeriod Sample period of component [s]
IntegernumIgnReq Number of ignored requests
RealtriAmo Trim amount
RealresAmo Respond amount (must have opposite sign of triAmo)
RealmaxRes Maximum response per time interval (must have same sign as resAmo)

Connectors

TypeNameDescription
input IntegerInputnumOfReqNumber of requests from zones/systems
input BooleanInputuDevStaOn/Off status of the associated device
output RealOutputySetpoint that have been reset

Modelica definition

block TrimAndRespond "Block to inplement trim and respond logic" parameter Real iniSet "Initial setpoint"; parameter Real minSet "Minimum setpoint"; parameter Real maxSet "Maximum setpoint"; parameter Real delTim( final unit="s", final quantity="Time", final min=100*1E-15) "Delay time"; parameter Real samplePeriod( final unit="s", final quantity="Time", final min=1E-3) "Sample period of component"; parameter Integer numIgnReq "Number of ignored requests"; parameter Real triAmo "Trim amount"; parameter Real resAmo "Respond amount (must have opposite sign of triAmo)"; parameter Real maxRes "Maximum response per time interval (must have same sign as resAmo)"; Buildings.Controls.OBC.CDL.Interfaces.IntegerInput numOfReq "Number of requests from zones/systems"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput uDevSta "On/Off status of the associated device"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y "Setpoint that have been reset"; Buildings.Controls.OBC.CDL.Logical.TrueDelay tim( final delayTime=delTim + samplePeriod, final delayOnInit=true) "Send an on signal after some delay time"; Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr "Check if the real requests is more than ignored requests setting"; Buildings.Controls.OBC.CDL.Reals.Switch netRes "Net setpoint reset value"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant resAmoCon( final k=resAmo) "Respond amount constant"; Buildings.Controls.OBC.CDL.Reals.Multiply pro "Products of net requests and respond amount value"; Buildings.Controls.OBC.CDL.Reals.Multiply pro1 "Product of trim and respond amount"; Buildings.Controls.OBC.CDL.Reals.Multiply pro2 "Product of respond and maximum amount"; Buildings.Controls.OBC.CDL.Discrete.UnitDelay uniDel( final samplePeriod=samplePeriod, final y_start=iniSet) "Output the input signal with a unit delay"; Buildings.Controls.OBC.CDL.Reals.Switch swi "Switch between initial setpoint and reseted setpoint"; Buildings.Controls.OBC.CDL.Reals.Switch swi1 "Before instant (device ON + delTim + samplePeriod), the setpoint should not be trimmed"; Buildings.Controls.OBC.CDL.Reals.Switch swi2 "Reinitialize setpoint to initial setting when device become OFF"; Buildings.Controls.OBC.CDL.Reals.Switch swi3 "Logical switch"; Buildings.Controls.OBC.CDL.Discrete.Sampler sampler( final samplePeriod=samplePeriod) "Sample number of requests"; Buildings.Controls.OBC.CDL.Reals.LessThreshold lesThr1 "Check if trim and response amount have same sign"; Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr2 "Check if trim and response amount have opposite sign"; Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr1 "Check if response amount have positive sign"; Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai( final k=-1) "Convert results back to negative"; protected Buildings.Controls.OBC.CDL.Reals.Sources.Constant iniSetCon(k=iniSet) "Initial setpoint"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant numIgnReqCon(k=numIgnReq) "Number of ignored requests"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant triAmoCon(k=triAmo) "Trim amount constant"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant maxResCon(k=maxRes) "Maximum response per time interval"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant maxSetCon(k=maxSet) "Maximum setpoint constant"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant zerTri(k=0) "Zero reset amount during time range from (device ON) to (device ON + delTim + timSet)"; Buildings.Controls.OBC.CDL.Conversions.IntegerToReal intToRea "Convert integer input to real output"; Buildings.Controls.OBC.CDL.Reals.Subtract difReqIgnReq "Difference between ignored request number and the real request number"; Buildings.Controls.OBC.CDL.Reals.Add add1 "Increase setpoint by amount of value defined from reset logic"; Buildings.Controls.OBC.CDL.Reals.Add add2 "Net reset value"; Buildings.Controls.OBC.CDL.Reals.Min minInp "Total response should not be more than maximum response"; Buildings.Controls.OBC.CDL.Reals.Min min1 "Reset setpoint should not be higher than the maximum setpoint"; Buildings.Controls.OBC.CDL.Logical.And and2 "After (device ON + delTim + timSta), when request number becomes more than ignored requests number"; Buildings.Controls.OBC.CDL.Logical.Not not1 "Logical Not"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant minSetCon(k=minSet) "Minimum setpoint constant"; Buildings.Controls.OBC.CDL.Reals.Max maxInp "Reset setpoint should not be lower than the minimum setpoint"; Buildings.Controls.OBC.CDL.Utilities.Assert assMes( final message="Trim amount 'triAmo' and respond amount 'resAmo' must have opposite signs.") "Generate alarm message"; Buildings.Controls.OBC.CDL.Utilities.Assert assMes2( final message="Respond amount 'resAmo' and maximum respond amount 'maxRes' must have same sign.") "Generate alarm message"; Buildings.Controls.OBC.CDL.Reals.Abs abs "Absolute value of real input"; Buildings.Controls.OBC.CDL.Reals.Abs abs1 "Absolute value of real input"; equation connect(difReqIgnReq.y, greThr.u); connect(pro.y, minInp.u1); connect(triAmoCon.y, add2.u1); connect(add2.y, netRes.u1); connect(iniSetCon.y, swi.u3); connect(swi.y, y); connect(maxSetCon.y, min1.u2); connect(add1.y, min1.u1); connect(uniDel.y, add1.u1); connect(triAmoCon.y, swi1.u1); connect(zerTri.y, swi1.u3); connect(greThr.y, and2.u2); connect(and2.y, netRes.u2); connect(iniSetCon.y, swi2.u1); connect(swi2.y, swi.u1); connect(swi2.y, uniDel.u); connect(uDevSta, not1.u); connect(not1.y, swi2.u2); connect(min1.y, maxInp.u1); connect(minSetCon.y, maxInp.u2); connect(numOfReq, intToRea.u); connect(intToRea.y, sampler.u); connect(difReqIgnReq.y, pro.u1); connect(uDevSta, tim.u); connect(tim.y, swi.u2); connect(tim.y, swi1.u2); connect(and2.u1, tim.y); connect(maxInp.y, swi2.u3); connect(triAmoCon.y, pro1.u1); connect(resAmoCon.y, pro1.u2); connect(pro1.y, lesThr1.u); connect(lesThr1.y, assMes.u); connect(resAmoCon.y, pro2.u1); connect(maxResCon.y, pro2.u2); connect(pro2.y, greThr2.u); connect(greThr2.y, assMes2.u); connect(resAmoCon.y, abs.u); connect(abs.y, pro.u2); connect(maxResCon.y, abs1.u); connect(abs1.y, minInp.u2); connect(minInp.y, swi3.u1); connect(resAmoCon.y, greThr1.u); connect(greThr1.y, swi3.u2); connect(netRes.y, add1.u2); connect(swi1.y, netRes.u3); connect(minInp.y, gai.u); connect(gai.y, swi3.u3); connect(swi3.y, add2.u2); connect(sampler.y, difReqIgnReq.u1); connect(numIgnReqCon.y, difReqIgnReq.u2); end TrimAndRespond;