Buildings.Controls.OBC.ASHRAE.G36.FanCoilUnits.Subsequences

Package of subsequences for fan coil unit controls

Information

This package contains the subsequences used in the fan coil unit controller.

Package Content

Name Description
Buildings.Controls.OBC.ASHRAE.G36.FanCoilUnits.Subsequences.FanSpeed FanSpeed Fan speed setpoint subsequence
Buildings.Controls.OBC.ASHRAE.G36.FanCoilUnits.Subsequences.PlantRequests PlantRequests Output plant requests for fan coil unit
Buildings.Controls.OBC.ASHRAE.G36.FanCoilUnits.Subsequences.SupplyAirTemperature SupplyAirTemperature Subsequence for calculating supply air temperature setpoint
Buildings.Controls.OBC.ASHRAE.G36.FanCoilUnits.Subsequences.Validation Validation Package containing validation models for fan coil unit subsequences

Buildings.Controls.OBC.ASHRAE.G36.FanCoilUnits.Subsequences.FanSpeed Buildings.Controls.OBC.ASHRAE.G36.FanCoilUnits.Subsequences.FanSpeed

Fan speed setpoint subsequence

Buildings.Controls.OBC.ASHRAE.G36.FanCoilUnits.Subsequences.FanSpeed

Information

Block that outputs the fan enable signal and the fan speed signal based on the heating and cooling loop signals. The implemented sequence is based on ASHRAE Guideline 36, 2021, Part 5.22.4.

The fan enable signal y1Fan is set to false when the operating mode signal opeMod is unoccupied, and is set to true otherwise.

The fan speed signal yFan is varied from the minimum cooling mode fan speed cooSpe_min to the maximum cooling mode fan speed cooSpe_max, when the cooling loop signal uCoo varies from the minimum limit uCoo_min to the maximum limit uCoo_max. Similarly, yFan is varied from the minimum heating mode fan speed heaSpe_min to the maximum heating mode fan speed heaSpe_max, when the heating loop signal uHea varies from the minimum limit uHea_min to the maximum limit uHea_max. The setpoint in deadband mode is equal to the deadband fan speed deaSpe.

Fan speed setpoint control logic diagram

Parameters

TypeNameDefaultDescription
Booleanhave_cooCoi True if the unit has a cooling coil
Booleanhave_heaCoi True if the unit has a heating coil
Deadband
RealdeaSpe0.1Deadband mode fan speed [1]
RealheaDea0.1Heating loop signal limit above which fan operation changes from deadband mode to heating mode [1]
RealcooDea0.1Cooling loop signal limit above which fan operation changes from deadband mode to cooling mode [1]
Heating loop
RealheaSpe_min0.1Minimum heating mode fan speed [1]
RealuHea_min0.5Minimum heating loop signal at which fan speed is modified [1]
RealheaSpe_max0.6Maximum heating mode fan speed [1]
RealuHea_max1Maximum heating loop signal at which fan speed is modified [1]
Cooling loop
RealcooSpe_min0.2Minimum cooling mode fan speed [1]
RealuCoo_min0.5Minimum cooling loop signal at which fan speed is modified [1]
RealcooSpe_max1Maximum cooling mode fan speed [1]
RealuCoo_max1Maximum cooling loop signal at which fan speed is modified [1]
Advanced
RealdeaHysLim0.05Hysteresis limits for deadband mode transitions [1]

Connectors

TypeNameDescription
input BooleanInputu1FanProFan proven on signal
input IntegerInputopeModSystem operating mode
input RealInputuHeaHeating loop signal [1]
input RealInputuCooCooling loop signal [1]
output BooleanOutputy1FanFan command on status
output RealOutputyFanFan command speed [1]

Modelica definition

