Buildings.Controls.OBC.ASHRAE.G36_PR1.Generic.SetPoints

Package with sequences that output control setpoints

Information

This package contains generic setpoint sequences for either AHU or terminal units control.

Package Content

Name Description
Buildings.Controls.OBC.ASHRAE.G36_PR1.Generic.SetPoints.OperationMode OperationMode Block that outputs the operation mode
Buildings.Controls.OBC.ASHRAE.G36_PR1.Generic.SetPoints.TrimAndRespond TrimAndRespond Block to inplement trim and respond logic
Buildings.Controls.OBC.ASHRAE.G36_PR1.Generic.SetPoints.ZoneStatus ZoneStatus Block that outputs zone temperature status
Buildings.Controls.OBC.ASHRAE.G36_PR1.Generic.SetPoints.Validation Validation Collection of validation models

Buildings.Controls.OBC.ASHRAE.G36_PR1.Generic.SetPoints.OperationMode Buildings.Controls.OBC.ASHRAE.G36_PR1.Generic.SetPoints.OperationMode

Block that outputs the operation mode

Buildings.Controls.OBC.ASHRAE.G36_PR1.Generic.SetPoints.OperationMode

Information

This block outputs VAV system operation mode. It is implemented according to ASHRAE guideline G36, PART 5.C.6 (zone group operating modes). The block has the modes listed below.

Occupied Mode

A Zone Group is in the occupied mode when occupancy input uOcc is true. This input shall be retrieved from other sequences that specifies occupancy variation and time remaining to the next occupied period tNexOcc.

Warmup Mode

Warmup mode shall start based on the zone with the longest calculated warm up time warUpTim requirement, but no earlier than 3 hours before the start of the scheduled occupied period, and shall end at the scheduled occupied start time. Zones where the window switch indicates that a window is open shall be ignored. Note that for each zone, the optimal warm-up time warUpTim shall be obtained from an Optimal Start sequences, computed in a separate block. The figure below shows the sequence.

Image of warm-up mode definition

Cool-Down Mode

Cool-down mode shall start based on the zone with the longest calculated cool-down time cooDowTim requirement, but no earlier than 3 hours before the start of the scheduled occupied period, and shall end at the scheduled occupied start time. Zones where the window switch indicates that a window is open shall be ignored. Note that the each zone cooDowTim shall be obtained from an Optimal Start sequences, computed in a separate block.

Image of cool-down mode definition

Setback Mode

During unoccupied mode, if any 5 zones (or all zones, if fewer than 5) in the zone group fall below their unoccupied heating setpoints TZonHeaSetUno, the zone group shall enter setback mode until all spaces in the zone group are 1.1 °C (2 °F) above their unoccupied setpoints.

Image of setback mode definition

Freeze Protection Setback Mode

During unoccupied Mode, if any single zone falls below 4.4 °C (40 °F), the zone group shall enter setback mode until all zones are above 7.2 °C (45 °F), and a Level 3 alarm yFreProSta shall be set.

Setup Mode

During unoccupied mode, if any 5 zones (or all zones, if fewer than 5) in the zone group rise above their unoccupied cooling setpoints TZonCooSetUno, the zone group shall enter setup mode until all spaces in the zone group are 1.1 °C (2 °F) below their unoccupied setpoints. Zones where the window switch indicates that a window is open shall be ignored.

Image of setup mode definition

Unoccupied Mode

Unoccupied mode shall be active if the zone group is not in any other mode.

Parameters

TypeNameDefaultDescription
IntegernumZonnumZon(min=1)Number of zones
RealpreWarCooTim10800Maximum cool-down or warm-up time [s]
RealTZonFreProOn277.55Threshold zone temperature value to activate freeze protection mode [K]
RealTZonFreProOff280.35Threshold zone temperature value to finish the freeze protection mode [K]
Sensors
Booleanhave_winSen Check if the zone has window status sensor

Connectors

TypeNameDescription
input BooleanInputuOccZone occupancy status: true=occupied, false=unoccupied
input RealInputtNexOccTime to next occupied period [s]
input RealInputmaxCooDowTimMaximum cool-down time among all the zones [s]
input RealInputmaxWarUpTimMaximum warm-up time among all the zones [s]
input BooleanInputoccHeaHigMinTrue when the occupied heating setpoint temperature is higher than the minimum zone temperature
input BooleanInputmaxHigOccCooTrue when the maximum zone temperature is higher than the occupied cooling setpoint
input BooleanInputuWinStaWindow status: true=open, false=close
input IntegerInputtotColZonTotal number of cold zone
input BooleanInputunoHeaHigMinTrue when the unoccupied heating setpoint is higher than minimum zone temperature
input RealInputTZonMaxMaximum zone temperature [K]
input RealInputTZonMinMinimum zone temperature [K]
input IntegerInputtotHotZonTotal number of hot zone
input BooleanInputmaxHigUnoCooTrue when the maximum zone temperature is higher than unoccupied cooling setpoint
output IntegerOutputyOpeModOperation mode

