Buildings.Controls.OBC.ASHRAE.G36_PR1.TerminalUnits.Reheat.SetPoints
Output setpoints for terminal unit control
Information
This package contains sequences generating setpoints for terminal units.
Extends from Modelica.Icons.Package (Icon for standard packages).
Package Content
Name | Description |
---|---|
ActiveAirFlow | Output the active airflow setpoint for VAV reheat terminal unit |
Validation | Collection of validation models |
Buildings.Controls.OBC.ASHRAE.G36_PR1.TerminalUnits.Reheat.SetPoints.ActiveAirFlow
Output the active airflow setpoint for VAV reheat terminal unit
Information
This atomic sequence sets the active maximum and minimum setpoints VActCooMax
,
VActCooMin
, VActMin
, VActHeaMin
,
VActHeaMax
for VAV reheat terminal unit according to ASHRAE
Guideline 36 (G36), PART5.E.3-5.
1. Information provided by designer
According to G36 PART 3.1.B.2, following VAV box design information should be provided:
- Zone maximum cooling airflow setpoint
VCooMax
- Zone minimum airflow setpoint
VMin
- Zone maximum heating airflow setpoint
VHeaMax
2. Occupied minimum airflow VOccMinAir
The VOccMinAir
shall be equal to zone minimum airflow setpoint
VMin
except as follows:
-
If the zone has an occupancy sensor,
VOccMinAir
shall be equal to minimum breathing zone outdoor airflow (if ventilation is according to ASHRAE Standard 62.1-2013) or zone minimum outdoor airflow for building area (if ventilation is according to California Title 24) when the room is unpopulated. -
If the zone has a window switch,
VOccMinAir
shall be zero when the window is open. -
If
VMin
is non-zero and less than the lowest possible airflow setpoint allowed by the controlsVMinCon
,VOccMinAir
shall be set equal toVMinCon
. -
If the zone has a CO2 sensor, then following steps are applied for calculating
VOccMinAir
. (1) During occupied mode, a P-only loop shall maintain CO2 concentration at setpoint, reset 0% at (CO2 setpointCO2Set
- 200 ppm) and 100% atCO2Set
. If ventilation outdoor airflow is controlled in accordance with ASHRAE Standard 62.1-2013, the loop output shall reset theVOccMinAir
fromVMin
at 0% loop output up toVCooMax
at 100% loop output; (2) Loop is diabled and output set to zero when the zone is not in occupied mode.
3. Active maximum and minimum setpoints
The setpoints shall vary depending on the mode of the zone group.
Setpoint | Occupied | Cool-down | Setup | Warmup | Setback | Unoccupied |
---|---|---|---|---|---|---|
Cooling maximum (VActCooMax ) | VCooMax |
VCooMax | VCooMax |
0 | 0 | 0 |
Cooling minimum (VActCooMin ) | VOccMinAir |
0 | 0 | 0 | 0 | 0 |
Minimum (VActMin ) | VOccMinAir | 0 | 0 | 0 | 0 | 0 |
Heating minimum (VActHeaMin ) | VOccMinAir |
0 | 0 | VHeaMax | VHeaMax |
0 |
Heating maximum (VActHeaMax ) | max(VHeaMax,VOccMinAir ) |
VHeaMax | 0 | VCooMax | VCooMax |
0 |
Parameters
Type | Name | Default | Description |
---|---|---|---|
Zone sensors | |||
Boolean | have_occSen | Set to true if the zone has occupancy sensor | |
Boolean | have_winSen | Set to true if the zone has window status sensor | |
Boolean | have_CO2Sen | Set to true if the zone has CO2 sensor | |
Nominal condition | |||
VolumeFlowRate | VCooMax | Zone maximum cooling airflow setpoint [m3/s] | |
VolumeFlowRate | VMin | Zone minimum airflow setpoint [m3/s] | |
VolumeFlowRate | VHeaMax | Zone maximum heating airflow setpoint [m3/s] | |
VolumeFlowRate | VMinCon | VAV box controllable minimum [m3/s] | |
Area | AFlo | Area of the zone [m2] | |
Real | outAirPerAre | 3e-4 | Outdoor air rate per unit area [m3/(s.m2)] |
VolumeFlowRate | outAirPerPer | 2.5e-3 | Outdoor air rate per person [m3/s] |
Real | CO2Set | 894 | CO2 setpoint in ppm |
Connectors
Type | Name | Description |
---|---|---|
input RealInput | nOcc | Number of occupants [1] |
input RealInput | ppmCO2 | Detected CO2 conventration |
input BooleanInput | uWin | Window status, true if open, false if closed |
input IntegerInput | uOpeMod | Zone operation mode |
output RealOutput | VOccMinAir | Occupied minimum airflow [m3/s] |
output RealOutput | VActCooMax | Active cooling maximum [m3/s] |
output RealOutput | VActCooMin | Active cooling minimum [m3/s] |
output RealOutput | VActMin | Active minimum [m3/s] |
output RealOutput | VActHeaMin | Active heating minimum [m3/s] |
output RealOutput | VActHeaMax | Active heating maximum [m3/s] |
Modelica definition
block ActiveAirFlow
"Output the active airflow setpoint for VAV reheat terminal unit"
parameter Boolean have_occSen "Set to true if the zone has occupancy sensor";
parameter Boolean have_winSen
"Set to true if the zone has window status sensor";
parameter Boolean have_CO2Sen "Set to true if the zone has CO2 sensor";
parameter Modelica.SIunits.VolumeFlowRate VCooMax
"Zone maximum cooling airflow setpoint";
parameter Modelica.SIunits.VolumeFlowRate VMin
"Zone minimum airflow setpoint";
parameter Modelica.SIunits.VolumeFlowRate VHeaMax
"Zone maximum heating airflow setpoint";
parameter Modelica.SIunits.VolumeFlowRate VMinCon
"VAV box controllable minimum";
parameter Modelica.SIunits.Area AFlo "Area of the zone";
parameter Real outAirPerAre(final unit="m3/(s.m2)") = 3e-4
"Outdoor air rate per unit area";
parameter Modelica.SIunits.VolumeFlowRate outAirPerPer=2.5e-3
"Outdoor air rate per person";
parameter Real CO2Set=894 "CO2 setpoint in ppm";
Buildings.Controls.OBC.CDL.Interfaces.RealInput nOcc(final unit="1") if
have_occSen "Number of occupants";
Buildings.Controls.OBC.CDL.Interfaces.RealInput ppmCO2 if have_CO2Sen
"Detected CO2 conventration";
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput uWin if have_winSen
"Window status, true if open, false if closed";
Buildings.Controls.OBC.CDL.Interfaces.IntegerInput uOpeMod
"Zone operation mode";
Buildings.Controls.OBC.CDL.Interfaces.RealOutput VOccMinAir(
min=0,
final unit="m3/s",
quantity="VolumeFlowRate") "Occupied minimum airflow ";
Buildings.Controls.OBC.CDL.Interfaces.RealOutput VActCooMax(
min=0,
final unit="m3/s",
quantity="VolumeFlowRate") "Active cooling maximum";
Buildings.Controls.OBC.CDL.Interfaces.RealOutput VActCooMin(
min=0,
final unit="m3/s",
quantity="VolumeFlowRate") "Active cooling minimum";
Buildings.Controls.OBC.CDL.Interfaces.RealOutput VActMin(
min=0,
final unit="m3/s",
quantity="VolumeFlowRate") "Active minimum";
Buildings.Controls.OBC.CDL.Interfaces.RealOutput VActHeaMin(
min=0,
final unit="m3/s",
quantity="VolumeFlowRate") "Active heating minimum";
Buildings.Controls.OBC.CDL.Interfaces.RealOutput VActHeaMax(
min=0,
final unit="m3/s",
quantity="VolumeFlowRate") "Active heating maximum";
Buildings.Controls.OBC.CDL.Continuous.Gain gai(k=outAirPerPer) if have_occSen
"Outdoor air per person";
Buildings.Controls.OBC.CDL.Continuous.Add breZon if have_occSen
"Breathing zone airflow";
Buildings.Controls.OBC.CDL.Continuous.Line co2ConLoo if have_CO2Sen
"Maintain CO2 concentration at setpoint, reset 0% at (setpoint-200) and 100% at setpoint";
Buildings.Controls.OBC.CDL.Continuous.Line lin1 if have_CO2Sen
"Reset occupied minimum airflow setpoint from 0% at VMin and 100% at VCooMax";
Buildings.Controls.OBC.CDL.Continuous.Greater gre
"Check if zone minimum airflow setpoint Vmin is less than the allowed controllable VMinCon";
Buildings.Controls.OBC.CDL.Continuous.GreaterThreshold greThr(threshold=0)
if have_occSen "Check if the zone becomes unpopulated";
Buildings.Controls.OBC.CDL.Continuous.GreaterThreshold greThr1
"Check if zone minimum airflow setpoint VMin is non-zero";
Buildings.Controls.OBC.CDL.Logical.Switch swi
"Reset occupied minimum airflow according to occupancy";
Buildings.Controls.OBC.CDL.Logical.Switch swi1
"Reset occupied minimum airflow according to window status";
Buildings.Controls.OBC.CDL.Logical.Switch swi2
"Reset occupied minimum airflow setpoint according to minimum controllable airflow";
Buildings.Controls.OBC.CDL.Logical.Switch swi3 if have_CO2Sen
"Switch between zero signal and CO2 control loop signal depending on the operation mode";
Buildings.Controls.OBC.CDL.Logical.And and1 "Logical and";
Buildings.Controls.OBC.CDL.Logical.Not not1 "Logical not";
Buildings.Controls.OBC.CDL.Logical.Not not2 if have_winSen "Logical not";
protected
Buildings.Controls.OBC.CDL.Continuous.Sources.Constant minZonAir1(final k=
VMin) if not have_CO2Sen "Zone minimum airflow setpoint";
Buildings.Controls.OBC.CDL.Continuous.Sources.Constant maxZonCooAir(final k=
VCooMax) if have_CO2Sen "Zone maximum cooling airflow setpoint";
Buildings.Controls.OBC.CDL.Continuous.Sources.Constant breZonAre(final k=
outAirPerAre*AFlo) if have_occSen
"Area component of the breathing zone outdoor airflow";
Buildings.Controls.OBC.CDL.Continuous.Sources.Constant conVolMin(final k=
VMinCon) "VAV box controllable minimum";
Buildings.Controls.OBC.CDL.Continuous.Sources.Constant minZonAir(final k=VMin)
"Zone minimum airflow setpoint";
Buildings.Controls.OBC.CDL.Continuous.Sources.Constant setCO1(final k=CO2Set -
200) if have_CO2Sen "CO2 setpoints minus 200";
Buildings.Controls.OBC.CDL.Continuous.Sources.Constant setCO2(final k=CO2Set)
if have_CO2Sen "CO2 setpoints";
Buildings.Controls.OBC.CDL.Continuous.Sources.Constant zerFlo(final k=0)
"Zero airflow when window is open";
Buildings.Controls.OBC.CDL.Logical.Sources.Constant con(final k=true) if not
have_occSen "Constant true";
Buildings.Controls.OBC.CDL.Logical.Sources.Constant con1(final k=true) if
not have_winSen "Constant true";
Buildings.Controls.OBC.CDL.Continuous.Sources.Constant zerCon(final k=0)
"Output zero";
Buildings.Controls.OBC.CDL.Continuous.Sources.Constant zerCon1(final k=0) if
have_CO2Sen "Output zero";
Buildings.Controls.OBC.CDL.Continuous.Sources.Constant zerCon2(final k=0) if
have_CO2Sen "Output zero";
Buildings.Controls.OBC.CDL.Continuous.Sources.Constant zerCon3(final k=0) if
not have_occSen "Output zero";
Buildings.Controls.OBC.CDL.Continuous.Sources.Constant oneCon(final k=1) if
have_CO2Sen "Output one";
Buildings.Controls.OBC.CDL.Continuous.Sources.Constant oneCon1(final k=1) if
have_CO2Sen "Output one";
Buildings.Controls.OBC.CDL.Continuous.Sources.Constant cooMaxAir(final k=
VCooMax) "Cooling maximum airflow";
Buildings.Controls.OBC.CDL.Continuous.Sources.Constant heaMaxAir(final k=
VHeaMax) "Heat maximum airflow";
Buildings.Controls.OBC.CDL.Continuous.Sources.Constant zerCon6(final k=0)
"Output zero";
Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt(final k=Buildings.Controls.OBC.ASHRAE.G36_PR1.Types.OperationModes.occupied)
"Occupied mode";
Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt1(final k=
Buildings.Controls.OBC.ASHRAE.G36_PR1.Types.OperationModes.coolDown)
"Cool down mode";
Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt2(final k=
Buildings.Controls.OBC.ASHRAE.G36_PR1.Types.OperationModes.setUp)
"Setup mode";
Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt3(final k=
Buildings.Controls.OBC.ASHRAE.G36_PR1.Types.OperationModes.warmUp)
"Warm up mode";
Buildings.Controls.OBC.CDL.Integers.Sources.Constant conInt4(final k=
Buildings.Controls.OBC.ASHRAE.G36_PR1.Types.OperationModes.setBack)
"Setback mode";
Buildings.Controls.OBC.CDL.Integers.Equal intEqu
"Check if current operation mode is occupied mode";
Buildings.Controls.OBC.CDL.Integers.Equal intEqu1
"Check if current operation mode is cool-down mode";
Buildings.Controls.OBC.CDL.Integers.Equal intEqu2
"Check if current operation mode is setup mode";
Buildings.Controls.OBC.CDL.Integers.Equal intEqu3
"Check if current operation mode is warmup mode";
Buildings.Controls.OBC.CDL.Integers.Equal intEqu4
"Check if current operation mode is setback mode";
Buildings.Controls.OBC.CDL.Logical.Switch swi4
"Select cooling maximum based on operation mode";
Buildings.Controls.OBC.CDL.Logical.Switch swi8
"Select heating maximum based on operation mode";
Buildings.Controls.OBC.CDL.Logical.Switch swi9
"Select cooling maximum based on operation mode";
Buildings.Controls.OBC.CDL.Logical.Switch swi17
"Select heating minimum based on operation mode";
Buildings.Controls.OBC.CDL.Logical.Switch swi18
"Select heating maximum based on operation mode";
Buildings.Controls.OBC.CDL.Logical.Switch swi22
"Select heating minimum based on operation mode";
Buildings.Controls.OBC.CDL.Logical.Switch swi23
"Select heating maximum based on operation mode";
Buildings.Controls.OBC.CDL.Logical.Switch swi24
"Select cooling maximum based on operation mode";
Buildings.Controls.OBC.CDL.Logical.Switch swi25
"Select cooling minimum based on operation mode";
Buildings.Controls.OBC.CDL.Logical.Switch swi26
"Select minimum based on operation mode";
Buildings.Controls.OBC.CDL.Logical.Switch swi27
"Select heating minimum based on operation mode";
Buildings.Controls.OBC.CDL.Logical.Switch swi28
"Select heating maximum based on operation mode";
Buildings.Controls.OBC.CDL.Continuous.MultiSum actCooMaxAir(nin=3)
"Active cooling maximum airflow";
Buildings.Controls.OBC.CDL.Continuous.MultiSum actCooMinAir(nin=1)
"Active cooling minimum airflow";
Buildings.Controls.OBC.CDL.Continuous.MultiSum actMinAir(nin=1)
"Active minimum airflow";
Buildings.Controls.OBC.CDL.Continuous.MultiSum actHeaMinAir(nin=3)
"Active heating minimum airflow";
Buildings.Controls.OBC.CDL.Continuous.MultiSum actHeaMaxAir(nin=4)
"Active heating maximum airflow";
Buildings.Controls.OBC.CDL.Continuous.Max maxInp "Find greater input";
equation
connect(conVolMin.y, gre.u1);
connect(setCO1.y, co2ConLoo.x1);
connect(zerCon.y, co2ConLoo.f1);
connect(ppmCO2, co2ConLoo.u);
connect(setCO2.y, co2ConLoo.x2);
connect(oneCon.y, co2ConLoo.f2);
connect(zerCon1.y, lin1.x1);
connect(oneCon1.y, lin1.x2);
connect(maxZonCooAir.y, lin1.f2);
connect(minZonAir.y, lin1.f1);
connect(intEqu.y, swi3.u2);
connect(co2ConLoo.y, swi3.u1);
connect(swi3.y, lin1.u);
connect(zerCon2.y, swi3.u3);
connect(uOpeMod, intEqu.u2);
connect(conInt.y, intEqu.u1);
connect(nOcc, greThr.u);
connect(nOcc, gai.u);
connect(breZonAre.y, breZon.u2);
connect(gai.y, breZon.u1);
connect(breZon.y, swi.u3);
connect(greThr.y, swi.u2);
connect(lin1.y, swi.u1);
connect(minZonAir.y, greThr1.u);
connect(minZonAir.y, gre.u2);
connect(gre.y, and1.u2);
connect(greThr1.y, and1.u1);
connect(and1.y, not1.u);
connect(not1.y, swi2.u2);
connect(conVolMin.y, swi2.u3);
connect(swi.y, swi2.u1);
connect(uWin, not2.u);
connect(not2.y, swi1.u2);
connect(zerFlo.y, swi1.u3);
connect(swi2.y, swi1.u1);
connect(swi1.y, VOccMinAir);
connect(con.y, swi.u2);
connect(minZonAir1.y, swi.u1);
connect(con1.y, swi1.u2);
connect(zerCon3.y, swi.u3);
connect(intEqu.y, swi24.u2);
connect(intEqu.y, swi25.u2);
connect(intEqu.y, swi26.u2);
connect(intEqu.y, swi27.u2);
connect(intEqu.y, swi28.u2);
connect(cooMaxAir.y, swi24.u1);
connect(heaMaxAir.y, maxInp.u2);
connect(maxInp.y, swi28.u1);
connect(zerCon6.y, swi24.u3);
connect(zerCon6.y, swi25.u3);
connect(zerCon6.y, swi26.u3);
connect(zerCon6.y, swi27.u3);
connect(zerCon6.y, swi28.u3);
connect(uOpeMod, intEqu1.u2);
connect(uOpeMod, intEqu2.u2);
connect(uOpeMod, intEqu4.u2);
connect(uOpeMod, intEqu3.u2);
connect(conInt1.y, intEqu1.u1);
connect(conInt2.y, intEqu2.u1);
connect(conInt4.y, intEqu4.u1);
connect(conInt3.y, intEqu3.u1);
connect(cooMaxAir.y, swi4.u1);
connect(heaMaxAir.y, swi8.u1);
connect(intEqu1.y, swi4.u2);
connect(intEqu1.y, swi8.u2);
connect(zerCon6.y, swi4.u3);
connect(zerCon6.y, swi8.u3);
connect(cooMaxAir.y, swi9.u1);
connect(intEqu2.y, swi9.u2);
connect(zerCon6.y, swi9.u3);
connect(intEqu3.y, swi17.u2);
connect(intEqu3.y, swi18.u2);
connect(intEqu4.y, swi22.u2);
connect(intEqu4.y, swi23.u2);
connect(heaMaxAir.y, swi17.u1);
connect(cooMaxAir.y, swi18.u1);
connect(zerCon6.y, swi17.u3);
connect(zerCon6.y, swi18.u3);
connect(zerCon6.y, swi22.u3);
connect(zerCon6.y, swi23.u3);
connect(heaMaxAir.y, swi22.u1);
connect(cooMaxAir.y, swi23.u1);
connect(swi24.y, actCooMaxAir.u[1]);
connect(swi25.y, actCooMinAir.u[1]);
connect(swi26.y, actMinAir.u[1]);
connect(swi27.y, actHeaMinAir.u[1]);
connect(swi28.y, actHeaMaxAir.u[1]);
connect(swi4.y, actCooMaxAir.u[2]);
connect(swi8.y, actHeaMaxAir.u[2]);
connect(swi9.y, actCooMaxAir.u[3]);
connect(swi17.y, actHeaMinAir.u[2]);
connect(swi18.y, actHeaMaxAir.u[3]);
connect(swi22.y, actHeaMinAir.u[3]);
connect(swi23.y, actHeaMaxAir.u[4]);
connect(swi1.y, swi25.u1);
connect(swi1.y, swi26.u1);
connect(swi1.y, swi27.u1);
connect(swi1.y, maxInp.u1);
connect(actCooMaxAir.y, VActCooMax);
connect(actCooMinAir.y, VActCooMin);
connect(actMinAir.y, VActMin);
connect(actHeaMinAir.y, VActHeaMin);
connect(actHeaMaxAir.y, VActHeaMax);
end ActiveAirFlow;