block FanSpeed "Fan speed setpoint subsequence" parameter Boolean have_cooCoi "True if the unit has a cooling coil"; parameter Boolean have_heaCoi "True if the unit has a heating coil"; parameter Real deaSpe( unit="1", displayUnit="1")=0.1 "Deadband mode fan speed"; parameter Real heaSpe_min( unit="1", displayUnit="1")=0.1 "Minimum heating mode fan speed"; parameter Real uHea_min( unit="1", displayUnit="1")=0.5 "Minimum heating loop signal at which fan speed is modified"; parameter Real heaSpe_max( unit="1", displayUnit="1")=0.6 "Maximum heating mode fan speed"; parameter Real uHea_max( unit="1", displayUnit="1")=1 "Maximum heating loop signal at which fan speed is modified"; parameter Real cooSpe_min( unit="1", displayUnit="1")=0.2 "Minimum cooling mode fan speed"; parameter Real uCoo_min( unit="1", displayUnit="1")=0.5 "Minimum cooling loop signal at which fan speed is modified"; parameter Real cooSpe_max( unit="1", displayUnit="1")=1 "Maximum cooling mode fan speed"; parameter Real uCoo_max( unit="1", displayUnit="1")=1 "Maximum cooling loop signal at which fan speed is modified"; parameter Real heaDea( unit="1", displayUnit="1")=0.1 "Heating loop signal limit above which fan operation changes from deadband mode to heating mode"; parameter Real cooDea( unit="1", displayUnit="1")=0.1 "Cooling loop signal limit above which fan operation changes from deadband mode to cooling mode"; parameter Real deaHysLim( unit="1", displayUnit="1")=0.05 "Hysteresis limits for deadband mode transitions"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1FanPro "Fan proven on signal"; Buildings.Controls.OBC.CDL.Interfaces.IntegerInput opeMod "System operating mode"; Buildings.Controls.OBC.CDL.Interfaces.RealInput uHea( final unit="1", displayUnit="1") if have_heaCoi "Heating loop signal"; Buildings.Controls.OBC.CDL.Interfaces.RealInput uCoo( final unit="1", displayUnit="1") if have_cooCoi "Cooling loop signal"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput y1Fan "Fan command on status"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput yFan( final unit="1", displayUnit="1") "Fan command speed"; Buildings.Controls.OBC.CDL.Integers.Equal isUnOcc "Check if zone is unoccupied"; Buildings.Controls.OBC.CDL.Logical.Not notUno "Enable only if zone is not in unoccupied mode"; Buildings.Controls.OBC.CDL.Reals.Switch swiFanPro "Switch fan speed to deadband speed until the fan is proven ON"; Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToRea "Convert fan enable signal to Real"; Buildings.Controls.OBC.CDL.Reals.Line linHeaFanSpe if have_heaCoi "Heating fan speed signal"; Buildings.Controls.OBC.CDL.Reals.Line linCooFanSpe if have_cooCoi "Cooling fan speed signal"; Buildings.Controls.OBC.CDL.Reals.Hysteresis hysDeaHea( final uLow=heaDea-deaHysLim, final uHigh=heaDea) if have_heaCoi "Hysteresis for switching between deadband mode and heating mode"; Buildings.Controls.OBC.CDL.Reals.Switch swiDeaHea if have_heaCoi "Switch for turning on heating mode from deadband mode"; Buildings.Controls.OBC.CDL.Reals.Hysteresis hysDeaCoo( final uLow=cooDea-deaHysLim, final uHigh=cooDea) if have_cooCoi "Hysteresis for switching on cooling mode from deadband mode"; Buildings.Controls.OBC.CDL.Reals.Switch swiDeaCoo "Switch for turning on cooling mode from deadband mode"; Buildings.Controls.OBC.CDL.Reals.Multiply mulFanSpe "Multiply fan speed signal by fan enable signal"; Buildings.Controls.OBC.CDL.Reals.Multiply mulDeaSpe "Multiply deadband speed signal by fan enable signal"; Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai( final k=1) if not have_heaCoi "Dummy gain"; Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai1( final k=1) if not have_cooCoi "Dummy gain"; protected Buildings.Controls.OBC.CDL.Integers.Sources.Constant unOccMod( final k=Buildings.Controls.OBC.ASHRAE.G36.Types.OperationModes.unoccupied) "Constant unoccupied mode signal"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant con( final k=false) if not have_cooCoi "Constant false"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant conuCoo_max( final k=uCoo_max) if have_cooCoi "Maximum cooling loop signal support point"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant concooSpe_max( final k=cooSpe_max) if have_cooCoi "Maximum cooling fan speed limit signal"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant conheaSpe_max( final k=heaSpe_max) if have_heaCoi "Maximum heating fan speed limit signal"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant conuHea_max( final k=uHea_max) if have_heaCoi "Maximum heating loop signal support point"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant conuCoo_min( final k=uCoo_min) if have_cooCoi "Minimum cooling loop signal support point"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant conDeaFanSpe( final k=deaSpe) "Deadband mode fan speed signal"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant conuHea_min( final k=uHea_min) if have_heaCoi "Minimum heating loop signal support point"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant conheaSpe_min( final k=heaSpe_min) if have_heaCoi "Minimum heating fan speed limit signal"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant concooSpe_min( final k=cooSpe_min) if have_cooCoi "Minimum cooling fan speed limit signal"; equation connect(unOccMod.y, isUnOcc.u2); connect(opeMod, isUnOcc.u1); connect(isUnOcc.y, notUno.u); connect(notUno.y, y1Fan); connect(u1FanPro, swiFanPro.u2); connect(notUno.y, booToRea.u); connect(uHea, linHeaFanSpe.u); connect(uCoo, linCooFanSpe.u); connect(uHea, hysDeaHea.u); connect(hysDeaHea.y, swiDeaHea.u2); connect(conDeaFanSpe.y, swiDeaHea.u3); connect(linHeaFanSpe.y, swiDeaHea.u1); connect(hysDeaCoo.y, swiDeaCoo.u2); connect(uCoo, hysDeaCoo.u); connect(linCooFanSpe.y, swiDeaCoo.u1); connect(swiDeaHea.y, swiDeaCoo.u3); connect(booToRea.y, mulFanSpe.u1); connect(swiDeaCoo.y, mulFanSpe.u2); connect(mulFanSpe.y, swiFanPro.u1); connect(swiFanPro.y, yFan); connect(conheaSpe_max.y, linHeaFanSpe.f2); connect(conuHea_max.y, linHeaFanSpe.x2); connect(concooSpe_max.y, linCooFanSpe.f2); connect(conuCoo_max.y, linCooFanSpe.x2); connect(conheaSpe_min.y, linHeaFanSpe.f1); connect(conuHea_min.y, linHeaFanSpe.x1); connect(conuCoo_min.y, linCooFanSpe.x1); connect(concooSpe_min.y, linCooFanSpe.f1); connect(mulDeaSpe.y, swiFanPro.u3); connect(booToRea.y, mulDeaSpe.u1); connect(conDeaFanSpe.y, mulDeaSpe.u2); connect(conDeaFanSpe.y, gai.u); connect(gai.y, swiDeaCoo.u3); connect(con.y, swiDeaCoo.u2); connect(conDeaFanSpe.y, gai1.u); connect(gai1.y, swiDeaCoo.u1); end FanSpeed;