Modelica definition

block OperationMode "Block that outputs the operation mode" parameter Boolean have_winSen "Check if the zone has window status sensor"; parameter Integer numZon(min=1) "Number of zones"; parameter Real preWarCooTim(unit="s") = 10800 "Maximum cool-down or warm-up time"; parameter Real TZonFreProOn( final unit="K", final displayUnit="degC", final quantity="ThermodynamicTemperature") = 277.55 "Threshold zone temperature value to activate freeze protection mode"; parameter Real TZonFreProOff( final unit="K", final displayUnit="degC", final quantity="ThermodynamicTemperature") = 280.35 "Threshold zone temperature value to finish the freeze protection mode"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput uOcc "Zone occupancy status: true=occupied, false=unoccupied"; Buildings.Controls.OBC.CDL.Interfaces.RealInput tNexOcc( final unit="s", final quantity="Time") "Time to next occupied period"; Buildings.Controls.OBC.CDL.Interfaces.RealInput maxCooDowTim( final unit="s", final quantity="Time") "Maximum cool-down time among all the zones"; Buildings.Controls.OBC.CDL.Interfaces.RealInput maxWarUpTim( final unit="s", final quantity="Time") "Maximum warm-up time among all the zones"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput occHeaHigMin "True when the occupied heating setpoint temperature is higher than the minimum zone temperature"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput maxHigOccCoo "True when the maximum zone temperature is higher than the occupied cooling setpoint"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput uWinSta if have_winSen "Window status: true=open, false=close"; Buildings.Controls.OBC.CDL.Interfaces.IntegerInput totColZon "Total number of cold zone"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput unoHeaHigMin "True when the unoccupied heating setpoint is higher than minimum zone temperature"; Buildings.Controls.OBC.CDL.Interfaces.RealInput TZonMax( final unit="K", final displayUnit="degC", final quantity="ThermodynamicTemperature") "Maximum zone temperature"; Buildings.Controls.OBC.CDL.Interfaces.RealInput TZonMin( final unit="K", final displayUnit="degC", final quantity="ThermodynamicTemperature") "Minimum zone temperature"; Buildings.Controls.OBC.CDL.Interfaces.IntegerInput totHotZon "Total number of hot zone"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput maxHigUnoCoo "True when the maximum zone temperature is higher than unoccupied cooling setpoint"; Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yOpeMod "Operation mode"; protected Buildings.Controls.OBC.CDL.Continuous.Sources.Constant occModInd( final k=Buildings.Controls.OBC.ASHRAE.G36_PR1.Types.OperationModes.occupied) "Occupied mode "; Buildings.Controls.OBC.CDL.Continuous.Sources.Constant unoPerInd( final k=0) "Index to indicate unoccupied period"; Buildings.Controls.OBC.CDL.Logical.Switch corCooDowTim "Corrected cool down period"; Buildings.Controls.OBC.CDL.Logical.Switch corWarUpTim "Corrected warm-up period"; Buildings.Controls.OBC.CDL.Integers.GreaterThreshold intGreThr( final threshold=4) "Check if the number of cold zones is not less than than 5"; Buildings.Controls.OBC.CDL.Integers.GreaterThreshold intGreThr1( final threshold=numZon - 1) "Check if all zones are cold zone"; Buildings.Controls.OBC.CDL.Logical.FallingEdge falEdg "Check if the unoccupied heating setpoint becomes lower than minimum zone temperature: true to false"; Buildings.Controls.OBC.CDL.Logical.Latch lat "If all zone temperature are higher than unoccupied heating setpoint by a given limit, then the setback mode should be off"; Buildings.Controls.OBC.CDL.Logical.Latch lat1 "If all zone temperature are higher than threshold temperature of ending freeze protection, then freeze protection setback mode should be off"; Buildings.Controls.OBC.CDL.Logical.Latch lat2 "If all zone temperature are lower than unoccupied cooling setpoint by a given limit, then the setup mode should be off"; Buildings.Controls.OBC.CDL.Logical.FallingEdge falEdg1 "Check if the unoccupied cooling setpoint becomes higher than maximum zone temperature: true to false"; Buildings.Controls.OBC.CDL.Continuous.Hysteresis hys2( final pre_y_start=true, final uHigh=0, final uLow=-60) "Hysteresis that outputs if the maximum cool-down time is more than the allowed cool-down time"; Buildings.Controls.OBC.CDL.Continuous.Hysteresis hys3( final pre_y_start=true, final uHigh=0, final uLow=-60) "Hysteresis that outputs if the maximum warm-up time is more than allowed warm-up time"; Buildings.Controls.OBC.CDL.Continuous.Add add5( final k1=-1) "Calculate differential between time-to-next-occupancy and the cool-down time"; Buildings.Controls.OBC.CDL.Continuous.Hysteresis hys4( final pre_y_start=false, final uHigh=0, final uLow=-60) "Hysteresis to activate the cool-down model"; Buildings.Controls.OBC.CDL.Continuous.Hysteresis hys5( final pre_y_start=false, final uHigh=0, final uLow=-60) "Hysteresis to activate the warm-up model"; Buildings.Controls.OBC.CDL.Continuous.Add add6( final k1=-1) "Calculate differential between time-to-next-occupancy and the warm-up time"; Buildings.Controls.OBC.CDL.Continuous.Hysteresis hys9( final pre_y_start=false, final uLow=-0.1, final uHigh=0.1) "Hysteresis that outputs if any zone temperature is lower than freeze protection threshold temperature"; Buildings.Controls.OBC.CDL.Continuous.AddParameter addPar( final p=TZonFreProOn, final k=-1) "Calculate differential between minimum zone temperature and freeze protection threshold temperature"; Buildings.Controls.OBC.CDL.Continuous.Hysteresis hys10( final pre_y_start=false, final uLow=-0.1, final uHigh=0.1) "Hysteresis that outputs if all zone temperature are higher than threshold temperature of ending freeze protection"; Buildings.Controls.OBC.CDL.Continuous.AddParameter addPar1( final k=1, final p=(-1)*TZonFreProOff) "Calculate differential between maximum zone temperature and threshold temperature of ending freeze protection"; Buildings.Controls.OBC.CDL.Continuous.AddParameter addPar2( final p=preWarCooTim, final k=-1) "Calculate the differential between maximum cool down time and the allowed maximum cool down time"; Buildings.Controls.OBC.CDL.Continuous.AddParameter addPar3( final p=preWarCooTim, final k=-1) "Calculate the differential between maximum warm-up time and the allowed maximum warm-up time"; Buildings.Controls.OBC.CDL.Continuous.Sources.Constant maxWarCooTime( final k=preWarCooTim) "Allowed maximum warm-up or cool-down time"; Buildings.Controls.OBC.CDL.Logical.Latch lat3 "Hold true when it should be in warm-up mode"; Buildings.Controls.OBC.CDL.Logical.Latch lat4 "Hold true when it should be in cool-down mode"; Buildings.Controls.OBC.CDL.Integers.GreaterThreshold intGreThr2( final threshold=4) "Check if the number of hot zones is not less than than 5"; Buildings.Controls.OBC.CDL.Integers.GreaterThreshold intGreThr3( final threshold=numZon - 1) "Check if all zones are hot zone"; Buildings.Controls.OBC.CDL.Integers.Add addInt "Sum of two integer inputs"; Buildings.Controls.OBC.CDL.Integers.Add addInt1 "Sum of two integer inputs"; Buildings.Controls.OBC.CDL.Integers.Add addInt2 "Sum of two integer inputs"; Buildings.Controls.OBC.CDL.Integers.Add addInt3 "Sum of two integer inputs"; Buildings.Controls.OBC.CDL.Integers.Add addInt4 "Sum of two integer inputs"; Buildings.Controls.OBC.CDL.Integers.Add addInt5 "Sum of two integer inputs"; Buildings.Controls.OBC.CDL.Conversions.RealToInteger occMod "Convert Real number to Integer number"; Buildings.Controls.OBC.CDL.Conversions.RealToInteger setBacMod "Convert Real number to Integer number"; Buildings.Controls.OBC.CDL.Conversions.RealToInteger freProSetBacMod "Convert Real number to Integer number"; Buildings.Controls.OBC.CDL.Conversions.RealToInteger setUpMod "Convert Real number to Integer number"; Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt1( final integerTrue=Buildings.Controls.OBC.ASHRAE.G36_PR1.Types.OperationModes.warmUp) "Convert Boolean to Integer number"; Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt( final integerTrue=Buildings.Controls.OBC.ASHRAE.G36_PR1.Types.OperationModes.coolDown) "Convert Boolean to Integer number"; Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt3( final integerTrue=Buildings.Controls.OBC.ASHRAE.G36_PR1.Types.OperationModes.unoccupied) "Convert Boolean to Integer "; Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToRea6( final realTrue=Buildings.Controls.OBC.ASHRAE.G36_PR1.Types.OperationModes.setUp) "Convert Boolean to Real "; Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToRea4( final realTrue=Buildings.Controls.OBC.ASHRAE.G36_PR1.Types.OperationModes.freezeProtection) "Convert Boolean to Real "; Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToRea3( final realTrue=Buildings.Controls.OBC.ASHRAE.G36_PR1.Types.OperationModes.setBack) "Convert Boolean to Real "; Buildings.Controls.OBC.CDL.Utilities.Assert assMes( final message="Level 3 alarm: freeze protection setback") "Generate alarm message"; Buildings.Controls.OBC.CDL.Logical.Not not2 "Logical not"; Buildings.Controls.OBC.CDL.Logical.And and1 "Check if the warm-up time should be activated"; Buildings.Controls.OBC.CDL.Logical.And and2 "Check if the cool-down time should be activated"; Buildings.Controls.OBC.CDL.Logical.Or or1 "Check if the number of cold zone is more than 5 or all zones are cold"; Buildings.Controls.OBC.CDL.Logical.Or3 or3 "Check if it is in Occupied, Cool-down, or Warm-up mode"; Buildings.Controls.OBC.CDL.Logical.Or or4 "Check if the number of hot zone is more than 5 or all zones are cold"; Buildings.Controls.OBC.CDL.Logical.Or3 or5 "Check if it is in Setback, Setback_freezeProtection, or Setup mode"; Buildings.Controls.OBC.CDL.Logical.Or or6 "Check if it is in any of the 6 modes except unoccupied mode"; Buildings.Controls.OBC.CDL.Logical.Switch swi "Switch between occupied mode index and unoccupied period index"; Buildings.Controls.OBC.CDL.Logical.Switch swi3 "If the Cool-down, warm-up, or Occupied mode is on, then setback mode should not be activated."; Buildings.Controls.OBC.CDL.Logical.Switch swi4 "If the Cool-down, warm-up, or Occupied mode is on, then freeze protection setback mode should not be activated."; Buildings.Controls.OBC.CDL.Logical.Switch swi5 "If the Cool-down, warm-up, or Occupied mode is on, then setup mode should not be activated."; Buildings.Controls.OBC.CDL.Logical.Not not3 "Logical not"; Buildings.Controls.OBC.CDL.Logical.Not not4 "Logical not"; Buildings.Controls.OBC.CDL.Logical.Not not5 "Logical not"; Buildings.Controls.OBC.CDL.Integers.GreaterThreshold notOcc( final threshold=1) if have_winSen "Check if the operation mode is other than occupied mode"; Buildings.Controls.OBC.CDL.Logical.And and3 if have_winSen "True if window open during modes other than occupied mode"; Buildings.Controls.OBC.CDL.Logical.Not not1 if have_winSen "Logical not"; Buildings.Controls.OBC.CDL.Utilities.Assert winOpe( final message="Level 4 alarm: window open during modes other than occupied mode") if have_winSen "Generate alarm message when window open during modes other than occupied mode"; equation connect(swi.y, occMod.u); connect(occModInd.y, swi.u1); connect(unoPerInd.y, swi.u3); connect(intGreThr.y, or1.u1); connect(intGreThr1.y, or1.u2); connect(or1.y, lat.u); connect(falEdg.y, lat.clr); connect(lat.y, booToRea3.u); connect(unoPerInd.y, swi3.u1); connect(or3.y, swi3.u2); connect(lat1.y, booToRea4.u); connect(or3.y, swi4.u2); connect(unoPerInd.y, swi4.u1); connect(or4.y, lat2.u); connect(falEdg1.y, lat2.clr); connect(lat2.y, booToRea6.u); connect(or3.y, swi5.u2); connect(unoPerInd.y, swi5.u1); connect(swi3.y, setBacMod.u); connect(swi4.y, freProSetBacMod.u); connect(swi5.y, setUpMod.u); connect(lat.y, or5.u1); connect(lat1.y, or5.u2); connect(lat2.y, or5.u3); connect(or5.y, or6.u1); connect(or3.y, or6.u2); connect(or6.y, not2.u); connect(not2.y,booToInt3. u); connect(and2.y, booToInt.u); connect(and1.y, booToInt1.u); connect(and2.y, or3.u2); connect(and1.y, or3.u1); connect(uOcc, swi.u2); connect(uOcc, or3.u3); connect(hys2.y, corCooDowTim.u2); connect(hys3.y, corWarUpTim.u2); connect(add5.y, hys4.u); connect(hys4.y, and2.u1); connect(tNexOcc, add5.u1); connect(corCooDowTim.y, add5.u2); connect(tNexOcc, add6.u1); connect(corWarUpTim.y, add6.u2); connect(add6.y, hys5.u); connect(hys5.y, and1.u1); connect(addPar.y, hys9.u); connect(hys9.y, lat1.u); connect(addPar1.y, hys10.u); connect(hys10.y, lat1.clr); connect(addPar2.y, hys2.u); connect(addPar3.y, hys3.u); connect(maxWarCooTime.y, corCooDowTim.u3); connect(maxWarCooTime.y, corWarUpTim.u3); connect(booToRea3.y, swi3.u3); connect(booToRea4.y, swi4.u3); connect(booToRea6.y, swi5.u3); connect(lat3.y, and1.u2); connect(lat4.y, and2.u2); connect(hys4.y, not3.u); connect(hys5.y, not4.u); connect(not4.y, lat3.clr); connect(not3.y, lat4.clr); connect(lat1.y, not5.u); connect(not5.y, assMes.u); connect(maxCooDowTim, addPar2.u); connect(maxCooDowTim, corCooDowTim.u1); connect(maxWarUpTim, addPar3.u); connect(maxWarUpTim, corWarUpTim.u1); connect(occHeaHigMin, lat3.u); connect(maxHigOccCoo, lat4.u); connect(unoHeaHigMin, falEdg.u); connect(TZonMax, addPar.u); connect(TZonMin, addPar1.u); connect(maxHigUnoCoo, falEdg1.u); connect(totColZon, intGreThr.u); connect(totColZon, intGreThr1.u); connect(totHotZon, intGreThr2.u); connect(totHotZon, intGreThr3.u); connect(intGreThr2.y, or4.u1); connect(intGreThr3.y, or4.u2); connect(booToInt.y, addInt.u1); connect(booToInt1.y, addInt.u2); connect(occMod.y, addInt1.u1); connect(addInt.y, addInt1.u2); connect(setBacMod.y, addInt2.u1); connect(freProSetBacMod.y, addInt2.u2); connect(setUpMod.y, addInt3.u2); connect(addInt2.y, addInt3.u1); connect(addInt3.y, addInt4.u1); connect(booToInt3.y, addInt4.u2); connect(addInt1.y, addInt5.u1); connect(addInt4.y, addInt5.u2); connect(addInt5.y, yOpeMod); connect(uWinSta, and3.u1); connect(notOcc.y, and3.u2); connect(and3.y, not1.u); connect(addInt5.y, notOcc.u); connect(not1.y, winOpe.u); end OperationMode;

