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.
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_flow
,
VActCooMin_flow
, VActMin_flow
, VActHeaMin_flow
,
VActHeaMax_flow
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
VDisCooSetMax_flow
- Zone minimum airflow setpoint
VDisSetMin_flow
- Zone maximum heating airflow setpoint
VDisHeaSetMax_flow
2. Occupied minimum airflow VOccDisMin_flow
The VOccDisMin_flow
shall be equal to zone minimum airflow setpoint
VDisSetMin_flow
except as follows:
-
If the zone has an occupancy sensor,
VOccDisMin_flow
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,
VOccDisMin_flow
shall be zero when the window is open. -
If
VDisSetMin_flow
is non-zero and less than the lowest possible airflow setpoint allowed by the controlsVDisConMin_flow
,VOccDisMin_flow
shall be set equal toVDisConMin_flow
. -
If the zone has a CO2 sensor, then following steps are applied for calculating
VOccDisMin_flow
. (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 theVOccDisMin_flow
fromVDisSetMin_flow
at 0% loop output up toVDisCooSetMax_flow
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_flow ) | VDisCooSetMax_flow |
VDisCooSetMax_flow | VDisCooSetMax_flow |
0 | 0 | 0 |
Cooling minimum (VActCooMin_flow ) | VOccDisMin_flow |
0 | 0 | 0 | 0 | 0 |
Minimum (VActMin_flow ) | VOccDisMin_flow | 0 | 0 | 0 | 0 | 0 |
Heating minimum (VActHeaMin_flow ) | VOccDisMin_flow |
0 | 0 | VDisHeaSetMax_flow | VDisHeaSetMax_flow |
0 |
Heating maximum (VActHeaMax_flow ) | max(VDisHeaSetMax_flow,VOccDisMin_flow ) |
VDisHeaSetMax_flow | 0 | VDisCooSetMax_flow | VDisCooSetMax_flow |
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 | VDisCooSetMax_flow | Zone maximum cooling airflow setpoint [m3/s] | |
VolumeFlowRate | VDisSetMin_flow | Zone minimum airflow setpoint [m3/s] | |
VolumeFlowRate | VDisHeaSetMax_flow | Zone maximum heating airflow setpoint [m3/s] | |
VolumeFlowRate | VDisConMin_flow | VAV box controllable minimum [m3/s] | |
Area | AFlo | Area of the zone [m2] | |
Real | VOutPerAre_flow | 3e-4 | Outdoor air rate per unit area [m3/(s.m2)] |
VolumeFlowRate | VOutPerPer_flow | 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 | VOccDisMin_flow | Occupied minimum airflow [m3/s] |
output RealOutput | VActCooMax_flow | Active cooling maximum [m3/s] |
output RealOutput | VActCooMin_flow | Active cooling minimum [m3/s] |
output RealOutput | VActMin_flow | Active minimum [m3/s] |
output RealOutput | VActHeaMin_flow | Active heating minimum [m3/s] |
output RealOutput | VActHeaMax_flow | 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 VDisCooSetMax_flow
"Zone maximum cooling airflow setpoint";
parameter Modelica.SIunits.VolumeFlowRate VDisSetMin_flow
"Zone minimum airflow setpoint";
parameter Modelica.SIunits.VolumeFlowRate VDisHeaSetMax_flow
"Zone maximum heating airflow setpoint";
parameter Modelica.SIunits.VolumeFlowRate VDisConMin_flow
"VAV box controllable minimum";
parameter Modelica.SIunits.Area AFlo "Area of the zone";
parameter Real VOutPerAre_flow(final unit = "m3/(s.m2)")=3e-4
"Outdoor air rate per unit area";
parameter Modelica.SIunits.VolumeFlowRate VOutPerPer_flow=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 VOccDisMin_flow(
min=0,
final unit="m3/s",
quantity="VolumeFlowRate") "Occupied minimum airflow ";
Buildings.Controls.OBC.CDL.Interfaces.RealOutput VActCooMax_flow(
min=0,
final unit="m3/s",
quantity="VolumeFlowRate") "Active cooling maximum";
Buildings.Controls.OBC.CDL.Interfaces.RealOutput VActCooMin_flow(
min=0,
final unit="m3/s",
quantity="VolumeFlowRate") "Active cooling minimum";
Buildings.Controls.OBC.CDL.Interfaces.RealOutput VActMin_flow(
min=0,
final unit="m3/s",
quantity="VolumeFlowRate") "Active minimum";
Buildings.Controls.OBC.CDL.Interfaces.RealOutput VActHeaMin_flow(
min=0,
final unit="m3/s",
quantity="VolumeFlowRate") "Active heating minimum";
Buildings.Controls.OBC.CDL.Interfaces.RealOutput VActHeaMax_flow(
min=0,
final unit="m3/s",
quantity="VolumeFlowRate") "Active heating maximum";
Buildings.Controls.OBC.CDL.Continuous.Gain gai(k=VOutPerPer_flow) 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 VDisSetMin_flow and 100% at VDisCooSetMax_flow";
Buildings.Controls.OBC.CDL.Continuous.Greater gre
"Check if zone minimum airflow setpoint Vmin is less than the allowed controllable VDisConMin_flow";
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 VDisSetMin_flow 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=VDisSetMin_flow) if not have_CO2Sen
"Zone minimum airflow setpoint";
Buildings.Controls.OBC.CDL.Continuous.Sources.Constant maxZonCooAir(final k=VDisCooSetMax_flow) if have_CO2Sen
"Zone maximum cooling airflow setpoint";
Buildings.Controls.OBC.CDL.Continuous.Sources.Constant breZonAre(final k=VOutPerAre_flow*AFlo) if have_occSen
"Area component of the breathing zone outdoor airflow";
Buildings.Controls.OBC.CDL.Continuous.Sources.Constant conVolMin(final k=VDisConMin_flow)
"VAV box controllable minimum";
Buildings.Controls.OBC.CDL.Continuous.Sources.Constant minZonAir(final k=VDisSetMin_flow)
"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=VDisCooSetMax_flow)
"Cooling maximum airflow";
Buildings.Controls.OBC.CDL.Continuous.Sources.Constant heaMaxAir(final k=VDisHeaSetMax_flow)
"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, VOccDisMin_flow);
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_flow);
connect(actCooMinAir.y, VActCooMin_flow);
connect(actMinAir.y, VActMin_flow);
connect(actHeaMinAir.y, VActHeaMin_flow);
connect(actHeaMaxAir.y, VActHeaMax_flow);
end ActiveAirFlow;