Buildings.Controls.OBC.ASHRAE.G36.FanCoilUnits.Subsequences.PlantRequests Buildings.Controls.OBC.ASHRAE.G36.FanCoilUnits.Subsequences.PlantRequests

Output plant requests for fan coil unit

Buildings.Controls.OBC.ASHRAE.G36.FanCoilUnits.Subsequences.PlantRequests

Information

This sequence outputs the system reset requests for fan coil unit. The implementation is according to the Section 5.22.8 of ASHRAE Guideline 36, 2021.

If there is a chilled-water coil (have_chiWatCoi=true), chilled water reset requests yChiWatResReq

  1. If the supply air temperature TAirSup exceeds the supply air temperature set point TSupSet by 5.56 °C (10 °F) for 5 minutes, send 3 requests.
  2. If the supply air temperature TAirSup exceeds TSupSet by by 2.78 °C (5 °F) for 5 minutes, send 2 requests.
  3. Else if the chilled water valve position uCooCoi_actual is greater than 0.95, send 1 request until uCooCoi_actual is less than 0.85.
  4. Else if the chilled water valve position uCooCoi_actual is less than 0.85, send 0 requests.

If there is a chilled-water coil and chilled water plant, chiller plant request yChiPlaReq

Send the chiller plant that serves the system a chiller plant request as follows:

  1. If the chilled water valve position uCooCoi_actual is greater than 0.95, send 1 request until the uCooCoi_actual is less than 0.1.
  2. Else if the chilled water valve position uCooCoi_actual is less than 0.1, send 0 request

If there is a hot-water coil (have_hotWatCoi=true), hot-water reset requests yHotWatResReq

  1. If the supply air temperature TAirSup is 17 °C (30 °F) less than the supply air temperature set point TSupSet for 5 minutes, send 3 requests.
  2. Else if the supply air temperature TAirSup is 8 °C (15 °F) less than TSupSet for 5 minutes, send 2 requests.
  3. Else if the hot water valve position uHeaCoi_actual is greater than 0.95, send 1 request until the uHeaCoi_actual is less than 0.85.
  4. Else if the hot water valve position uHeaCoi_actual is less than 0.85, send 0 request.

If there is a hot-water coil and heating hot-water plant, heating hot-water plant requests yHotWatPlaReq

Send the heating hot-water plant that serves the air handling unit a heating hot-water plant request as follows:

  1. If the hot water valve position uHeaCoi_actual is greater than 0.95, send 1 request until the hot water valve position is less than 0.1.
  2. If the hot water valve position uHeaCoi_actual is less than 0.1, send 0 requests.

Parameters

TypeNameDefaultDescription
Booleanhave_hotWatCoitrueTrue if the unit has a hot-water heating coil
Booleanhave_chiWatCoitrueTrue if the unit has a chilled-water cooling coil
RealcooSpe_max1Maximum cooling mode fan speed [1]
RealheaSpe_max0.6Maximum heating mode fan speed [1]
Request limits
Chilled water plant requests
RealchiWatPlaReqLim00.1Valve position limit below which zero chilled water plant requests are sent when one request was previously being sent [1]
RealchiWatPlaReqLim10.95Valve position limit above which one chilled water plant request is sent [1]
Chilled water reset requests
RealchiWatResReqLim00.85Valve position limit below which zero chilled water reset requests are sent when one request was previously being sent [1]
RealchiWatResReqLim10.95Valve position limit above which one chilled water reset request is sent [1]
RealchiWatResReqLim22.78Temperature difference limit between setpoint and supply air temperature above which two chilled water reset requests are sent [K]
RealchiWatResReqTimLim2300Time period for which chiWatResReqLim2 has to be exceeded before two chilled water reset requests are sent [s]
RealchiWatResReqLim35.56Temperature difference limit between setpoint and supply air temperature above which three chilled water reset requests are sent [K]
RealchiWatResReqTimLim3300Time period for which chiWatResReqLim3 has to be exceeded before three chilled water reset requests are sent [s]
Hot water plant requests
RealhotWatPlaReqLim00.1Valve position limit below which zero hot water plant requests are sent when one request was previously being sent [1]
RealhotWatPlaReqLim10.95Valve position limit above which one hot water plant request is sent [1]
Hot water reset requests
RealhotWatResReqLim00.85Valve position limit below which zero hot water reset requests are sent when one request was previously being sent [1]
RealhotWatResReqLim10.95Valve position limit above which one hot water reset request is sent [1]
RealhotWatResReqLim28Temperature difference limit between setpoint and supply air temperature above which two hot water reset requests are sent [K]
RealhotWatResReqTimLim2300Time period for which hotWatResReqLim2 has to be exceeded before two hot water reset requests are sent [s]
RealhotWatResReqLim317Temperature difference limit between setpoint and supply air temperature above which three hot water reset requests are sent [K]
RealhotWatResReqTimLim3300Time period for which hotWatResReqLim3 has to be exceeded before three hot water reset requests are sent [s]
Advanced
RealTHys0.1Hysteresis for checking temperature difference [K]
RealdFanSpe0.05Fan speed hysteresis difference [1]

