Package of subsequences for cooling only box control
Information
This package contains subsequences for VAV cooling only unit. They are created
according to Section 5.5 of ASHRAE Guideline 36, May 2020.
Package Content
Name |
Description |
ActiveAirFlow
|
Active maximum and minimum setpoints for cooling only terminal unit |
Alarms
|
Generate alarms of cooling only terminal unit |
Dampers
|
Output signals for controlling VAV cooling only box damper position |
SystemRequests
|
Output system requests for VAV cooling only terminal unit |
Validation
|
Collection of validation models |
Active maximum and minimum setpoints for cooling only terminal unit
Information
This block outputs the active maximum and minimum airflow setpoint for cooling only
terminal unit. The implementation is according to the Section 5.5.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 ) | 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] |
output RealOutput | VActHeaMax_flow | Active heating maximum airflow [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") ;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput VActHeaMax_flow(
final min=0,
final unit="m3/s",
final quantity="VolumeFlowRate") ;
Buildings.Controls.OBC.CDL.Conversions.BooleanToReal actCooMax(
final realTrue=VCooMax_flow)
;
Buildings.Controls.OBC.CDL.Logical.Or3 or3
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToRea(
final realTrue=1)
;
Buildings.Controls.OBC.CDL.Reals.Multiply actMin
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant occMod(
final k=Buildings.Controls.OBC.ASHRAE.G36.Types.OperationModes.occupied)
;
Buildings.Controls.OBC.CDL.Integers.Equal intEqu
;
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.Integers.Equal intEqu2
;
Buildings.Controls.OBC.CDL.Integers.Equal intEqu1
;
equation
connect(occMod.y, intEqu.u1);
connect(intEqu2.u1, setUpMod.y);
connect(cooDowMod.y, intEqu1.u1);
connect(uOpeMod, intEqu.u2);
connect(uOpeMod, intEqu1.u2);
connect(uOpeMod, intEqu2.u2);
connect(intEqu.y, or3.u1);
connect(intEqu1.y, or3.u2);
connect(intEqu2.y, or3.u3);
connect(or3.y, actCooMax.u);
connect(intEqu.y, booToRea.u);
connect(booToRea.y, actMin.u1);
connect(VOccMin_flow, actMin.u2);
connect(actCooMax.y, VActCooMax_flow);
connect(actMin.y, VActHeaMax_flow);
connect(actMin.y, VActMin_flow);
end ActiveAirFlow;
Generate alarms of cooling only terminal unit
Information
This block outputs alarms of cooling only terminal unit. The implementation is according
to the Section 5.5.6 of ASHRAE Guideline 36, May 2020.
Low airflow 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 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 fan serving the zone has been OFF (uFan=false
) for 10 minutes
(fanOffTim
), and 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 damper position (uDam
) is 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 (uFan=true
), generate a Level
4 alarm.
Parameters
Type | Name | Default | Description |
Real | staPreMul | | Importance multiplier for the zone static pressure 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 | fanOffTim | 600 | Threshold time to check fan off [s] |
Real | leaFloTim | 600 | Threshold time to check leaking flow [s] |
Advanced |
Real | floHys | | Near zero flow rate, below which the flow rate or difference will be seen as zero [m3/s] |
Real | damPosHys | | 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
Modelica definition
block Alarms
parameter Real staPreMul
;
parameter Real VCooMax_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")
;
parameter Real damPosHys(
final unit="1")
;
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") ;
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.IntegerInput uOpeMod
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput uDam(
final min=0,
final unit="1")
;
Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yLowFloAla
;
Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yFloSenAla
;
Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yLeaDamAla
;
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)
;
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 leaDamAla1
;
Buildings.Controls.OBC.CDL.Logical.And leaDamAla2
;
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.Logical.TrueDelay truDel4(
final delayTime=lowFloTim)
;
Buildings.Controls.OBC.CDL.Logical.And and11
;
Buildings.Controls.OBC.CDL.Logical.And and10
;
Buildings.Controls.OBC.CDL.Logical.TrueDelay fanIni(
final delayTime=staTim)
;
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 and6
;
Buildings.Controls.OBC.CDL.Logical.And and7
;
Buildings.Controls.OBC.CDL.Logical.And and3
;
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(u1Fan, not3.u);
connect(gai2.y, gre1.u2);
connect(VDis_flow, gre1.u1);
connect(not4.y, assMes2.u);
connect(booToInt2.y, yFloSenAla);
connect(proInt.y, yLowFloAla);
connect(uDam, cloDam.u);
connect(not5.y, assMes3.u);
connect(booToInt3.y, yLeaDamAla);
connect(greThr.y, truDel4.u);
connect(truDel4.y, and1.u1);
connect(truDel4.y, and2.u2);
connect(and5.y, truDel2.u);
connect(gre1.y, and5.u1);
connect(not3.y, and5.u2);
connect(truDel3.y, booToInt3.u);
connect(truDel3.y, not5.u);
connect(les.y, and10.u1);
connect(and10.y, truDel.u);
connect(gre.y, and11.u1);
connect(and11.y, truDel1.u);
connect(u1Fan, fanIni.u);
connect(fanIni.y, and11.u2);
connect(fanIni.y, and10.u2);
connect(occMod.y,isOcc. u2);
connect(uOpeMod,isOcc. u1);
connect(and6.y, booToInt2.u);
connect(and6.y, not4.u);
connect(truDel2.y, and6.u1);
connect(isOcc.y, and6.u2);
connect(gai.y, les.u2);
connect(and8.y, and7.u1);
connect(and7.y, lowFloAla.u2);
connect(and7.y, not1.u);
connect(and3.y, booToInt.u);
connect(and3.y, not2.u);
connect(and4.y, and3.u1);
connect(isOcc.y, and7.u2);
connect(isOcc.y, and3.u2);
connect(u1Fan, leaDamAla1.u1);
connect(cloDam.y, leaDamAla1.u2);
connect(leaDamAla1.y, leaDamAla2.u1);
connect(gre1.y, leaDamAla2.u2);
connect(leaDamAla2.y, truDel3.u);
end Alarms;
Output signals for controlling VAV cooling only box damper position
Information
This sequence sets the damper position for VAV cooling only terminal unit. The
implementation is according to Section 5.5.5 and 5.5.7 of ASHRAE Guideline 36 (G36), May 2020.
-
When the zone state (
uZonSta
) is cooling, the cooling-loop output
(uCoo
) shall be mapped to the active airflow setpoint from the
minimum (VActMin_flow
) to the cooling maximum airflow setpoints
(VActCooMax_flow
).
-
If supply air temperature
TSup
from the 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 or heating, the active airflow setpoint shall be
the minimum airflow setpoint.
-
The VAV damper
yDam
shall be modulated by a control loop to maintain
the measured airflow VDis_flow
at the active setpoint.
The sequences of controlling damper position for the cooling only terminal
unit are described in the following figure below.
Override the airflow setpoint and the damper position setpoint by providing 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
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.
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] |
SimpleController | damCon | 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 | Delta between the temperature hysteresis high and low limit [K] |
Real | iniDam | 0.01 | Initial damper position when the damper control is enabled [1] |
Connectors
Type | Name | Description |
input RealInput | VActMin_flow | Active minimum 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 | uCoo | Cooling loop signal [1] |
input RealInput | VActCooMax_flow | Active cooling maximum airflow rate [m3/s] |
input IntegerInput | uZonSta | Current zone state |
input IntegerInput | oveFloSet | Index of overriding flow setpoint, 1: set to zero; 2: set to cooling maximum; 3: set to minimum flow |
input BooleanInput | u1Fan | AHU supply fan status |
input RealInput | VDis_flow | Measured primary discharge airflow rate [m3/s] |
input IntegerInput | oveDamPos | Index of overriding damper position, 1: set to close; 2: set to open |
output RealOutput | VSet_flow | Airflow setpoint after considering override [m3/s] |
output RealOutput | yDam | Commanded damper position after considering override [1] |
Modelica definition
block Dampers
parameter Real VMin_flow(unit="m3/s")
;
parameter Real VCooMax_flow(unit="m3/s")
;
parameter Buildings.Controls.OBC.CDL.Types.SimpleController damCon=
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 iniDam(unit="1")=0.01
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput VActMin_flow(
final min=0,
final unit="m3/s",
final quantity="VolumeFlowRate") ;
Buildings.Controls.OBC.CDL.Interfaces.RealInput TSup(
final quantity="ThermodynamicTemperature",
final unit="K",
final displayUnit="degC")
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput TZon(
final quantity="ThermodynamicTemperature",
final unit="K",
final displayUnit="degC") ;
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.IntegerInput uZonSta
;
Buildings.Controls.OBC.CDL.Interfaces.IntegerInput oveFloSet
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1Fan
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput VDis_flow(
final min=0,
final unit="m3/s",
final quantity="VolumeFlowRate")
;
Buildings.Controls.OBC.CDL.Interfaces.IntegerInput oveDamPos
;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput VSet_flow(
final min=0,
final unit="m3/s",
final quantity="VolumeFlowRate")
;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput yDam(
final min=0,
final unit="1")
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant con(
final k=0) ;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant con1(
final k=1) ;
Buildings.Controls.OBC.CDL.Reals.Line lin
;
Buildings.Controls.OBC.CDL.Reals.Greater gre(
final h=dTHys)
;
Buildings.Controls.OBC.CDL.Reals.Switch swi
;
Buildings.Controls.OBC.CDL.Reals.Switch actFlo
;
Buildings.Controls.OBC.CDL.Reals.PIDWithReset conPID(
final controllerType=damCon,
final k=kDam,
final Ti=TiDam,
final Td=TdDam,
final y_reset=iniDam)
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt(
final k=Buildings.Controls.OBC.ASHRAE.G36.Types.ZoneStates.cooling)
;
Buildings.Controls.OBC.CDL.Integers.Equal cooSta
;
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.Integers.Sources.Constant conInt1(
final k=1)
;
Buildings.Controls.OBC.CDL.Integers.Equal forZerFlo
;
Buildings.Controls.OBC.CDL.Integers.Equal forCooMax
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt2(
final k=2)
;
Buildings.Controls.OBC.CDL.Integers.Equal forMinFlo
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt3(
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 swi1
;
Buildings.Controls.OBC.CDL.Logical.Or3 or3
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt4(
final k=1)
;
Buildings.Controls.OBC.CDL.Integers.Equal intEqu3
;
Buildings.Controls.OBC.CDL.Integers.Equal intEqu4
;
Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt5(
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 swi2
;
equation
connect(conInt.y, cooSta.u1);
connect(uZonSta, cooSta.u2);
connect(con.y, lin.x1);
connect(con1.y, lin.x2);
connect(uCoo, lin.u);
connect(TSup, gre.u1);
connect(TZon, gre.u2);
connect(gre.y, swi.u2);
connect(lin.y, swi.u3);
connect(VActMin_flow, lin.f1);
connect(VActMin_flow, swi.u1);
connect(VActCooMax_flow, lin.f2);
connect(cooSta.y, actFlo.u2);
connect(VActMin_flow, actFlo.u3);
connect(swi.y, actFlo.u1);
connect(nomFlow.y, VDisSet_flowNor.u2);
connect(nomFlow.y, VDis_flowNor.u2);
connect(VDis_flow, VDis_flowNor.u1);
connect(VDisSet_flowNor.y, conPID.u_s);
connect(VDis_flowNor.y, conPID.u_m);
connect(oveFloSet,forZerFlo. u1);
connect(conInt1.y, forZerFlo.u2);
connect(oveFloSet,forCooMax. u1);
connect(conInt2.y,forCooMax. u2);
connect(oveFloSet,forMinFlo. u1);
connect(conInt3.y,forMinFlo. u2);
connect(forZerFlo.y,zerFlo. u);
connect(forCooMax.y,cooMax. u);
connect(forMinFlo.y,minFlo. u);
connect(cooMax.y,add2. u1);
connect(minFlo.y,add2. u2);
connect(zerFlo.y,add1. u1);
connect(add2.y,add1. u2);
connect(forZerFlo.y,or3. u1);
connect(forCooMax.y,or3. u2);
connect(forMinFlo.y,or3. u3);
connect(or3.y, swi1.u2);
connect(add1.y, swi1.u1);
connect(swi1.y, VSet_flow);
connect(actFlo.y, swi1.u3);
connect(swi1.y, VDisSet_flowNor.u1);
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(or2.y,swi2. u2);
connect(swi2.y, yDam);
connect(conPID.y, swi2.u3);
connect(conInt5.y, intEqu4.u2);
connect(conInt4.y, intEqu3.u2);
connect(add3.y, swi2.u1);
connect(u1Fan, conPID.trigger);
end Dampers;
Output system requests for VAV cooling only terminal unit
Information
This sequence outputs the system reset requests for cooling only terminal unit. The
implementation is according to the Section 5.5.8 of ASHRAE Guideline 36, May 2020.
Cooling SAT reset requests yZonTemResReq
-
If the zone temperature
TZon
exceeds the zone cooling setpoint
TZonCooSet
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
TZonCooSet
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
VDis_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
VDis_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
).
Parameters
Type | Name | Default | Description |
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] |
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 | VDis_flow | Measured discharge airflow rate [m3/s] |
input RealInput | uDam | Damper position setpoint [1] |
output IntegerOutput | yZonTemResReq | Zone cooling supply air temperature reset request |
output IntegerOutput | yZonPreResReq | Zone static pressure reset requests |
Modelica definition
block SystemRequests
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")
;
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 VDis_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.IntegerOutput yZonTemResReq
;
Buildings.Controls.OBC.CDL.Interfaces.IntegerOutput yZonPreResReq
;
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.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(TCooSet, sub2.u2);
connect(TCooSet, sub3.u2);
connect(TZon, sub2.u1);
connect(TZon, sub3.u1);
connect(uCoo, sampler.u);
connect(sampler.y, greThr.u);
connect(uDam, sampler1.u);
connect(sampler1.y, greThr3.u);
connect(VDis_flow, sampler2.u);
connect(sampler2.y, greEqu.u2);
connect(sampler2.y, greEqu1.u2);
connect(greThr4.u, sampler3.y);
connect(sampler3.u, VSet_flow);
connect(sampler3.y, gai1.u);
connect(sampler3.y, gai2.u);
end SystemRequests;