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 |
FanSpeed
|
Fan speed setpoint subsequence |
PlantRequests
|
Output plant requests for fan coil unit |
SupplyAirTemperature
|
Subsequence for calculating supply air temperature setpoint |
Validation
|
Package containing validation models for fan coil unit subsequences |
Fan speed setpoint subsequence
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.
Parameters
| Type | Name | Default | Description |
| Boolean | have_cooCoi | | True if the unit has a cooling coil |
| Boolean | have_heaCoi | | True if the unit has a heating coil |
| Deadband |
| Real | deaSpe | 0.1 | Deadband mode fan speed [1] |
| Real | heaDea | 0.1 | Heating loop signal limit above which fan operation changes from deadband
mode to heating mode [1] |
| Real | cooDea | 0.1 | Cooling loop signal limit above which fan operation changes from deadband
mode to cooling mode [1] |
| Heating loop |
| Real | heaSpe_min | 0.1 | Minimum heating mode fan speed [1] |
| Real | uHea_min | 0.5 | Minimum heating loop signal at which fan speed is modified [1] |
| Real | heaSpe_max | 0.6 | Maximum heating mode fan speed [1] |
| Real | uHea_max | 1 | Maximum heating loop signal at which fan speed is modified [1] |
| Cooling loop |
| Real | cooSpe_min | 0.2 | Minimum cooling mode fan speed [1] |
| Real | uCoo_min | 0.5 | Minimum cooling loop signal at which fan speed is modified [1] |
| Real | cooSpe_max | 1 | Maximum cooling mode fan speed [1] |
| Real | uCoo_max | 1 | Maximum cooling loop signal at which fan speed is modified [1] |
| Advanced |
| Real | deaHysLim | 0.05 | Hysteresis limits for deadband mode transitions [1] |
Connectors
Modelica definition
block FanSpeed
parameter Boolean have_cooCoi
;
parameter Boolean have_heaCoi
;
parameter Real deaSpe(
unit="1",
displayUnit="1")=0.1
;
parameter Real heaSpe_min(
unit="1",
displayUnit="1")=0.1
;
parameter Real uHea_min(
unit="1",
displayUnit="1")=0.5
;
parameter Real heaSpe_max(
unit="1",
displayUnit="1")=0.6
;
parameter Real uHea_max(
unit="1",
displayUnit="1")=1
;
parameter Real cooSpe_min(
unit="1",
displayUnit="1")=0.2
;
parameter Real uCoo_min(
unit="1",
displayUnit="1")=0.5
;
parameter Real cooSpe_max(
unit="1",
displayUnit="1")=1
;
parameter Real uCoo_max(
unit="1",
displayUnit="1")=1
;
parameter Real heaDea(
unit="1",
displayUnit="1")=0.1
;
parameter Real cooDea(
unit="1",
displayUnit="1")=0.1
;
parameter Real deaHysLim(
unit="1",
displayUnit="1")=0.05
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1FanPro
;
Buildings.Controls.OBC.CDL.Interfaces.IntegerInput opeMod
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput uHea(
final unit="1",
displayUnit="1")
if have_heaCoi
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput uCoo(
final unit="1",
displayUnit="1")
if have_cooCoi
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput y1Fan
;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput yFan(
final unit="1",
displayUnit="1")
;
Buildings.Controls.OBC.CDL.Integers.Equal isUnOcc
;
Buildings.Controls.OBC.CDL.Logical.Not notUno
;
Buildings.Controls.OBC.CDL.Reals.Switch swiFanPro
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToRea
;
Buildings.Controls.OBC.CDL.Reals.Line linHeaFanSpe
if have_heaCoi
;
Buildings.Controls.OBC.CDL.Reals.Line linCooFanSpe
if have_cooCoi
;
Buildings.Controls.OBC.CDL.Reals.Hysteresis hysDeaHea(
final uLow=heaDea-deaHysLim,
final uHigh=heaDea)
if have_heaCoi
;
Buildings.Controls.OBC.CDL.Reals.Switch swiDeaHea
if have_heaCoi
;
Buildings.Controls.OBC.CDL.Reals.Hysteresis hysDeaCoo(
final uLow=cooDea-deaHysLim,
final uHigh=cooDea)
if have_cooCoi
;
Buildings.Controls.OBC.CDL.Reals.Switch swiDeaCoo
;
Buildings.Controls.OBC.CDL.Reals.Multiply mulFanSpe
;
Buildings.Controls.OBC.CDL.Reals.Multiply mulDeaSpe
;
Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai(
final k=1)
if not have_heaCoi ;
Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai1(
final k=1)
if not have_cooCoi ;
protected
Buildings.Controls.OBC.CDL.Integers.Sources.Constant unOccMod(
final k=Buildings.Controls.OBC.ASHRAE.G36.Types.OperationModes.unoccupied)
;
Buildings.Controls.OBC.CDL.Logical.Sources.Constant con(
final k=false)
if not have_cooCoi
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant conuCoo_max(
final k=uCoo_max)
if have_cooCoi
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant concooSpe_max(
final k=cooSpe_max)
if have_cooCoi
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant conheaSpe_max(
final k=heaSpe_max)
if have_heaCoi
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant conuHea_max(
final k=uHea_max)
if have_heaCoi
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant conuCoo_min(
final k=uCoo_min)
if have_cooCoi
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant conDeaFanSpe(
final k=deaSpe)
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant conuHea_min(
final k=uHea_min)
if have_heaCoi
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant conheaSpe_min(
final k=heaSpe_min)
if have_heaCoi
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant concooSpe_min(
final k=cooSpe_min)
if have_cooCoi
;
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;
Output plant requests for fan coil unit
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
-
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.
-
If the supply air temperature
TAirSup exceeds TSupSet
by by 2.78 °C (5 °F) for 5 minutes, send 2 requests.
-
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.
-
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:
-
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.
-
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
-
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.
-
Else if the supply air temperature
TAirSup is 8 °C (15 °F)
less than TSupSet for 5 minutes, send 2 requests.
-
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.
-
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:
-
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.
-
If the hot water valve position
uHeaCoi_actual is less than 0.1,
send 0 requests.
Parameters
| Type | Name | Default | Description |
| Boolean | have_hotWatCoi | true | True if the unit has a hot-water heating coil |
| Boolean | have_chiWatCoi | true | True if the unit has a chilled-water cooling coil |
| Real | cooSpe_max | 1 | Maximum cooling mode fan speed [1] |
| Real | heaSpe_max | 0.6 | Maximum heating mode fan speed [1] |
| Request limits |
| Chilled water plant requests |
| Real | chiWatPlaReqLim0 | 0.1 | Valve position limit below which zero chilled water plant requests are sent when one request was previously being sent [1] |
| Real | chiWatPlaReqLim1 | 0.95 | Valve position limit above which one chilled water plant request is sent [1] |
| Chilled water reset requests |
| Real | chiWatResReqLim0 | 0.85 | Valve position limit below which zero chilled water reset requests are sent when one request was previously being sent [1] |
| Real | chiWatResReqLim1 | 0.95 | Valve position limit above which one chilled water reset request is sent [1] |
| Real | chiWatResReqLim2 | 2.78 | Temperature difference limit between setpoint and supply air temperature above which two chilled water reset requests are sent [K] |
| Real | chiWatResReqTimLim2 | 300 | Time period for which chiWatResReqLim2 has to be exceeded before two chilled water reset requests are sent [s] |
| Real | chiWatResReqLim3 | 5.56 | Temperature difference limit between setpoint and supply air temperature above which three chilled water reset requests are sent [K] |
| Real | chiWatResReqTimLim3 | 300 | Time period for which chiWatResReqLim3 has to be exceeded before three chilled water reset requests are sent [s] |
| Hot water plant requests |
| Real | hotWatPlaReqLim0 | 0.1 | Valve position limit below which zero hot water plant requests are sent when one request was previously being sent [1] |
| Real | hotWatPlaReqLim1 | 0.95 | Valve position limit above which one hot water plant request is sent [1] |
| Hot water reset requests |
| Real | hotWatResReqLim0 | 0.85 | Valve position limit below which zero hot water reset requests are sent when one request was previously being sent [1] |
| Real | hotWatResReqLim1 | 0.95 | Valve position limit above which one hot water reset request is sent [1] |
| Real | hotWatResReqLim2 | 8 | Temperature difference limit between setpoint and supply air temperature above which two hot water reset requests are sent [K] |
| Real | hotWatResReqTimLim2 | 300 | Time period for which hotWatResReqLim2 has to be exceeded before two hot water reset requests are sent [s] |
| Real | hotWatResReqLim3 | 17 | Temperature difference limit between setpoint and supply air temperature above which three hot water reset requests are sent [K] |
| Real | hotWatResReqTimLim3 | 300 | Time period for which hotWatResReqLim3 has to be exceeded before three hot water reset requests are sent [s] |
| Advanced |
| Real | THys | 0.1 | Hysteresis for checking temperature difference [K] |
| Real | dFanSpe | 0.05 | Fan speed hysteresis difference [1] |
Connectors
| Type | Name | Description |
| input RealInput | TAirSup | Measured supply air temperature [K] |
| input RealInput | TAirSupSet | Supply air temperature setpoint [K] |
| input RealInput | uCooCoiSet | Commanded cooling coil position [1] |
| input RealInput | uHeaCoiSet | Commanded heating coil position [1] |
| input RealInput | uFan | Fan speed signal [1] |
| output IntegerOutput | yChiWatResReq | Chilled water reset request |
| output IntegerOutput | yChiPlaReq | Chiller plant request |
| output IntegerOutput | yHotWatResReq | Hot water reset request |
| output IntegerOutput | yHotWatPlaReq | Hot water plant request |
Modelica definition
block PlantRequests
parameter Boolean have_hotWatCoi = true
;
parameter Boolean have_chiWatCoi = true
;
parameter Real cooSpe_max(
final unit="1",
displayUnit="1") = 1
;
parameter Real heaSpe_max(
final unit="1",
displayUnit="1") = 0.6
;
parameter Real chiWatPlaReqLim0(
final unit="1",
displayUnit="1") = 0.1
;
parameter Real chiWatResReqLim0(
final unit="1",
displayUnit="1") = 0.85
;
parameter Real chiWatPlaReqLim1(
final unit="1",
displayUnit="1") = 0.95
;
parameter Real chiWatResReqLim1(
final unit="1",
displayUnit="1") = 0.95
;
parameter Real chiWatResReqLim2(
final unit="K") = 2.78
;
parameter Real chiWatResReqTimLim2(
final unit="s",
displayUnit="s",
final quantity="Time") = 300
;
parameter Real chiWatResReqLim3(
final unit="K") = 5.56
;
parameter Real chiWatResReqTimLim3(
final unit="s",
displayUnit="s",
final quantity="Time") = 300
;
parameter Real hotWatPlaReqLim0(
final unit="1",
displayUnit="1") = 0.1
;
parameter Real hotWatResReqLim0(
final unit="1",
displayUnit="1") = 0.85
;
parameter Real hotWatPlaReqLim1(
final unit="1",
displayUnit="1") = 0.95
;
parameter Real hotWatResReqLim1(
final unit="1",
displayUnit="1") = 0.95
;
parameter Real hotWatResReqLim2(
final unit="K") = 8
;
parameter Real hotWatResReqTimLim2(
final unit="s",
displayUnit="s",
final quantity="Time") = 300
;
parameter Real hotWatResReqLim3(
final unit="K") = 17
;
parameter Real hotWatResReqTimLim3(
final unit="s",
displayUnit="s",
final quantity="Time") = 300
;
parameter Real THys(
final unit="K") = 0.1
;
parameter Real dFanSpe(
final unit="1",
displayUnit="1") = 0.05
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput TAirSup(
final unit="K",
displayUnit="degC",
final quantity="ThermodynamicTemperature")
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput TAirSupSet(
final unit="K",
displayUnit="degC",
final quantity="ThermodynamicTemperature")
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput uCooCoiSet(
final unit="1",
final min=0,
final max=1)
if have_chiWatCoi ;
Buildings.Controls.OBC.CDL.Interfaces.RealInput uHeaCoiSet(
final unit="1",
final min=0,
final max=1)
if have_hotWatCoi ;
Buildings.Controls.OBC.CDL.Interfaces.RealInput uFan(
final unit="1",
final min=0,
final max=1)
;
Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yChiWatResReq
if have_chiWatCoi
;
Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yChiPlaReq
if have_chiWatCoi
;
Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yHotWatResReq
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yHotWatPlaReq
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Reals.Hysteresis hysFanCoo(
final uLow=cooSpe_max - 2*dFanSpe,
final uHigh=cooSpe_max - dFanSpe)
if have_chiWatCoi
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToIntCoo
if have_chiWatCoi
;
Buildings.Controls.OBC.CDL.Integers.Multiply mulIntCoo
if have_chiWatCoi
;
Buildings.Controls.OBC.CDL.Reals.Hysteresis hysFanHea(
final uLow=heaSpe_max - 2*dFanSpe,
final uHigh=heaSpe_max - dFanSpe)
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToIntHea
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Integers.Multiply mulIntHea
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Reals.Subtract cooSupTemDif
;
Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr(
final t=chiWatResReqLim3,
final h=THys)
if have_chiWatCoi
;
Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr1(
final t=chiWatResReqLim2,
final h=THys)
if have_chiWatCoi
;
Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel(
final delayTime=chiWatResReqTimLim3)
if have_chiWatCoi
;
Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel1(
final delayTime=chiWatResReqTimLim2)
if have_chiWatCoi
;
Buildings.Controls.OBC.CDL.Reals.Hysteresis hys(
final uLow=chiWatResReqLim0,
final uHigh=chiWatResReqLim1)
if have_chiWatCoi
;
Buildings.Controls.OBC.CDL.Integers.Switch chiWatRes3
if have_chiWatCoi
;
Buildings.Controls.OBC.CDL.Integers.Switch chiWatRes2
if have_chiWatCoi
;
Buildings.Controls.OBC.CDL.Integers.Switch chiWatRes1
if have_chiWatCoi
;
Buildings.Controls.OBC.CDL.Integers.Switch intSwi3
if have_chiWatCoi
;
Buildings.Controls.OBC.CDL.Reals.Subtract heaSupTemDif
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr3(
final t=hotWatResReqLim3,
final h=THys)
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr4(
final t=hotWatResReqLim2,
final h=THys)
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel2(
final delayTime=hotWatResReqTimLim3)
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel3(
final delayTime=hotWatResReqTimLim2)
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Integers.Switch hotWatRes3
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Integers.Switch hotWatRes2
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Integers.Switch hotWatRes1
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Integers.Switch intSwi1
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Reals.Hysteresis hys1(
final uLow=chiWatPlaReqLim0,
final uHigh=chiWatPlaReqLim1)
if have_chiWatCoi
;
Buildings.Controls.OBC.CDL.Reals.Hysteresis hys2(
final uLow=hotWatResReqLim0,
final uHigh=hotWatResReqLim1)
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Reals.Hysteresis hys3(
final uLow=hotWatPlaReqLim0,
final uHigh=hotWatPlaReqLim1)
if have_hotWatCoi
;
protected
Buildings.Controls.OBC.CDL.Integers.Sources.Constant thr(
final k=3)
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant two(
final k=2)
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant one(
final k=1)
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant zer(
final k=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;
Subsequence for calculating supply air temperature setpoint
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.
Parameters
| Type | Name | Default | Description |
| Boolean | have_cooCoi | | True if the unit has a cooling coil |
| Boolean | have_heaCoi | | True if the unit has a heating coil |
| Heating loop |
| Real | uHea_min | heaDea | Minimum heating loop signal at which supply air temperature is modified [1] |
| Real | TSupSet_max | 305.15 | Supply air temperature setpoint at maximum heating loop signal [K] |
| Real | uHea_max | 0.5 | Maximum heating loop signal at which supply air temperature is modified [1] |
| Cooling loop |
| Real | uCoo_min | cooDea | Minimum cooling loop signal at which supply air temperature is modified [1] |
| Real | TSupSet_min | 285.95 | Supply air temperature setpoint at maximum cooling loop signal [K] |
| Real | uCoo_max | 0.5 | Maximum cooling loop signal at which supply air temperature is modified [1] |
| Deadband |
| Real | heaDea | 0.1 | Heating loop signal limit above which setpoint operation changes from deadband
mode to heating mode [1] |
| Real | cooDea | 0.1 | Cooling loop signal limit above which setpoint operation changes from deadband
mode to cooling mode [1] |
| PID controller parameters |
| Cooling coil |
| SimpleController | cooCoiConTyp | Buildings.Controls.OBC.CDL.T... | Type of cooling coil controller |
| Real | kCooCoi | 1 | Controller gain [1] |
| Real | TiCooCoi | 60 | Integrator time constant [s] |
| Real | TdCooCoi | 0.1 | Derivative block time constant [s] |
| Heating coil |
| SimpleController | heaCoiConTyp | Buildings.Controls.OBC.CDL.T... | Type of heating coil controller |
| Real | kHeaCoi | 1 | Controller gain [1] |
| Real | TiHeaCoi | 60 | Integrator block time constant [s] |
| Real | TdHeaCoi | 0.1 | Derivative block time constant [s] |
| Advanced |
| Real | deaHysLim | 0.05 | Hysteresis limits for deadband mode transitions [1] |
Connectors
| Type | Name | Description |
| input BooleanInput | u1Fan | Fan proven on signal |
| input RealInput | uHea | Heating loop signal [1] |
| input RealInput | uCoo | Cooling loop signal [1] |
| input RealInput | TAirSup | Measured supply air temperature [K] |
| input RealInput | TZonHeaSet | Zone heating temperature setpoint [K] |
| input RealInput | TZonCooSet | Zone cooling temperature setpoint [K] |
| output RealOutput | yHeaCoi | Heating coil signal [1] |
| output RealOutput | yCooCoi | Cooling coil signal [1] |
| output RealOutput | TSupSet | Supply air temperature setpoint [K] |
Modelica definition
block SupplyAirTemperature
parameter Boolean have_cooCoi
;
parameter Boolean have_heaCoi
;
parameter Real uHea_min(unit="1")=heaDea
;
parameter Real TSupSet_max(
unit="K",
displayUnit="degC")=305.15
;
parameter Real uHea_max(
unit="1",
displayUnit="1")=0.5
;
parameter Real uCoo_min(unit="1")=cooDea
;
parameter Real TSupSet_min(
unit="K",
displayUnit="degC")=285.95
;
parameter Real uCoo_max(
unit="1",
displayUnit="1")=0.5
;
parameter Real heaDea(
unit="1",
displayUnit="1")=0.1
;
parameter Real cooDea(
unit="1",
displayUnit="1")=0.1
;
parameter Buildings.Controls.OBC.CDL.Types.SimpleController cooCoiConTyp=Buildings.Controls.OBC.CDL.Types.SimpleController.PI
;
parameter Real kCooCoi(
unit="1",
displayUnit="1")=1
;
parameter Real TiCooCoi(
unit="s",
displayUnit="s")=60
;
parameter Real TdCooCoi(
unit="s",
displayUnit="s")=0.1
;
parameter Buildings.Controls.OBC.CDL.Types.SimpleController heaCoiConTyp=Buildings.Controls.OBC.CDL.Types.SimpleController.PI
;
parameter Real kHeaCoi(
unit="1",
displayUnit="1")=1
;
parameter Real TiHeaCoi(
unit="s",
displayUnit="s")=60
;
parameter Real TdHeaCoi(
unit="s",
displayUnit="s")=0.1
;
parameter Real deaHysLim(
unit="1",
displayUnit="1")=0.05
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1Fan
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput uHea(
final unit="1",
displayUnit="1")
if have_heaCoi
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput uCoo(
final unit="1",
displayUnit="1")
if have_cooCoi
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput TAirSup(
final unit="K",
displayUnit="degC",
final quantity="ThermodynamicTemperature")
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput TZonHeaSet(
final unit="K",
displayUnit="degC",
final quantity="ThermodynamicTemperature")
if have_heaCoi
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput TZonCooSet(
final unit="K",
displayUnit="degC",
final quantity="ThermodynamicTemperature")
if have_cooCoi
;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput yHeaCoi(
final unit="1",
displayUnit="1")
if have_heaCoi
;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput yCooCoi(
final unit="1",
displayUnit="1")
if have_cooCoi
;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput TSupSet(
final unit="K",
displayUnit="degC",
final quantity="ThermodynamicTemperature")
;
Buildings.Controls.OBC.CDL.Reals.Switch swiDeaCoo
;
Buildings.Controls.OBC.CDL.Reals.Switch swiCooCoi
if have_cooCoi
;
Buildings.Controls.OBC.CDL.Reals.Switch swiHeaCoi
if have_heaCoi
;
Buildings.Controls.OBC.CDL.Reals.Line linTHeaSupAir
if have_heaCoi
;
Buildings.Controls.OBC.CDL.Reals.Line linTCooSupAir
if have_cooCoi
;
Buildings.Controls.OBC.CDL.Reals.PID conPIDHea(
final controllerType=heaCoiConTyp,
final k=kHeaCoi,
final Ti=TiHeaCoi,
final Td=TdHeaCoi,
r=10)
if have_heaCoi
;
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
;
Buildings.Controls.OBC.CDL.Reals.Hysteresis hysDeaHea(
final uLow=heaDea-deaHysLim,
final uHigh=heaDea)
if have_heaCoi
;
Buildings.Controls.OBC.CDL.Reals.Switch swiDeaHea
if have_heaCoi
;
Buildings.Controls.OBC.CDL.Reals.Hysteresis hysDeaCoo(
final uLow=cooDea-deaHysLim,
final uHigh=cooDea)
if have_cooCoi
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToRea2
;
Buildings.Controls.OBC.CDL.Reals.Multiply mul2
if have_heaCoi
;
Buildings.Controls.OBC.CDL.Reals.Multiply mul3
if have_cooCoi
;
Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai(
final k=1)
if not have_heaCoi
;
Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai1(
final k=1)
if not have_cooCoi
;
protected
Buildings.Controls.OBC.CDL.Reals.Sources.Constant conTSupSet_max(
final k=TSupSet_max)
if have_heaCoi
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant conUHea_min(
final k=uHea_min)
if have_heaCoi
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant conTSupSet_min(
final k=TSupSet_min)
if have_cooCoi
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant conUCoo_min(
final k=uCoo_min)
if have_cooCoi
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant conUHea_max(
final k=uHea_max)
if have_heaCoi
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant conUCoo_max(
final k=uCoo_max)
if have_cooCoi
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant conZer(
final k=0)
;
Buildings.Controls.OBC.CDL.Logical.Sources.Constant con(
final k=false)
if not have_cooCoi
;
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;