Connectors

TypeNameDescription
input RealInputTAirSupMeasured supply air temperature [K]
input RealInputTAirSupSetSupply air temperature setpoint [K]
input RealInputuCooCoiSetCommanded cooling coil position [1]
input RealInputuHeaCoiSetCommanded heating coil position [1]
input RealInputuFanFan speed signal [1]
output IntegerOutputyChiWatResReqChilled water reset request
output IntegerOutputyChiPlaReqChiller plant request
output IntegerOutputyHotWatResReqHot water reset request
output IntegerOutputyHotWatPlaReqHot water plant request

Modelica definition

block PlantRequests "Output plant requests for fan coil unit" parameter Boolean have_hotWatCoi = true "True if the unit has a hot-water heating coil"; parameter Boolean have_chiWatCoi = true "True if the unit has a chilled-water cooling coil"; parameter Real cooSpe_max( final unit="1", displayUnit="1") = 1 "Maximum cooling mode fan speed"; parameter Real heaSpe_max( final unit="1", displayUnit="1") = 0.6 "Maximum heating mode fan speed"; parameter Real chiWatPlaReqLim0( final unit="1", displayUnit="1") = 0.1 "Valve position limit below which zero chilled water plant requests are sent when one request was previously being sent"; parameter Real chiWatResReqLim0( final unit="1", displayUnit="1") = 0.85 "Valve position limit below which zero chilled water reset requests are sent when one request was previously being sent"; parameter Real chiWatPlaReqLim1( final unit="1", displayUnit="1") = 0.95 "Valve position limit above which one chilled water plant request is sent"; parameter Real chiWatResReqLim1( final unit="1", displayUnit="1") = 0.95 "Valve position limit above which one chilled water reset request is sent"; parameter Real chiWatResReqLim2( final unit="K") = 2.78 "Temperature difference limit between setpoint and supply air temperature above which two chilled water reset requests are sent"; parameter Real chiWatResReqTimLim2( final unit="s", displayUnit="s", final quantity="Time") = 300 "Time period for which chiWatResReqLim2 has to be exceeded before two chilled water reset requests are sent"; parameter Real chiWatResReqLim3( final unit="K") = 5.56 "Temperature difference limit between setpoint and supply air temperature above which three chilled water reset requests are sent"; parameter Real chiWatResReqTimLim3( final unit="s", displayUnit="s", final quantity="Time") = 300 "Time period for which chiWatResReqLim3 has to be exceeded before three chilled water reset requests are sent"; parameter Real hotWatPlaReqLim0( final unit="1", displayUnit="1") = 0.1 "Valve position limit below which zero hot water plant requests are sent when one request was previously being sent"; parameter Real hotWatResReqLim0( final unit="1", displayUnit="1") = 0.85 "Valve position limit below which zero hot water reset requests are sent when one request was previously being sent"; parameter Real hotWatPlaReqLim1( final unit="1", displayUnit="1") = 0.95 "Valve position limit above which one hot water plant request is sent"; parameter Real hotWatResReqLim1( final unit="1", displayUnit="1") = 0.95 "Valve position limit above which one hot water reset request is sent"; parameter Real hotWatResReqLim2( final unit="K") = 8 "Temperature difference limit between setpoint and supply air temperature above which two hot water reset requests are sent"; parameter Real hotWatResReqTimLim2( final unit="s", displayUnit="s", final quantity="Time") = 300 "Time period for which hotWatResReqLim2 has to be exceeded before two hot water reset requests are sent"; parameter Real hotWatResReqLim3( final unit="K") = 17 "Temperature difference limit between setpoint and supply air temperature above which three hot water reset requests are sent"; parameter Real hotWatResReqTimLim3( final unit="s", displayUnit="s", final quantity="Time") = 300 "Time period for which hotWatResReqLim3 has to be exceeded before three hot water reset requests are sent"; parameter Real THys( final unit="K") = 0.1 "Hysteresis for checking temperature difference"; parameter Real dFanSpe( final unit="1", displayUnit="1") = 0.05 "Fan speed hysteresis difference"; Buildings.Controls.OBC.CDL.Interfaces.RealInput TAirSup( final unit="K", displayUnit="degC", final quantity="ThermodynamicTemperature") "Measured supply air temperature"; Buildings.Controls.OBC.CDL.Interfaces.RealInput TAirSupSet( final unit="K", displayUnit="degC", final quantity="ThermodynamicTemperature") "Supply air temperature setpoint"; Buildings.Controls.OBC.CDL.Interfaces.RealInput uCooCoiSet( final unit="1", final min=0, final max=1) if have_chiWatCoi "Commanded cooling coil position"; Buildings.Controls.OBC.CDL.Interfaces.RealInput uHeaCoiSet( final unit="1", final min=0, final max=1) if have_hotWatCoi "Commanded heating coil position"; Buildings.Controls.OBC.CDL.Interfaces.RealInput uFan( final unit="1", final min=0, final max=1) "Fan speed signal"; Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yChiWatResReq if have_chiWatCoi "Chilled water reset request"; Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yChiPlaReq if have_chiWatCoi "Chiller plant request"; Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yHotWatResReq if have_hotWatCoi "Hot water reset request"; Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yHotWatPlaReq if have_hotWatCoi "Hot water plant request"; Buildings.Controls.OBC.CDL.Reals.Hysteresis hysFanCoo( final uLow=cooSpe_max - 2*dFanSpe, final uHigh=cooSpe_max - dFanSpe) if have_chiWatCoi "Check if fan is at max cooling mode speed"; Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToIntCoo if have_chiWatCoi "Output integer 1 when fan is at max cooling mode speed"; Buildings.Controls.OBC.CDL.Integers.Multiply mulIntCoo if have_chiWatCoi "Output reset requests only if fan is at max cooling mode speed"; Buildings.Controls.OBC.CDL.Reals.Hysteresis hysFanHea( final uLow=heaSpe_max - 2*dFanSpe, final uHigh=heaSpe_max - dFanSpe) if have_hotWatCoi "Check if fan is at max heating mode speed"; Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToIntHea if have_hotWatCoi "Output integer 1 when fan is at max heating mode speed"; Buildings.Controls.OBC.CDL.Integers.Multiply mulIntHea if have_hotWatCoi "Output reset requests only if fan is at max heating mode speed"; Buildings.Controls.OBC.CDL.Reals.Subtract cooSupTemDif "Find the cooling supply temperature difference to the setpoint"; Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr( final t=chiWatResReqLim3, final h=THys) if have_chiWatCoi "Check if the supply temperature is greater than the setpoint by a threshold value for sending three reset requests"; Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr1( final t=chiWatResReqLim2, final h=THys) if have_chiWatCoi "Check if the supply temperature is greater than the setpoint by a threshold value for sending two reset requests"; Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel( final delayTime=chiWatResReqTimLim3) if have_chiWatCoi "Ensure condition for sending three chilled water reset requests is true for minimum threshold time period"; Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel1( final delayTime=chiWatResReqTimLim2) if have_chiWatCoi "Ensure condition for sending two chilled water reset requests is true for minimum threshold time period"; Buildings.Controls.OBC.CDL.Reals.Hysteresis hys( final uLow=chiWatResReqLim0, final uHigh=chiWatResReqLim1) if have_chiWatCoi "Check chilled water valve position against threshold values for sending one reset request"; Buildings.Controls.OBC.CDL.Integers.Switch chiWatRes3 if have_chiWatCoi "Send 3 chilled water reset request"; Buildings.Controls.OBC.CDL.Integers.Switch chiWatRes2 if have_chiWatCoi "Send 2 chilled water reset request"; Buildings.Controls.OBC.CDL.Integers.Switch chiWatRes1 if have_chiWatCoi "Send 1 chilled water reset request"; Buildings.Controls.OBC.CDL.Integers.Switch intSwi3 if have_chiWatCoi "Send 1 chiller plant request"; Buildings.Controls.OBC.CDL.Reals.Subtract heaSupTemDif if have_hotWatCoi "Find the heating supply temperature difference to the setpoint"; Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr3( final t=hotWatResReqLim3, final h=THys) if have_hotWatCoi "Check if the supply temperature is less than the setpoint by a threshold value for sending three reset requests"; Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr4( final t=hotWatResReqLim2, final h=THys) if have_hotWatCoi "Check if the supply temperature is less than the setpoint by a threshold value for sending two reset requests"; Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel2( final delayTime=hotWatResReqTimLim3) if have_hotWatCoi "Ensure condition for sending three hot water reset requests is true for minimum threshold time period"; Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel3( final delayTime=hotWatResReqTimLim2) if have_hotWatCoi "Ensure condition for sending two hot water reset requests is true for minimum threshold time period"; Buildings.Controls.OBC.CDL.Integers.Switch hotWatRes3 if have_hotWatCoi "Send 3 hot water reset request"; Buildings.Controls.OBC.CDL.Integers.Switch hotWatRes2 if have_hotWatCoi "Send 2 hot water reset request"; Buildings.Controls.OBC.CDL.Integers.Switch hotWatRes1 if have_hotWatCoi "Send 1 hot water reset request"; Buildings.Controls.OBC.CDL.Integers.Switch intSwi1 if have_hotWatCoi "Send 1 hot water plant request"; Buildings.Controls.OBC.CDL.Reals.Hysteresis hys1( final uLow=chiWatPlaReqLim0, final uHigh=chiWatPlaReqLim1) if have_chiWatCoi "Check chilled water valve position against threshold values for sending one plant request"; Buildings.Controls.OBC.CDL.Reals.Hysteresis hys2( final uLow=hotWatResReqLim0, final uHigh=hotWatResReqLim1) if have_hotWatCoi "Check hot water valve position against threshold values for sending one reset request"; Buildings.Controls.OBC.CDL.Reals.Hysteresis hys3( final uLow=hotWatPlaReqLim0, final uHigh=hotWatPlaReqLim1) if have_hotWatCoi "Check hot water valve position against threshold values for sending one plant request"; protected Buildings.Controls.OBC.CDL.Integers.Sources.Constant thr( final k=3) "Constant 3"; Buildings.Controls.OBC.CDL.Integers.Sources.Constant two( final k=2) "Constant 2"; Buildings.Controls.OBC.CDL.Integers.Sources.Constant one( final k=1) "Constant 1"; Buildings.Controls.OBC.CDL.Integers.Sources.Constant zer( final k=0) "Constant 0"; equation connect(TAirSup, cooSupTemDif.u1); connect(TAirSupSet, cooSupTemDif.u2); connect(cooSupTemDif.y, greThr.u); connect(greThr.y, truDel.u); connect(greThr1.y, truDel1.u); connect(cooSupTemDif.y, greThr1.u); connect(uCooCoiSet, hys.u); connect(truDel.y, chiWatRes3.u2); connect(thr.y, chiWatRes3.u1); connect(truDel1.y, chiWatRes2.u2); connect(two.y, chiWatRes2.u1); connect(one.y, chiWatRes1.u1); connect(chiWatRes1.y, chiWatRes2.u3); connect(chiWatRes2.y, chiWatRes3.u3); connect(zer.y, chiWatRes1.u3); connect(one.y, intSwi3.u1); connect(zer.y, intSwi3.u3); connect(intSwi3.y, yChiPlaReq); connect(TAirSup, heaSupTemDif.u2); connect(greThr3.y, truDel2.u); connect(greThr4.y, truDel3.u); connect(heaSupTemDif.y, greThr3.u); connect(heaSupTemDif.y, greThr4.u); connect(truDel2.y, hotWatRes3.u2); connect(thr.y, hotWatRes3.u1); connect(hotWatRes2.y, hotWatRes3.u3); connect(two.y, hotWatRes2.u1); connect(truDel3.y, hotWatRes2.u2); connect(one.y, hotWatRes1.u1); connect(zer.y, hotWatRes1.u3); connect(hotWatRes1.y, hotWatRes2.u3); connect(one.y, intSwi1.u1); connect(zer.y, intSwi1.u3); connect(intSwi1.y, yHotWatPlaReq); connect(uFan, hysFanCoo.u); connect(hysFanCoo.y, booToIntCoo.u); connect(chiWatRes3.y, mulIntCoo.u2); connect(booToIntCoo.y, mulIntCoo.u1); connect(mulIntCoo.y, yChiWatResReq); connect(hotWatRes3.y, mulIntHea.u2); connect(hysFanHea.y, booToIntHea.u); connect(booToIntHea.y, mulIntHea.u1); connect(uFan, hysFanHea.u); connect(mulIntHea.y, yHotWatResReq); connect(TAirSupSet, heaSupTemDif.u1); connect(hys.y, chiWatRes1.u2); connect(uCooCoiSet, hys1.u); connect(hys1.y, intSwi3.u2); connect(uHeaCoiSet, hys2.u); connect(hys2.y, hotWatRes1.u2); connect(hys3.y, intSwi1.u2); connect(hys3.u, uHeaCoiSet); end PlantRequests;

