Package of subsequences for constant-volume series fan-powered terminal unit
Information
This package contains subsequences for series fan-powered terminal unit with
constant-volume fan.
They are created according to Section 5.9 of ASHRAE Guideline 36, May 2020.
Package Content
Name |
Description |
ActiveAirFlow
|
Output the active primary airflow setpoint for constant-volume series fan-powered terminal unit |
Alarms
|
Generate alarms of parallerl fan-powered terminal unit with constant-volume fan |
DamperValves
|
Output signals for controlling constant-volume series fan-powered terminal unit |
Overrides
|
Software switches to override setpoints |
SystemRequests
|
Output system requests for parallel fan-powered terminal unit with constant-volume fan |
Validation
|
Collection of validation models |
Output the active primary airflow setpoint for constant-volume series fan-powered terminal unit
Information
This sequence sets the active primary cooling maximum and minimum setpoints
for series fan-powered terminal unit with constant volume fan. The implementation
is according to the Section 5.9.4 of ASHRAE Guideline 36, May 2020.
The setpoints shall vary depending on the mode of the zone group.
Setpoint | Occupied | Cooldown |
Setup | Warm-up | Setback | Unoccupied |
Cooling maximum (VActCooMax_flow ) | VCooMax_flow |
VCooMax_flow | VCooMax_flow |
0 | 0 | 0 |
Minimum (VActMin_flow ) | VOccMin_flow | 0 |
0 | 0 | 0 | 0 |
Parameters
Type | Name | Default | Description |
Real | VCooMax_flow | | Design zone cooling maximum airflow rate [m3/s] |
Connectors
Type | Name | Description |
input IntegerInput | uOpeMod | Zone operation mode |
input RealInput | VOccMin_flow | Occupied minimum airflow setpoint [m3/s] |
output RealOutput | VActCooMax_flow | Active cooling maximum airflow setpoint [m3/s] |
output RealOutput | VActMin_flow | Active minimum airflow setpoint [m3/s] |
Modelica definition
block ActiveAirFlow
parameter Real VCooMax_flow(
final quantity="VolumeFlowRate",
final unit="m3/s")
;
Buildings.Controls.OBC.CDL.Interfaces.IntegerInput uOpeMod
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput VOccMin_flow(
final unit="m3/s",
final quantity="VolumeFlowRate")
;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput VActCooMax_flow(
final min=0,
final unit="m3/s",
final quantity="VolumeFlowRate")
;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput VActMin_flow(
final min=0,
final unit="m3/s",
final quantity="VolumeFlowRate")
;
protected
Buildings.Controls.OBC.CDL.Integers.Sources.Constant occMod(
final k=Buildings.Controls.OBC.ASHRAE.G36.Types.OperationModes.occupied)
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant cooDowMod(
final k=Buildings.Controls.OBC.ASHRAE.G36.Types.OperationModes.coolDown)
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant setUpMod(
final k=Buildings.Controls.OBC.ASHRAE.G36.Types.OperationModes.setUp)
;
Buildings.Controls.OBC.CDL.Logical.Or3 or3
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToReal actCooMax(
final realTrue=VCooMax_flow)
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToReal occModInd(
final realTrue=1)
;
Buildings.Controls.OBC.CDL.Continuous.Multiply pro
;
Buildings.Controls.OBC.CDL.Integers.Equal ifOcc
;
Buildings.Controls.OBC.CDL.Integers.Equal ifCooDow
;
Buildings.Controls.OBC.CDL.Integers.Equal ifSetUp
;
equation
connect(occMod.y, ifOcc.u1);
connect(cooDowMod.y, ifCooDow.u1);
connect(setUpMod.y, ifSetUp.u1);
connect(uOpeMod, ifOcc.u2);
connect(uOpeMod, ifCooDow.u2);
connect(uOpeMod, ifSetUp.u2);
connect(ifOcc.y, or3.u1);
connect(ifCooDow.y, or3.u2);
connect(ifSetUp.y, or3.u3);
connect(or3.y, actCooMax.u);
connect(ifOcc.y, occModInd.u);
connect(VOccMin_flow, pro.u2);
connect(occModInd.y, pro.u1);
connect(actCooMax.y, VActCooMax_flow);
connect(pro.y, VActMin_flow);
end ActiveAirFlow;
Generate alarms of parallerl fan-powered terminal unit with constant-volume fan
Information
This block outputs alarms of series fan-powered terminal unit with constant volume fan.
The implementation is according to the Section 5.9.6 of ASHRAE Guideline 36, May 2020.
Low airflow
-
If the measured airflow
VPri_flow
is less than 70% of setpoint
VActSet_flow
for 5 minutes (lowFloTim
) while the setpoint
is greater than zero, generate a Level 3 alarm.
-
If the measured airflow
VPri_flow
is less than 50% of setpoint
VActSet_flow
for 5 minutes (lowFloTim
) while the setpoint
is greater than zero, generate a Level 2 alarm.
-
If a zone has an importance multiplier (
staPreMul
) of 0 for its
static pressure reset Trim-Respond control loop, low airflow alarms shall be
suppressed for that zone.
Low-discharging air temperature
-
If heating hot-water plant is proven on (
u1HotPla=true
), and the
discharge temperature (TDis
) is 8.3 °C (15 °F) less than the
setpoint (TDisSet
) for 10 minuts (lowTemTim
), generate a
Level 3 alarm.
-
If heating hot-water plant is proven on (
u1HotPla=true
), and the
discharge temperature (TDis
) is 17 °C (30 °F) less than the
setpoint (TDisSet
) for 10 minuts (lowTemTim
), generate a
Level 2 alarm.
-
If a zone has an importance multiplier (
hotWatRes
) of 0 for its
hot-water reset Trim-Respond control loop, low discharing air temperature alarms
shall be suppressed for that zone.
Fan status alarm
Fan alarm is indicated by the status input being different from the output command
after a period of 15 seconds after a change in output status.
-
Command on (
u1FanCom=true
), status off (u1TerFan=false
),
generate Level 2 alarm.
-
Command off (
u1FanCom=false
), status on (u1TerFan=true
),
generate Level 4 alarm.
Airflow sensor calibration
If the fan serving the zone has been OFF (u1Fan=false
) for 10 minutes
(fanOffTim
), and airflow sensor reading VPri_flow
is above 10% of the cooling maximum airflow setpoint VCooMax_flow
,
generate a Level 3 alarm.
Leaking damper
If the damper position (uDam
) is 0% and airflow sensor reading
VPri_flow
is above 10% of the cooling maximum airflow setpoint
VCooMax_flow
for 10 minutes (leaFloTim
) while the
fan serving the zone is proven on (u1Fan=true
), generate a Level
4 alarm.
Leaking valve
If the valve position (uVal
) is 0% for 15 minutes (valCloTim
),
discharing air temperature TDis
is above AHU supply temperature
TSup
by 3 °C (5 °F), and the fan serving the zone is proven
on (u1Fan=true
), gemerate a Level 4 alarm.
Parameters
Type | Name | Default | Description |
Boolean | have_hotWatCoi | | True: the unit has the hot water coil |
Real | staPreMul | | Importance multiplier for the zone static pressure reset control loop |
Real | hotWatRes | | Importance multiplier for the hot water reset control loop |
Real | VCooMax_flow | | Design zone cooling maximum airflow rate [m3/s] |
Real | lowFloTim | 300 | Threshold time to check low flow rate [s] |
Real | lowTemTim | 600 | Threshold time to check low discharge temperature [s] |
Real | comChaTim | 15 | Threshold time after fan command change [s] |
Real | fanOffTim | 600 | Threshold time to check fan off [s] |
Real | leaFloTim | 600 | Threshold time to check damper leaking airflow [s] |
Real | valCloTim | 900 | Threshold time to check valve leaking water flow [s] |
Advanced |
Real | floHys | 0.05 | Near zero flow rate, below which the flow rate or difference will be seen as zero [m3/s] |
Real | dTHys | 0.25 | Temperature difference hysteresis below which the temperature difference will be seen as zero [K] |
Real | damPosHys | 0.05 | Near zero damper position, below which the damper will be seen as closed [1] |
Real | valPosHys | 0.05 | Near zero valve position, below which the valve will be seen as closed [1] |
Connectors
Type | Name | Description |
input RealInput | VPri_flow | Measured primary airflow rate airflow rate [m3/s] |
input RealInput | VActSet_flow | Active airflow setpoint [m3/s] |
input BooleanInput | u1Fan | AHU supply fan status |
input BooleanInput | u1FanCom | Terminal fan command on |
input BooleanInput | u1TerFan | Terminal fan status |
input RealInput | uDam | Damper position setpoint [1] |
input RealInput | uVal | Actual valve position [1] |
input RealInput | TSup | Temperature of the air supplied from central air handler [K] |
input BooleanInput | u1HotPla | Hot water plant status |
input RealInput | TDis | Measured discharge air temperature [K] |
input RealInput | TDisSet | Discharge air temperature setpoint [K] |
output IntegerOutput | yLowFloAla | Low airflow alarms |
output IntegerOutput | yFloSenAla | Airflow sensor calibration alarm |
output IntegerOutput | yFanStaAla | Fan status alarm |
output IntegerOutput | yLeaDamAla | Leaking damper alarm |
output IntegerOutput | yLeaValAla | Leaking valve alarm |
output IntegerOutput | yLowTemAla | Low discharge air temperature alarms |
Modelica definition
block Alarms
parameter Boolean have_hotWatCoi
;
parameter Real staPreMul
;
parameter Real hotWatRes
;
parameter Real VCooMax_flow(
final quantity="VolumeFlowRate",
final unit="m3/s")
;
parameter Real lowFloTim(
final unit="s",
final quantity="Time")=300
;
parameter Real lowTemTim(
final unit="s",
final quantity="Time")=600
;
parameter Real comChaTim(
final unit="s",
final quantity="Time")=15
;
parameter Real fanOffTim(
final unit="s",
final quantity="Time")=600
;
parameter Real leaFloTim(
final unit="s",
final quantity="Time")=600
;
parameter Real valCloTim(
final unit="s",
final quantity="Time")=900
;
parameter Real floHys(
final quantity="VolumeFlowRate",
final unit="m3/s")=0.05
;
parameter Real dTHys(
final unit="K",
final quantity="TemperatureDifference")=0.25
;
parameter Real damPosHys(
final unit="1")=0.05
;
parameter Real valPosHys(
final unit="1")=0.05
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput VPri_flow(
final min=0,
final unit="m3/s",
final quantity="VolumeFlowRate")
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput VActSet_flow(
final min=0,
final unit="m3/s",
final quantity="VolumeFlowRate") ;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1Fan
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1FanCom
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1TerFan
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput uDam(
final min=0,
final unit="1") ;
Buildings.Controls.OBC.CDL.Interfaces.RealInput uVal(
final min=0,
final unit="1")
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput TSup(
final unit="K",
final displayUnit="degC",
final quantity="ThermodynamicTemperature")
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1HotPla
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput TDis(
final unit="K",
final displayUnit="degC",
final quantity="ThermodynamicTemperature")
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput TDisSet(
final unit="K",
final displayUnit="degC",
final quantity="ThermodynamicTemperature")
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yLowFloAla
;
Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yFloSenAla
;
Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yFanStaAla
;
Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yLeaDamAla
;
Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yLeaValAla
;
Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yLowTemAla
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Continuous.MultiplyByParameter gai(
final k=0.5)
;
Buildings.Controls.OBC.CDL.Continuous.Less les(
final h=floHys)
;
Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel(
final delayTime=lowFloTim)
;
Buildings.Controls.OBC.CDL.Continuous.GreaterThreshold greThr(
final h=floHys)
;
Buildings.Controls.OBC.CDL.Continuous.Greater gre(
final h=floHys)
;
Buildings.Controls.OBC.CDL.Continuous.MultiplyByParameter gai1(
final k=0.7)
;
Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel1(
final delayTime=lowFloTim)
;
Buildings.Controls.OBC.CDL.Logical.And and2
;
Buildings.Controls.OBC.CDL.Logical.And and1
;
Buildings.Controls.OBC.CDL.Integers.Switch lowFloAla ;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt(
final k=2)
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt(
final integerTrue=3)
;
Buildings.Controls.OBC.CDL.Continuous.Sources.Constant conInt1(
final k=staPreMul)
;
Buildings.Controls.OBC.CDL.Continuous.GreaterThreshold greThr1
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt1
;
Buildings.Controls.OBC.CDL.Integers.Multiply proInt
;
Buildings.Controls.OBC.CDL.Logical.And and3
;
Buildings.Controls.OBC.CDL.Logical.Not not1
;
Buildings.Controls.OBC.CDL.Utilities.Assert assMes(
final message="Warning: airflow is less than 50% of the setpoint.")
;
Buildings.Controls.OBC.CDL.Logical.And and4
;
Buildings.Controls.OBC.CDL.Logical.Not not2
;
Buildings.Controls.OBC.CDL.Utilities.Assert assMes1(
final message="Warning: airflow is less than 70% of the setpoint.")
;
Buildings.Controls.OBC.CDL.Continuous.Sources.Constant cooMaxFlo(
final k=VCooMax_flow)
;
Buildings.Controls.OBC.CDL.Continuous.MultiplyByParameter gai2(
final k=0.1)
;
Buildings.Controls.OBC.CDL.Logical.Not not3
;
Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel2(
final delayTime=fanOffTim)
;
Buildings.Controls.OBC.CDL.Continuous.Greater gre1(
final h=floHys)
;
Buildings.Controls.OBC.CDL.Logical.And and5
;
Buildings.Controls.OBC.CDL.Logical.Not not4
;
Buildings.Controls.OBC.CDL.Utilities.Assert assMes2(
final message="Warning: airflow sensor should be calibrated.")
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt2(
final integerTrue=3)
;
Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel3(
final delayTime=leaFloTim)
;
Buildings.Controls.OBC.CDL.Continuous.LessThreshold cloDam(
final t=damPosHys,
final h=0.5*damPosHys) ;
Buildings.Controls.OBC.CDL.Logical.And3 leaDamAla
;
Buildings.Controls.OBC.CDL.Logical.Not not5 ;
Buildings.Controls.OBC.CDL.Utilities.Assert assMes3(
final message="Warning: the damper is leaking.")
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt3(
final integerTrue=4)
;
Buildings.Controls.OBC.CDL.Continuous.Less les1(
final h=dTHys)
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Continuous.AddParameter addPar(
final p=-17)
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Continuous.Less les2(
final h=dTHys)
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Continuous.AddParameter addPar1(
final p=-8.3)
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel4(
final delayTime=lowTemTim)
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel5(
final delayTime=lowTemTim)
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Logical.And and6
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Logical.And and7
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Logical.Not not6
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Utilities.Assert assMes4(
final message="Warning: discharge air temperature is 17 degC less than the setpoint.")
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Integers.Switch lowTemAla
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt2(
final k=2)
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Logical.And and8
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt4(
final integerTrue=3)
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Logical.And and9
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Logical.Not not7
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Utilities.Assert assMes5(
final message="Warning: discharge air temperature is 8 degC less than the setpoint.")
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Continuous.Sources.Constant conInt3(
final k=hotWatRes)
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Continuous.GreaterThreshold greThr2
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt5
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Integers.Multiply proInt1
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel6(
final delayTime=valCloTim)
;
Buildings.Controls.OBC.CDL.Continuous.LessThreshold cloVal(
final t=valPosHys,
final h=0.5*valPosHys)
;
Buildings.Controls.OBC.CDL.Continuous.AddParameter addPar2(
final p=3)
;
Buildings.Controls.OBC.CDL.Continuous.Greater gre2(
final h=dTHys)
;
Buildings.Controls.OBC.CDL.Logical.And3 leaValAla ;
Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt6(
final integerTrue=4)
;
Buildings.Controls.OBC.CDL.Logical.Not not8 ;
Buildings.Controls.OBC.CDL.Utilities.Assert assMes6(
final message="Warning: the valve is leaking.")
;
Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel7(
final delayTime=comChaTim)
;
Buildings.Controls.OBC.CDL.Logical.And3 and11
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt4(
final k=2)
;
Buildings.Controls.OBC.CDL.Integers.Switch fanStaAla
;
Buildings.Controls.OBC.CDL.Logical.Not not9
;
Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel8(
final delayTime=comChaTim)
;
Buildings.Controls.OBC.CDL.Logical.And3 and10
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt7(
final integerTrue=4)
;
Buildings.Controls.OBC.CDL.Logical.Not not10
;
Buildings.Controls.OBC.CDL.Utilities.Assert assMes7(
final message="Warning: fan has been commanded ON but still OFF.")
;
Buildings.Controls.OBC.CDL.Logical.Not not11
;
Buildings.Controls.OBC.CDL.Utilities.Assert assMes8(
final message="Warning: fan has been commanded OFF but still ON.")
;
Buildings.Controls.OBC.CDL.Logical.Not not12
;
equation
connect(VActSet_flow, gai.u);
connect(VPri_flow, les.u1);
connect(gai.y, les.u2);
connect(les.y, truDel.u);
connect(VActSet_flow, greThr.u);
connect(VActSet_flow, gai1.u);
connect(VPri_flow, gre.u2);
connect(gai1.y, gre.u1);
connect(gre.y, truDel1.u);
connect(truDel.y, and2.u1);
connect(greThr.y, and2.u2);
connect(greThr.y, and1.u1);
connect(truDel1.y, and1.u2);
connect(and2.y, lowFloAla.u2);
connect(conInt.y, lowFloAla.u1);
connect(and1.y, booToInt.u);
connect(booToInt.y, lowFloAla.u3);
connect(conInt1.y, greThr1.u);
connect(greThr1.y, booToInt1.u);
connect(lowFloAla.y, proInt.u1);
connect(booToInt1.y, proInt.u2);
connect(not1.y, assMes.u);
connect(and3.y, not1.u);
connect(and2.y, and3.u1);
connect(greThr1.y, and3.u2);
connect(and1.y, and4.u1);
connect(greThr1.y, and4.u2);
connect(and4.y, not2.u);
connect(not2.y, assMes1.u);
connect(cooMaxFlo.y, gai2.u);
connect(not3.y, truDel2.u);
connect(u1Fan, not3.u);
connect(gai2.y, gre1.u2);
connect(gre1.y, and5.u1);
connect(truDel2.y, and5.u2);
connect(and5.y, not4.u);
connect(not4.y, assMes2.u);
connect(and5.y, booToInt2.u);
connect(booToInt2.y, yFloSenAla);
connect(proInt.y, yLowFloAla);
connect(gre1.y, truDel3.u);
connect(uDam, cloDam.u);
connect(truDel3.y, leaDamAla.u1);
connect(u1Fan, leaDamAla.u2);
connect(cloDam.y, leaDamAla.u3);
connect(not5.y, assMes3.u);
connect(leaDamAla.y, not5.u);
connect(leaDamAla.y, booToInt3.u);
connect(booToInt3.y, yLeaDamAla);
connect(VPri_flow, gre1.u1);
connect(TDis, les1.u1);
connect(TDisSet, addPar.u);
connect(addPar.y, les1.u2);
connect(TDis, les2.u1);
connect(TDisSet, addPar1.u);
connect(addPar1.y, les2.u2);
connect(les1.y, truDel4.u);
connect(les2.y, truDel5.u);
connect(truDel4.y, and6.u1);
connect(u1HotPla, and6.u2);
connect(and6.y, lowTemAla.u2);
connect(conInt2.y, lowTemAla.u1);
connect(and6.y, and7.u1);
connect(and7.y, not6.u);
connect(not6.y, assMes4.u);
connect(truDel5.y, and8.u1);
connect(and8.y, booToInt4.u);
connect(u1HotPla, and8.u2);
connect(and8.y, and9.u1);
connect(booToInt4.y, lowTemAla.u3);
connect(and9.y, not7.u);
connect(not7.y, assMes5.u);
connect(conInt3.y, greThr2.u);
connect(greThr2.y, booToInt5.u);
connect(lowTemAla.y, proInt1.u1);
connect(booToInt5.y, proInt1.u2);
connect(greThr2.y, and7.u2);
connect(greThr2.y, and9.u2);
connect(proInt1.y, yLowTemAla);
connect(uVal, cloVal.u);
connect(cloVal.y, truDel6.u);
connect(TSup, addPar2.u);
connect(TDis, gre2.u1);
connect(addPar2.y, gre2.u2);
connect(truDel6.y, leaValAla.u1);
connect(u1Fan, leaValAla.u2);
connect(gre2.y, leaValAla.u3);
connect(leaValAla.y, booToInt6.u);
connect(leaValAla.y, not8.u);
connect(not8.y, assMes6.u);
connect(booToInt6.y, yLeaValAla);
connect(u1FanCom, truDel7.u);
connect(u1FanCom, not9.u);
connect(not9.y, truDel8.u);
connect(u1FanCom, and11.u2);
connect(truDel7.y, and11.u3);
connect(and11.y, fanStaAla.u2);
connect(not9.y, and10.u2);
connect(truDel8.y, and10.u3);
connect(and10.y, booToInt7.u);
connect(conInt4.y, fanStaAla.u1);
connect(booToInt7.y, fanStaAla.u3);
connect(fanStaAla.y, yFanStaAla);
connect(and11.y, not10.u);
connect(not10.y, assMes7.u);
connect(not11.y, assMes8.u);
connect(and10.y, not11.u);
connect(u1TerFan, and10.u1);
connect(u1TerFan, not12.u);
connect(not12.y, and11.u1);
end Alarms;
Output signals for controlling constant-volume series fan-powered terminal unit
Information
This sequence sets the fan status, damper and valve position for constant-volume
series fan-powered terminal unit.
The implementation is according to Section 5.9.5 of ASHRAE Guideline 36, May 2020. The
calculation is done following the steps below.
-
When the zone state is cooling (
uCoo > 0
), then the cooling loop output
uCoo
shall be mapped to the airflow
setpoint from the minimum VActMin_flow
to the cooling maximum
VActCooMax_flow
airflow setpoints.
The heating coil is disabled (yVal=0
).
-
If supply air temperature
TSup
from the AHU is greater than
room temperature TZon
, cooling supply airflow setpoint shall be
no higher than the minimum.
-
When the zone state is Deadband (
uCoo=0
and uHea=0
), then
the active airflow setpoint shall be the minimum airflow setpoint VActMin_flow
.
The heating coil is disabled (yVal=0
).
-
When the zone state is Heating (
uHea > 0
),
-
As the heating-loop output
uHea
increases from 0% to 100%, it shall reset
the discharge temperature THeaDisSet
from the current AHU setpoint
temperature TSupSet
to a maximum of dTDisZonSetMax
above space temperature setpoint.
-
The airflow setpoint shall be the minimum flow
VActMin_flow
.
-
The heating coil shall be modulated to maintain the discharge temperature at setpoint.
-
The VAV damper shall be modulated by a control loop to maintain the measured
airflow at the active setpoint.
-
Fan control
-
Fan shall run whenever zone state is heating or cooling state, or if the associated
zone group is in occupied mode. Prior to starting fan, the damper is first driven
fully closed to ensure that the fan is not rotating backward. Once the fan is
proven on (
u1Fan=true
) for a fixed time delay (15 seconds), the damper
override is released.
The sequences of controlling fan, damper position for constant-volume
series fan-powered terminal unit are described in the following figure below.
As specified in Section 5.9.7 of ASHRAE Guideline 36, the airflow setpoint could be
override by providing software switches that interlock to a system-level point to:
-
when
oveFloSet
equals to 1, force the zone airflow setpoint
VPri_flow_Set
to zero,
-
when
oveFloSet
equals to 2, force the zone airflow setpoint
VPri_flow_Set
to zone cooling maximum airflow rate
VCooMax_flow
,
-
when
oveFloSet
equals to 3, force the zone airflow setpoint
VPri_flow_Set
to zone minimum airflow setpoint
VMin_flow
.
Parameters
Type | Name | Default | Description |
Real | dTDisZonSetMax | 11 | Zone maximum discharge air temperature above heating setpoint [K] |
Real | VMin_flow | | Design zone minimum airflow setpoint [m3/s] |
Real | VCooMax_flow | | Design zone cooling maximum airflow rate [m3/s] |
Valve |
SimpleController | controllerTypeVal | Buildings.Controls.OBC.CDL.T... | Type of controller |
Real | kVal | 0.5 | Gain of controller for valve control [1/K] |
Real | TiVal | 300 | Time constant of integrator block for valve control [s] |
Real | TdVal | 0.1 | Time constant of derivative block for valve control [s] |
Damper |
Boolean | have_preIndDam | true | True: the VAV damper is pressure independent (with built-in flow controller) |
SimpleController | controllerTypeDam | Buildings.Controls.OBC.CDL.T... | Type of controller |
Real | kDam | 0.5 | Gain of controller for damper control [1] |
Real | TiDam | 300 | Time constant of integrator block for damper control [s] |
Real | TdDam | 0.1 | Time constant of derivative block for damper control [s] |
Advanced |
Real | dTHys | 0.25 | Temperature difference hysteresis below which the temperature difference will be seen as zero [K] |
Real | looHys | 0.05 | Loop output hysteresis below which the output will be seen as zero [1] |
Real | floHys | 0.01 | Hysteresis for checking airflow rate [m3/s] |
Real | damPosHys | 0.05 | Hysteresis for checking damper position [m3/s] |
Connectors
Type | Name | Description |
input IntegerInput | oveFloSet | Index of overriding flow setpoint, 1: set to zero; 2: set to cooling maximum; 3: set to minimum flow; 4: set to heating maximum |
input RealInput | VPri_flow | Measured primary airflow rate [m3/s] |
input RealInput | uCoo | Cooling control signal [1] |
input RealInput | VActCooMax_flow | Active cooling maximum airflow rate [m3/s] |
input RealInput | TSup | Temperature of the air supplied from central air handler [K] |
input RealInput | TZon | Measured zone temperature [K] |
input RealInput | VActMin_flow | Active minimum airflow rate [m3/s] |
input RealInput | TSupSet | Supply air temperature setpoint from central air handler [K] |
input RealInput | THeaSet | Zone heating setpoint temperature [K] |
input RealInput | uHea | Heating control signal [1] |
input RealInput | TDis | Measured discharge air temperature [K] |
input IntegerInput | uOpeMod | Zone operation mode |
input BooleanInput | u1Fan | Terminal fan status |
input RealInput | uDam | Damper position setpoint [1] |
output RealOutput | VPri_flow_Set | Primary airflow setpoint [m3/s] |
output RealOutput | yDam | VAV damper commanded position [1] |
output RealOutput | THeaDisSet | Discharge airflow setpoint temperature for heating [K] |
output RealOutput | yVal | Hot water valve commanded position [1] |
output BooleanOutput | y1Fan | Terminal fan command on |
Modelica definition
block DamperValves
parameter Real dTDisZonSetMax(
final unit="K",
final quantity="TemperatureDifference")=11
;
parameter Real VMin_flow(
final quantity="VolumeFlowRate",
final unit="m3/s")
;
parameter Real VCooMax_flow(
final quantity="VolumeFlowRate",
final unit="m3/s")
;
parameter Buildings.Controls.OBC.CDL.Types.SimpleController controllerTypeVal=
Buildings.Controls.OBC.CDL.Types.SimpleController.PI
;
parameter Real kVal(
final unit="1/K")=0.5
;
parameter Real TiVal(
final unit="s",
final quantity="Time")=300
;
parameter Real TdVal(
final unit="s",
final quantity="Time")=0.1
;
parameter Boolean have_preIndDam = true
;
parameter Buildings.Controls.OBC.CDL.Types.SimpleController controllerTypeDam=
Buildings.Controls.OBC.CDL.Types.SimpleController.PI
;
parameter Real kDam(
final unit="1")=0.5
;
parameter Real TiDam(
final unit="s",
final quantity="Time")=300
;
parameter Real TdDam(
final unit="s",
final quantity="Time")=0.1
;
parameter Real dTHys(
final unit="K",
final quantity="TemperatureDifference")=0.25
;
parameter Real looHys(
final unit="1") = 0.05
;
parameter Real floHys(
final unit="m3/s") = 0.01
;
parameter Real damPosHys(
final unit="m3/s") = 0.05
;
Buildings.Controls.OBC.CDL.Interfaces.IntegerInput oveFloSet
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput VPri_flow(
final min=0,
final unit="m3/s",
final quantity="VolumeFlowRate") ;
Buildings.Controls.OBC.CDL.Interfaces.RealInput uCoo(
final min=0,
final max=1,
final unit="1")
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput VActCooMax_flow(
final min=0,
final unit="m3/s",
final quantity="VolumeFlowRate")
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput TSup(
final unit="K",
final displayUnit="degC",
final quantity="ThermodynamicTemperature")
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput TZon(
final unit="K",
final displayUnit="degC",
final quantity="ThermodynamicTemperature")
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput VActMin_flow(
final min=0,
final unit="m3/s",
final quantity="VolumeFlowRate") ;
Buildings.Controls.OBC.CDL.Interfaces.RealInput TSupSet(
final unit="K",
final displayUnit="degC",
final quantity="ThermodynamicTemperature")
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput THeaSet(
final unit="K",
final displayUnit="degC",
final quantity="ThermodynamicTemperature")
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput uHea(
final min=0,
final max=1,
final unit="1")
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput TDis(
final unit="K",
final displayUnit="degC",
final quantity="ThermodynamicTemperature")
;
Buildings.Controls.OBC.CDL.Interfaces.IntegerInput uOpeMod
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1Fan
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput uDam(
final min=0,
final unit="1")
;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput VPri_flow_Set(
final min=0,
final unit="m3/s",
final quantity="VolumeFlowRate") ;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput yDam(
final min=0,
final max=1,
final unit="1") ;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput THeaDisSet(
final unit="K",
final displayUnit="degC",
final quantity="ThermodynamicTemperature")
;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput yVal(
final min=0,
final max=1,
final unit="1") ;
Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput y1Fan
;
Buildings.Controls.OBC.CDL.Logical.And and4 ;
Buildings.Controls.OBC.CDL.Continuous.Line lin
;
Buildings.Controls.OBC.CDL.Continuous.Switch swi
;
Buildings.Controls.OBC.CDL.Continuous.Switch swi5
;
Buildings.Controls.OBC.CDL.Continuous.Sources.Constant conZer(
final k=0) ;
Buildings.Controls.OBC.CDL.Continuous.Sources.Constant conOne(
final k=1) ;
Buildings.Controls.OBC.CDL.Continuous.GreaterThreshold greThr1(
final t=looHys,
final h=0.5*looHys)
;
Buildings.Controls.OBC.CDL.Continuous.GreaterThreshold greThr(
final t=dTHys,
final h=0.5*dTHys)
;
Buildings.Controls.OBC.CDL.Continuous.Subtract sub2
;
Buildings.Controls.OBC.CDL.Continuous.GreaterThreshold greThr2(
final t=looHys,
final h=0.5*looHys)
;
Buildings.Controls.OBC.CDL.Continuous.Sources.Constant conZer3(
final k=0)
;
Buildings.Controls.OBC.CDL.Continuous.AddParameter addPar(
final p=dTDisZonSetMax)
;
Buildings.Controls.OBC.CDL.Continuous.Sources.Constant conHal(
final k=1)
;
Buildings.Controls.OBC.CDL.Continuous.Line conTDisHeaSet
;
Buildings.Controls.OBC.CDL.Continuous.PIDWithReset conVal(
final controllerType=controllerTypeVal,
final k=kVal,
final Ti=TiVal,
final Td=TdVal,
final yMax=1,
final yMin=0,
u_s(
final unit="K", displayUnit="degC"),
u_m(
final unit="K", displayUnit="degC"))
;
Buildings.Controls.OBC.CDL.Continuous.Switch swi1
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant unOcc(
final k=Buildings.Controls.OBC.ASHRAE.G36.Types.OperationModes.unoccupied)
;
Buildings.Controls.OBC.CDL.Integers.Equal isUno
;
Buildings.Controls.OBC.CDL.Continuous.Switch swi2 ;
Buildings.Controls.OBC.CDL.Continuous.Sources.Constant nomFlow(
final k=
VCooMax_flow)
;
Buildings.Controls.OBC.CDL.Continuous.Divide VDisSet_flowNor
;
Buildings.Controls.OBC.CDL.Continuous.Divide VDis_flowNor
if not have_preIndDam
;
Buildings.Controls.OBC.CDL.Continuous.PIDWithReset conDam(
final controllerType=controllerTypeDam,
final k=kDam,
final Ti=TiDam,
final Td=TdDam,
final yMax=1,
final yMin=0,
final y_reset=0)
if not have_preIndDam
;
Buildings.Controls.OBC.CDL.Continuous.MultiplyByParameter gai(
final k=1)
if have_preIndDam
;
Buildings.Controls.OBC.CDL.Continuous.Switch swi3 ;
Buildings.Controls.OBC.CDL.Logical.Not not1 ;
Buildings.Controls.OBC.CDL.Logical.Latch lat ;
Buildings.Controls.OBC.CDL.Continuous.LessThreshold cloDam(
final t=damPosHys,
final h=damPosHys/2)
;
Buildings.Controls.OBC.CDL.Logical.Or3 or3
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant occ(
final k=Buildings.Controls.OBC.ASHRAE.G36.Types.OperationModes.occupied)
;
Buildings.Controls.OBC.CDL.Integers.Equal isOcc
;
Buildings.Controls.OBC.CDL.Logical.Edge edg
;
Buildings.Controls.OBC.CDL.Logical.Timer tim(
final t=15)
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToRea(
final realTrue=0,
final realFalse=1)
;
Buildings.Controls.OBC.CDL.Continuous.Multiply mul
;
Buildings.Controls.OBC.CDL.Logical.And and2
;
Buildings.Controls.OBC.CDL.Logical.Latch lat1
;
Buildings.Controls.OBC.CDL.Logical.FallingEdge falEdg
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt(
final k=1)
;
Buildings.Controls.OBC.CDL.Integers.Equal forZerFlo
;
Buildings.Controls.OBC.CDL.Integers.Equal forCooMax
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt1(
final k=2)
;
Buildings.Controls.OBC.CDL.Integers.Equal forMinFlo
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt2(
final k=3)
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToReal zerFlo(
final realTrue=0)
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToReal cooMax(
final realTrue=VCooMax_flow)
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToReal minFlo(
final realTrue=VMin_flow)
;
Buildings.Controls.OBC.CDL.Continuous.Add add2 ;
Buildings.Controls.OBC.CDL.Continuous.Add add1 ;
Buildings.Controls.OBC.CDL.Continuous.Switch swi8
;
Buildings.Controls.OBC.CDL.Logical.Or3 or1
;
equation
connect(uCoo, lin.u);
connect(conZer.y, lin.x1);
connect(conOne.y, lin.x2);
connect(VActCooMax_flow, lin.f2);
connect(uCoo, greThr1.u);
connect(and4.y, swi5.u2);
connect(lin.y, swi5.u3);
connect(swi5.y, swi.u1);
connect(TSup, sub2.u1);
connect(sub2.y, greThr.u);
connect(greThr.y, and4.u2);
connect(greThr1.y, and4.u1);
connect(greThr1.y, swi.u2);
connect(VActMin_flow, swi5.u1);
connect(VActMin_flow, lin.f1);
connect(uHea, greThr2.u);
connect(VActMin_flow, swi.u3);
connect(conZer3.y, conTDisHeaSet.x1);
connect(TSupSet, conTDisHeaSet.f1);
connect(uHea, conTDisHeaSet.u);
connect(conHal.y, conTDisHeaSet.x2);
connect(THeaSet, addPar.u);
connect(addPar.y, conTDisHeaSet.f2);
connect(greThr2.y, conVal.trigger);
connect(TZon, sub2.u2);
connect(TDis, conVal.u_m);
connect(conTDisHeaSet.y, conVal.u_s);
connect(conTDisHeaSet.y, THeaDisSet);
connect(greThr2.y, swi1.u2);
connect(conVal.y, swi1.u1);
connect(unOcc.y, isUno.u1);
connect(uOpeMod, isUno.u2);
connect(isUno.y, swi2.u2);
connect(conZer3.y, swi1.u3);
connect(conZer3.y, swi2.u1);
connect(swi1.y, swi2.u3);
connect(swi2.y, yVal);
connect(nomFlow.y, VDisSet_flowNor.u2);
connect(VDisSet_flowNor.y, conDam.u_s);
connect(VPri_flow, VDis_flowNor.u1);
connect(nomFlow.y, VDis_flowNor.u2);
connect(isUno.y, swi3.u2);
connect(conZer3.y, swi3.u1);
connect(VDisSet_flowNor.y, gai.u);
connect(gai.y, swi3.u3);
connect(conDam.y, swi3.u3);
connect(VDis_flowNor.y, conDam.u_m);
connect(isUno.y, not1.u);
connect(not1.y, conDam.trigger);
connect(uDam, cloDam.u);
connect(uOpeMod, isOcc.u1);
connect(occ.y, isOcc.u2);
connect(greThr1.y, or3.u1);
connect(greThr2.y, or3.u2);
connect(isOcc.y, or3.u3);
connect(or3.y, edg.u);
connect(edg.y, lat.u);
connect(u1Fan, tim.u);
connect(tim.passed, lat.clr);
connect(lat.y, booToRea.u);
connect(booToRea.y, mul.u2);
connect(swi3.y, mul.u1);
connect(mul.y, yDam);
connect(cloDam.y, and2.u1);
connect(or3.y, and2.u2);
connect(and2.y, lat1.u);
connect(or3.y, falEdg.u);
connect(falEdg.y, lat1.clr);
connect(lat1.y, y1Fan);
connect(oveFloSet,forZerFlo. u1);
connect(conInt.y,forZerFlo. u2);
connect(oveFloSet,forCooMax. u1);
connect(conInt1.y,forCooMax. u2);
connect(oveFloSet,forMinFlo. u1);
connect(conInt2.y,forMinFlo. u2);
connect(forZerFlo.y,zerFlo. u);
connect(forCooMax.y,cooMax. u);
connect(forMinFlo.y,minFlo. u);
connect(cooMax.y,add2. u1);
connect(zerFlo.y,add1. u1);
connect(forZerFlo.y,or1. u1);
connect(forCooMax.y,or1. u2);
connect(add1.y,swi8. u1);
connect(add2.y,add1. u2);
connect(minFlo.y,add2. u2);
connect(forMinFlo.y,or1. u3);
connect(or1.y, swi8.u2);
connect(swi.y, swi8.u3);
connect(swi8.y, VDisSet_flowNor.u1);
connect(swi8.y, VPri_flow_Set);
end DamperValves;
Software switches to override setpoints
Information
This block considers the overrides to the setpoints for series fan-powered unit
with constant-volume fan.
The implementation is according to the Section 5.9.7 of ASHRAE Guideline 36,
May 2020.
Provide software switches that interlock to a system-level point to:
-
when
oveDamPos
equals to 1, force the damper to full closed by setting
yDam
to 0,
-
when
oveDamPos
equals to 2, force the damper to full open by setting
yDam
to 1.
-
when
uHeaOff
equals to true
, force the heating valve to
full closed by setting yVal
to 0.
-
When
oveFan
equals to 1, force the fan to turn OFF.
-
When
oveFan
equals to 2, force the fan to turn ON.
Connectors
Type | Name | Description |
input IntegerInput | oveDamPos | Index of overriding damper position, 1: set to close; 2: set to open |
input RealInput | uDam | Damper commanded position [1] |
input BooleanInput | uHeaOff | Override heating valve position, true: close heating valve |
input RealInput | uVal | Heating valve commanded position [1] |
input IntegerInput | oveFan | Index of overriding fan status, 1: turn fan off; 2: turn fan on |
input BooleanInput | u1Fan | Terminal fan status |
output RealOutput | yDam | Damper commanded position, after considering override [1] |
output RealOutput | yVal | Heating valve commanded position, after considering override [1] |
output BooleanOutput | y1Fan | Fan status after considering override |
Modelica definition
block Overrides
Buildings.Controls.OBC.CDL.Interfaces.IntegerInput oveDamPos
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput uDam(
final min=0,
final unit="1") ;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput uHeaOff
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput uVal(
final min=0,
final unit="1") ;
Buildings.Controls.OBC.CDL.Interfaces.IntegerInput oveFan
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1Fan
;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput yDam(
final min=0,
final unit="1") ;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput yVal(
final min=0,
final unit="1")
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput y1Fan
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt3(
final k=1)
;
Buildings.Controls.OBC.CDL.Integers.Equal intEqu3
;
Buildings.Controls.OBC.CDL.Integers.Equal intEqu4
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt4(
final k=2)
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToReal cloDam(
final realTrue=0) ;
Buildings.Controls.OBC.CDL.Conversions.BooleanToReal opeDam(
final realTrue=1) ;
Buildings.Controls.OBC.CDL.Continuous.Add add3 ;
Buildings.Controls.OBC.CDL.Logical.Or or2
;
Buildings.Controls.OBC.CDL.Continuous.Switch swi1
;
Buildings.Controls.OBC.CDL.Continuous.Multiply pro
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToRea(
final realTrue=0,
final realFalse=1)
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt5(
final k=1)
;
Buildings.Controls.OBC.CDL.Integers.Equal intEqu1
;
Buildings.Controls.OBC.CDL.Integers.Equal intEqu2
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt6(
final k=2)
;
Buildings.Controls.OBC.CDL.Logical.Switch logSwi
;
Buildings.Controls.OBC.CDL.Logical.Sources.Constant con(
final k=false)
;
Buildings.Controls.OBC.CDL.Logical.Switch logSwi1
;
Buildings.Controls.OBC.CDL.Logical.Sources.Constant con1(
final k=true)
;
equation
connect(conInt3.y, intEqu3.u2);
connect(conInt4.y,intEqu4. u2);
connect(oveDamPos, intEqu3.u1);
connect(oveDamPos, intEqu4.u1);
connect(intEqu3.y, cloDam.u);
connect(intEqu4.y, opeDam.u);
connect(cloDam.y, add3.u1);
connect(opeDam.y, add3.u2);
connect(intEqu3.y, or2.u1);
connect(intEqu4.y, or2.u2);
connect(add3.y, swi1.u1);
connect(or2.y, swi1.u2);
connect(uDam, swi1.u3);
connect(swi1.y, yDam);
connect(uHeaOff, booToRea.u);
connect(booToRea.y, pro.u1);
connect(uVal, pro.u2);
connect(pro.y,yVal);
connect(conInt5.y,intEqu1. u2);
connect(conInt6.y,intEqu2. u2);
connect(oveFan, intEqu2.u1);
connect(oveFan, intEqu1.u1);
connect(intEqu1.y, logSwi.u2);
connect(con.y, logSwi.u1);
connect(intEqu2.y, logSwi1.u2);
connect(con1.y, logSwi1.u1);
connect(u1Fan, logSwi1.u3);
connect(logSwi1.y, logSwi.u3);
connect(logSwi.y, y1Fan);
end Overrides;
Output system requests for parallel fan-powered terminal unit with constant-volume fan
Information
This sequence outputs the system reset requests for series fan-powered terminal
unit with constant-voume fan. The implementation is according to the Section 5.9.8
of ASHRAE Guideline 36, May 2020.
Cooling SAT reset requests yZonTemResReq
-
If the zone temperature
TZon
exceeds the zone cooling setpoint
TCooSet
by 3 °C (5 °F)) for 2 minutes and after suppression
period (uAftSup=true
) due to setpoint change per G36 Part 5.1.20,
send 3 requests (yZonTemResReq=3
).
-
Else if the zone temperature
TZon
exceeds the zone cooling setpoint
TCooSet
by 2 °C (3 °F) for 2 minutes and after suppression
period (uAftSup=true
) due to setpoint change per G36 Part 5.1.20,
send 2 requests (yZonTemResReq=2
).
-
Else if the cooling loop
uCoo
is greater than 95%, send 1 request
(yZonTemResReq=1
) until uCoo
is less than 85%.
-
Else if
uCoo
is less than 95%, send 0 request (yZonTemResReq=0
).
Static pressure reset requests yZonPreResReq
-
If the measured airflow
VPri_flow
is less than 50% of setpoint
VSet_flow
while the setpoint is greater than zero and the damper position
uDam
is greater than 95% for 1 minute, send 3 requests (yZonPreResReq=3
).
-
Else if the measured airflow
VPri_flow
is less than 70% of setpoint
VSet_flow
while the setpoint is greater than zero and the damper position
uDam
is greater than 95% for 1 minute, send 2 requests (yZonPreResReq=2
).
-
Else if the damper position
uDam
is greater than 95%, send 1 request
(yZonPreResReq=1
) until uDam
is less than 85%.
-
Else if the damper position
uDam
is less than 95%, send 0 request
(yZonPreResReq=0
).
If there is a hot-water coil (have_hotWatCoi=true
), hot-water reset requests
yHeaValResReq
-
If the discharging air temperature
TDis
is 17 °C (30 °F)
thrTDis_1
less than the setpoint TDisSet
for 5 minutes, send 3 requests.
-
Else ff the discharging air temperature
TDis
is 8.3 °C (15 °F)
thrTDis_1
less than the setpoint TDisSet
for 5 minutes, send 2 requests.
-
Else if the hot water valve position
uVal
is greater than 95%, send 1
request until the hot water valve position is less than 85%.
-
Else if the hot water valve position
uVal
is less than 95%, send 0 request.
If there is a hot-water coil and heating hot-water plant, heating hot-water
plant reqeusts. Send the heating hot-water plant that serves the zone a heating
hot-water plant request as follows:
-
If the hot water valve position
uVal
is greater than 95%, send 1
request until the hot water valve position is less than 10%.
-
If the hot water valve position
uVal
is less than 95%, send 0 requests.
Parameters
Type | Name | Default | Description |
Boolean | have_hotWatCoi | | True: the system has hot water coil |
Real | thrTemDif | 3 | Threshold difference between zone temperature and cooling setpoint for generating 3 cooling SAT reset requests [K] |
Real | twoTemDif | 2 | Threshold difference between zone temperature and cooling setpoint for generating 2 cooling SAT reset requests [K] |
Real | thrTDis_1 | 17 | Threshold difference between discharge air temperature and its setpoint for generating 3 hot water reset requests [K] |
Real | thrTDis_2 | 8.3 | Threshold difference between discharge air temperature and its setpoint for generating 2 hot water reset requests [K] |
Duration times |
Real | durTimTem | 120 | Duration time of zone temperature exceeds setpoint [s] |
Real | durTimFlo | 60 | Duration time of airflow rate less than setpoint [s] |
Real | durTimDisAir | 300 | Duration time of discharge air temperature less than setpoint [s] |
Advanced |
Real | dTHys | 0.25 | Near zero temperature difference, below which the difference will be seen as zero [K] |
Real | floHys | | Near zero flow rate, below which the flow rate or difference will be seen as zero [m3/s] |
Real | looHys | | Loop output hysteresis below which the output will be seen as zero [1] |
Real | damPosHys | | Near zero damper position, below which the damper will be seen as closed [1] |
Real | valPosHys | | Near zero valve position, below which the valve will be seen as closed [1] |
Real | samplePeriod | 120 | Sample period of component, set to the same value as the trim and respond that process yPreSetReq [s] |
Connectors
Type | Name | Description |
input BooleanInput | uAftSup | After suppression period due to the setpoint change |
input RealInput | TCooSet | Zone cooling setpoint temperature [K] |
input RealInput | TZon | Zone temperature [K] |
input RealInput | uCoo | Cooling loop signal [1] |
input RealInput | VSet_flow | Discharge airflow rate setpoint [m3/s] |
input RealInput | VPri_flow | Measured discharge airflow rate [m3/s] |
input RealInput | uDam | Damper position setpoint [1] |
input RealInput | TDisSet | Discharge airflow setpoint temperature for heating [K] |
input RealInput | TDis | Measured discharge airflow temperature [K] |
input RealInput | uVal | Hot water valve position [1] |
output IntegerOutput | yZonTemResReq | Zone cooling supply air temperature reset request |
output IntegerOutput | yZonPreResReq | Zone static pressure reset requests |
output IntegerOutput | yHeaValResReq | Hot water reset requests |
output IntegerOutput | yHotWatPlaReq | Request to heating hot-water plant |
Modelica definition
block SystemRequests
parameter Boolean have_hotWatCoi
;
parameter Real thrTemDif(unit="K")=3
;
parameter Real twoTemDif(unit="K")=2
;
parameter Real thrTDis_1(unit="K")=17
;
parameter Real thrTDis_2(unit="K")=8.3
;
parameter Real durTimTem(unit="s")=120
;
parameter Real durTimFlo(unit="s")=60
;
parameter Real durTimDisAir(unit="s")=300
;
parameter Real dTHys(unit="K")=0.25
;
parameter Real floHys(unit="m3/s")
;
parameter Real looHys(unit="1")
;
parameter Real damPosHys(unit="1")
;
parameter Real valPosHys(unit="1")
;
parameter Real samplePeriod(
final unit="s",
final quantity="Time")=120
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput uAftSup
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput TCooSet(
final unit="K",
final displayUnit="degC",
final quantity="ThermodynamicTemperature")
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput TZon(
final unit="K",
final displayUnit="degC",
final quantity="ThermodynamicTemperature")
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput uCoo(
final min=0,
final max=1,
final unit="1")
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput VSet_flow(
final min=0,
final unit="m3/s",
quantity="VolumeFlowRate")
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput VPri_flow(
final min=0,
final unit="m3/s",
final quantity="VolumeFlowRate")
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput uDam(
final min=0,
final max=1,
final unit="1")
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput TDisSet(
final unit="K",
final displayUnit="degC",
final quantity="ThermodynamicTemperature")
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput TDis(
final unit="K",
final displayUnit="degC",
final quantity="ThermodynamicTemperature")
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput uVal(
final min=0,
final max=1,
final unit="1")
if have_hotWatCoi ;
Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yZonTemResReq
;
Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yZonPreResReq
;
Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yHeaValResReq
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yHotWatPlaReq
if have_hotWatCoi
;
protected
Buildings.Controls.OBC.CDL.Continuous.Less les(
final h=dTHys)
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Continuous.Less les1(
final h=dTHys)
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Continuous.GreaterThreshold greThr1(
final t=thrTemDif,
final h=dTHys)
;
Buildings.Controls.OBC.CDL.Continuous.GreaterThreshold greThr2(
final t=twoTemDif,
final h=dTHys)
;
Buildings.Controls.OBC.CDL.Continuous.GreaterThreshold greThr3(
final t=0.95,
final h=damPosHys)
;
Buildings.Controls.OBC.CDL.Continuous.GreaterThreshold greThr(
final t=0.95,
final h=looHys)
;
Buildings.Controls.OBC.CDL.Continuous.GreaterThreshold greThr4(
final t=floHys,
final h=0.5*floHys)
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt1
;
Buildings.Controls.OBC.CDL.Continuous.MultiplyByParameter gai1(
final k=0.5)
;
Buildings.Controls.OBC.CDL.Continuous.MultiplyByParameter gai2(
final k=0.7)
;
Buildings.Controls.OBC.CDL.Continuous.Subtract sub2
;
Buildings.Controls.OBC.CDL.Continuous.Subtract sub3
;
Buildings.Controls.OBC.CDL.Logical.And and1
;
Buildings.Controls.OBC.CDL.Logical.And and2
;
Buildings.Controls.OBC.CDL.Logical.And and3
;
Buildings.Controls.OBC.CDL.Logical.And and4
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant thrCooResReq(
final k=3)
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant twoCooResReq(
final k=2) ;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant thrPreResReq(
final k=3)
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant twoPreResReq(
final k=2)
;
Buildings.Controls.OBC.CDL.Integers.Switch intSwi
;
Buildings.Controls.OBC.CDL.Integers.Switch intSwi1
;
Buildings.Controls.OBC.CDL.Integers.Switch swi4
;
Buildings.Controls.OBC.CDL.Integers.Switch swi5
;
Buildings.Controls.OBC.CDL.Logical.TrueDelay tim1(
final delayTime=durTimTem) ;
Buildings.Controls.OBC.CDL.Logical.TrueDelay tim2(
final delayTime=durTimTem) ;
Buildings.Controls.OBC.CDL.Logical.TrueDelay tim3(
final delayTime=durTimFlo) ;
Buildings.Controls.OBC.CDL.Continuous.Greater greEqu(
final h=floHys)
;
Buildings.Controls.OBC.CDL.Continuous.Greater greEqu1(
final h=floHys)
;
Buildings.Controls.OBC.CDL.Logical.And and5
;
Buildings.Controls.OBC.CDL.Continuous.AddParameter addPar(
final p=thrTDis_1)
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Continuous.AddParameter addPar1(
final p=thrTDis_2)
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant thrHeaResReq(
final k=3)
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant twoHeaResReq(
final k=2)
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Integers.Switch intSwi2
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Integers.Switch intSwi3
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Logical.TrueDelay tim4(
final delayTime=durTimDisAir)
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Logical.TrueDelay tim5(
final delayTime=durTimDisAir)
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Continuous.GreaterThreshold greThr5(
final t=0.95,
final h=valPosHys)
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt2
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Continuous.GreaterThreshold greThr6(
final t=0.95,
final h=0.85)
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt3
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Discrete.Sampler sampler(
final samplePeriod=samplePeriod)
;
Buildings.Controls.OBC.CDL.Discrete.Sampler sampler1(
final samplePeriod=samplePeriod)
;
Buildings.Controls.OBC.CDL.Discrete.Sampler sampler2(
final samplePeriod=samplePeriod)
;
Buildings.Controls.OBC.CDL.Discrete.Sampler sampler3(
final samplePeriod=samplePeriod)
;
equation
connect(sub2.y, greThr1.u);
connect(and2.y, intSwi.u2);
connect(sub3.y, greThr2.u);
connect(and1.y, intSwi1.u2);
connect(and3.y, swi4.u2);
connect(and4.y, swi5.u2);
connect(greThr2.y, tim2.u);
connect(tim2.y, and1.u2);
connect(greThr1.y, tim1.u);
connect(tim1.y, and2.u2);
connect(greEqu.u1, gai1.y);
connect(greEqu.y, and3.u2);
connect(gai2.y, greEqu1.u1);
connect(greEqu1.y, and4.u2);
connect(uAftSup, and2.u1);
connect(uAftSup, and1.u1);
connect(thrCooResReq.y, intSwi.u1);
connect(twoCooResReq.y, intSwi1.u1);
connect(intSwi1.y, intSwi.u3);
connect(intSwi.y, yZonTemResReq);
connect(greThr.y, booToInt.u);
connect(booToInt.y, intSwi1.u3);
connect(greThr3.y, tim3.u);
connect(greThr4.y, and5.u1);
connect(tim3.y, and5.u2);
connect(and5.y, and3.u1);
connect(and5.y, and4.u1);
connect(greThr3.y, booToInt1.u);
connect(booToInt1.y, swi5.u3);
connect(twoPreResReq.y, swi5.u1);
connect(thrPreResReq.y, swi4.u1);
connect(swi5.y, swi4.u3);
connect(swi4.y, yZonPreResReq);
connect(TDis,addPar. u);
connect(TDis,addPar1. u);
connect(tim5.y, intSwi3.u2);
connect(tim4.y, intSwi2.u2);
connect(addPar.y, les.u1);
connect(TDisSet, les.u2);
connect(les.y, tim4.u);
connect(TDisSet, les1.u2);
connect(addPar1.y, les1.u1);
connect(les1.y, tim5.u);
connect(yHeaValResReq, intSwi2.y);
connect(thrHeaResReq.y, intSwi2.u1);
connect(twoHeaResReq.y, intSwi3.u1);
connect(intSwi3.y, intSwi2.u3);
connect(uVal, greThr5.u);
connect(greThr5.y, booToInt2.u);
connect(booToInt2.y, intSwi3.u3);
connect(uVal, greThr6.u);
connect(greThr6.y, booToInt3.u);
connect(booToInt3.y, yHotWatPlaReq);
connect(TCooSet, sub3.u2);
connect(TCooSet, sub2.u2);
connect(TZon, sub2.u1);
connect(TZon, sub3.u1);
connect(uCoo, sampler.u);
connect(sampler.y, greThr.u);
connect(uDam, sampler3.u);
connect(sampler3.y, greThr3.u);
connect(greThr4.u, sampler2.y);
connect(sampler2.u, VSet_flow);
connect(sampler2.y, gai1.u);
connect(sampler2.y, gai2.u);
connect(VPri_flow, sampler1.u);
connect(sampler1.y, greEqu.u2);
connect(sampler1.y, greEqu1.u2);
end SystemRequests;