Package of subsequences for snap-acting controlled dual-duct terminal unit
Information
This package contains subsequences for snap-acting controlled dual-duct terminal unit.
They are created according to Section 5.11 of ASHRAE Guideline 36, May 2020.
Package Content
Name |
Description |
ActiveAirFlow
|
Output the active airflow setpoint for snap-acting controlled dual-duct terminal unit |
Alarms
|
Generate alarms of snap-acting controlled dual-duct terminal unit |
DampersDualSensors
|
Output signals for controlling dampers of snap-acting controlled dual-duct terminal unit with dual inlet airflow sensors |
DampersSingleSensors
|
Output signals for controlling dampers of snap-acting controlled dual-duct terminal unit with single discharge airflow sensors |
Overrides
|
Software switches to override setpoints |
SystemRequests
|
Output system requests for VAV terminal unit with reheat |
Validation
|
Collection of validation models |
Output the active airflow setpoint for snap-acting controlled dual-duct terminal unit
Information
This sequence sets the active cooling and heating maximum and the active minimum setpoints
for snap-acting controlled dual-duct terminal unit.
The implementation is according to the Section 5.11.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 |
Heating maximum (VActHeaMax_flow ) | VHeaMax_flow |
0 | 0 | VHeaMax_flow | VHeaMax_flow |
0 |
Parameters
Type | Name | Default | Description |
Real | VCooMax_flow | | Design zone cooling maximum airflow rate [m3/s] |
Real | VHeaMax_flow | | Design zone heating maximum airflow rate [m3/s] |
Connectors
Type | Name | Description |
input RealInput | VOccMin_flow | Occupied minimum airflow setpoint [m3/s] |
input IntegerInput | uOpeMod | Zone operation mode |
output RealOutput | VActCooMax_flow | Active cooling maximum airflow setpoint [m3/s] |
output RealOutput | VActMin_flow | Active minimum airflow setpoint [m3/s] |
output RealOutput | VActHeaMax_flow | Active heating maximum airflow setpoint [m3/s] |
Modelica definition
block ActiveAirFlow
parameter Real VCooMax_flow(
final quantity="VolumeFlowRate",
final unit="m3/s")
;
parameter Real VHeaMax_flow(
final quantity="VolumeFlowRate",
final unit="m3/s")
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput VOccMin_flow(
final unit="m3/s",
final quantity="VolumeFlowRate")
;
Buildings.Controls.OBC.CDL.Interfaces.IntegerInput uOpeMod
;
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")
;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput VActHeaMax_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.Or 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.Conversions.BooleanToReal heaMaxFlo(
final realTrue=VHeaMax_flow)
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant setBacMod(
final k=Buildings.Controls.OBC.ASHRAE.G36.Types.OperationModes.setBack)
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant warUpMod(
final k=Buildings.Controls.OBC.ASHRAE.G36.Types.OperationModes.warmUp)
;
Buildings.Controls.OBC.CDL.Integers.Equal ifOcc
;
Buildings.Controls.OBC.CDL.Integers.Equal ifCooDow
;
Buildings.Controls.OBC.CDL.Integers.Equal ifSetUp
;
Buildings.Controls.OBC.CDL.Integers.Equal ifWarUp
;
Buildings.Controls.OBC.CDL.Integers.Equal ifSetBac
;
Buildings.Controls.OBC.CDL.Logical.Or or1
;
Buildings.Controls.OBC.CDL.Logical.Or or2
;
Buildings.Controls.OBC.CDL.Logical.Or or4
;
equation
connect(occMod.y, ifOcc.u1);
connect(cooDowMod.y, ifCooDow.u1);
connect(setUpMod.y, ifSetUp.u1);
connect(warUpMod.y, ifWarUp.u1);
connect(uOpeMod, ifOcc.u2);
connect(uOpeMod, ifCooDow.u2);
connect(uOpeMod, ifSetUp.u2);
connect(uOpeMod, ifWarUp.u2);
connect(uOpeMod, ifSetBac.u2);
connect(setBacMod.y, ifSetBac.u1);
connect(ifOcc.y, or3.u1);
connect(ifCooDow.y, or3.u2);
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);
connect(ifOcc.y, or1.u1);
connect(ifWarUp.y, or1.u2);
connect(heaMaxFlo.y, VActHeaMax_flow);
connect(or3.y, or2.u1);
connect(or2.y, actCooMax.u);
connect(or1.y, or4.u1);
connect(or4.y, heaMaxFlo.u);
connect(ifSetUp.y, or2.u2);
connect(ifSetBac.y, or4.u2);
end ActiveAirFlow;
Generate alarms of snap-acting controlled dual-duct terminal unit
Information
This block outputs alarms of snap-acting controlled dual-duct terminal unit. The
implementation is according to the Section 5.11.6 of ASHRAE Guideline 36, May 2020.
Low airflow
-
If the zone is in occupied mode and after the AHU supply fan has been enabled for
staTim
,
if the measured airflow VDis_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 zone is in occupied mode and after the AHU supply fan has been enabled for
staTim
,
if the measured airflow VDis_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.
Airflow sensor calibration
-
If the unit has dual inlet sensor (
have_duaSen=true
):
-
If the cooling fan serving the zone has been OFF (
u1CooFan=false
) for 10 minutes
(fanOffTim
), and the cold-duct airflow sensor reading VColDucDis_flow
is above 10% of the cooling maximum airflow setpoint VCooMax_flow
,
generate a Level 3 alarm.
-
If the heating fan serving the zone has been OFF (
u1HeaFan=false
) for 10 minutes
(fanOffTim
), and the hot-duct airflow sensor reading VHotDucDis_flow
is above 10% of the heating maximum airflow setpoint VHeaMax_flow
,
generate a Level 3 alarm.
-
If the unit has single discharge flow sensor (
have_duaSen=false
):
-
If the cooling and heating fans serving the zone have been OFF (
u1CooFan=false
and u1HeaFan=false
) for 10 minutes (fanOffTim
), and the
discharge airflow sensor reading VDis_flow
is above 10% of the cooling maximum airflow setpoint VCooMax_flow
,
generate a Level 3 alarm.
Leaking damper
-
If the unit has dual inlet sensor (
have_duaSen=true
):
-
If the cooling damper position (
uCooDam
) is 0% and airflow sensor reading
VColDucDis_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 (u1CooFan=true
), generate a Level
4 alarm.
-
If the heating damper position (
uHeaDam
) is 0% and airflow sensor reading
VHotDucDis_flow
is above 10% of the heating maximum airflow setpoint
VHeaMax_flow
for 10 minutes (leaFloTim
) while the
fan serving the zone is proven on (u1HeaFan=true
), generate a Level
4 alarm.
-
If the unit has single discharge flow sensor (
have_duaSen=false
):
-
If the cooling and heating damper position (
uCooDam
and uHeaDam
)
are 0% and airflow sensor reading
VDis_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 (u1CooFan=true
or u1HeaFan=true
),
generate a Level 4 alarm.
Parameters
Type | Name | Default | Description |
Boolean | have_duaSen | | True: the unit have dual inlet flow sensor |
Real | staPreMul | | Importance multiplier for the zone static pressure reset control loop |
Real | VCooMax_flow | | Design zone cooling maximum airflow rate [m3/s] |
Real | VHeaMax_flow | | Design zone heating maximum airflow rate [m3/s] |
Real | lowFloTim | 300 | Threshold time to check low flow rate [s] |
Real | fanOffTim | 600 | Threshold time to check fan off [s] |
Real | leaFloTim | 600 | Threshold time to check damper leaking airflow [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 | damPosHys | 0.05 | Near zero damper position, below which the damper will be seen as closed [1] |
Real | staTim | 1800 | Delay triggering alarms after enabling AHU supply fan [s] |
Connectors
Type | Name | Description |
input RealInput | VDis_flow | Measured discharge airflow rate [m3/s] |
input RealInput | VActSet_flow | Active airflow setpoint [m3/s] |
input IntegerInput | uOpeMod | Zone operation mode |
input RealInput | VColDucDis_flow | Measured cold-duct discharge airflow rate [m3/s] |
input BooleanInput | u1CooFan | Cooling air handler supply fan status |
input RealInput | uCooDam | Cooling damper position setpoint [1] |
input RealInput | VHotDucDis_flow | Measured hot-duct discharge airflow rate [m3/s] |
input BooleanInput | u1HeaFan | Heating air handler supply fan status |
input RealInput | uHeaDam | Heating damper position setpoint [1] |
output IntegerOutput | yLowFloAla | Low airflow alarms |
output IntegerOutput | yFloSenAla | Airflow sensor calibration alarm |
output IntegerOutput | yLeaDamAla | Leaking dampers alarm, could be heating or cooling damper |
output IntegerOutput | yColFloSenAla | Cold-duct airflow sensor calibration alarm |
output IntegerOutput | yColLeaDamAla | Leaking cold-duct damper alarm |
output IntegerOutput | yHotFloSenAla | Hot-duct airflow sensor calibration alarm |
output IntegerOutput | yHotLeaDamAla | Leaking hot-duct damper alarm |
Modelica definition
block Alarms
parameter Boolean have_duaSen
;
parameter Real staPreMul
;
parameter Real VCooMax_flow(
final quantity="VolumeFlowRate",
final unit="m3/s")
;
parameter Real VHeaMax_flow(
final quantity="VolumeFlowRate",
final unit="m3/s")
;
parameter Real lowFloTim(
final unit="s",
final quantity="Time")=300
;
parameter Real fanOffTim(
final unit="s",
final quantity="Time")=600
;
parameter Real leaFloTim(
final unit="s",
final quantity="Time")=600
;
parameter Real floHys(
final quantity="VolumeFlowRate",
final unit="m3/s")=0.05
;
parameter Real damPosHys(
final unit="1")=0.05
;
parameter Real staTim(
final unit="s",
final quantity="Time")=1800
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput VDis_flow(
final min=0,
final unit="m3/s",
final quantity="VolumeFlowRate")
if not have_duaSen
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput VActSet_flow(
final min=0,
final unit="m3/s",
final quantity="VolumeFlowRate") ;
Buildings.Controls.OBC.CDL.Interfaces.IntegerInput uOpeMod
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput VColDucDis_flow(
final min=0,
final unit="m3/s",
final quantity="VolumeFlowRate")
if have_duaSen
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1CooFan
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput uCooDam(
final min=0,
final unit="1")
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput VHotDucDis_flow(
final min=0,
final unit="m3/s",
final quantity="VolumeFlowRate")
if have_duaSen
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1HeaFan
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput uHeaDam(
final min=0,
final unit="1")
;
Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yLowFloAla
;
Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yFloSenAla
if not have_duaSen
;
Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yLeaDamAla
if not have_duaSen
;
Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yColFloSenAla
if have_duaSen ;
Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yColLeaDamAla
if have_duaSen ;
Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yHotFloSenAla
if have_duaSen ;
Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yHotLeaDamAla
if have_duaSen ;
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 and8
;
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)
if have_duaSen ;
Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai2(
final k=0.1)
if have_duaSen
;
Buildings.Controls.OBC.CDL.Logical.Not not3
if have_duaSen
;
Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel2(
final delayTime=fanOffTim)
if have_duaSen
;
Buildings.Controls.OBC.CDL.Reals.Greater gre1(
final h=floHys)
if have_duaSen
;
Buildings.Controls.OBC.CDL.Logical.And and5
if have_duaSen
;
Buildings.Controls.OBC.CDL.Logical.Not not4
if have_duaSen
;
Buildings.Controls.OBC.CDL.Utilities.Assert assMes2(
final message="Warning: cold-duct airflow sensor should be calibrated.")
if have_duaSen
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt2(
final integerTrue=3)
if have_duaSen
;
Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel3(
final delayTime=leaFloTim)
if have_duaSen
;
Buildings.Controls.OBC.CDL.Reals.LessThreshold cloDam(
final t=damPosHys,
final h=0.5*damPosHys) ;
Buildings.Controls.OBC.CDL.Logical.And leaDamAla
if have_duaSen
;
Buildings.Controls.OBC.CDL.Logical.Not not5
if have_duaSen
;
Buildings.Controls.OBC.CDL.Utilities.Assert assMes3(
final message="Warning: the cold-duct damper is leaking.")
if have_duaSen
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt3(
final integerTrue=4)
if have_duaSen
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant heaMaxFlo(
final k=VHeaMax_flow)
if have_duaSen ;
Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai3(
final k=0.1)
if have_duaSen
;
Buildings.Controls.OBC.CDL.Logical.Not not6
if have_duaSen
;
Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel4(
final delayTime=fanOffTim)
if have_duaSen
;
Buildings.Controls.OBC.CDL.Reals.Greater gre2(
final h=floHys)
if have_duaSen
;
Buildings.Controls.OBC.CDL.Logical.And and6
if have_duaSen
;
Buildings.Controls.OBC.CDL.Logical.Not not7
if have_duaSen
;
Buildings.Controls.OBC.CDL.Utilities.Assert assMes4(
final message="Warning: hot-duct airflow sensor should be calibrated.")
if have_duaSen
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt4(
final integerTrue=3)
if have_duaSen
;
Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel5(
final delayTime=leaFloTim)
if have_duaSen
;
Buildings.Controls.OBC.CDL.Reals.LessThreshold cloDam1(
final t=damPosHys,
final h=0.5*damPosHys)
;
Buildings.Controls.OBC.CDL.Logical.And leaDamAla1
if have_duaSen
;
Buildings.Controls.OBC.CDL.Logical.Not not8
if have_duaSen
;
Buildings.Controls.OBC.CDL.Utilities.Assert assMes5(
final message="Warning: the hot-duct damper is leaking.")
if have_duaSen
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt5(
final integerTrue=4)
if have_duaSen
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant cooMaxFlo1(
final k=VCooMax_flow)
if not have_duaSen
;
Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai4(
final k=0.1)
if not have_duaSen
;
Buildings.Controls.OBC.CDL.Reals.Greater gre3(
final h=floHys)
if not have_duaSen
;
Buildings.Controls.OBC.CDL.Logical.And and7
if not have_duaSen
;
Buildings.Controls.OBC.CDL.Logical.Not not9
if not have_duaSen
;
Buildings.Controls.OBC.CDL.Utilities.Assert assMes6(
final message="Warning: airflow sensor should be calibrated.")
if not have_duaSen
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt6(
final integerTrue=3)
if not have_duaSen
;
Buildings.Controls.OBC.CDL.Logical.Or or2
if not have_duaSen
;
Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel6(
final delayTime=fanOffTim)
if not have_duaSen
;
Buildings.Controls.OBC.CDL.Logical.Not not10
if not have_duaSen
;
Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel7(
final delayTime=leaFloTim)
if not have_duaSen
;
Buildings.Controls.OBC.CDL.Logical.And leaDamAla2
if not have_duaSen
;
Buildings.Controls.OBC.CDL.Logical.And cloBotDam
if not have_duaSen
;
Buildings.Controls.OBC.CDL.Logical.Not not11
if not have_duaSen
;
Buildings.Controls.OBC.CDL.Utilities.Assert assMes7(
final message="Warning: the cold-duct or hot-dcut damper is leaking.")
if not have_duaSen
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt7(
final integerTrue=4)
if not have_duaSen
;
Buildings.Controls.OBC.CDL.Reals.Add add2
if have_duaSen
;
Buildings.Controls.OBC.CDL.Logical.TrueDelay truDel8(
final delayTime=lowFloTim)
;
Buildings.Controls.OBC.CDL.Logical.TrueDelay fanIni(
final delayTime=staTim)
;
Buildings.Controls.OBC.CDL.Logical.And and11
;
Buildings.Controls.OBC.CDL.Logical.And and10
;
Buildings.Controls.OBC.CDL.Logical.Or or1
;
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 and3
;
Buildings.Controls.OBC.CDL.Logical.And and9
;
Buildings.Controls.OBC.CDL.Logical.And leaDamAla3
if not have_duaSen
;
Buildings.Controls.OBC.CDL.Logical.And leaDamAla4
if have_duaSen
;
Buildings.Controls.OBC.CDL.Logical.And leaDamAla5
if have_duaSen
;
equation
connect(VActSet_flow, gai.u);
connect(VDis_flow, les.u1);
connect(VActSet_flow, greThr.u);
connect(VActSet_flow, gai1.u);
connect(VDis_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,and8. u1);
connect(greThr1.y,and8. u2);
connect(and1.y, and4.u1);
connect(greThr1.y, and4.u2);
connect(not2.y, assMes1.u);
connect(cooMaxFlo.y, gai2.u);
connect(u1CooFan, not3.u);
connect(gai2.y, gre1.u2);
connect(gre1.y, and5.u1);
connect(not4.y, assMes2.u);
connect(booToInt2.y, yColFloSenAla);
connect(proInt.y, yLowFloAla);
connect(uCooDam, cloDam.u);
connect(u1CooFan, leaDamAla.u2);
connect(not5.y, assMes3.u);
connect(booToInt3.y, yColLeaDamAla);
connect(VColDucDis_flow, gre1.u1);
connect(heaMaxFlo.y, gai3.u);
connect(u1HeaFan, not6.u);
connect(gai3.y,gre2. u2);
connect(gre2.y,and6. u1);
connect(not7.y,assMes4. u);
connect(booToInt4.y, yHotFloSenAla);
connect(uHeaDam, cloDam1.u);
connect(u1HeaFan, leaDamAla1.u2);
connect(not8.y,assMes5. u);
connect(booToInt5.y, yHotLeaDamAla);
connect(VHotDucDis_flow, gre2.u1);
connect(VDis_flow, gre3.u1);
connect(u1CooFan, or2.u1);
connect(u1HeaFan, or2.u2);
connect(or2.y, not10.u);
connect(not9.y, assMes6.u);
connect(booToInt6.y, yFloSenAla);
connect(gai4.y, gre3.u2);
connect(cooMaxFlo1.y, gai4.u);
connect(or2.y, leaDamAla2.u2);
connect(cloDam.y, cloBotDam.u1);
connect(cloDam1.y, cloBotDam.u2);
connect(not11.y, assMes7.u);
connect(booToInt7.y, yLeaDamAla);
connect(VColDucDis_flow, add2.u1);
connect(VHotDucDis_flow, add2.u2);
connect(add2.y, les.u1);
connect(add2.y, gre.u2);
connect(add2.y, gre3.u1);
connect(greThr.y, truDel8.u);
connect(truDel8.y, and1.u1);
connect(truDel8.y, and2.u2);
connect(gre3.y, and7.u1);
connect(not10.y, and7.u2);
connect(and7.y, truDel6.u);
connect(truDel6.y, booToInt6.u);
connect(truDel6.y, not9.u);
connect(truDel7.y, booToInt7.u);
connect(truDel7.y, not11.u);
connect(gre3.y, leaDamAla2.u1);
connect(not3.y, and5.u2);
connect(and5.y, truDel2.u);
connect(truDel2.y, booToInt2.u);
connect(truDel2.y, not4.u);
connect(gre1.y, leaDamAla.u1);
connect(truDel3.y, booToInt3.u);
connect(truDel3.y, not5.u);
connect(and6.y, truDel4.u);
connect(truDel4.y, booToInt4.u);
connect(not6.y, and6.u2);
connect(truDel4.y, not7.u);
connect(truDel5.y, booToInt5.u);
connect(truDel5.y, not8.u);
connect(gre2.y, leaDamAla1.u1);
connect(les.y, and10.u1);
connect(and10.y, truDel.u);
connect(gre.y, and11.u1);
connect(and11.y, truDel1.u);
connect(fanIni.y, and10.u2);
connect(u1CooFan, or1.u1);
connect(u1HeaFan, or1.u2);
connect(or1.y, fanIni.u);
connect(occMod.y,isOcc. u2);
connect(uOpeMod,isOcc. u1);
connect(fanIni.y, and11.u2);
connect(gai.y, les.u2);
connect(and8.y, and9.u1);
connect(and9.y, lowFloAla.u2);
connect(booToInt.u, and3.y);
connect(and9.y, not1.u);
connect(and3.y, not2.u);
connect(and4.y, and3.u1);
connect(isOcc.y, and9.u2);
connect(isOcc.y, and3.u2);
connect(leaDamAla2.y, leaDamAla3.u1);
connect(leaDamAla3.y, truDel7.u);
connect(cloBotDam.y, leaDamAla3.u2);
connect(leaDamAla.y, leaDamAla4.u1);
connect(leaDamAla4.y, truDel3.u);
connect(cloDam.y, leaDamAla4.u2);
connect(leaDamAla1.y, leaDamAla5.u1);
connect(leaDamAla5.y, truDel5.u);
connect(cloDam1.y, leaDamAla5.u2);
end Alarms;
Output signals for controlling dampers of snap-acting controlled dual-duct terminal unit with dual inlet airflow sensors
Information
This sequence sets the dampers for snap-acting controlled dual-duct terminal unit
with dual inlet airflow sensors.
The implementation is according to Section 5.11.5.1 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 reset the cooling supply airflow setpoint
VColDucDis_flow_Set
from the minimum VActMin_flow
to
cooling maximum setpoint VActCooMax_flow
. The cooling damper shall be
modulated by a control loop to maintain the measured cooling aiflow
VColDucDis_flow
at setpoint. The heating damper shall be closed
yHeaDam=0
.
-
If the cold-deck supply air temperature
TColSup
from the cooling air handler
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
), the cooling
and heating airflow set points shall be their last set points just before entering deadband.
In other words, when going from cooling to deadband, the cooling airflow set point is
equal to the zone minimum VActMin_flow
, and the heating set point is zero
When going from heating to deadband, the heating airflow set point is equal to the
zone minimum VActMin_flow
, and the cooling set point is zero.
-
When the zone state is heating (
uHea > 0
), then the heating loop output
uHea
shall reset the heating supply airflow setpoint
VHotDucDis_flow_Set
from the minimum VActMin_flow
to
heating maximum setpoint VActHeaMax_flow
. The heating damper shall be
modulated by a control loop to maintain the measured heating aiflow
VHotDucDis_flow
at setpoint. The cooling damper shall be closed
yCooDam=0
.
-
If the hot-deck supply air temperature
THotSup
from the heating air handler
is less than room temperature TZon
, heating supply airflow setpoint shall be
no higher than the minimum.
-
Overriding above controls:
-
If heating air handler is not proven ON (
u1HeaAHU=false
), the heating
damper shall be closed (yHeaDam=0
).
-
If cooling air handler is not proven ON (
u1CooAHU=false
), the cooling
damper shall be closed (yCooDam=0
).
The sequences of controlling dampers position for snap-acting controlled dual-duct terminal unit
with dual inlet airflow sensors are described in the following figure below.
Parameters
Type | Name | Default | Description |
Real | VCooMax_flow | | Design zone cooling maximum airflow rate [m3/s] |
Real | VHeaMax_flow | | Design zone heating maximum airflow rate [m3/s] |
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 | samplePeriod | | Sample period of component [s] |
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 | iniDam | 0.01 | Initial damper position when the damper control is enabled [1] |
Connectors
Type | Name | Description |
input RealInput | uCoo | Cooling control signal [1] |
input RealInput | VActCooMax_flow | Active cooling maximum airflow rate [m3/s] |
input RealInput | TColSup | Cold duct supply air temperature from central air handler [K] |
input RealInput | VColDucDis_flow | Measured cold-duct discharge airflow rate airflow rate [m3/s] |
input BooleanInput | u1CooAHU | Cooling air handler status |
input RealInput | VActMin_flow | Active minimum airflow rate [m3/s] |
input RealInput | TZon | Measured zone temperature [K] |
input RealInput | THotSup | Hot duct supply air temperature from central air handler [K] |
input RealInput | uHea | Heating control signal [1] |
input RealInput | VActHeaMax_flow | Active heating maximum airflow rate [m3/s] |
input RealInput | VHotDucDis_flow | Measured hot-duct discharge airflow rate airflow rate [m3/s] |
input BooleanInput | u1HeaAHU | Heating air handler status |
output RealOutput | VDis_flow_Set | Discharge airflow setpoint [m3/s] |
output RealOutput | VColDucDis_flow_Set | Cold duct discharge airflow setpoint [m3/s] |
output RealOutput | yCooDam | Cold duct damper commanded position [1] |
output RealOutput | VHotDucDis_flow_Set | Hot duct discharge airflow setpoint [m3/s] |
output RealOutput | yHeaDam | Hot duct damper commanded position [1] |
Modelica definition
block DampersDualSensors
parameter Real VCooMax_flow(
final quantity="VolumeFlowRate",
final unit="m3/s")
;
parameter Real VHeaMax_flow(
final quantity="VolumeFlowRate",
final unit="m3/s")
;
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 samplePeriod(
final unit="s",
final quantity="Time",
final min=1E-3)
;
parameter Real dTHys(
final unit="K",
final quantity="TemperatureDifference")=0.25
;
parameter Real looHys(
final unit="1") = 0.05
;
parameter Real iniDam(unit="1")=0.01
;
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 TColSup(
final unit="K",
final displayUnit="degC",
final quantity="ThermodynamicTemperature")
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput VColDucDis_flow(
final min=0,
final unit="m3/s",
final quantity="VolumeFlowRate")
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1CooAHU
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput VActMin_flow(
final min=0,
final unit="m3/s",
final quantity="VolumeFlowRate")
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput TZon(
final unit="K",
final displayUnit="degC",
final quantity="ThermodynamicTemperature")
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput THotSup(
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 VActHeaMax_flow(
final min=0,
final unit="m3/s",
final quantity="VolumeFlowRate")
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput VHotDucDis_flow(
final min=0,
final unit="m3/s",
final quantity="VolumeFlowRate")
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1HeaAHU
;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput VDis_flow_Set(
final min=0,
final unit="m3/s",
final quantity="VolumeFlowRate")
;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput VColDucDis_flow_Set(
final min=0,
final unit="m3/s",
final quantity="VolumeFlowRate")
;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput yCooDam(
final min=0,
final max=1,
final unit="1") ;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput VHotDucDis_flow_Set(
final min=0,
final unit="m3/s",
final quantity="VolumeFlowRate") ;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput yHeaDam(
final min=0,
final max=1,
final unit="1") ;
Buildings.Controls.OBC.CDL.Logical.And and4 ;
Buildings.Controls.OBC.CDL.Reals.Line lin
;
Buildings.Controls.OBC.CDL.Reals.PIDWithReset conCooDam(
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 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 cooDamPos
;
Buildings.Controls.OBC.CDL.Reals.Divide VDis_flowNor
;
Buildings.Controls.OBC.CDL.Reals.Divide VDisSet_flowNor
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant conZer1(
final k=0)
;
Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr2(
final t=looHys,
final h=0.5*looHys)
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant conOne1(
final k=1)
;
Buildings.Controls.OBC.CDL.Reals.Line lin1
;
Buildings.Controls.OBC.CDL.Reals.Subtract sub1
;
Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr3(
final t=dTHys,
final h=0.5*dTHys)
;
Buildings.Controls.OBC.CDL.Logical.And and1 ;
Buildings.Controls.OBC.CDL.Reals.Switch swi1
;
Buildings.Controls.OBC.CDL.Logical.Or or2
;
Buildings.Controls.OBC.CDL.Logical.Not not1
;
Buildings.Controls.OBC.CDL.Logical.FallingEdge falEdg
;
Buildings.Controls.OBC.CDL.Logical.And and2
;
Buildings.Controls.OBC.CDL.Logical.And and3
;
Buildings.Controls.OBC.CDL.Discrete.Sampler samHea(
final samplePeriod=samplePeriod)
;
Buildings.Controls.OBC.CDL.Discrete.Sampler samCoo(
final samplePeriod=samplePeriod)
;
Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr4(
final t=looHys,
final h=0.5*looHys)
;
Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr5(
final t=looHys,
final h=0.5*looHys) ;
Buildings.Controls.OBC.CDL.Logical.Latch lat
;
Buildings.Controls.OBC.CDL.Logical.Latch lat1
;
Buildings.Controls.OBC.CDL.Reals.Switch swi2
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant conZer2(
final k=0)
;
Buildings.Controls.OBC.CDL.Reals.Switch swi3
;
Buildings.Controls.OBC.CDL.Reals.Switch swi4
;
Buildings.Controls.OBC.CDL.Reals.PIDWithReset conHeaDam(
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 heaDamPos
;
Buildings.Controls.OBC.CDL.Reals.Divide VDis_flowNor1
;
Buildings.Controls.OBC.CDL.Reals.Divide VDisSet_flowNor1
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant conZer3(
final k=0)
;
Buildings.Controls.OBC.CDL.Logical.Not not2 ;
Buildings.Controls.OBC.CDL.Logical.Not not3
;
Buildings.Controls.OBC.CDL.Reals.Multiply mul
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToRea(
final realTrue=0,
final realFalse=1)
;
Buildings.Controls.OBC.CDL.Reals.Multiply mul1
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToRea1(
final realTrue=0,
final realFalse=1)
;
Buildings.Controls.OBC.CDL.Reals.Multiply mul2
;
Buildings.Controls.OBC.CDL.Reals.Multiply mul3
;
Buildings.Controls.OBC.CDL.Reals.Add add2
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant heaMax1(
final k=VHeaMax_flow)
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant cooMax1(
final k=VCooMax_flow)
;
Buildings.Controls.OBC.CDL.Reals.Max max2
;
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(TColSup, sub2.u1);
connect(sub2.y, greThr.u);
connect(greThr.y, and4.u2);
connect(cooDamPos.y, yCooDam);
connect(VColDucDis_flow, VDis_flowNor.u1);
connect(VDis_flowNor.y, conCooDam.u_m);
connect(VDisSet_flowNor.y, conCooDam.u_s);
connect(greThr1.y, and4.u1);
connect(greThr1.y, swi.u2);
connect(VActMin_flow, swi5.u1);
connect(VActMin_flow, lin.f1);
connect(conZer1.y, lin1.x1);
connect(VActMin_flow, lin1.f1);
connect(conOne1.y, lin1.x2);
connect(uHea, lin1.u);
connect(TZon, sub2.u2);
connect(uHea, greThr2.u);
connect(VActHeaMax_flow, lin1.f2);
connect(TZon, sub1.u1);
connect(sub1.y, greThr3.u);
connect(THotSup, sub1.u2);
connect(greThr3.y, and1.u1);
connect(greThr2.y, and1.u2);
connect(and1.y, swi1.u2);
connect(VActMin_flow, swi1.u1);
connect(lin1.y, swi1.u3);
connect(greThr1.y, or2.u1);
connect(greThr2.y, or2.u2);
connect(or2.y, not1.u);
connect(not1.y, falEdg.u);
connect(not1.y, and2.u1);
connect(not1.y, and3.u2);
connect(uHea, samHea.u);
connect(uCoo, samCoo.u);
connect(samCoo.y, greThr4.u);
connect(greThr4.y, and3.u1);
connect(samHea.y, greThr5.u);
connect(greThr5.y, and2.u2);
connect(and3.y, lat.u);
connect(falEdg.y, lat.clr);
connect(and2.y, lat1.u);
connect(falEdg.y, lat1.clr);
connect(lat.y, swi2.u2);
connect(VActMin_flow, swi2.u1);
connect(conZer2.y, swi2.u3);
connect(lat1.y, swi3.u2);
connect(VActMin_flow, swi3.u1);
connect(conZer2.y, swi3.u3);
connect(swi2.y, swi.u3);
connect(greThr2.y, swi4.u2);
connect(swi1.y, swi4.u1);
connect(swi3.y, swi4.u3);
connect(heaDamPos.y, yHeaDam);
connect(VDis_flowNor1.y, conHeaDam.u_m);
connect(VDisSet_flowNor1.y, conHeaDam.u_s);
connect(VHotDucDis_flow, VDis_flowNor1.u1);
connect(conZer3.y, cooDamPos.u1);
connect(conZer3.y, heaDamPos.u1);
connect(u1HeaAHU, not2.u);
connect(not2.y, heaDamPos.u2);
connect(u1HeaAHU, conHeaDam.trigger);
connect(u1CooAHU, not3.u);
connect(not3.y, cooDamPos.u2);
connect(u1CooAHU, conCooDam.trigger);
connect(greThr1.y, booToRea.u);
connect(swi4.y, mul.u1);
connect(booToRea.y, mul.u2);
connect(mul.y, VHotDucDis_flow_Set);
connect(mul.y, VDisSet_flowNor1.u1);
connect(booToRea.y, mul1.u2);
connect(mul1.y, heaDamPos.u3);
connect(conHeaDam.y, mul1.u1);
connect(greThr2.y, booToRea1.u);
connect(swi.y, mul2.u1);
connect(booToRea1.y, mul2.u2);
connect(mul2.y, VColDucDis_flow_Set);
connect(mul2.y, VDisSet_flowNor.u1);
connect(booToRea1.y, mul3.u2);
connect(conCooDam.y, mul3.u1);
connect(mul3.y, cooDamPos.u3);
connect(mul2.y, add2.u2);
connect(mul.y, add2.u1);
connect(add2.y, VDis_flow_Set);
connect(cooMax1.y,max2. u1);
connect(heaMax1.y,max2. u2);
connect(max2.y, VDisSet_flowNor.u2);
connect(max2.y, VDis_flowNor.u2);
connect(max2.y, VDisSet_flowNor1.u2);
connect(max2.y, VDis_flowNor1.u2);
end DampersDualSensors;
Output signals for controlling dampers of snap-acting controlled dual-duct terminal unit with single discharge airflow sensors
Information
This sequence sets the dampers for snap-acting controlled dual-duct terminal unit
with single discharge airflow sensors.
The implementation is according to Section 5.11.5.2 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 reset the discharge airflow setpoint
VDis_flow_Set
from the minimum VActMin_flow
to
cooling maximum setpoint VActCooMax_flow
. The cooling damper shall be
modulated by a control loop to maintain the measured discharge aiflow
VDis_flow
at setpoint. The heating damper shall be closed
yHeaDam=0
.
-
When the zone state is deadband (
uCoo=0
and uHea=0
), the
discharge airflow set point VDis_flow_Set
shall be the zone minimum
VActMin_flow
, maintained by the damper that was operative just before
entering deadband. The other damper shall remain closed. In other words, when going
from cooling to deadband, the cooling damper shall maintain the discharge airflow at
the zone minimum set point, and the heating damper shall be closed. When going from
heating to deadband, the heating damper shall maintain the discharge airflow at the
zone minimum set point, and the cooling damper shall be closed.
-
When the zone state is heating (
uHea > 0
), then the heating loop output
uHea
shall reset the discharge airflow setpoint
VDis_flow_Set
from the minimum VActMin_flow
to
heating maximum setpoint VActHeaMax_flow
. The heating damper shall be
modulated by a control loop to maintain the measured discharge aiflow
VDis_flow
at setpoint. The cooling damper shall be closed
yCooDam=0
.
-
Overriding above controls:
-
If heating air handler is not proven ON (
u1HeaAHU=false
), the heating
damper shall be closed (yHeaDam=0
).
-
If cooling air handler is not proven ON (
u1CooAHU=false
), the cooling
damper shall be closed (yCooDam=0
).
The sequences of controlling dampers position for snap-acting controlled dual-duct terminal unit
with single discharge airflow sensors are described in the following figure below.
Parameters
Type | Name | Default | Description |
Real | VCooMax_flow | | Design zone cooling maximum airflow rate [m3/s] |
Real | VHeaMax_flow | | Design zone heating maximum airflow rate [m3/s] |
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 | samplePeriod | | Sample period of component [s] |
Real | looHys | 0.05 | Loop output hysteresis below which the output will be seen as zero [1] |
Real | iniDam | 0.01 | Initial damper position when the damper control is enabled [1] |
Connectors
Type | Name | Description |
input RealInput | uCoo | Cooling control signal [1] |
input RealInput | VActCooMax_flow | Active cooling maximum airflow rate [m3/s] |
input RealInput | VActMin_flow | Active minimum airflow rate [m3/s] |
input RealInput | uHea | Heating control signal [1] |
input RealInput | VActHeaMax_flow | Active heating maximum airflow rate [m3/s] |
input RealInput | VDis_flow | Measured discharge airflow rate airflow rate [m3/s] |
input BooleanInput | u1CooAHU | Cooling air handler status |
input BooleanInput | u1HeaAHU | Heating air handler status |
output RealOutput | VDis_flow_Set | Discharge airflow setpoint [m3/s] |
output BooleanOutput | y1CooDam | Cooling damper command open |
output RealOutput | yCooDam | Cold duct damper commanded position [1] |
output BooleanOutput | y1HeaDam | Heating damper command open |
output RealOutput | yHeaDam | Hot duct damper commanded position [1] |
Modelica definition
block DampersSingleSensors
parameter Real VCooMax_flow(
final quantity="VolumeFlowRate",
final unit="m3/s")
;
parameter Real VHeaMax_flow(
final quantity="VolumeFlowRate",
final unit="m3/s")
;
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 samplePeriod(
final unit="s",
final quantity="Time",
final min=1E-3)
;
parameter Real looHys(
final unit="1") = 0.05
;
parameter Real iniDam(unit="1")=0.01
;
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 VActMin_flow(
final min=0,
final unit="m3/s",
final quantity="VolumeFlowRate")
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput uHea(
final min=0,
final max=1,
final unit="1")
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput VActHeaMax_flow(
final min=0,
final unit="m3/s",
final quantity="VolumeFlowRate")
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput VDis_flow(
final min=0,
final unit="m3/s",
final quantity="VolumeFlowRate")
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1CooAHU
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1HeaAHU
;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput VDis_flow_Set(
final min=0,
final unit="m3/s",
final quantity="VolumeFlowRate")
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput y1CooDam
;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput yCooDam(
final min=0,
final max=1,
final unit="1") ;
Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput y1HeaDam
;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput yHeaDam(
final min=0,
final max=1,
final unit="1") ;
Buildings.Controls.OBC.CDL.Reals.Line lin
;
Buildings.Controls.OBC.CDL.Reals.PIDWithReset conCooDam(
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.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.Switch damPos ;
Buildings.Controls.OBC.CDL.Reals.Divide VDis_flowNor
;
Buildings.Controls.OBC.CDL.Reals.Divide VDisSet_flowNor
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant conZer1(
final k=0)
;
Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr2(
final t=looHys,
final h=0.5*looHys)
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant conOne1(
final k=1)
;
Buildings.Controls.OBC.CDL.Reals.Line lin1
;
Buildings.Controls.OBC.CDL.Logical.Or or2
;
Buildings.Controls.OBC.CDL.Logical.Not not1
;
Buildings.Controls.OBC.CDL.Logical.FallingEdge falEdg
;
Buildings.Controls.OBC.CDL.Logical.And and2
;
Buildings.Controls.OBC.CDL.Logical.And and3
;
Buildings.Controls.OBC.CDL.Discrete.Sampler samHea(
final samplePeriod=samplePeriod)
;
Buildings.Controls.OBC.CDL.Discrete.Sampler samCoo(
final samplePeriod=samplePeriod)
;
Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr4(
final t=looHys,
final h=0.5*looHys)
;
Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr5(
final t=looHys,
final h=0.5*looHys) ;
Buildings.Controls.OBC.CDL.Logical.Latch lat
;
Buildings.Controls.OBC.CDL.Logical.Latch lat1
;
Buildings.Controls.OBC.CDL.Reals.Switch cooFloSet
;
Buildings.Controls.OBC.CDL.Reals.Switch heaFloSet
;
Buildings.Controls.OBC.CDL.Logical.Or or1
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant conZer3(
final k=0)
;
Buildings.Controls.OBC.CDL.Logical.Or or3
;
Buildings.Controls.OBC.CDL.Reals.Switch cooDamPos ;
Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToRea(
final realTrue=0,
final realFalse=1)
;
Buildings.Controls.OBC.CDL.Reals.Multiply mul1
;
Buildings.Controls.OBC.CDL.Logical.Or or4
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToRea1(
final realTrue=0,
final realFalse=1)
;
Buildings.Controls.OBC.CDL.Reals.Multiply mul2
;
Buildings.Controls.OBC.CDL.Reals.Switch heaDamPos
;
Buildings.Controls.OBC.CDL.Logical.And and1
;
Buildings.Controls.OBC.CDL.Logical.And and4
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant heaMax1(
final k=VHeaMax_flow)
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant cooMax1(
final k=VCooMax_flow)
;
Buildings.Controls.OBC.CDL.Reals.Max max2
;
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(VDis_flowNor.y, conCooDam.u_m);
connect(VDisSet_flowNor.y, conCooDam.u_s);
connect(VActMin_flow, lin.f1);
connect(conZer1.y, lin1.x1);
connect(VActMin_flow, lin1.f1);
connect(conOne1.y, lin1.x2);
connect(uHea, lin1.u);
connect(uHea, greThr2.u);
connect(VActHeaMax_flow, lin1.f2);
connect(greThr1.y, or2.u1);
connect(greThr2.y, or2.u2);
connect(or2.y, not1.u);
connect(not1.y, falEdg.u);
connect(not1.y, and2.u1);
connect(not1.y, and3.u2);
connect(uHea, samHea.u);
connect(uCoo, samCoo.u);
connect(samCoo.y, greThr4.u);
connect(greThr4.y, and3.u1);
connect(samHea.y, greThr5.u);
connect(greThr5.y, and2.u2);
connect(and3.y, lat.u);
connect(falEdg.y, lat.clr);
connect(and2.y, lat1.u);
connect(falEdg.y, lat1.clr);
connect(greThr1.y, cooFloSet.u2);
connect(lin.y, cooFloSet.u1);
connect(heaFloSet.y, cooFloSet.u3);
connect(greThr2.y, heaFloSet.u2);
connect(lin1.y, heaFloSet.u1);
connect(VActMin_flow, heaFloSet.u3);
connect(cooFloSet.y, VDis_flow_Set);
connect(cooFloSet.y, VDisSet_flowNor.u1);
connect(VDis_flow, VDis_flowNor.u1);
connect(u1CooAHU, or1.u1);
connect(u1HeaAHU, or1.u2);
connect(or1.y, conCooDam.trigger);
connect(or1.y, damPos.u2);
connect(conCooDam.y, damPos.u1);
connect(conZer3.y, damPos.u3);
connect(greThr1.y, or3.u1);
connect(lat.y, or3.u2);
connect(u1CooAHU, booToRea.u);
connect(damPos.y, mul1.u1);
connect(booToRea.y, mul1.u2);
connect(or3.y, cooDamPos.u2);
connect(mul1.y, cooDamPos.u1);
connect(conZer3.y, cooDamPos.u3);
connect(greThr2.y, or4.u1);
connect(lat1.y, or4.u2);
connect(u1HeaAHU, booToRea1.u);
connect(or4.y, heaDamPos.u2);
connect(damPos.y, mul2.u1);
connect(booToRea1.y, mul2.u2);
connect(mul2.y, heaDamPos.u1);
connect(conZer3.y, heaDamPos.u3);
connect(u1CooAHU, and1.u1);
connect(or3.y, and1.u2);
connect(and1.y, y1CooDam);
connect(or4.y, and4.u2);
connect(u1HeaAHU, and4.u1);
connect(and4.y, y1HeaDam);
connect(cooDamPos.y, yCooDam);
connect(heaDamPos.y, yHeaDam);
connect(heaMax1.y,max2. u2);
connect(cooMax1.y,max2. u1);
connect(max2.y, VDisSet_flowNor.u2);
connect(max2.y, VDis_flowNor.u2);
end DampersSingleSensors;
Software switches to override setpoints
Information
This block considers the overrides to the setpoints for snap-acting controlled
dual-duct terminal unit.
The implementation is according to the Section 5.11.7 of ASHRAE Guideline 36,
May 2020.
Provide software switches that interlock to a system-level point to:
-
when
oveFloSet
equals to 1, force the zone airflow setpoint
VSet_flow
to zero,
-
when
oveFloSet
equals to 2, force the zone airflow setpoint
VSet_flow
to zone cooling maximum airflow rate
VCooMax_flow
,
-
when
oveFloSet
equals to 3, force the zone airflow setpoint
VSet_flow
to zone minimum airflow setpoint
VMin_flow
.
-
when
oveFloSet
equals to 4, force the zone airflow setpoint
VSet_flow
to zone heating maximum airflow setpoint
VHeaMax_flow
.
-
when
oveCooDamPos
equals to 1, force the cooling damper to full closed by setting
yCooDam
to 0,
-
when
oveCooDamPos
equals to 2, force the cooling damper to full open by setting
yCooDam
to 1.
-
when
oveHeaDamPos
equals to 1, force the heating damper to full closed by setting
yHeaDam
to 0,
-
when
oveHeaDamPos
equals to 2, force the heating damper to full open by setting
yHeaDam
to 1.
Parameters
Type | Name | Default | Description |
Real | VMin_flow | | Design zone minimum airflow setpoint [m3/s] |
Real | VCooMax_flow | | Design zone cooling maximum airflow rate [m3/s] |
Real | VHeaMax_flow | | Design zone heating maximum airflow rate [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 | VActSet_flow | Active airflow setpoint [m3/s] |
input IntegerInput | oveCooDamPos | Index of overriding cooling damper position, 1: set to close; 2: set to open |
input RealInput | uCooDam | Cooling damper commanded position [1] |
input IntegerInput | oveHeaDamPos | Index of overriding heating damper position, 1: set to close; 2: set to open |
input RealInput | uHeaDam | Heating damper commanded position [1] |
output RealOutput | VSet_flow | Airflow setpoint after considering override [m3/s] |
output RealOutput | yCooDam | Cooling damper commanded position, after considering override [1] |
output RealOutput | yHeaDam | Heating damper commanded position, after considering override [1] |
Modelica definition
block Overrides
parameter Real VMin_flow(
final quantity="VolumeFlowRate",
final unit="m3/s")
;
parameter Real VCooMax_flow(
final quantity="VolumeFlowRate",
final unit="m3/s")
;
parameter Real VHeaMax_flow(
final quantity="VolumeFlowRate",
final unit="m3/s")
;
Buildings.Controls.OBC.CDL.Interfaces.IntegerInput oveFloSet
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput VActSet_flow(
final min=0,
final unit="m3/s",
final quantity="VolumeFlowRate")
;
Buildings.Controls.OBC.CDL.Interfaces.IntegerInput oveCooDamPos
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput uCooDam(
final min=0,
final unit="1") ;
Buildings.Controls.OBC.CDL.Interfaces.IntegerInput oveHeaDamPos
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput uHeaDam(
final min=0,
final unit="1") ;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput VSet_flow(
final min=0,
final unit="m3/s",
final quantity="VolumeFlowRate")
;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput yCooDam(
final min=0,
final unit="1")
;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput yHeaDam(
final min=0,
final unit="1")
;
protected
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 swi
;
Buildings.Controls.OBC.CDL.Logical.Or or3
;
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.Integers.Sources.Constant conInt5(
final k=4)
;
Buildings.Controls.OBC.CDL.Integers.Equal forMinFlo1
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToReal heaMax(
final realTrue=VHeaMax_flow)
;
Buildings.Controls.OBC.CDL.Reals.Add add4
;
Buildings.Controls.OBC.CDL.Logical.Or or1
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt6(
final k=1)
;
Buildings.Controls.OBC.CDL.Integers.Equal intEqu1
;
Buildings.Controls.OBC.CDL.Integers.Equal intEqu2
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt7(
final k=2)
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToReal cloDam1(
final realTrue=0)
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToReal opeDam1(
final realTrue=1)
;
Buildings.Controls.OBC.CDL.Reals.Add add5
;
Buildings.Controls.OBC.CDL.Logical.Or or4
;
Buildings.Controls.OBC.CDL.Reals.Switch swi2
;
Buildings.Controls.OBC.CDL.Logical.Or or5
;
equation
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, swi.u1);
connect(VActSet_flow, swi.u3);
connect(swi.y, VSet_flow);
connect(conInt3.y, intEqu3.u2);
connect(conInt4.y,intEqu4. u2);
connect(oveCooDamPos, intEqu3.u1);
connect(oveCooDamPos, 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(uCooDam, swi1.u3);
connect(swi1.y, yCooDam);
connect(oveFloSet, forMinFlo1.u1);
connect(conInt5.y, forMinFlo1.u2);
connect(forMinFlo1.y, heaMax.u);
connect(add2.y, add1.u2);
connect(minFlo.y, add4.u1);
connect(heaMax.y, add4.u2);
connect(add4.y, add2.u2);
connect(forMinFlo1.y, or1.u2);
connect(or1.y, swi.u2);
connect(conInt6.y,intEqu1. u2);
connect(conInt7.y,intEqu2. u2);
connect(oveHeaDamPos, intEqu1.u1);
connect(oveHeaDamPos, intEqu2.u1);
connect(intEqu1.y, cloDam1.u);
connect(intEqu2.y, opeDam1.u);
connect(cloDam1.y, add5.u1);
connect(opeDam1.y, add5.u2);
connect(intEqu1.y,or4. u1);
connect(intEqu2.y,or4. u2);
connect(add5.y,swi2. u1);
connect(or4.y,swi2. u2);
connect(uHeaDam, swi2.u3);
connect(swi2.y, yHeaDam);
connect(or3.y, or5.u1);
connect(or5.y, or1.u1);
connect(forMinFlo.y, or5.u2);
end Overrides;
Output system requests for VAV terminal unit with reheat
Information
This sequence outputs the system reset requests for snap-acting controlled dual-duct
terminal unit. The implementation is according to the Section 5.11.8 of ASHRAE
Guideline 36, May 2020.
Cooling SAT reset requests yZonCooTemResReq
-
If the zone temperature
TZon
exceeds the zone cooling setpoint
TCooSet
by 3 °C (5 °F)) for 2 minutes and after suppression
period (uAftSupCoo=true
) due to setpoint change per G36 Part 5.1.20,
send 3 requests (yZonCooTemResReq=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 (uAftSupCoo=true
) due to setpoint change per G36 Part 5.1.20,
send 2 requests (yZonCooTemResReq=3
).
-
Else if the cooling loop
uCoo
is greater than 95%, send 1 request
(yZonCooTemResReq=1
) until uCoo
is less than 85%.
-
Else if
uCoo
is less than 95%, send 0 request (yZonCooTemResReq=0
).
Cold-duct static pressure reset requests yColDucPreResReq
-
If the measured airflow
VColDucDis_flow
is less than 50% of setpoint
VColDuc_flow_Set
while the setpoint is greater than zero and the damper position
uCooDam
is greater than 95% for 1 minute, send 3 requests (yColDucPreResReq=3
).
-
Else if the measured airflow
VColDucDis_flow
is less than 70% of setpoint
VColDuc_flow_Set
while the setpoint is greater than zero and the damper position
uCooDam
is greater than 95% for 1 minute, send 2 requests (yColDucPreResReq=2
).
-
Else if the damper position
uCooDam
is greater than 95%, send 1 request
(yColDucPreResReq=1
) until uDam
is less than 85%.
-
Else if the damper position
uCooDam
is less than 95%, send 0 request
(yColDucPreResReq=0
).
Heating SAT reset requests yZonHeaTemResReq
-
If the zone temperature
TZon
is below the zone heating setpoint
THeaSet
by 3 °C (5 °F)) for 2 minutes and after suppression
period (uAftSupHea=true
) due to setpoint change per G36 Part 5.1.20,
send 3 requests (yZonHeaTemResReq=3
).
-
Else if the zone temperature
TZon
is below the zone heating setpoint
THeaSet
by 2 °C (3 °F) for 2 minutes and after suppression
period (uAftSupHea=true
) due to setpoint change per G36 Part 5.1.20,
send 2 requests (yZonHeaTemResReq=3
).
-
Else if the heating loop
uHea
is greater than 95%, send 1 request
(yZonHeaTemResReq=1
) until uHea
is less than 85%.
-
Else if
uHea
is less than 95%, send 0 request (yZonHeaTemResReq=0
).
Hot-duct static pressure reset requests yHotDucPreResReq
-
If the measured airflow
VHotDucDis_flow
is less than 50% of setpoint
VHotDuc_flow_Set
while the setpoint is greater than zero and the damper position
uHeaDam
is greater than 95% for 1 minute, send 3 requests (yHotDucPreResReq=3
).
-
Else if the measured airflow
VHotDucDis_flow
is less than 70% of setpoint
VHotDuc_flow_Set
while the setpoint is greater than zero and the damper position
uHeaDam
is greater than 95% for 1 minute, send 2 requests (yHotDucPreResReq=2
).
-
Else if the damper position
uHeaDam
is greater than 95%, send 1 request
(yHotDucPreResReq=1
) until uHeaDam
is less than 85%.
-
Else if the damper position
uHeaDam
is less than 95%, send 0 request
(yHotDucPreResReq=0
).
Heating-fan requests
Send the heating fan that serves the zone a heating-fan request as follows:
-
If the heating loop is greater than 15%, send 1 request until the heating loop is
less than 1%.
-
Else if the heatling loop is less than 15%, send 0 requests.
Parameters
Type | Name | Default | Description |
Boolean | have_duaSen | | True: the unit has dual inlet sensors |
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] |
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] |
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] |
Connectors
Type | Name | Description |
input BooleanInput | uAftSupCoo | After suppression period due to the cooling 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 | VColDuc_flow_Set | Cold duct discharge airflow rate setpoint [m3/s] |
input RealInput | VColDucDis_flow | Measured cold duct discharge airflow rate [m3/s] |
input RealInput | uCooDam | Cooling damper position setpoint [1] |
input BooleanInput | u1CooDam | Cold duct damper proven on |
input BooleanInput | uAftSupHea | After suppression period due to the heating setpoint change |
input RealInput | THeaSet | Zone heating setpoint temperature [K] |
input RealInput | uHea | Heating loop signal [1] |
input RealInput | VHotDuc_flow_Set | Hot duct discharge airflow rate setpoint [m3/s] |
input RealInput | VHotDucDis_flow | Measured hot duct discharge airflow rate [m3/s] |
input RealInput | uHeaDam | Heating damper position setpoint [1] |
input BooleanInput | u1HeaDam | Hot duct damper proven on |
output IntegerOutput | yZonCooTemResReq | Zone cooling supply air temperature reset request |
output IntegerOutput | yColDucPreResReq | Cold duct static pressure reset requests |
output IntegerOutput | yZonHeaTemResReq | Zone heating supply air temperature reset request |
output IntegerOutput | yHotDucPreResReq | Hot duct static pressure reset requests |
output IntegerOutput | yHeaFanReq | Heating fan request |
Modelica definition
block SystemRequests
parameter Boolean have_duaSen
;
parameter Real thrTemDif(
final unit="K",
final quantity="TemperatureDifference")=3
;
parameter Real twoTemDif(
final unit="K",
final quantity="TemperatureDifference")=2
;
parameter Real durTimTem(
final unit="s",
final quantity="Time")=120
;
parameter Real durTimFlo(
final unit="s",
final quantity="Time")=60
;
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")
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput uAftSupCoo
;
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 VColDuc_flow_Set(
final min=0,
final unit="m3/s",
quantity="VolumeFlowRate") ;
Buildings.Controls.OBC.CDL.Interfaces.RealInput VColDucDis_flow(
final min=0,
final unit="m3/s",
final quantity="VolumeFlowRate")
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput uCooDam(
final min=0,
final max=1,
final unit="1")
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1CooDam
if not have_duaSen
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput uAftSupHea
;
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 VHotDuc_flow_Set(
final min=0,
final unit="m3/s",
quantity="VolumeFlowRate")
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput VHotDucDis_flow(
final min=0,
final unit="m3/s",
final quantity="VolumeFlowRate")
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput uHeaDam(
final min=0,
final max=1,
final unit="1")
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1HeaDam
if not have_duaSen
;
Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yZonCooTemResReq
;
Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yColDucPreResReq
;
Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yZonHeaTemResReq
;
Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yHotDucPreResReq
;
Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yHeaFanReq
;
protected
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.GreaterThreshold greThr7(
final t=thrTemDif,
final h=dTHys)
;
Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr8(
final t=twoTemDif,
final h=dTHys)
;
Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr9(
final t=0.95,
final h=damPosHys)
;
Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr10(
final t=0.95,
final h=looHys) ;
Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr11(
final t=floHys,
final h=0.5*floHys)
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt4
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt5
;
Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai3(
final k=0.5)
;
Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai4(
final k=0.7)
;
Buildings.Controls.OBC.CDL.Reals.Subtract sub1
;
Buildings.Controls.OBC.CDL.Reals.Subtract sub4
;
Buildings.Controls.OBC.CDL.Logical.And and6
;
Buildings.Controls.OBC.CDL.Logical.And and7
;
Buildings.Controls.OBC.CDL.Logical.And and8
;
Buildings.Controls.OBC.CDL.Logical.And and9
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant thrCooResReq1(
final k=3)
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant twoCooResReq1(
final k=2)
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant thrPreResReq1(
final k=3)
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant twoPreResReq1(
final k=2)
;
Buildings.Controls.OBC.CDL.Integers.Switch intSwi4
;
Buildings.Controls.OBC.CDL.Integers.Switch intSwi5
;
Buildings.Controls.OBC.CDL.Integers.Switch swi1
;
Buildings.Controls.OBC.CDL.Integers.Switch swi2
;
Buildings.Controls.OBC.CDL.Logical.TrueDelay tim6(
final delayTime=durTimTem)
;
Buildings.Controls.OBC.CDL.Logical.TrueDelay tim7(
final delayTime=durTimTem)
;
Buildings.Controls.OBC.CDL.Logical.TrueDelay tim8(
final delayTime=durTimFlo)
;
Buildings.Controls.OBC.CDL.Reals.Greater greEqu2(
final h=floHys)
;
Buildings.Controls.OBC.CDL.Reals.Greater greEqu3(
final h=floHys)
;
Buildings.Controls.OBC.CDL.Logical.And and10
;
Buildings.Controls.OBC.CDL.Reals.GreaterThreshold greThr12(
final t=0.15,
final h=looHys)
;
Buildings.Controls.OBC.CDL.Logical.Latch lat ;
Buildings.Controls.OBC.CDL.Reals.LessThreshold lesThr(
final t=0.01,
final h=looHys)
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt6
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant conOne(
final k=1)
if have_duaSen
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant conOne1(
final k=1)
if have_duaSen
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt2
if not have_duaSen
;
Buildings.Controls.OBC.CDL.Integers.Multiply mulInt
if not have_duaSen
;
Buildings.Controls.OBC.CDL.Integers.Multiply mulInt1
if have_duaSen
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger booToInt3
if not have_duaSen
;
Buildings.Controls.OBC.CDL.Integers.Multiply mulInt2
if not have_duaSen
;
Buildings.Controls.OBC.CDL.Integers.Multiply mulInt3
if have_duaSen
;
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(greThr4.u, VColDuc_flow_Set);
connect(greEqu.u1, gai1.y);
connect(greEqu.y, and3.u2);
connect(gai2.y, greEqu1.u1);
connect(greEqu1.y, and4.u2);
connect(uCoo, greThr.u);
connect(uAftSupCoo, and2.u1);
connect(uAftSupCoo, and1.u1);
connect(thrCooResReq.y, intSwi.u1);
connect(twoCooResReq.y, intSwi1.u1);
connect(intSwi1.y, intSwi.u3);
connect(intSwi.y, yZonCooTemResReq);
connect(greThr.y, booToInt.u);
connect(booToInt.y, intSwi1.u3);
connect(uCooDam, greThr3.u);
connect(VColDuc_flow_Set, gai1.u);
connect(VColDuc_flow_Set, gai2.u);
connect(VColDucDis_flow, greEqu.u2);
connect(VColDucDis_flow, greEqu1.u2);
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(TCooSet, sub3.u2);
connect(TCooSet, sub2.u2);
connect(TZon, sub2.u1);
connect(TZon, sub3.u1);
connect(sub1.y,greThr7. u);
connect(and7.y, intSwi4.u2);
connect(sub4.y,greThr8. u);
connect(and6.y,intSwi5. u2);
connect(and8.y,swi1. u2);
connect(and9.y,swi2. u2);
connect(greThr8.y,tim7. u);
connect(tim7.y,and6. u2);
connect(greThr7.y,tim6. u);
connect(tim6.y,and7. u2);
connect(greThr11.u, VHotDuc_flow_Set);
connect(greEqu2.u1, gai3.y);
connect(greEqu2.y, and8.u2);
connect(gai4.y,greEqu3. u1);
connect(greEqu3.y,and9. u2);
connect(uHea, greThr10.u);
connect(uAftSupHea, and7.u1);
connect(uAftSupHea, and6.u1);
connect(thrCooResReq1.y, intSwi4.u1);
connect(twoCooResReq1.y, intSwi5.u1);
connect(intSwi5.y, intSwi4.u3);
connect(intSwi4.y, yZonHeaTemResReq);
connect(greThr10.y, booToInt4.u);
connect(booToInt4.y, intSwi5.u3);
connect(uHeaDam, greThr9.u);
connect(VHotDuc_flow_Set, gai3.u);
connect(VHotDuc_flow_Set, gai4.u);
connect(VHotDucDis_flow, greEqu2.u2);
connect(VHotDucDis_flow, greEqu3.u2);
connect(greThr9.y,tim8. u);
connect(greThr11.y, and10.u1);
connect(tim8.y, and10.u2);
connect(and10.y, and8.u1);
connect(and10.y, and9.u1);
connect(greThr9.y,booToInt5. u);
connect(booToInt5.y,swi2. u3);
connect(twoPreResReq1.y, swi2.u1);
connect(thrPreResReq1.y, swi1.u1);
connect(swi2.y,swi1. u3);
connect(THeaSet, sub1.u1);
connect(THeaSet, sub4.u1);
connect(TZon, sub1.u2);
connect(TZon, sub4.u2);
connect(uHea, greThr12.u);
connect(greThr12.y, lat.u);
connect(uHea, lesThr.u);
connect(lesThr.y, lat.clr);
connect(lat.y, booToInt6.u);
connect(booToInt6.y, yHeaFanReq);
connect(u1CooDam, booToInt2.u);
connect(booToInt2.y, mulInt.u2);
connect(swi4.y, mulInt.u1);
connect(swi4.y, mulInt1.u1);
connect(conOne.y, mulInt1.u2);
connect(mulInt1.y, yColDucPreResReq);
connect(mulInt.y, yColDucPreResReq);
connect(u1HeaDam, booToInt3.u);
connect(booToInt3.y, mulInt2.u2);
connect(conOne1.y, mulInt3.u2);
connect(swi1.y, mulInt3.u1);
connect(swi1.y, mulInt2.u1);
connect(mulInt3.y, yHotDucPreResReq);
connect(mulInt2.y, yHotDucPreResReq);
end SystemRequests;