Buildings.Controls.OBC.ASHRAE.G36.FanCoilUnits.Subsequences.SupplyAirTemperature Buildings.Controls.OBC.ASHRAE.G36.FanCoilUnits.Subsequences.SupplyAirTemperature

Subsequence for calculating supply air temperature setpoint

Buildings.Controls.OBC.ASHRAE.G36.FanCoilUnits.Subsequences.SupplyAirTemperature

Information

Block that outputs the supply air temperature setpoint, as well as the control signals for the cooling and heating coils in a fan coil unit system. The implemented sequence is based on ASHRAE Guideline 36, 2021, Part 5.22.4.

The supply air temperature TSupSet is varied from the zone cooling setpoint temperature TZonCooSet to the minimum supply air temperature for cooling TSupSet_min, when the cooling loop signal uCoo varies from the minimum limit uCoo_min to the maximum limit uCoo_max. Similarly, TSupSet is varied from the zone heating setpoint temperature TZonHeaSet to the maximum supply air temperature for heating TSupSet_max, when the heating loop signal uHea varies from the minimum limit uHea_min to the maximum limit uHea_max. The setpoint in deadband mode is equal to the current measured supply air temperature TAirSup. yCooCoi and yHeaCoi are set to zero when the fan proven on signal u1Fan is false.