Buildings.Controls.OBC.ASHRAE.G36_PR1.Generic.SetPoints.TrimAndRespond Buildings.Controls.OBC.ASHRAE.G36_PR1.Generic.SetPoints.TrimAndRespond

Block to inplement trim and respond logic

Buildings.Controls.OBC.ASHRAE.G36_PR1.Generic.SetPoints.TrimAndRespond

Information

This block implements the trim and respond logic according to ASHRAE guideline G36, PART 5.A.15 (trim and respond setpoint reset logic).

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
RealdelTimdelTim(final unit="s", final...Delay time [s]
RealsamplePeriodsamplePeriod(final unit="s",...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.Continuous.GreaterEqualThreshold greThr "Check if the real requests is more than ignored requests setting"; Buildings.Controls.OBC.CDL.Logical.Switch netRes "Net setpoint reset value"; Buildings.Controls.OBC.CDL.Continuous.Sources.Constant resAmoCon( final k=resAmo) "Respond amount constant"; Buildings.Controls.OBC.CDL.Continuous.Product pro "Products of net requests and respond amount value"; Buildings.Controls.OBC.CDL.Continuous.Product pro1 "Product of trim and respond amount"; Buildings.Controls.OBC.CDL.Continuous.Product 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.Logical.Switch swi "Switch between initial setpoint and reseted setpoint"; Buildings.Controls.OBC.CDL.Logical.Switch swi1 "Before instant (device ON + delTim + samplePeriod), the setpoint should not be trimmed"; Buildings.Controls.OBC.CDL.Logical.Switch swi2 "Reinitialize setpoint to initial setting when device become OFF"; Buildings.Controls.OBC.CDL.Logical.Switch swi3 "Logical switch"; Buildings.Controls.OBC.CDL.Discrete.Sampler sampler( final samplePeriod=samplePeriod) "Sample number of requests"; Buildings.Controls.OBC.CDL.Continuous.LessEqualThreshold lesEquThr1 "Check if trim and response amount have same sign"; Buildings.Controls.OBC.CDL.Continuous.GreaterEqualThreshold greEquThr "Check if trim and response amount have opposite sign"; Buildings.Controls.OBC.CDL.Continuous.GreaterEqualThreshold greEquThr1 "Check if response amount have positive sign"; Buildings.Controls.OBC.CDL.Continuous.Gain gai( final k=-1) "Convert results back to negative"; protected Buildings.Controls.OBC.CDL.Continuous.Sources.Constant iniSetCon(k=iniSet) "Initial setpoint"; Buildings.Controls.OBC.CDL.Continuous.Sources.Constant numIgnReqCon(k=numIgnReq) "Number of ignored requests"; Buildings.Controls.OBC.CDL.Continuous.Sources.Constant triAmoCon(k=triAmo) "Trim amount constant"; Buildings.Controls.OBC.CDL.Continuous.Sources.Constant maxResCon(k=maxRes) "Maximum response per time interval"; Buildings.Controls.OBC.CDL.Continuous.Sources.Constant maxSetCon(k=maxSet) "Maximum setpoint constant"; Buildings.Controls.OBC.CDL.Continuous.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.Continuous.Add difReqIgnReq(k1=-1) "Difference between ignored request number and the real request number"; Buildings.Controls.OBC.CDL.Continuous.Add add1 "Increase setpoint by amount of value defined from reset logic"; Buildings.Controls.OBC.CDL.Continuous.Add add2 "Net reset value"; Buildings.Controls.OBC.CDL.Continuous.Min minInp "Total response should not be more than maximum response"; Buildings.Controls.OBC.CDL.Continuous.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.Continuous.Sources.Constant minSetCon(k=minSet) "Minimum setpoint constant"; Buildings.Controls.OBC.CDL.Continuous.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.Continuous.Abs abs "Absolute value of real input"; Buildings.Controls.OBC.CDL.Continuous.Abs abs1 "Absolute value of real input"; equation connect(numIgnReqCon.y, difReqIgnReq.u1); 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(sampler.y, difReqIgnReq.u2); 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, lesEquThr1.u); connect(lesEquThr1.y, assMes.u); connect(resAmoCon.y, pro2.u1); connect(maxResCon.y, pro2.u2); connect(pro2.y, greEquThr.u); connect(greEquThr.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, greEquThr1.u); connect(greEquThr1.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); end TrimAndRespond;

Buildings.Controls.OBC.ASHRAE.G36_PR1.Generic.SetPoints.ZoneStatus Buildings.Controls.OBC.ASHRAE.G36_PR1.Generic.SetPoints.ZoneStatus

Block that outputs zone temperature status

Buildings.Controls.OBC.ASHRAE.G36_PR1.Generic.SetPoints.ZoneStatus

Information

This block outputs single zone status. It includes outputs as following:

Parameters

TypeNameDefaultDescription
RealbouLim1.1Value limit to indicate the end of setback or setup mode [K]
Booleanhave_winSenfalseCheck if the zone has window status sensor

Connectors

TypeNameDescription
input RealInputcooDowTimCool-down time retrieved from optimal cool-down block [s]
input RealInputwarUpTimWarm-up time retrieved from optimal warm-up block [s]
input BooleanInputuWinStaWindow status: true=open, false=close
input RealInputTZonHeaSetOccOccupied heating setpoint temperature [K]
input RealInputTZonCooSetOccOccupied cooling setpoint temperature [K]
input RealInputTZonMaxMaximum zone temperature in the zone group [K]
input RealInputTZonSingle zone temperature [K]
input RealInputTZonMinMinimum zone temperature in the zone group [K]
input RealInputTZonHeaSetUnoUnoccupied heating setpoint temperature [K]
input RealInputTZonCooSetUnoUnoccupied cooling setpoint temperature [K]
output RealOutputyCooTimCool-down time [s]
output RealOutputyWarTimWarm-up time [s]
output BooleanOutputyOccHeaHigMinTrue when the occupied heating setpoint temperature is higher than the minimum zone temperature
output BooleanOutputyMaxHigOccCooTrue when the maximum zone temperature is higher than the occupied cooling setpoint
output BooleanOutputyLowUnoHeaTrue when zone temperature is lower than unoccupied heating setpoint
output BooleanOutputyUnoHeaHigMinTrue when the unoccupied heating setpoint is higher than minimum zone temperature
output BooleanOutputyMaxHigUnoCooTrue when the maximum zone temperature is higher than unoccupied cooling setpoint
output BooleanOutputyHigUnoCooTrue when the zone temperature is higher than the unoccupied cooling setpoint

Modelica definition

block ZoneStatus "Block that outputs zone temperature status" parameter Real bouLim( final unit="K", final displayUnit="K", final quantity="TemperatureDifference", final min=0.5) = 1.1 "Value limit to indicate the end of setback or setup mode"; parameter Boolean have_winSen=false "Check if the zone has window status sensor"; Buildings.Controls.OBC.CDL.Interfaces.RealInput cooDowTim( final unit="s", final quantity="Time") "Cool-down time retrieved from optimal cool-down block"; Buildings.Controls.OBC.CDL.Interfaces.RealInput warUpTim( final unit="s", final quantity="Time") "Warm-up time retrieved from optimal warm-up block"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput uWinSta if have_winSen "Window status: true=open, false=close"; Buildings.Controls.OBC.CDL.Interfaces.RealInput TZonHeaSetOcc( final unit="K", final displayUnit="degC", final quantity="ThermodynamicTemperature") "Occupied heating setpoint temperature"; Buildings.Controls.OBC.CDL.Interfaces.RealInput TZonCooSetOcc( final unit="K", final displayUnit="degC", final quantity="ThermodynamicTemperature") "Occupied cooling setpoint temperature"; Buildings.Controls.OBC.CDL.Interfaces.RealInput TZonMax( final unit="K", final displayUnit="degC", final quantity="ThermodynamicTemperature") "Maximum zone temperature in the zone group"; Buildings.Controls.OBC.CDL.Interfaces.RealInput TZon( final unit="K", final displayUnit="degC", final quantity="ThermodynamicTemperature") "Single zone temperature"; Buildings.Controls.OBC.CDL.Interfaces.RealInput TZonMin( final unit="K", final displayUnit="degC", final quantity="ThermodynamicTemperature") "Minimum zone temperature in the zone group"; Buildings.Controls.OBC.CDL.Interfaces.RealInput TZonHeaSetUno( final unit="K", final displayUnit="degC", final quantity="ThermodynamicTemperature") "Unoccupied heating setpoint temperature"; Buildings.Controls.OBC.CDL.Interfaces.RealInput TZonCooSetUno( final unit="K", final displayUnit="degC", final quantity="ThermodynamicTemperature") "Unoccupied cooling setpoint temperature"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput yCooTim( final unit="s", final quantity="Time") "Cool-down time"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput yWarTim( final unit="s", final quantity="Time") "Warm-up time"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput yOccHeaHigMin "True when the occupied heating setpoint temperature is higher than the minimum zone temperature"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput yMaxHigOccCoo "True when the maximum zone temperature is higher than the occupied cooling setpoint"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput yLowUnoHea "True when zone temperature is lower than unoccupied heating setpoint"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput yUnoHeaHigMin "True when the unoccupied heating setpoint is higher than minimum zone temperature"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput yMaxHigUnoCoo "True when the maximum zone temperature is higher than unoccupied cooling setpoint"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput yHigUnoCoo "True when the zone temperature is higher than the unoccupied cooling setpoint"; protected Buildings.Controls.OBC.CDL.Continuous.Product pro "Decide if the cool down time of one zone should be ignored: if window is open, then output zero, otherwise, output cool-down time from optimal cool-down block"; Buildings.Controls.OBC.CDL.Continuous.Product pro1 "Decide if the warm-up time of one zone should be ignored: if window is open, then output zero, otherwise, output warm-up time from optimal warm-up block"; Buildings.Controls.OBC.CDL.Continuous.Add add(final k2=-1) "Calculate differential between minimum zone temperature and the heating setpoint"; Buildings.Controls.OBC.CDL.Continuous.Hysteresis hys( final pre_y_start=false, final uLow=-0.1, final uHigh=0.1) "Hysteresis that outputs if the system should run in warm-up mode"; Buildings.Controls.OBC.CDL.Continuous.Add add1(final k1=-1) "Calculate differential between maximum zone temperature and the cooling setpoint"; Buildings.Controls.OBC.CDL.Continuous.Hysteresis hys1( final pre_y_start=false, final uLow=-0.1, final uHigh=0.1) "Hysteresis that outputs if the system should run in cool-down mode"; Buildings.Controls.OBC.CDL.Continuous.Add add2(final k1=-1) "Calculate zone temperature difference to setpoint"; Buildings.Controls.OBC.CDL.Continuous.Hysteresis hys2( final pre_y_start=false, final uLow=-0.1, final uHigh=0.1) "Hysteresis that outputs if the zone temperature is lower then setpoint"; Buildings.Controls.OBC.CDL.Continuous.Add add3(final k2=-1) "Calculate the difference between minimum zone temperature and unoccupied heating setpoint"; Buildings.Controls.OBC.CDL.Continuous.Hysteresis hys3( final uLow=-0.5*bouLim, final uHigh=0.5*bouLim, final pre_y_start=false) "Hysteresis that outputs if the unoccupied heating setpoint is higher than minimum zone temperature by a given limit"; Buildings.Controls.OBC.CDL.Continuous.Add add5(final k2=-1) "Calculate zone temperature difference to setpoint"; Buildings.Controls.OBC.CDL.Continuous.Hysteresis hys5( final pre_y_start=false, final uLow=-0.1, final uHigh=0.1) "Hysteresis that outputs if the zone temperature is higher than setpoint"; Buildings.Controls.OBC.CDL.Continuous.Add add4(final k2=-1) "Calculate the difference between maximum zone temperature and unoccupied cooling setpoint"; Buildings.Controls.OBC.CDL.Continuous.Hysteresis hys4( final pre_y_start=false, final uLow=-0.5*bouLim, final uHigh=0.5*bouLim) "Hysteresis that outputs if the maximum zone temperature is higher than unoccupied cooling setpoint by a given limit"; Buildings.Controls.OBC.CDL.Logical.Not not1 "Logical not"; Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToRea "Convert Boolean to Real number"; Buildings.Controls.OBC.CDL.Logical.Switch swi "Decide if the temperature difference to setpoint should be ignored: if the zone window is open, then output setpoint temperature, otherwise, output zone temperature"; Buildings.Controls.OBC.CDL.Logical.Switch swi1 "Decide if the temperature difference to setpoint should be ignored: if the zone window is open, then output setpoint temperature, otherwise, output zone temperature"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant con(final k=false) if not have_winSen "Constant false"; equation connect(cooDowTim, pro.u1); connect(warUpTim, pro1.u1); connect(booToRea.y, pro.u2); connect(booToRea.y, pro1.u2); connect(TZonHeaSetOcc, add.u1); connect(TZonMin, add.u2); connect(add.y, hys.u); connect(TZonCooSetOcc, add1.u1); connect(TZonMax, add1.u2); connect(add1.y, hys1.u); connect(uWinSta, not1.u); connect(uWinSta, swi.u2); connect(TZonHeaSetUno, swi.u1); connect(TZon, swi.u3); connect(swi.y, add2.u1); connect(TZonHeaSetUno, add2.u2); connect(add2.y, hys2.u); connect(TZonMin, add3.u2); connect(TZonHeaSetUno, add3.u1); connect(add3.y, hys3.u); connect(uWinSta, swi1.u2); connect(TZonCooSetUno, swi1.u1); connect(TZon, swi1.u3); connect(swi1.y, add5.u1); connect(TZonCooSetUno, add5.u2); connect(add5.y, hys5.u); connect(TZonMax, add4.u1); connect(TZonCooSetUno, add4.u2); connect(add4.y, hys4.u); connect(not1.y, booToRea.u); connect(hys.y, yOccHeaHigMin); connect(hys1.y, yMaxHigOccCoo); connect(pro.y, yCooTim); connect(pro1.y, yWarTim); connect(hys2.y, yLowUnoHea); connect(hys3.y,yUnoHeaHigMin); connect(hys4.y, yMaxHigUnoCoo); connect(hys5.y, yHigUnoCoo); connect(con.y, not1.u); connect(con.y, swi.u2); connect(con.y, swi1.u2); end ZoneStatus;