Package of sequences for minimum flow bypass valve
Information
This package contains control sequences for the HW or CHW minimum flow bypass valve.
Package Content
| Name |
Description |
Controller
|
Minimum flow bypass valve controller |
ControllerHeatPumps
|
CHW and/or HW minimum flow bypass valve controller for heat pump plants |
Setpoint
|
Minimum flow setpoint calculation |
Validation
|
Collection of validation models |
Minimum flow bypass valve controller
Information
The minimum flow bypass valve is modulated based on a reverse acting control loop
to maintain the primary flow rate at setpoint.
The setpoint is calculated as described in
Buildings.Templates.Plants.Controls.MinimumFlow.Setpoint.
When using isolation valve command signals
(have_valInlIso=true or have_valOutIso=true):
When any valve is commanded open, the bypass valve control loop is enabled.
The valve is opened 100 % otherwise.
When enabled, the bypass valve loop shall be biased to start with the valve 100 % open.
Otherwise
(have_valInlIso=false and have_valOutIso=false):
When any primary pump is proven on, the bypass valve control loop is enabled.
The valve is opened 100 % otherwise.
When enabled, the bypass valve loop shall be biased to start with the valve 100 % open.
Parameters
| Type | Name | Default | Description |
| Boolean | use_val | | Set to true to use isolation valve command to enable control loop – Any unit |
| Boolean | use_valEqu[nEqu] | | Set to true to use isolation valve command to enable control loop – Each unit |
| Boolean | use_pumPriDed | | Set to true to use dedicated primary pump status to enable control loop – Any unit |
| Boolean | use_pumPriDedEqu[nEqu] | | Set to true to use dedicated primary pump status to enable control loop – Each unit |
| Integer | nEqu | 0 | Number of plant equipment |
| Real | V_flow_nominal[:] | | Design flow rate – Each unit [m3/s] |
| Real | V_flow_min[:] | | Minimum flow rate – Each unit [m3/s] |
| Real | k | 1 | Gain of controller |
| Time | Ti | 0.5 | Time constant of integrator block [s] |
Connectors
| Type | Name | Description |
| input RealInput | VPri_flow | Primary volume flow rate [m3/s] |
| input BooleanInput | u1PumPri_actual[nEqu] | Dedicated primary pump status |
| input BooleanInput | u1ValIso[nEqu] | Isolation valve command |
| output RealOutput | y | Valve command [1] |
| input BooleanInput | u1Equ[nEqu] | Equipment enable command |
| output RealOutput | VPriSet_flow | Primary flow setpoint [m3/s] |
Modelica definition
block Controller
parameter Boolean use_val
;
parameter Boolean use_valEqu[nEqu](start=
fill(false, nEqu))
;
parameter Boolean use_pumPriDed(start=false)
;
parameter Boolean use_pumPriDedEqu[nEqu](start=
fill(false, nEqu))
;
parameter Integer nEqu(
final min=1)=0
;
parameter Real V_flow_nominal[:](
each final unit="m3/s")
;
parameter Real V_flow_min[:](
each final unit="m3/s")
;
parameter Real k(
min=0)=1
;
parameter Modelica.Units.SI.Time Ti(
min=Buildings.Controls.OBC.CDL.Constants.small)=0.5
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput VPri_flow(
final unit="m3/s")
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1PumPri_actual[nEqu]
if use_pumPriDed ;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1ValIso[nEqu]
if use_val
;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput y(
final unit="1")
;
Buildings.Controls.OBC.Utilities.PIDWithEnable ctl(
final k=k,
final Ti=Ti,
final reverseActing=true,
y_reset=1,
y_neutral=1)
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1Equ[nEqu]
;
Setpoint setFloMin(
final V_flow_nominal=V_flow_nominal,
final V_flow_min=V_flow_min,
nEqu=nEqu)
;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput VPriSet_flow(
final unit="m3/s")
;
Buildings.Controls.OBC.CDL.Logical.And valIsoOpeAndPumPriDed[nEqu]
;
Buildings.Controls.OBC.CDL.Logical.Sources.Constant notUseVal[nEqu](
final k={
not use_valEqu[i]
for i
in 1:nEqu})
;
Buildings.Controls.OBC.CDL.Logical.Or valIsoOpeOrNotUse[nEqu]
if use_val
;
Buildings.Controls.OBC.CDL.Logical.Sources.Constant notUsePumPriDed[nEqu](
final k={
not use_pumPriDedEqu[i]
for i
in 1:nEqu})
;
Buildings.Controls.OBC.CDL.Logical.Or pumPriDedOrNotUse[nEqu]
if
use_pumPriDed
;
Utilities.PlaceholderLogical phPumPriDedOrNotUse[nEqu](
each final have_inp=
use_pumPriDed,
each final u_internal=true) ;
Utilities.PlaceholderLogical phValIsoOpeOrNotUse[nEqu](
each final have_inp=
use_val,
each final u_internal=true) ;
Buildings.Controls.OBC.CDL.Logical.MultiOr anyValIsoOpeAndPumPriDed(
final nin
=nEqu) ;
equation
connect(VPri_flow, ctl.u_m);
connect(ctl.y, y);
connect(u1Equ, setFloMin.u1);
connect(setFloMin.VPriSet_flow, ctl.u_s);
connect(setFloMin.VPriSet_flow, VPriSet_flow);
connect(notUseVal.y, valIsoOpeOrNotUse.u1);
connect(u1ValIso, valIsoOpeOrNotUse.u2);
connect(notUsePumPriDed.y, pumPriDedOrNotUse.u1);
connect(u1PumPri_actual, pumPriDedOrNotUse.u2);
connect(pumPriDedOrNotUse.y, phPumPriDedOrNotUse.u);
connect(phPumPriDedOrNotUse.y, valIsoOpeAndPumPriDed.u2);
connect(valIsoOpeOrNotUse.y, phValIsoOpeOrNotUse.u);
connect(phValIsoOpeOrNotUse.y, valIsoOpeAndPumPriDed.u1);
connect(valIsoOpeAndPumPriDed.y, anyValIsoOpeAndPumPriDed.u);
connect(anyValIsoOpeAndPumPriDed.y, ctl.uEna);
end Controller;
CHW and/or HW minimum flow bypass valve controller for heat pump plants
Information
HW minimum flow
The HW minimum flow bypass valve is modulated based on a reverse acting
control loop to maintain the primary HW flow rate at setpoint. The setpoint
is calculated as described in
Buildings.Templates.Plants.Controls.MinimumFlow.Setpoint using the
number of units commanded on in heating mode at each stage.
When using isolation valve command signals
(have_valInlIso=true or have_valOutIso=true): When
any HW isolation valve is commanded open, the HW bypass valve control loop
is enabled. The valve is opened 100 % otherwise. When enabled,
the HW bypass valve loop shall be biased to start with the valve
100 % open.
Otherwise
(have_valInlIso=false and have_valOutIso=false):
-
For heating and cooling plants with common dedicated CHW and HW
pumps: When any primary pump is proven on and the associated heat pump is
commanded in heating mode, the HW bypass valve control loop is enabled.
The valve is opened 100 % otherwise. When enabled, the HW
bypass valve loop shall be biased to start with the valve
100 % open.
-
For any other plants: When any primary HW pump is proven on, the HW
bypass valve control loop is enabled. The valve is opened
100 % otherwise. When enabled, the HW bypass valve loop shall
be biased to start with the valve 100 % open.
CHW minimum flow
The CHW minimum flow bypass valve is modulated based on a reverse acting
control loop to maintain the primary CHW flow rate at setpoint. The setpoint
is calculated as described in
Buildings.Templates.Plants.Controls.MinimumFlow.Setpoint using the
number of units commanded on in cooling mode at each stage.
When using isolation valve command signals
(have_valInlIso=true or have_valOutIso=true): When
any CHW isolation valve is commanded open, the CHW bypass valve control loop
is enabled. The valve is opened 100 % otherwise. When enabled,
the CHW bypass valve loop shall be biased to start with the valve
100 % open.
Otherwise
(have_valInlIso=false and have_valOutIso=false):
-
For heating and cooling plants with common dedicated CHW and HW
pumps: When any primary pump is proven on and the associated heat pump is
commanded in cooling mode, the CHW bypass valve control loop is enabled.
The valve is opened 100 % otherwise. When enabled, the CHW
bypass valve loop shall be biased to start with the valve
100 % open.
-
For any other plants: When any primary CHW pump is proven on, the
CHW bypass valve control loop is enabled. The valve is opened
100 % otherwise. When enabled, the CHW bypass valve loop shall
be biased to start with the valve 100 % open.
Parameters
| Type | Name | Default | Description |
| Boolean | have_heaWat | | Set to true for plants that provide HW |
| Boolean | have_chiWat | | Set to true for plants that provide CHW |
| Boolean | have_pumPriHdr | | Set to true for headered primary pumps, false for dedicated pumps |
| Boolean | have_pumChiWatPriDedHp | | Set to true for HP with separate dedicated primary pumps for CHW and HW circuits |
| Integer | nHp | | Number of 2-pipe heat pumps |
| Integer | nPhp | | Number of polyvalent heat pumps |
| Boolean | have_valInlIso | | Set to true if inlet isolation valves are present |
| Boolean | have_valOutIso | | Set to true if outlet isolation valves are present |
| Real | VHeaWat_flow_nominal[nEqu] | | Design HW flow rate – Each unit [m3/s] |
| Real | VHeaWat_flow_min[nEqu] | | Minimum HW flow rate – Each unit [m3/s] |
| Real | VChiWat_flow_nominal[nEqu] | | Design CHW flow rate – Each unit [m3/s] |
| Real | VChiWat_flow_min[nEqu] | | Minimum CHW flow rate – Each unit [m3/s] |
| Real | k | 1 | Gain of controller |
| Time | Ti | 0.5 | Time constant of integrator block [s] |
Connectors
| Type | Name | Description |
| input BooleanInput | u1PumHeaWatPriDedHp_actual[nHp] | Primary HW pump status – HP dedicated pumps |
| input BooleanInput | u1PumHeaWatPriDedPhp_actual[nPhp] | Primary HW pump status – Polyvalent HP dedicated pumps |
| input RealInput | VChiWatPri_flow | Primary CHW volume flow rate [m3/s] |
| input RealInput | VHeaWatPri_flow | Primary HW volume flow rate [m3/s] |
| input BooleanInput | u1ValHeaWatInlIso[nEqu] | Inlet HW isolation valve command |
| input BooleanInput | u1ValHeaWatOutIso[nEqu] | Outlet HW isolation valve command |
| output RealOutput | yValHeaWatMinByp | HW minimum flow bypass valve command [1] |
| input BooleanInput | u1Hp[nHp] | HP enable command |
| output RealOutput | VHeaWatPriSet_flow | Primary HW flow setpoint [m3/s] |
| input BooleanInput | u1HeaHp[nHp] | HP heating mode command |
| input BooleanInput | u1ValChiWatInlIso[nEqu] | Inlet CHW isolation valve command |
| input BooleanInput | u1ValChiWatOutIso[nEqu] | Outlet CHW isolation valve command |
| output RealOutput | yValChiWatMinByp | CHW minimum flow bypass valve command [1] |
| output RealOutput | VChiWatPriSet_flow | Primary CHW flow setpoint [m3/s] |
| input BooleanInput | u1HeaPhp[nPhp] | Polyvalent HP heating mode command |
| input BooleanInput | u1CooPhp[nPhp] | Polyvalent HP cooling mode command |
| input BooleanInput | u1PumChiWatPriDedHp_actual[nHp] | Primary CHW pump status – HP dedicated pumps |
| input BooleanInput | u1PumChiWatPriDedPhp_actual[nPhp] | Primary CHW pump status – Polyvalent HP dedicated pumps |
Modelica definition
block ControllerHeatPumps
parameter Boolean have_heaWat
;
parameter Boolean have_chiWat
;
parameter Boolean have_pumPriHdr
;
parameter Boolean have_pumChiWatPriDedHp(start=false)
;
final parameter Boolean use_valEqu[nEqu] = {(have_valInlIso
or have_valOutIso)
and (
not have_pumPriHdr
and i <= nHp
and not have_pumChiWatPriDedHp
or have_pumPriHdr)
for i
in 1:nEqu}
;
final parameter Boolean use_val = (have_valInlIso
or have_valOutIso)
and (
not have_pumPriHdr
and nHp > 0
and not have_pumChiWatPriDedHp
or have_pumPriHdr)
;
final parameter Boolean use_pumPriDedEqu[nEqu] =
{
not have_pumPriHdr
for i
in 1:nEqu}
;
final parameter Boolean use_pumPriDed =
not have_pumPriHdr
;
parameter Integer nHp
;
parameter Integer nPhp
;
final parameter Integer nEqu = nHp + nPhp
;
parameter Boolean have_valInlIso
;
parameter Boolean have_valOutIso
;
parameter Real VHeaWat_flow_nominal[nEqu](
start=
fill(0, nEqu),
unit=
fill("m3/s", nEqu))
;
parameter Real VHeaWat_flow_min[nEqu](
start=
fill(0, nEqu),
unit=
fill("m3/s", nEqu))
;
parameter Real VChiWat_flow_nominal[nEqu](
start=
fill(0, nEqu),
unit=
fill("m3/s", nEqu))
;
parameter Real VChiWat_flow_min[nEqu](
start=
fill(0, nEqu),
unit=
fill("m3/s", nEqu))
;
parameter Real k(min=0) = 1 ;
parameter Modelica.Units.SI.Time Ti(
min=Buildings.Controls.OBC.CDL.Constants.small) = 0.5
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1PumHeaWatPriDedHp_actual[nHp]
if have_heaWat
and nHp > 0
and not have_pumPriHdr
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1PumHeaWatPriDedPhp_actual[nPhp]
if have_heaWat
and nPhp > 0
and not have_pumPriHdr
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput VChiWatPri_flow(
final unit="m3/s")
if have_chiWat
;
Buildings.Controls.OBC.CDL.Interfaces.RealInput VHeaWatPri_flow(
final unit="m3/s")
if have_heaWat
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1ValHeaWatInlIso[nEqu]
if have_heaWat
and have_valInlIso
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1ValHeaWatOutIso[nEqu]
if have_heaWat
and have_valOutIso
;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput yValHeaWatMinByp(
final unit="1")
if have_heaWat
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1Hp[nHp]
if nHp > 0
;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput VHeaWatPriSet_flow(
final unit="m3/s")
if have_heaWat
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1HeaHp[nHp]
if have_heaWat
and have_chiWat
and nHp > 0
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1ValChiWatInlIso[nEqu]
if have_chiWat
and have_valInlIso
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1ValChiWatOutIso[nEqu]
if have_chiWat
and have_valOutIso
;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput yValChiWatMinByp(
final unit="1")
if have_chiWat
;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput VChiWatPriSet_flow(
final unit="m3/s")
if have_chiWat
;
Controller ctlFloMinHeaWat(
final use_val=use_val,
final use_valEqu=use_valEqu,
final use_pumPriDed=use_pumPriDed,
final use_pumPriDedEqu=use_pumPriDedEqu,
final V_flow_nominal=VHeaWat_flow_nominal,
final V_flow_min=VHeaWat_flow_min,
final k=k,
final Ti=Ti,
final nEqu=nEqu)
if have_heaWat
;
Controller ctlFloMinChiWat(
final use_val=use_val,
final use_valEqu=use_valEqu,
final use_pumPriDed=use_pumPriDed,
final use_pumPriDedEqu=use_pumPriDedEqu,
final V_flow_nominal=VChiWat_flow_nominal,
final V_flow_min=VChiWat_flow_min,
final k=k,
final Ti=Ti,
final nEqu=nEqu)
if have_chiWat
;
Utilities.PlaceholderLogical phHeaCooHp[nHp](
each final have_inp=have_heaWat
and have_chiWat,
each final have_inpPh=false,
each final u_internal=have_heaWat)
if nHp > 0
;
Buildings.Controls.OBC.CDL.Logical.Not u1CooHp[nHp]
if have_chiWat
and nHp > 0
;
Buildings.Controls.OBC.CDL.Logical.And onAndHeaHp[nHp]
if have_heaWat
and nHp > 0
;
Buildings.Controls.OBC.CDL.Logical.And onAndCooHp[nHp]
if have_chiWat
and nHp > 0
;
Buildings.Controls.OBC.CDL.Logical.And pumDedOnAndCooHp[nHp]
if have_heaWat
and have_chiWat
and nHp > 0
and not have_pumPriHdr
and not have_pumChiWatPriDedHp
;
Buildings.Controls.OBC.CDL.Logical.And pumDedOnAndHeaHp[nHp]
if have_heaWat
and have_chiWat
and nHp > 0
and not have_pumPriHdr
and not have_pumChiWatPriDedHp
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1HeaPhp[nPhp]
if nPhp > 0
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1CooPhp[nPhp]
if nPhp > 0
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1PumChiWatPriDedHp_actual[nHp]
if have_chiWat
and nHp > 0
and not have_pumPriHdr
and have_pumChiWatPriDedHp
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1PumChiWatPriDedPhp_actual[nPhp]
if have_chiWat
and not have_pumPriHdr
and nPhp > 0
;
Utilities.PlaceholderLogical phValHeaWatInlIso[nEqu](
each final have_inp=have_valInlIso,
each final have_inpPh=false,
each final u_internal=false)
if have_heaWat
;
Utilities.PlaceholderLogical phValHeaWatOutIso[nEqu](
each final have_inp=have_valOutIso,
each final have_inpPh=false,
each final u_internal=false)
if have_heaWat
;
Buildings.Controls.OBC.CDL.Logical.Or valHeaWatInlOrOutIso[nEqu]
if have_heaWat
;
Utilities.PlaceholderLogical phValChiWatInlIso[nEqu](
each final have_inp=have_valInlIso,
each final have_inpPh=false,
each final u_internal=false)
if have_chiWat
;
Utilities.PlaceholderLogical phValChiWatOutIso[nEqu](
each final have_inp=have_valOutIso,
each final have_inpPh=false,
each final u_internal=false)
if have_chiWat
;
Buildings.Controls.OBC.CDL.Logical.Or valChiWatInlOrOutIso[nEqu]
if have_chiWat
;
Utilities.ConcatenateSelectLogical pumDedOnCoo(
final have_u1=nHp > 0,
final have_u2=nPhp > 0,
nin2=nPhp,
nin1=nHp)
if have_chiWat
and not have_pumPriHdr
;
Utilities.ConcatenateSelectLogical pumDedOnHeaHpPhp(
final have_u1=nHp > 0,
final have_u2=nPhp > 0,
nin2=nPhp,
nin1=nHp)
if have_heaWat
and not have_pumPriHdr
;
Utilities.PlaceholderLogical pumDedOnAndHeaHp1[nHp](
each final have_inp=have_heaWat
and have_chiWat
and nHp > 0
and not have_pumPriHdr
and not have_pumChiWatPriDedHp,
each final have_inpPh=true)
if have_heaWat
and not have_pumPriHdr
and nHp > 0
;
Utilities.PlaceholderLogical pumDedOnAndHeaHp2[nHp](
each final have_inp=have_heaWat
and have_chiWat
and nHp > 0
and not have_pumPriHdr
and not have_pumChiWatPriDedHp,
each final have_inpPh=true)
if have_chiWat
and not have_pumPriHdr
and nHp > 0
;
Utilities.ConcatenateSelectLogical onAndHea(
final have_u1=nHp > 0,
final have_u2=nPhp > 0,
final nin2=nPhp,
final nin1=nHp)
if have_heaWat
;
Utilities.ConcatenateSelectLogical onAndCoo(
final have_u1=nHp > 0,
final have_u2=nPhp > 0,
final nin2=nPhp,
final nin1=nHp)
if have_chiWat
;
equation
connect(ctlFloMinHeaWat.y, yValHeaWatMinByp);
connect(ctlFloMinHeaWat.VPriSet_flow, VHeaWatPriSet_flow);
connect(ctlFloMinChiWat.y, yValChiWatMinByp);
connect(ctlFloMinChiWat.VPriSet_flow, VChiWatPriSet_flow);
connect(u1HeaHp, phHeaCooHp.u);
connect(phHeaCooHp.y, u1CooHp.u);
connect(u1Hp, onAndHeaHp.u1);
connect(VChiWatPri_flow, ctlFloMinChiWat.VPri_flow);
connect(VHeaWatPri_flow, ctlFloMinHeaWat.VPri_flow);
connect(u1CooHp.y, onAndCooHp.u2);
connect(u1CooHp.y, pumDedOnAndCooHp.u1);
connect(phHeaCooHp.y, onAndHeaHp.u2);
connect(phHeaCooHp.y, pumDedOnAndHeaHp.u1);
connect(u1Hp, onAndCooHp.u1);
connect(u1ValHeaWatInlIso, phValHeaWatInlIso.u);
connect(u1ValHeaWatOutIso, phValHeaWatOutIso.u);
connect(phValHeaWatInlIso.y, valHeaWatInlOrOutIso.u1);
connect(phValHeaWatOutIso.y, valHeaWatInlOrOutIso.u2);
connect(valHeaWatInlOrOutIso.y, ctlFloMinHeaWat.u1ValIso);
connect(u1ValChiWatInlIso, phValChiWatInlIso.u);
connect(u1ValChiWatOutIso, phValChiWatOutIso.u);
connect(phValChiWatInlIso.y, valChiWatInlOrOutIso.u1);
connect(phValChiWatOutIso.y, valChiWatInlOrOutIso.u2);
connect(valChiWatInlOrOutIso.y, ctlFloMinChiWat.u1ValIso);
connect(u1PumChiWatPriDedPhp_actual, pumDedOnCoo.u2);
connect(pumDedOnCoo.y, ctlFloMinChiWat.u1PumPri_actual);
connect(u1PumHeaWatPriDedPhp_actual, pumDedOnHeaHpPhp.u2);
connect(u1PumHeaWatPriDedHp_actual, pumDedOnAndHeaHp.u2);
connect(u1PumHeaWatPriDedHp_actual, pumDedOnAndCooHp.u2);
connect(pumDedOnHeaHpPhp.y, ctlFloMinHeaWat.u1PumPri_actual);
connect(pumDedOnAndHeaHp.y, pumDedOnAndHeaHp1.u);
connect(u1PumHeaWatPriDedHp_actual, pumDedOnAndHeaHp1.uPh);
connect(pumDedOnAndHeaHp1.y, pumDedOnHeaHpPhp.u1);
connect(pumDedOnAndHeaHp2.y, pumDedOnCoo.u1);
connect(u1PumChiWatPriDedHp_actual, pumDedOnAndHeaHp2.uPh);
connect(pumDedOnAndCooHp.y, pumDedOnAndHeaHp2.u);
connect(onAndHeaHp.y, onAndHea.u1);
connect(u1HeaPhp, onAndHea.u2);
connect(onAndHea.y, ctlFloMinHeaWat.u1Equ);
connect(onAndCooHp.y, onAndCoo.u1);
connect(onAndCoo.y, ctlFloMinChiWat.u1Equ);
connect(u1CooPhp, onAndCoo.u2);
end ControllerHeatPumps;
Minimum flow setpoint calculation
Information
The minimum flow setpoint is determined as follows, to provide minimum flow
through all operating units.
-
For the units commanded on in the stage, calculate
the highest ratio of minimum flow rate to design flow rate.
-
Calculate the minimum flow setpoint as the highest minimum flow ratio
multiplied by the sum of the design flow rates for the operating equipment.
Details
For plants consisting of identical units, the minimum flow setpoint is
the minimum flow of each unit multiplied by the number of units
enabled in the stage.
If the units have different minimum flow to design flow ratios, just maintaining
the sum of the minimum flows will not satisfy the equipment with the highest
relative minimum flows.
Note that this also requires that equipment be balanced to distribute flow
proportional to their design flow.
Parameters
| Type | Name | Default | Description |
| Real | V_flow_nominal[:] | | Design flow rate – Each unit [m3/s] |
| Real | V_flow_min[:] | | Minimum flow rate – Each unit [m3/s] |
Connectors
| Type | Name | Description |
| input BooleanInput | u1[nEqu] | Equipment enable command |
| output RealOutput | VPriSet_flow | Primary flow setpoint [m3/s] |
Modelica definition
block Setpoint
parameter Integer nEqu(
final min=1)=0
;
parameter Real V_flow_nominal[:](
each final unit="m3/s")
;
parameter Real V_flow_min[:](
each final unit="m3/s")
;
Buildings.Controls.OBC.CDL.Interfaces.BooleanInput u1[nEqu]
;
Buildings.Controls.OBC.CDL.Interfaces.RealOutput VPriSet_flow(
final unit="m3/s")
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant floMin[nEqu](
final k=V_flow_min)
;
Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToRea[nEqu](
each final realTrue=1,
each final realFalse=0)
;
Buildings.Controls.OBC.CDL.Reals.Multiply floMinEna[nEqu]
;
Buildings.Controls.OBC.CDL.Reals.Divide ratFloMinEna[nEqu]
;
Buildings.Controls.OBC.CDL.Reals.Sources.Constant floDes[nEqu](
final k=V_flow_nominal)
;
Buildings.Controls.OBC.CDL.Reals.MultiMax maxRatFloMinEna(
nin=nEqu)
;
Buildings.Controls.OBC.CDL.Reals.Multiply floDesEqu[nEqu]
;
Buildings.Controls.OBC.CDL.Reals.MultiSum sumFloDesEna(
nin=nEqu)
;
Buildings.Controls.OBC.CDL.Reals.Multiply floMinSet
;
equation
connect(u1, booToRea.u);
connect(booToRea.y, floMinEna.u2);
connect(floMin.y, floMinEna.u1);
connect(floDes.y, ratFloMinEna.u2);
connect(floMinEna.y, ratFloMinEna.u1);
connect(ratFloMinEna.y, maxRatFloMinEna.u);
connect(booToRea.y, floDesEqu.u1);
connect(floDes.y, floDesEqu.u2);
connect(maxRatFloMinEna.y, floMinSet.u1);
connect(floMinSet.y, VPriSet_flow);
connect(floDesEqu.y, sumFloDesEna.u);
connect(sumFloDesEna.y, floMinSet.u2);
end Setpoint;