Supply air temperature setpoint control logic diagram

Parameters

TypeNameDefaultDescription
Booleanhave_cooCoi True if the unit has a cooling coil
Booleanhave_heaCoi True if the unit has a heating coil
Heating loop
RealuHea_minheaDeaMinimum heating loop signal at which supply air temperature is modified [1]
RealTSupSet_max305.15Supply air temperature setpoint at maximum heating loop signal [K]
RealuHea_max0.5Maximum heating loop signal at which supply air temperature is modified [1]
Cooling loop
RealuCoo_mincooDeaMinimum cooling loop signal at which supply air temperature is modified [1]
RealTSupSet_min285.95Supply air temperature setpoint at maximum cooling loop signal [K]
RealuCoo_max0.5Maximum cooling loop signal at which supply air temperature is modified [1]
Deadband
RealheaDea0.1Heating loop signal limit above which setpoint operation changes from deadband mode to heating mode [1]
RealcooDea0.1Cooling loop signal limit above which setpoint operation changes from deadband mode to cooling mode [1]
PID controller parameters
Cooling coil
SimpleControllercooCoiConTypBuildings.Controls.OBC.CDL.T...Type of cooling coil controller
RealkCooCoi1Controller gain [1]
RealTiCooCoi60Integrator time constant [s]
RealTdCooCoi0.1Derivative block time constant [s]
Heating coil
SimpleControllerheaCoiConTypBuildings.Controls.OBC.CDL.T...Type of heating coil controller
RealkHeaCoi1Controller gain [1]
RealTiHeaCoi60Integrator block time constant [s]
RealTdHeaCoi0.1Derivative block time constant [s]
Advanced
RealdeaHysLim0.05Hysteresis limits for deadband mode transitions [1]

