Package of subsequences for variable-volume parallel fan-powered terminal unit
Information
This package contains subsequences for controlling variable-volume parallel fan-powered terminal unit.
They are created according to Section 5.8 of ASHRAE Guideline 36, May 2020.
Package Content
Name |
Description |
ActiveAirFlow
|
Output the active primary airflow setpoint for variable-volume parallel fan-powered terminal unit |
Alarms
|
Generate alarms of parallel fan-powered terminal unit with variable-volume fan |
DamperValves
|
Output signals for controlling variable-volume parallel fan-powered terminal unit |
Overrides
|
Software switches to override setpoints |
SystemRequests
|
Output system requests for parallel fan-powered terminal unit with variable-volume fan |
Validation
|
Collection of validation models |
Output the active primary airflow setpoint for variable-volume parallel fan-powered terminal unit
Information
This sequence sets the active primary cooling maximum and minimum setpoints
for parallel fan-powered terminal unit with variable volume fan. The implementation
is according to the Section 5.8.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.Reals.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 parallel fan-powered terminal unit with variable-volume fan
Information
This block outputs alarms of parallel fan-powered terminal unit with variable volume fan.
The implementation is according to the Section 5.8.6 of ASHRAE Guideline 36, May 2020.
Low airflow
-
After the AHU supply fan has been enabled for
staTim
,
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.
-
After the AHU supply fan has been enabled for
staTim
,
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] |
Real | staTim | 1800 | Delay triggering alarms after enabling AHU supply fan [s] |
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 IntegerInput | uOpeMod | Zone operation mode |
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
;
parameter Real staTim(
final unit="s",
final quantity="Time")=1800
;
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.IntegerInput uOpeMod
;
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.Reals.MultiplyByParameter gai(
final k=0.5)
;
Buildings.Controls.OBC.CDL.Reals.Less les(
final h=floHys)
;
Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel(
final delayTime=lowFloTim)
;
Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr(
final t=floHys,
final h=0.5*floHys)
;
Buildings.Controls.OBC.CDL.Reals.Greater gre(
final h=floHys)
;
Buildings.Controls.OBC.CDL.Reals.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.Reals.Sources.Constant conInt1(
final k=staPreMul)
;
Buildings.Controls.OBC.CDL.Reals.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.Reals.Sources.Constant cooMaxFlo(
final k=VCooMax_flow)
;
Buildings.Controls.OBC.CDL.Reals.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.Reals.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.Reals.LessThreshold cloDam(
final t=damPosHys,
final h=0.5*damPosHys) ;
Buildings.Controls.OBC.CDL.Logical.And 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.Reals.Less les1(
final h=dTHys)
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Reals.AddParameter addPar(
final p=-17)
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Reals.Less les2(
final h=dTHys)
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Reals.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.Reals.Sources.Constant conInt3(
final k=hotWatRes)
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Reals.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.Reals.LessThreshold cloVal(
final t=valPosHys,
final h=0.5*valPosHys)
;
Buildings.Controls.OBC.CDL.Reals.AddParameter addPar2(
final p=3)
;
Buildings.Controls.OBC.CDL.Reals.Greater gre2(
final h=dTHys)
;
Buildings.Controls.OBC.CDL.Logical.And 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.And 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.And 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
;
Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel9(
final delayTime=lowFloTim)
;
Buildings.Controls.OBC.CDL.Logical.TrueDelay fanIni(
final delayTime=staTim)
;
Buildings.Controls.OBC.CDL.Logical.And and12
;
Buildings.Controls.OBC.CDL.Logical.And and13
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant occMod(
final k=Buildings.Controls.OBC.ASHRAE.G36.Types.OperationModes.occupied)
;
Buildings.Controls.OBC.CDL.Integers.Equal isOcc
;
Buildings.Controls.OBC.CDL.Logical.And and14
;
Buildings.Controls.OBC.CDL.Logical.And and15
;
Buildings.Controls.OBC.CDL.Logical.And and16
;
Buildings.Controls.OBC.CDL.Logical.And and17
;
Buildings.Controls.OBC.CDL.Logical.And leaDamAla1
;
Buildings.Controls.OBC.CDL.Logical.And leaValAla1
;
Buildings.Controls.OBC.CDL.Logical.And and18
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Logical.And and19
if have_hotWatCoi
;
equation
connect(VActSet_flow, gai.u);
connect(VPri_flow, les.u1);
connect(VActSet_flow, greThr.u);
connect(VActSet_flow, gai1.u);
connect(VPri_flow, gre.u2);
connect(gai1.y, gre.u1);
connect(truDel.y, and2.u1);
connect(truDel1.y, and1.u2);
connect(conInt.y, lowFloAla.u1);
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(and2.y, and3.u1);
connect(greThr1.y, and3.u2);
connect(and1.y, and4.u1);
connect(greThr1.y, and4.u2);
connect(not2.y, assMes1.u);
connect(cooMaxFlo.y, gai2.u);
connect(u1Fan, not3.u);
connect(gai2.y, gre1.u2);
connect(gre1.y, and5.u1);
connect(not4.y, assMes2.u);
connect(booToInt2.y, yFloSenAla);
connect(proInt.y, yLowFloAla);
connect(uDam, cloDam.u);
connect(u1Fan, leaDamAla.u2);
connect(not5.y, assMes3.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(conInt2.y, lowTemAla.u1);
connect(not6.y, assMes4.u);
connect(booToInt4.y, lowTemAla.u3);
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(TSup, addPar2.u);
connect(TDis, gre2.u1);
connect(addPar2.y, gre2.u2);
connect(u1Fan, leaValAla.u2);
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(not9.y, and10.u2);
connect(conInt4.y, fanStaAla.u1);
connect(booToInt7.y, fanStaAla.u3);
connect(fanStaAla.y, yFanStaAla);
connect(not10.y, assMes7.u);
connect(not11.y, assMes8.u);
connect(u1TerFan, not12.u);
connect(u1TerFan, and10.u1);
connect(not12.y, and11.u1);
connect(greThr.y, truDel9.u);
connect(truDel9.y, and1.u1);
connect(truDel9.y, and2.u2);
connect(not3.y, and5.u2);
connect(and5.y, truDel2.u);
connect(truDel2.y, not4.u);
connect(truDel2.y, booToInt2.u);
connect(truDel3.y, booToInt3.u);
connect(truDel3.y, not5.u);
connect(gre1.y, leaDamAla.u1);
connect(truDel6.y, booToInt6.u);
connect(truDel6.y, not8.u);
connect(cloVal.y, leaValAla.u1);
connect(and6.y, truDel4.u);
connect(and8.y, truDel5.u);
connect(les2.y, and8.u1);
connect(les1.y, and6.u1);
connect(truDel4.y, and7.u1);
connect(truDel5.y, and9.u1);
connect(u1HotPla, and6.u2);
connect(u1HotPla, and8.u2);
connect(les.y, and13.u1);
connect(and13.y, truDel.u);
connect(gre.y, and12.u1);
connect(and12.y, truDel1.u);
connect(u1Fan, fanIni.u);
connect(fanIni.y, and13.u2);
connect(fanIni.y, and12.u2);
connect(uOpeMod, isOcc.u1);
connect(occMod.y, isOcc.u2);
connect(gai.y, les.u2);
connect(and15.y, lowFloAla.u2);
connect(and3.y, and15.u1);
connect(and15.y, not1.u);
connect(and14.y, booToInt.u);
connect(and4.y, and14.u1);
connect(isOcc.y, and15.u2);
connect(isOcc.y, and14.u2);
connect(and11.y, and16.u1);
connect(and16.y, fanStaAla.u2);
connect(and10.y, and17.u1);
connect(and17.y, booToInt7.u);
connect(and16.y, not10.u);
connect(and17.y, not11.u);
connect(truDel7.y, and16.u2);
connect(leaDamAla.y, leaDamAla1.u1);
connect(leaDamAla1.y, truDel3.u);
connect(cloDam.y, leaDamAla1.u2);
connect(leaValAla.y, leaValAla1.u1);
connect(leaValAla1.y, truDel6.u);
connect(gre2.y, leaValAla1.u2);
connect(truDel8.y, and17.u2);
connect(and7.y, and19.u1);
connect(and19.y, lowTemAla.u2);
connect(and19.y, not6.u);
connect(and18.y, booToInt4.u);
connect(and9.y, and18.u1);
connect(and18.y, not7.u);
connect(isOcc.y, and19.u2);
connect(isOcc.y, and18.u2);
connect(and14.y, not2.u);
end Alarms;
Output signals for controlling variable-volume parallel fan-powered terminal unit
Information
This sequence sets the parallel fan flow rate setpoint, damper and valve position for
variable-volume parallel fan-powered terminal unit.
The implementation is according to Section 5.8.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 primary 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 primary 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 50%, it shall reset
the discharge temperature THeaDisSet
from the current AHU setpoint
temperature TSupSet
to a maximum of dTDisZonSetMax
above space temperature setpoint.
-
The primary 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 primary
airflow at the setpoint.
-
Fan control
-
When the zone stats is cooling (
uCoo > 0
), in occupied mode only, the
parallel fan starts when primary airflow (VPri_flow
) drops below the
the minimum outdoor airflow setpoint VOAMin_flow
(if using California Title 24, it should be the zone absolute minimum outdoor airflow rate)
minus half of the minium fan
rate minRat
and shuts off when primary airflow rises above the
VOAMin_flow
(or the zone absolute minimum outdoor airflow rate). Fan airflow rate
set point is equal to the minimum outdoor airflow rate
minus the current primary airflow set point VPri_flow_Set
.
-
When the zone state is Deadband (
uCoo=0
and uHea=0
),
the parallel fan starts when primary airflow (VPri_flow
) is below the
minimum outdoor airflow VOAMin_flow
(or if using California Title 24,
the zone absolute minimum outdoor airflow rate). The fan flow rate setpoint
is equal to the minimum outdoor airflow rate minus the current primary airflow setpoint
VPri_flow_Set
.
-
When the zone state is Heating (
uHea > 0
), fan shall run. As the
heating-loop output uHea
increases from 50% to 100%, it shall reset
the fan airflow setpoint from the setpoint required in deadband proportionally
up to the maximum heating-fan airflow setpoint maxRat
.
The sequences of controlling damper and the parallel fan for the
unit are described in the following figure below.
As specified in Section 5.8.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] |
Real | minRat | | Lowest parallel fan rate when it receives the lowest signal from BAS [m3/s] |
Real | maxRat | | Maximum heating-fan airflow setpoint [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 |
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 | iniDam | 0.01 | Initial damper position when the damper control is enabled [1] |
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 discharge 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 BooleanInput | u1Fan | AHU supply fan status |
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 RealInput | VOAMin_flow | Minimum outdoor airflow setpoint [m3/s] |
input IntegerInput | uOpeMod | Zone operation mode |
output RealOutput | VPri_flow_Set | Discharge 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 RealOutput | VFan_flow_Set | Paralle fan flow rate setpoint [m3/s] |
output BooleanOutput | y1Fan | Terminal fan command on |
Modelica definition
block DamperValves
parameter Real dTDisZonSetMax(unit="K")=11
;
parameter Real VMin_flow(
final quantity="VolumeFlowRate",
final unit="m3/s")
;
parameter Real VCooMax_flow(
final quantity="VolumeFlowRate",
final unit="m3/s")
;
parameter Real minRat(unit="m3/s")
;
parameter Real maxRat(unit="m3/s")
;
parameter Buildings.Controls.OBC.CDL.Types.SimpleController controllerTypeVal=
Buildings.Controls.OBC.CDL.Types.SimpleController.PI
;
parameter Real kVal(unit="1/K")=0.5
;
parameter Real TiVal(unit="s")=300
;
parameter Real TdVal(unit="s")=0.1
;
parameter Buildings.Controls.OBC.CDL.Types.SimpleController controllerTypeDam=
Buildings.Controls.OBC.CDL.Types.SimpleController.PI
;
parameter Real kDam(unit="1")=0.5
;
parameter Real TiDam(unit="s")=300
;
parameter Real TdDam(unit="s")=0.1
;
parameter Real dTHys(unit="K")=0.25
;
parameter Real looHys(unit="1")=0.05
;
parameter Real floHys(unit="m3/s")=0.01
;
parameter Real iniDam(unit="1")=0.01
;
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.BooleanInput u1Fan
;
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.RealInput VOAMin_flow(
final min=0,
final unit="m3/s",
final quantity="VolumeFlowRate")
;
Buildings.Controls.OBC.CDL.Interfaces.IntegerInput uOpeMod
;
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.RealOutput VFan_flow_Set(
final min=0,
final unit="m3/s",
final quantity="VolumeFlowRate")
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput y1Fan
;
Buildings.Controls.OBC.CDL.Logical.And and4 ;
Buildings.Controls.OBC.CDL.Reals.Line lin
;
Buildings.Controls.OBC.CDL.Reals.Switch swi
;
Buildings.Controls.OBC.CDL.Reals.Switch swi5
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant conZer(
final k=0) ;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant conOne(
final k=1) ;
Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr1(
final t=looHys,
final h=0.5*looHys)
;
Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr(
final t=dTHys,
final h=0.5*dTHys)
;
Buildings.Controls.OBC.CDL.Reals.Subtract sub2
;
Buildings.Controls.OBC.CDL.Reals.Switch swi2 ;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant nomFlow(
final k=
VCooMax_flow)
;
Buildings.Controls.OBC.CDL.Reals.Divide VDisSet_flowNor
;
Buildings.Controls.OBC.CDL.Reals.Divide VDis_flowNor
;
Buildings.Controls.OBC.CDL.Reals.PIDWithReset conDam(
final controllerType=controllerTypeDam,
final k=kDam,
final Ti=TiDam,
final Td=TdDam,
final yMax=1,
final yMin=0,
final y_reset=iniDam)
;
Buildings.Controls.OBC.CDL.Reals.Switch swi3 ;
Buildings.Controls.OBC.CDL.Reals.Line conTDisHeaSet
;
Buildings.Controls.OBC.CDL.Reals.AddParameter addPar(
final p=dTDisZonSetMax)
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant conHal(
final k=0.5)
;
Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr2(
final t=looHys,
final h=0.5*looHys)
;
Buildings.Controls.OBC.CDL.Reals.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.Reals.Sources.Constant conZer3(
final k=0)
;
Buildings.Controls.OBC.CDL.Reals.Switch swi1
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant occ(
final k=Buildings.Controls.OBC.ASHRAE.G36.Types.OperationModes.occupied)
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant minFan(
final k=minRat) ;
Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai1(
final k=0.5) ;
Buildings.Controls.OBC.CDL.Reals.Subtract sub
;
Buildings.Controls.OBC.CDL.Reals.Greater gre(
final h=floHys)
;
Buildings.Controls.OBC.CDL.Logical.Latch lat
;
Buildings.Controls.OBC.CDL.Integers.Equal isOcc
;
Buildings.Controls.OBC.CDL.Logical.And and1
;
Buildings.Controls.OBC.CDL.Reals.Greater gre1(
final h=floHys)
;
Buildings.Controls.OBC.CDL.Reals.Switch swi4
;
Buildings.Controls.OBC.CDL.Reals.Subtract sub1
;
Buildings.Controls.OBC.CDL.Reals.Max max1 ;
Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToRea
;
Buildings.Controls.OBC.CDL.Reals.Multiply mul
;
Buildings.Controls.OBC.CDL.Logical.Or cooHea ;
Buildings.Controls.OBC.CDL.Logical.Not not1 ;
Buildings.Controls.OBC.CDL.Reals.Switch swi6
;
Buildings.Controls.OBC.CDL.Reals.Greater gre2(
final h=floHys)
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToRea1
;
Buildings.Controls.OBC.CDL.Reals.Multiply mul1
;
Buildings.Controls.OBC.CDL.Reals.Line heaFanRat
;
Buildings.Controls.OBC.CDL.Reals.Max max2
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant conHal1(
final k=0.5)
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant conHal2(
final k=1)
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant maxFan(
final k=maxRat) ;
Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToRea2
;
Buildings.Controls.OBC.CDL.Reals.Multiply mul2
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant uno(
final k=Buildings.Controls.OBC.ASHRAE.G36.Types.OperationModes.unoccupied)
;
Buildings.Controls.OBC.CDL.Integers.Equal isUno
;
Buildings.Controls.OBC.CDL.Reals.Switch swi7
;
Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr3(
final t=floHys,
final h=floHys/2)
;
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.Reals.Add add2 ;
Buildings.Controls.OBC.CDL.Reals.Add add1 ;
Buildings.Controls.OBC.CDL.Reals.Switch swi8
;
Buildings.Controls.OBC.CDL.Logical.Or3 or3
;
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(VActMin_flow, swi.u3);
connect(TZon, sub2.u2);
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(swi3.y, yDam);
connect(VDis_flowNor.y, conDam.u_m);
connect(THeaSet, addPar.u);
connect(conZer3.y, conTDisHeaSet.x1);
connect(TSupSet, conTDisHeaSet.f1);
connect(uHea, conTDisHeaSet.u);
connect(conHal.y, conTDisHeaSet.x2);
connect(addPar.y, conTDisHeaSet.f2);
connect(conTDisHeaSet.y, conVal.u_s);
connect(TDis, conVal.u_m);
connect(uHea, greThr2.u);
connect(greThr2.y, swi1.u2);
connect(swi1.y, swi2.u3);
connect(conZer3.y, swi2.u1);
connect(conTDisHeaSet.y, THeaDisSet);
connect(conDam.y, swi3.u3);
connect(conZer3.y, swi3.u1);
connect(minFan.y, gai1.u);
connect(gai1.y, sub.u2);
connect(VOAMin_flow, sub.u1);
connect(sub.y, gre.u1);
connect(VPri_flow, gre.u2);
connect(occ.y, isOcc.u2);
connect(uOpeMod, isOcc.u1);
connect(isOcc.y, and1.u1);
connect(greThr1.y, and1.u2);
connect(VOAMin_flow, gre1.u2);
connect(VPri_flow, gre1.u1);
connect(gre.y, lat.u);
connect(gre1.y, lat.clr);
connect(and1.y, swi4.u2);
connect(VOAMin_flow, sub1.u1);
connect(sub1.y, max1.u2);
connect(conZer3.y, max1.u1);
connect(lat.y, booToRea.u);
connect(booToRea.y, mul.u1);
connect(max1.y, mul.u2);
connect(mul.y, swi4.u1);
connect(VOAMin_flow, gre2.u1);
connect(gre2.y, booToRea1.u);
connect(max1.y, mul1.u1);
connect(booToRea1.y, mul1.u2);
connect(greThr2.y, cooHea.u2);
connect(greThr1.y, cooHea.u1);
connect(cooHea.y, not1.u);
connect(mul1.y, swi6.u1);
connect(not1.y, swi6.u2);
connect(swi6.y, swi4.u3);
connect(conHal1.y, heaFanRat.x1);
connect(mul1.y, max2.u2);
connect(minFan.y, max2.u1);
connect(max2.y, heaFanRat.f1);
connect(uHea, heaFanRat.u);
connect(conHal2.y, heaFanRat.x2);
connect(maxFan.y, heaFanRat.f2);
connect(greThr2.y, booToRea2.u);
connect(booToRea2.y, mul2.u1);
connect(heaFanRat.y, mul2.u2);
connect(mul2.y, swi6.u3);
connect(uno.y, isUno.u1);
connect(uOpeMod, isUno.u2);
connect(isUno.y, swi2.u2);
connect(isUno.y, swi3.u2);
connect(isUno.y, swi7.u2);
connect(swi4.y, swi7.u3);
connect(conZer3.y, swi7.u1);
connect(swi7.y, VFan_flow_Set);
connect(greThr2.y, conVal.trigger);
connect(swi7.y, greThr3.u);
connect(greThr3.y, y1Fan);
connect(conVal.y, swi1.u1);
connect(conZer3.y, swi1.u3);
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,or3. u1);
connect(forCooMax.y,or3. u2);
connect(add1.y,swi8. u1);
connect(add2.y,add1. u2);
connect(minFlo.y,add2. u2);
connect(forMinFlo.y,or3. u3);
connect(swi.y, swi8.u3);
connect(or3.y, swi8.u2);
connect(swi8.y, VPri_flow_Set);
connect(swi8.y, VDisSet_flowNor.u1);
connect(swi8.y, gre2.u2);
connect(swi8.y, sub1.u2);
connect(u1Fan, conDam.trigger);
end DamperValves;
Software switches to override setpoints
Information
This block considers the overrides to the setpoints for parallel fan-powered unit
with variable-volume fan.
The implementation is according to the Section 5.8.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 proven on |
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 command on, 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.Reals.Add add3 ;
Buildings.Controls.OBC.CDL.Logical.Or or2
;
Buildings.Controls.OBC.CDL.Reals.Switch swi1
;
Buildings.Controls.OBC.CDL.Reals.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 variable-volume fan
Information
This sequence outputs the system reset requests for parallel fan-powered terminal
unit with variable-voume fan. The implementation is according to the Section 5.8.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 primary 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(
final unit="K",
final quantity="TemperatureDifference")=3
;
parameter Real twoTemDif(
final unit="K",
final quantity="TemperatureDifference")=2
;
parameter Real thrTDis_1(
final unit="K",
final quantity="TemperatureDifference")=17
;
parameter Real thrTDis_2(
final unit="K",
final quantity="TemperatureDifference")=8.3
;
parameter Real durTimTem(
final unit="s",
final quantity="Time")=120
;
parameter Real durTimFlo(
final unit="s",
final quantity="Time")=60
;
parameter Real durTimDisAir(
final unit="s",
final quantity="Time")=300
;
parameter Real dTHys(
final unit="K",
final quantity="TemperatureDifference")=0.25
;
parameter Real floHys(
final quantity="VolumeFlowRate",
final unit="m3/s")
;
parameter Real looHys(unit="1")
;
parameter Real damPosHys(
final unit="1")
;
parameter Real valPosHys(
final 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.Reals.Less les(
final h=dTHys)
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Reals.Less les1(
final h=dTHys)
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr1(
final t=thrTemDif,
final h=dTHys)
;
Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr2(
final t=twoTemDif,
final h=dTHys)
;
Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr3(
final t=0.95,
final h=damPosHys)
;
Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr(
final t=0.95,
final h=looHys)
;
Buildings.Controls.OBC.CDL.Reals.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.Reals.MultiplyByParameter gai1(
final k=0.5)
;
Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai2(
final k=0.7)
;
Buildings.Controls.OBC.CDL.Reals.Subtract sub2
;
Buildings.Controls.OBC.CDL.Reals.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.Reals.Greater greEqu(
final h=floHys)
;
Buildings.Controls.OBC.CDL.Reals.Greater greEqu1(
final h=floHys)
;
Buildings.Controls.OBC.CDL.Logical.And and5
;
Buildings.Controls.OBC.CDL.Reals.AddParameter addPar(
final p=thrTDis_1)
if have_hotWatCoi
;
Buildings.Controls.OBC.CDL.Reals.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.Reals.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.Reals.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(VPri_flow, sampler1.u);
connect(sampler1.y, greEqu.u2);
connect(sampler1.y, greEqu1.u2);
connect(greThr4.u, sampler2.y);
connect(sampler2.u, VSet_flow);
connect(sampler2.y, gai1.u);
connect(sampler2.y, gai2.u);
end SystemRequests;