Connectors

TypeNameDescription
input BooleanInputu1FanFan proven on signal
input RealInputuHeaHeating loop signal [1]
input RealInputuCooCooling loop signal [1]
input RealInputTAirSupMeasured supply air temperature [K]
input RealInputTZonHeaSetZone heating temperature setpoint [K]
input RealInputTZonCooSetZone cooling temperature setpoint [K]
output RealOutputyHeaCoiHeating coil signal [1]
output RealOutputyCooCoiCooling coil signal [1]
output RealOutputTSupSetSupply air temperature setpoint [K]

Modelica definition

block SupplyAirTemperature "Subsequence for calculating supply air temperature setpoint" parameter Boolean have_cooCoi "True if the unit has a cooling coil"; parameter Boolean have_heaCoi "True if the unit has a heating coil"; parameter Real uHea_min(unit="1")=heaDea "Minimum heating loop signal at which supply air temperature is modified"; parameter Real TSupSet_max( unit="K", displayUnit="degC")=305.15 "Supply air temperature setpoint at maximum heating loop signal"; parameter Real uHea_max( unit="1", displayUnit="1")=0.5 "Maximum heating loop signal at which supply air temperature is modified"; parameter Real uCoo_min(unit="1")=cooDea "Minimum cooling loop signal at which supply air temperature is modified"; parameter Real TSupSet_min( unit="K", displayUnit="degC")=285.95 "Supply air temperature setpoint at maximum cooling loop signal"; parameter Real uCoo_max( unit="1", displayUnit="1")=0.5 "Maximum cooling loop signal at which supply air temperature is modified"; parameter Real heaDea( unit="1", displayUnit="1")=0.1 "Heating loop signal limit above which setpoint operation changes from deadband mode to heating mode"; parameter Real cooDea( unit="1", displayUnit="1")=0.1 "Cooling loop signal limit above which setpoint operation changes from deadband mode to cooling mode"; parameter Buildings.Controls.OBC.CDL.Types.SimpleController cooCoiConTyp=Buildings.Controls.OBC.CDL.Types.SimpleController.PI "Type of cooling coil controller"; parameter Real kCooCoi( unit="1", displayUnit="1")=1 "Controller gain"; parameter Real TiCooCoi( unit="s", displayUnit="s")=60 "Integrator time constant"; parameter Real TdCooCoi( unit="s", displayUnit="s")=0.1 "Derivative block time constant"; parameter Buildings.Controls.OBC.CDL.Types.SimpleController heaCoiConTyp=Buildings.Controls.OBC.CDL.Types.SimpleController.PI "Type of heating coil controller"; parameter Real kHeaCoi( unit="1", displayUnit="1")=1 "Controller gain"; parameter Real TiHeaCoi( unit="s", displayUnit="s")=60 "Integrator block time constant"; parameter Real TdHeaCoi( unit="s", displayUnit="s")=0.1 "Derivative block time constant"; parameter Real deaHysLim( unit="1", displayUnit="1")=0.05 "Hysteresis limits for deadband mode transitions"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1Fan "Fan proven on signal"; Buildings.Controls.OBC.CDL.Interfaces.RealInput uHea( final unit="1", displayUnit="1") if have_heaCoi "Heating loop signal"; Buildings.Controls.OBC.CDL.Interfaces.RealInput uCoo( final unit="1", displayUnit="1") if have_cooCoi "Cooling loop signal"; Buildings.Controls.OBC.CDL.Interfaces.RealInput TAirSup( final unit="K", displayUnit="degC", final quantity="ThermodynamicTemperature") "Measured supply air temperature"; Buildings.Controls.OBC.CDL.Interfaces.RealInput TZonHeaSet( final unit="K", displayUnit="degC", final quantity="ThermodynamicTemperature") if have_heaCoi "Zone heating temperature setpoint"; Buildings.Controls.OBC.CDL.Interfaces.RealInput TZonCooSet( final unit="K", displayUnit="degC", final quantity="ThermodynamicTemperature") if have_cooCoi "Zone cooling temperature setpoint"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput yHeaCoi( final unit="1", displayUnit="1") if have_heaCoi "Heating coil signal"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput yCooCoi( final unit="1", displayUnit="1") if have_cooCoi "Cooling coil signal"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput TSupSet( final unit="K", displayUnit="degC", final quantity="ThermodynamicTemperature") "Supply air temperature setpoint"; Buildings.Controls.OBC.CDL.Reals.Switch swiDeaCoo "Switch for turning on cooling mode from deadband mode"; Buildings.Controls.OBC.CDL.Reals.Switch swiCooCoi if have_cooCoi "Switch cooling coil signal to zero in deadband mode"; Buildings.Controls.OBC.CDL.Reals.Switch swiHeaCoi if have_heaCoi "Switch heating coil signal to zero in deadband mode"; Buildings.Controls.OBC.CDL.Reals.Line linTHeaSupAir if have_heaCoi "Convert heating loop signal to supply air temperature setpoint"; Buildings.Controls.OBC.CDL.Reals.Line linTCooSupAir if have_cooCoi "Convert cooling loop signal to supply air temperature setpoint"; Buildings.Controls.OBC.CDL.Reals.PID conPIDHea( final controllerType=heaCoiConTyp, final k=kHeaCoi, final Ti=TiHeaCoi, final Td=TdHeaCoi, r=10) if have_heaCoi "PID controller for heating coil"; Buildings.Controls.OBC.CDL.Reals.PID conPIDCoo( final controllerType=cooCoiConTyp, final k=kCooCoi, final Ti=TiCooCoi, final Td=TdCooCoi, final reverseActing=false, r=10) if have_cooCoi "PID controller for cooling coil"; Buildings.Controls.OBC.CDL.Reals.Hysteresis hysDeaHea( final uLow=heaDea-deaHysLim, final uHigh=heaDea) if have_heaCoi "Hysteresis for switching between deadband mode and heating mode"; Buildings.Controls.OBC.CDL.Reals.Switch swiDeaHea if have_heaCoi "Switch for turning on heating mode from deadband mode"; Buildings.Controls.OBC.CDL.Reals.Hysteresis hysDeaCoo( final uLow=cooDea-deaHysLim, final uHigh=cooDea) if have_cooCoi "Hysteresis for switching on cooling mode from deadband mode"; Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToRea2 "Boolean to Real conversion"; Buildings.Controls.OBC.CDL.Reals.Multiply mul2 if have_heaCoi "Output heating coil signal only when fan is proven on"; Buildings.Controls.OBC.CDL.Reals.Multiply mul3 if have_cooCoi "Output cooling coil signal only when fan is proven on"; Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai( final k=1) if not have_heaCoi "Dummy gain"; Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai1( final k=1) if not have_cooCoi "Dummy gain"; protected Buildings.Controls.OBC.CDL.Reals.Sources.Constant conTSupSet_max( final k=TSupSet_max) if have_heaCoi "Maximum heating supply air temperature setpoint limit signal"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant conUHea_min( final k=uHea_min) if have_heaCoi "Minimum heating loop signal support point"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant conTSupSet_min( final k=TSupSet_min) if have_cooCoi "Minimum cooling supply air temperature setpoint limit signal"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant conUCoo_min( final k=uCoo_min) if have_cooCoi "Minimum cooling loop signal support point"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant conUHea_max( final k=uHea_max) if have_heaCoi "Maximum heating loop signal support point"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant conUCoo_max( final k=uCoo_max) if have_cooCoi "Maximum cooling loop signal support point"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant conZer( final k=0) "Constant zero signal"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant con( final k=false) if not have_cooCoi "Constant false"; equation connect(uHea, linTHeaSupAir.u); connect(uCoo, linTCooSupAir.u); connect(TAirSup, conPIDHea.u_m); connect(TAirSup, conPIDCoo.u_m); connect(linTHeaSupAir.y, swiDeaHea.u1); connect(uHea, hysDeaHea.u); connect(hysDeaHea.y, swiDeaHea.u2); connect(hysDeaCoo.y, swiDeaCoo.u2); connect(uCoo, hysDeaCoo.u); connect(swiDeaHea.y, swiDeaCoo.u3); connect(linTCooSupAir.y, swiDeaCoo.u1); connect(swiDeaCoo.y, conPIDHea.u_s); connect(swiDeaCoo.y, conPIDCoo.u_s); connect(conTSupSet_max.y, linTHeaSupAir.f2); connect(conTSupSet_min.y, linTCooSupAir.f2); connect(TZonHeaSet, linTHeaSupAir.f1); connect(TZonCooSet, linTCooSupAir.f1); connect(TAirSup, swiDeaHea.u3); connect(swiDeaCoo.y, TSupSet); connect(u1Fan, booToRea2.u); connect(yHeaCoi, mul2.y); connect(booToRea2.y, mul2.u1); connect(mul3.y, yCooCoi); connect(booToRea2.y, mul3.u1); connect(conUHea_max.y, linTHeaSupAir.x2); connect(conUHea_min.y, linTHeaSupAir.x1); connect(conUCoo_min.y, linTCooSupAir.x1); connect(conUCoo_max.y, linTCooSupAir.x2); connect(conPIDCoo.y, swiCooCoi.u1); connect(swiCooCoi.y, mul3.u2); connect(hysDeaCoo.y, swiCooCoi.u2); connect(swiHeaCoi.y, mul2.u2); connect(conPIDHea.y, swiHeaCoi.u1); connect(hysDeaHea.y, swiHeaCoi.u2); connect(conZer.y, swiHeaCoi.u3); connect(conZer.y, swiCooCoi.u3); connect(TAirSup, gai.u); connect(gai.y, swiDeaCoo.u3); connect(con.y, swiDeaCoo.u2); connect(TAirSup, gai1.u); connect(gai1.y, swiDeaCoo.u1); end SupplyAirTemperature;