Buildings.Fluid.HydronicConfigurations.ActiveNetworks

Package of hydronic configurations for active networks

Information

This package contains models of hydronic configurations compatible with active primary networks.

Extends from Modelica.Icons.VariantsPackage (Icon for package containing variants).

Package Content

Name Description
Buildings.Fluid.HydronicConfigurations.ActiveNetworks.Decoupling Decoupling Decoupling circuit with self-acting Delta-p control valve
Buildings.Fluid.HydronicConfigurations.ActiveNetworks.Diversion Diversion Diversion circuit
Buildings.Fluid.HydronicConfigurations.ActiveNetworks.InjectionThreeWay InjectionThreeWay Injection circuit with three-way valve
Buildings.Fluid.HydronicConfigurations.ActiveNetworks.InjectionTwoWay InjectionTwoWay Injection circuit with two-way valve
Buildings.Fluid.HydronicConfigurations.ActiveNetworks.InjectionTwoWayCheckValve InjectionTwoWayCheckValve Injection circuit with two-way valve and check valve in bypass branch
Buildings.Fluid.HydronicConfigurations.ActiveNetworks.SingleMixing SingleMixing Single mixing circuit
Buildings.Fluid.HydronicConfigurations.ActiveNetworks.Throttle Throttle Throttle circuit
Buildings.Fluid.HydronicConfigurations.ActiveNetworks.Examples Examples Example models

Buildings.Fluid.HydronicConfigurations.ActiveNetworks.Decoupling Buildings.Fluid.HydronicConfigurations.ActiveNetworks.Decoupling

Decoupling circuit with self-acting Delta-p control valve

Buildings.Fluid.HydronicConfigurations.ActiveNetworks.Decoupling

Information

Summary

This configuration (see schematic below) is used for variable flow primary and consumer circuits where the consumer circuit has the same supply temperature set point as the primary circuit. The fixed bypass prevents the primary pressure differential from being transmitted to the consumer circuit. This allows a proper operation of the terminal control valves on the consumer side when the primary pressure differential is either too low or too high or varying too much. The self-acting Δp control valve maintains a nearly constant bypass mass flow rate, set by default to 5% of the consumer circuit design mass flow rate.

Schematic

The following table presents the main characteristics of this configuration.

Primary circuit Variable flow
Secondary (consumer) circuit Variable flow
Typical applications Same consumer circuit supply temperature set point as primary circuit
(Otherwise use either this model in conjunction with Buildings.Fluid.HydronicConfigurations.PassiveNetworks.SingleMixing, or Buildings.Fluid.HydronicConfigurations.ActiveNetworks.InjectionTwoWay)
Primary pressure differential either too low or too high or varying too much such as in DHC systems
Non-recommended applications Heating systems with condensing boilers due to the recirculating primary flow rate
(Since the recirculating primary flow rate is controlled to a nearly constant value, this configuration is used in DHC systems.)
Built-in valve control options Self-acting Δp control valve with a proportional band of ±20% around the pressure differential set point
Control valve selection
(See the nomenclature in the schematic.)
β = ΔpA-B / (Δp1 + ΔpA-J) ≈ ΔpA-B / Δp1
The valve is sized with a pressure drop of Δp1 / 2 for a mass flow rate 5 to 10% higher than m2_flow_nominal.
Balancing requirement The design pressure drop of the bypass balancing valve dpBal3_nominal is typically around 10 kPa for a mass flow rate of m1_flow_nominal-m2_flow_nominal. No primary balancing valve is needed in addition to the self-acting Δp control valve.
(For an actuated control valve with external controls, the same balancing requirements as for Buildings.Fluid.HydronicConfigurations.ActiveNetworks.InjectionTwoWay hold. No bypass balancing valve is needed.)
Lumped flow resistance includes
(With the setting use_lumFloRes=true.)
Control valve val and primary balancing valve res1

Additional comments

The P-controller used in the model mimics a self-acting Δp control valve with a proportional band of ±20% around the pressure differential set point. This set point corresponds to the design pressure drop of the bypass balancing valve. Note that this configuration yields a nearly constant bypass mass flow rate, as opposed to a constant percentage of the consumer circuit mass flow rate provided by a control based on the return temperature upstream and downstream of the bypass. However, as illustrated in Buildings.Fluid.HydronicConfigurations.ActiveNetworks.Examples.DecouplingTemperature the latter control logic is flawed at low load, and the primary mass flow rate potentially maxed out. Since there is no standard strategy to counteract that effect, the configuration with built-in controls based on return temperature is not included in this package.

The specific built-in control option implemented in this model does not depend on the actual function of the consumer circuit (such as cooling, heating, or change-over). Therefore, the model remains the same whatever the value assigned to the parameter typCtl except if None (no built-in controls) is selected. In that latter case only, no built-in controls are included and the user must connect a control signal to modulate the valve.

For consumer circuits with a different supply temperature set point, this configuration is sometimes used in conjunction with Buildings.Fluid.HydronicConfigurations.PassiveNetworks.SingleMixing, see the example Buildings.Fluid.HydronicConfigurations.ActiveNetworks.Examples.DecouplingMixing.

Extends from Fluid.HydronicConfigurations.Interfaces.PartialHydronicConfiguration.

Parameters

TypeNameDefaultDescription
replaceable package MediumWaterMedium in the component
Configuration
Booleanuse_siztrueSet to true for built-in sizing of control valve and optional pump
Booleanuse_dp1use_sizSet to true to enable dp1_nominal
Booleanuse_dp2use_siz and typPum <> Buildi...Set to true to enable dp2_nominal
ValvetypValBuildings.Fluid.HydronicConf...Type of control valve
Booleanhave_typVarfalseSet to true to enable the choice of the controlled variable
Nominal condition
MassFlowRatem2_flow_nominal Mass flow rate in consumer circuit at design conditions [kg/s]
PressureDifferencedp1_nominal Primary circuit pressure differential at design conditions [Pa]
PressureDifferencedp2_nominal Consumer circuit pressure differential at design conditions [Pa]
Control valve
ValveCharacteristictypChaBuildings.Fluid.HydronicConf...Control valve characteristic
PressureDifferencedpValve_nominaldp1_nominal/2Control valve pressure drop at design conditions [Pa]
GenericflowCharacteristics Table with flow characteristics
GenericflowCharacteristics1 Table with flow characteristics for direct flow path at port_1
GenericflowCharacteristics3 Table with flow characteristics for bypass flow path at port_3
Pump
PumptypPumBuildings.Fluid.HydronicConf...Type of secondary pump
PumpModeltypPumModBuildings.Fluid.HydronicConf...Type of pump model
MassFlowRatemPum_flow_nominalm2_flow_nominalPump head at design conditions [kg/s]
PressureDifferencedpPum_nominaldp2_nominal + dpBal2_nominalPump head at design conditions [Pa]
GenericperPumredeclare parameter Movers.D...Pump parameters
Controls
ControltypCtlBuildings.Fluid.HydronicConf...Type of built-in controls
ControlVariabletypVarBuildings.Fluid.HydronicConf...Controlled variable
SimpleControllercontrollerTypeBuildings.Controls.OBC.CDL.T...Type of controller
Realk5Gain of controller
RealTi120Time constant of integrator block [s]
Balancing valves
PressureDifferencedpBal1_nominal0Primary balancing valve pressure drop at design conditions [Pa]
PressureDifferencedpBal2_nominal0Secondary balancing valve pressure drop at design conditions [Pa]
PressureDifferencedpBal3_nominalif typCtl <> Buildings.Fluid...Bypass balancing valve pressure drop at design conditions [Pa]
Assumptions
Booleanuse_lumFloRestrueSet to true to use a lumped flow resistance when possible
BooleanallowFlowReversaltrue= false to simplify equations, assuming, but not enforcing, no flow reversal for medium 1
Dynamics
Conservation equations
DynamicsenergyDynamicsModelica.Fluid.Types.Dynamic...Type of energy balance: dynamic (3 initialization options) or steady state
Advanced
Diagnostics
Booleanshow_Tfalse= true, if actual temperature at port is computed

Connectors

TypeNameDescription
FluidPort_aport_a1Primary supply port
FluidPort_bport_b1Primary return port
FluidPort_aport_a2Secondary return port
FluidPort_bport_b2Secondary supply port
input RealInputyValValve control signal [1]
input RealInputsetSet point
input RealInputyPumPump control signal (variable speed) [1]
input IntegerInputmodeOperating mode
output RealOutputyVal_actualValve position feedback [1]
output RealOutputyPum_actualActual pump input value that is used for computations [1]
output RealOutputPPumPump electrical power [W]

Modelica definition

model Decoupling "Decoupling circuit with self-acting Delta-p control valve" extends Fluid.HydronicConfigurations.Interfaces.PartialHydronicConfiguration( dpBal3_nominal=if typCtl<>Buildings.Fluid.HydronicConfigurations.Types.Control.None then 1e4 else 0, dpValve_nominal=dp1_nominal/2, m1_flow_nominal(min=(1+1e-2)*m2_flow_nominal)=1.05 * m2_flow_nominal, k=5, final controllerType=Buildings.Controls.OBC.CDL.Types.SimpleController.P, final typVal=Buildings.Fluid.HydronicConfigurations.Types.Valve.TwoWay, final have_set=false, final have_typVar=false, final use_dp1=use_siz, final use_dp2=use_siz and typPum<>Buildings.Fluid.HydronicConfigurations.Types.Pump.None); FixedResistances.Junction junBypSup( redeclare final package Medium = Medium, final energyDynamics=energyDynamics, final portFlowDirection_1=if allowFlowReversal then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Entering, final portFlowDirection_2=if allowFlowReversal then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Leaving, final portFlowDirection_3=if allowFlowReversal then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Leaving, final m_flow_nominal=m1_flow_nominal .* {1,-1,-1}, final dp_nominal=fill(0, 3)) "Junction"; FixedResistances.Junction junBypRet( redeclare final package Medium = Medium, final energyDynamics=energyDynamics, final portFlowDirection_1=if allowFlowReversal then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Entering, final portFlowDirection_2=if allowFlowReversal then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Leaving, final portFlowDirection_3=if allowFlowReversal then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Leaving, final m_flow_nominal=m1_flow_nominal .* {1,-1,1}, final dp_nominal=fill(0, 3)) "Junction"; Components.TwoWayValve val( redeclare final package Medium = Medium, final typCha=typCha, use_inputFilter=energyDynamics <> Modelica.Fluid.Types.Dynamics.SteadyState, final allowFlowReversal=allowFlowReversal, final m_flow_nominal=m1_flow_nominal, final dpValve_nominal=dpValve_nominal, final dpFixed_nominal=if use_lumFloRes then dpBal1_nominal else 0, final flowCharacteristics=flowCharacteristics) "Control valve"; FixedResistances.PressureDrop res1( redeclare final package Medium = Medium, final allowFlowReversal=allowFlowReversal, final m_flow_nominal=m1_flow_nominal, final dp_nominal=if use_lumFloRes then 0 else dpBal1_nominal) "Primary balancing valve"; FixedResistances.PressureDrop res2( redeclare final package Medium = Medium, final allowFlowReversal=allowFlowReversal, final m_flow_nominal=m2_flow_nominal, final dp_nominal=dpBal2_nominal) "Secondary balancing valve"; Buildings.Controls.OBC.CDL.Integers.GreaterThreshold isEna( final t=Controls.OperatingModes.disabled) "Returns true if enabled"; Components.Pump pum( redeclare final package Medium = Medium, final typ=typPum, final typMod=typPumMod, final m_flow_nominal=mPum_flow_nominal, final dp_nominal=dpPum_nominal, final energyDynamics=energyDynamics, final allowFlowReversal=allowFlowReversal, use_inputFilter=energyDynamics <> Modelica.Fluid.Types.Dynamics.SteadyState, final per=perPum) "Pump"; Sensors.TemperatureTwoPort T2Sup( redeclare final package Medium = Medium, final m_flow_nominal=m2_flow_nominal, final allowFlowReversal=allowFlowReversal, tau=if energyDynamics == Modelica.Fluid.Types.Dynamics.SteadyState then 0 else 1) "Consumer circuit supply temperature sensor"; Controls.PIDWithOperatingMode ctl( r=dpBal3_nominal, final reverseActing=true, final yMin=0, final yMax=1, final controllerType=controllerType, final k=k, final Ti=Ti) if typCtl <> Buildings.Fluid.HydronicConfigurations.Types.Control.None "Controller"; Sensors.TemperatureTwoPort T2Ret( redeclare final package Medium = Medium, final m_flow_nominal=m2_flow_nominal, final allowFlowReversal=allowFlowReversal, tau=if energyDynamics == Modelica.Fluid.Types.Dynamics.SteadyState then 0 else 1) "Consumer circuit return temperature sensor"; FixedResistances.PressureDrop res3( redeclare final package Medium = Medium, final allowFlowReversal=allowFlowReversal, final m_flow_nominal=m1_flow_nominal-m2_flow_nominal, final dp_nominal=dpBal3_nominal) "Bypass balancing valve"; Sensors.RelativePressure dp3( redeclare final package Medium = Medium) "Pressure drop across bypass balancing valve"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant dp3Set( y(final unit="Pa"), final k=dpBal3_nominal) "Pressure differential set point"; Buildings.Controls.OBC.CDL.Conversions.BooleanToInteger enaCtl "Enable signal for control loop"; equation connect(port_a1, junBypSup.port_1); connect(val.port_b, res1.port_a); connect(res1.port_b, port_b1); connect(mode, isEna.u); connect(junBypSup.port_2, pum.port_a); connect(pum.port_b, T2Sup.port_a); connect(T2Sup.port_b, port_b2); connect(ctl.y, val.y); connect(yVal, val.y); connect(val.y_actual, yVal_actual); connect(pum.y_actual, yPum_actual); connect(pum.P, PPum); connect(junBypRet.port_2, val.port_a); connect(res2.port_b, junBypRet.port_1); connect(port_a2, T2Ret.port_a); connect(T2Ret.port_b, res2.port_a); connect(junBypSup.port_3, res3.port_a); connect(res3.port_b, junBypRet.port_3); connect(dp3.port_a, res3.port_a); connect(dp3.port_b, res3.port_b); connect(dp3.p_rel, ctl.u_m); connect(dp3Set.y, ctl.u_s); connect(enaCtl.y, ctl.mode); connect(isEna.y, enaCtl.u); connect(isEna.y, pum.y1); connect(yPum, pum.y); end Decoupling;

Buildings.Fluid.HydronicConfigurations.ActiveNetworks.Diversion Buildings.Fluid.HydronicConfigurations.ActiveNetworks.Diversion

Diversion circuit

Buildings.Fluid.HydronicConfigurations.ActiveNetworks.Diversion

Information

Summary

This configuration (see schematic below) is used for constant flow primary circuits and variable flow consumer circuits where the consumer circuit has the same supply temperature set point as the primary circuit.

Schematic

The following table presents the main characteristics of this configuration.

Primary circuit Constant flow
Secondary (consumer) circuit Variable flow
Typical applications Single heating or cooling coil served by a constant flow circuit
Non-recommended applications DHC systems due to the significant recirculating primary flow rate at low load
Heating systems with condensing boilers for the same reason
Built-in valve control options No built-in controls
Control valve selection β = ΔpA-AB / (Δp2 + ΔpA-AB) = ΔpA-AB / (Δp1 - ΔpAB-b1)
The valve is sized with a pressure drop of Δp2 for a mass flow rate equal to the consumer circuit design flow.
Balancing requirement The bypass balancing valve is not needed in most cases. If the valve has a low authority and the consumer circuit has a high pressure drop (compared to the primary pump head) then a bypass balancing valve should be used and sized so that ΔpJ-B + ΔpB-AB = Δp2 + ΔpA-AB for a mass flow rate equal to the consumer circuit design flow.
Lumped flow resistances include
(With the setting use_lumFloRes=true.)
Direct branch: control valve direct branch val.res1 and whole consumer circuit between b2 and a2
Bypass branch: control valve bypass branch val.res3 and bypass balancing valve res3

Additional comments

See the example Buildings.Fluid.HydronicConfigurations.ActiveNetworks.Examples.DiversionOpenLoop for additional comments regarding the need for a balanced bypass.

Extends from Fluid.HydronicConfigurations.Interfaces.PartialHydronicConfiguration.

Parameters

TypeNameDefaultDescription
replaceable package MediumWaterMedium in the component
Configuration
Booleanuse_siztrueSet to true for built-in sizing of control valve and optional pump
Booleanuse_dp1falseSet to true to enable dp1_nominal
Booleanuse_dp2use_lumFloRes or use_sizSet to true to enable dp2_nominal
ValvetypValBuildings.Fluid.HydronicConf...Type of control valve
Booleanhave_typVarfalseSet to true to enable the choice of the controlled variable
Nominal condition
MassFlowRatem1_flow_nominalm2_flow_nominalMass flow rate in primary circuit at design conditions [kg/s]
MassFlowRatem2_flow_nominal Mass flow rate in consumer circuit at design conditions [kg/s]
PressureDifferencedp1_nominal Primary circuit pressure differential at design conditions [Pa]
PressureDifferencedp2_nominal Consumer circuit pressure differential at design conditions [Pa]
Control valve
ValveCharacteristictypChaBuildings.Fluid.HydronicConf...Control valve characteristic
PressureDifferencedpValve_nominaldp2_nominalControl valve pressure drop at design conditions [Pa]
GenericflowCharacteristics Table with flow characteristics
GenericflowCharacteristics1 Table with flow characteristics for direct flow path at port_1
GenericflowCharacteristics3 Table with flow characteristics for bypass flow path at port_3
Pump
PumptypPumBuildings.Fluid.HydronicConf...Type of secondary pump
PumpModeltypPumModBuildings.Fluid.HydronicConf...Type of pump model
MassFlowRatemPum_flow_nominalm2_flow_nominalPump head at design conditions [kg/s]
PressureDifferencedpPum_nominaldp2_nominal + dpBal2_nominalPump head at design conditions [Pa]
GenericperPumredeclare parameter Movers.D...Pump parameters
Controls
ControltypCtlBuildings.Fluid.HydronicConf...Type of built-in controls
ControlVariabletypVarBuildings.Fluid.HydronicConf...Controlled variable
SimpleControllercontrollerTypeBuildings.Controls.OBC.CDL.T...Type of controller
Realk0.1Gain of controller
RealTi120Time constant of integrator block [s]
Balancing valves
PressureDifferencedpBal1_nominal0Primary balancing valve pressure drop at design conditions [Pa]
PressureDifferencedpBal2_nominal0Secondary balancing valve pressure drop at design conditions [Pa]
PressureDifferencedpBal3_nominal0Bypass balancing valve pressure drop at design conditions [Pa]
Assumptions
Booleanuse_lumFloRestrueSet to true to use a lumped flow resistance when possible
BooleanallowFlowReversaltrue= false to simplify equations, assuming, but not enforcing, no flow reversal for medium 1
Dynamics
Conservation equations
DynamicsenergyDynamicsModelica.Fluid.Types.Dynamic...Type of energy balance: dynamic (3 initialization options) or steady state
Advanced
Diagnostics
Booleanshow_Tfalse= true, if actual temperature at port is computed

Connectors

TypeNameDescription
FluidPort_aport_a1Primary supply port
FluidPort_bport_b1Primary return port
FluidPort_aport_a2Secondary return port
FluidPort_bport_b2Secondary supply port
input RealInputyValValve control signal [1]
input RealInputsetSet point
input RealInputyPumPump control signal (variable speed) [1]
input IntegerInputmodeOperating mode
output RealOutputyVal_actualValve position feedback [1]
output RealOutputyPum_actualActual pump input value that is used for computations [1]
output RealOutputPPumPump electrical power [W]

Modelica definition

model Diversion "Diversion circuit" extends Fluid.HydronicConfigurations.Interfaces.PartialHydronicConfiguration( dpValve_nominal=dp2_nominal, final m1_flow_nominal=m2_flow_nominal, final dpBal2_nominal=0, final typVal=Buildings.Fluid.HydronicConfigurations.Types.Valve.ThreeWay, final typPum=Buildings.Fluid.HydronicConfigurations.Types.Pump.None, final typCtl=Buildings.Fluid.HydronicConfigurations.Types.Control.None, final have_typVar=false, final use_dp1=false, final use_dp2=use_lumFloRes or use_siz); Buildings.Fluid.HydronicConfigurations.Components.ThreeWayValve val( redeclare final package Medium=Medium, final typCha=typCha, final energyDynamics=energyDynamics, use_inputFilter=energyDynamics<>Modelica.Fluid.Types.Dynamics.SteadyState, final portFlowDirection_1=if allowFlowReversal then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Entering, final portFlowDirection_2=if allowFlowReversal then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Leaving, final portFlowDirection_3=if allowFlowReversal then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Entering, final m_flow_nominal=m2_flow_nominal, final dpValve_nominal=dpValve_nominal, final dpFixed_nominal=if use_lumFloRes then {dp2_nominal, dpBal3_nominal} else {0, 0}, final flowCharacteristics1=flowCharacteristics1, final flowCharacteristics3=flowCharacteristics3) "Control valve"; Buildings.Fluid.FixedResistances.Junction jun( redeclare final package Medium=Medium, final energyDynamics=energyDynamics, final portFlowDirection_1=if allowFlowReversal then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Entering, final portFlowDirection_2=if allowFlowReversal then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Leaving, final portFlowDirection_3=if allowFlowReversal then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Leaving, final m_flow_nominal=m2_flow_nominal .* {1,-1,-1}, final dp_nominal=fill(0, 3)) "Junction"; Buildings.Fluid.FixedResistances.PressureDrop res1( redeclare final package Medium=Medium, final allowFlowReversal=allowFlowReversal, final m_flow_nominal=m1_flow_nominal, final dp_nominal=dpBal1_nominal) "Primary balancing valve"; FixedResistances.PressureDrop res3( redeclare final package Medium = Medium, final allowFlowReversal=allowFlowReversal, final m_flow_nominal=m2_flow_nominal, final dp_nominal=if use_lumFloRes then 0 else dpBal3_nominal) "Bypass balancing valve"; equation connect(port_a2, val.port_1); connect(val.port_2,res1. port_a); connect(res1.port_b, port_b1); connect(jun.port_1, port_a1); connect(jun.port_2, port_b2); connect(yVal, val.y); connect(val.y_actual, yVal_actual); connect(jun.port_3, res3.port_a); connect(res3.port_b, val.port_3); end Diversion;

Buildings.Fluid.HydronicConfigurations.ActiveNetworks.InjectionThreeWay Buildings.Fluid.HydronicConfigurations.ActiveNetworks.InjectionThreeWay

Injection circuit with three-way valve

Buildings.Fluid.HydronicConfigurations.ActiveNetworks.InjectionThreeWay

Information

Summary

This configuration (see schematic below) is used for constant flow primary and consumer circuits where the consumer circuit has a different supply temperature set point, either at design conditions or varying during operation. Although this configuration may theoretically still be used if the primary and secondary design temperatures are equal, it loses its main advantage which is that the control valve can be sized for a lower flow rate and can therefore be smaller. The fixed bypass ensures a consumer circuit operation hydronically decoupled from the primary side and the control valve position.

Schematic

The following table presents the main characteristics of this configuration.

Primary circuit Constant flow
Secondary (consumer) circuit Constant flow
Typical applications Consumer circuit supply temperature different from primary circuit such as underfloor heating systems
(Otherwise use Buildings.Fluid.HydronicConfigurations.ActiveNetworks.Decoupling)
Primary pressure differential either too low or too high or varying too much
Non-recommended applications DHC systems due to the significant recirculating primary flow rate at low load
Heating systems with condensing boilers for the same reason
Built-in valve control options Supply temperature
Return temperature
Control valve selection
β = ΔpA-AB / ΔpJ-AB ≈ 1
Sizing is only based on a minimum pressure drop of 3 kPa at design flow rate 1, design (see below).
Balancing requirement The three-way valve should be fully open at design conditions.
dpBal3_nominal=dp1_nominal-dpValve_nominal for the primary design flow rate 1, design = ṁ2, design * (T2, sup, design - T2, ret, design) / (T1, sup, design - T2, ret, design)
Lumped flow resistances include
(With the setting use_lumFloRes=true.)
Control valve val only
(So the option has no effect here: the balancing valves are always modeled as distinct flow resistances.)

Additional comments

The reduced flow through the control valve due to the intermediary bypass allows selecting a smaller valve for the same design pressure drop. The pressure drop through the control valve is compensated by the primary pump, reducing the secondary pump head.

The balancing procedure should ensure that the three-way valve is fully open at design conditions. Oversizing the primary balancing valve (yielding a lower pressure drop) is not detrimental to the consumer circuit operation: the control valve compensates by working at a lower opening fraction on average. However, the primary circuit operation is degraded with a lower ΔT and a higher mass flow rate. See Buildings.Fluid.HydronicConfigurations.ActiveNetworks.Examples.InjectionThreeWay for a numerical illustration of those effects.

Extends from Fluid.HydronicConfigurations.Interfaces.PartialHydronicConfiguration.

Parameters

TypeNameDefaultDescription
replaceable package MediumWaterMedium in the component
Configuration
Booleanuse_siztrueSet to true for built-in sizing of control valve and optional pump
Booleanuse_dp1falseSet to true to enable dp1_nominal
Booleanuse_dp2use_siz and typPum <> Buildi...Set to true to enable dp2_nominal
ValvetypValBuildings.Fluid.HydronicConf...Type of control valve
Booleanhave_typVartrueSet to true to enable the choice of the controlled variable
Nominal condition
MassFlowRatem1_flow_nominal Mass flow rate in primary circuit at design conditions [kg/s]
MassFlowRatem2_flow_nominal Mass flow rate in consumer circuit at design conditions [kg/s]
PressureDifferencedp1_nominal Primary circuit pressure differential at design conditions [Pa]
PressureDifferencedp2_nominal Consumer circuit pressure differential at design conditions [Pa]
Control valve
ValveCharacteristictypChaBuildings.Fluid.HydronicConf...Control valve characteristic
PressureDifferencedpValve_nominal3e3Control valve pressure drop at design conditions [Pa]
GenericflowCharacteristics Table with flow characteristics
GenericflowCharacteristics1 Table with flow characteristics for direct flow path at port_1
GenericflowCharacteristics3 Table with flow characteristics for bypass flow path at port_3
Pump
PumptypPumBuildings.Fluid.HydronicConf...Type of secondary pump
PumpModeltypPumModBuildings.Fluid.HydronicConf...Type of pump model
MassFlowRatemPum_flow_nominalm2_flow_nominalPump head at design conditions [kg/s]
PressureDifferencedpPum_nominaldp2_nominal + dpBal2_nominalPump head at design conditions [Pa]
GenericperPumredeclare parameter Movers.D...Pump parameters
Controls
ControltypCtlBuildings.Fluid.HydronicConf...Type of built-in controls
ControlVariabletypVarBuildings.Fluid.HydronicConf...Controlled variable
SimpleControllercontrollerTypeBuildings.Controls.OBC.CDL.T...Type of controller
Realk0.1Gain of controller
RealTi120Time constant of integrator block [s]
Balancing valves
PressureDifferencedpBal1_nominal0Primary balancing valve pressure drop at design conditions [Pa]
PressureDifferencedpBal2_nominal0Secondary balancing valve pressure drop at design conditions [Pa]
PressureDifferencedpBal3_nominal0Bypass balancing valve pressure drop at design conditions [Pa]
Assumptions
Booleanuse_lumFloRestrueSet to true to use a lumped flow resistance when possible
BooleanallowFlowReversaltrue= false to simplify equations, assuming, but not enforcing, no flow reversal for medium 1
Dynamics
Conservation equations
DynamicsenergyDynamicsModelica.Fluid.Types.Dynamic...Type of energy balance: dynamic (3 initialization options) or steady state
Advanced
Diagnostics
Booleanshow_Tfalse= true, if actual temperature at port is computed

Connectors

TypeNameDescription
FluidPort_aport_a1Primary supply port
FluidPort_bport_b1Primary return port
FluidPort_aport_a2Secondary return port
FluidPort_bport_b2Secondary supply port
input RealInputyValValve control signal [1]
input RealInputsetSet point [K]
input RealInputyPumPump control signal (variable speed) [1]
input IntegerInputmodeOperating mode
output RealOutputyVal_actualValve position feedback [1]
output RealOutputyPum_actualActual pump input value that is used for computations [1]
output RealOutputPPumPump electrical power [W]

Modelica definition

model InjectionThreeWay "Injection circuit with three-way valve" extends Fluid.HydronicConfigurations.Interfaces.PartialHydronicConfiguration( dpValve_nominal=3e3, set(final unit="K", displayUnit="degC"), final dpBal3_nominal=0, final typVal=Buildings.Fluid.HydronicConfigurations.Types.Valve.ThreeWay, final have_typVar=true, final use_dp1=false, final use_dp2=use_siz and typPum<>Buildings.Fluid.HydronicConfigurations.Types.Pump.None); Buildings.Fluid.HydronicConfigurations.Components.ThreeWayValve val( redeclare final package Medium=Medium, final typCha=typCha, final energyDynamics=energyDynamics, use_inputFilter=energyDynamics<>Modelica.Fluid.Types.Dynamics.SteadyState, final portFlowDirection_1=if allowFlowReversal then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Entering, final portFlowDirection_2=if allowFlowReversal then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Leaving, final portFlowDirection_3=if allowFlowReversal then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Entering, final m_flow_nominal=m1_flow_nominal, final dpValve_nominal=dpValve_nominal, final dpFixed_nominal={0, 0}, final flowCharacteristics1=flowCharacteristics1, final flowCharacteristics3=flowCharacteristics3) "Control valve"; FixedResistances.Junction jun( redeclare final package Medium = Medium, final energyDynamics=energyDynamics, final portFlowDirection_1=if allowFlowReversal then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Entering, final portFlowDirection_2=if allowFlowReversal then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Leaving, final portFlowDirection_3=if allowFlowReversal then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Leaving, final m_flow_nominal=m1_flow_nominal .* {1,-1,-1}, final dp_nominal=fill(0, 3)) "Junction"; FixedResistances.Junction junBypSup( redeclare final package Medium = Medium, final energyDynamics=energyDynamics, final portFlowDirection_1=if allowFlowReversal then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Entering, final portFlowDirection_2=if allowFlowReversal then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Leaving, final portFlowDirection_3=if allowFlowReversal then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Leaving, final m_flow_nominal=m2_flow_nominal .* {1,-1,1}, final dp_nominal=fill(0, 3)) "Junction"; FixedResistances.Junction junBypRet( redeclare final package Medium = Medium, final energyDynamics=energyDynamics, final portFlowDirection_1=if allowFlowReversal then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Entering, final portFlowDirection_2=if allowFlowReversal then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Leaving, final portFlowDirection_3=if allowFlowReversal then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Leaving, final m_flow_nominal=m2_flow_nominal .* {1,-1,-1}, final dp_nominal=fill(0, 3)) "Junction"; FixedResistances.PressureDrop res1( redeclare final package Medium = Medium, final allowFlowReversal=allowFlowReversal, final m_flow_nominal=m1_flow_nominal, final dp_nominal=dpBal1_nominal) "Primary balancing valve"; FixedResistances.PressureDrop res2( redeclare final package Medium = Medium, final allowFlowReversal=allowFlowReversal, final m_flow_nominal=m2_flow_nominal, final dp_nominal=dpBal2_nominal) "Secondary balancing valve"; Buildings.Fluid.HydronicConfigurations.Components.Pump pum( redeclare final package Medium = Medium, final typ=typPum, final typMod=typPumMod, final m_flow_nominal=mPum_flow_nominal, final dp_nominal=dpPum_nominal, final energyDynamics=energyDynamics, final allowFlowReversal=allowFlowReversal, use_inputFilter=energyDynamics<>Modelica.Fluid.Types.Dynamics.SteadyState, final per=perPum) "Pump"; Sensors.TemperatureTwoPort T2Sup( redeclare final package Medium = Medium, final m_flow_nominal=m2_flow_nominal, final allowFlowReversal=allowFlowReversal, tau=if energyDynamics == Modelica.Fluid.Types.Dynamics.SteadyState then 0 else 1) "Consumer circuit supply temperature sensor"; Controls.PIDWithOperatingMode ctl( u_s(final unit="K", displayUnit="degC"), u_m(final unit="K", displayUnit="degC"), final reverseActing=typCtl == Buildings.Fluid.HydronicConfigurations.Types.Control.Heating, final yMin=0, final yMax=1, final controllerType=controllerType, final k=k, final Ti=Ti) if typCtl <> Buildings.Fluid.HydronicConfigurations.Types.Control.None "Controller"; Buildings.Controls.OBC.CDL.Integers.GreaterThreshold isEna( final t=Controls.OperatingModes.disabled) "Returns true if enabled"; Sensors.TemperatureTwoPort T2Ret( redeclare final package Medium = Medium, final m_flow_nominal=m2_flow_nominal, final allowFlowReversal=allowFlowReversal, tau=if energyDynamics == Modelica.Fluid.Types.Dynamics.SteadyState then 0 else 1) "Consumer circuit return temperature sensor"; Buildings.Controls.OBC.CDL.Routing.RealExtractor extIndSig(final nin=2) "Select measured signal"; Buildings.Controls.OBC.CDL.Integers.Sources.Constant ctlVar( final k=Integer(typVar)) "Controlled variable selector"; equation connect(jun.port_3, val.port_3); connect(junBypRet.port_2, val.port_1); connect(junBypSup.port_3, junBypRet.port_3); connect(jun.port_2, junBypSup.port_1); connect(port_a1, jun.port_1); connect(port_b1,res1. port_b); connect(res1.port_a, val.port_2); connect(res2.port_b, junBypRet.port_1); connect(junBypSup.port_2, pum.port_a); connect(pum.port_b, T2Sup.port_a); connect(T2Sup.port_b, port_b2); connect(mode, ctl.mode); connect(set, ctl.u_s); connect(yVal, val.y); connect(mode, isEna.u); connect(port_a2, T2Ret.port_a); connect(T2Ret.port_b,res2. port_a); connect(extIndSig.y, ctl.u_m); connect(T2Sup.T, extIndSig.u[2]); connect(T2Ret.T, extIndSig.u[1]); connect(ctl.y, val.y); connect(ctlVar.y, extIndSig.index); connect(val.y_actual, yVal_actual); connect(pum.P, PPum); connect(pum.y_actual, yPum_actual); connect(yPum, pum.y); connect(isEna.y, pum.y1); end InjectionThreeWay;

Buildings.Fluid.HydronicConfigurations.ActiveNetworks.InjectionTwoWay Buildings.Fluid.HydronicConfigurations.ActiveNetworks.InjectionTwoWay

Injection circuit with two-way valve

Buildings.Fluid.HydronicConfigurations.ActiveNetworks.InjectionTwoWay

Information

Summary

This circuit (see schematic hereunder) is used for variable flow primary circuits and either constant flow or variable flow consumer circuits. The fixed bypass prevents the primary pressure differential from being transmitted to the consumer circuit. This allows a proper operation of the terminal control valves on the consumer side when the primary pressure differential is either too low or too high or varying too much. For variable flow consumer circuits, the supply temperature set point must be different from the primary circuit.

Schematic

The following table presents the main characteristics of this configuration.

Primary circuit Variable flow
(See caveats in Buildings.Fluid.HydronicConfigurations.ActiveNetworks.Examples.InjectionTwoWayConstant: control options are critical to achieve a truly variable flow.)
Secondary (consumer) circuit Constant or variable flow
Typical applications Consumer circuit supply temperature set point different from primary circuit
(Otherwise use Buildings.Fluid.HydronicConfigurations.ActiveNetworks.Decoupling)
Primary pressure differential either too low or too high or varying too much such as in DHC systems
Non-recommended applications Variable flow consumer circuit with same supply temperature set point as primary circuit, see Buildings.Fluid.HydronicConfigurations.ActiveNetworks.Examples.InjectionTwoWayVariable
Variable flow consumer circuit with return temperature control, see Buildings.Fluid.HydronicConfigurations.ActiveNetworks.Examples.InjectionTwoWayVariableReturn
Built-in valve control options Supply temperature (must be different from primary)
Return temperature (incompatible with variable secondary)
Control valve selection
(See the nomenclature in the schematic.)
β = ΔpA-B / Δp1
The valve is sized with a pressure drop of Δp1 / 2 which yields an authority of 0.5.
Balancing requirement dpBal1_nominal=dp1_nominal-dpValve_nominal for the primary design flow rate 1, design = ṁ2, design * (T2, sup, design - T2, ret, design) / (T1, sup, design - T2, ret, design)
Lumped flow resistance includes
(With the setting use_lumFloRes=true.)
Control valve val and primary balancing valve res1

Additional comments

The pressure drop through the control valve is compensated by the primary pump, reducing the secondary pump head.

Extends from HydronicConfigurations.Interfaces.PartialHydronicConfiguration.

Parameters

TypeNameDefaultDescription
replaceable package MediumWaterMedium in the component
LosslessPiperes3res3(redeclare final package...Fluid pass-through that can be replaced by check valve
Configuration
Booleanuse_siztrueSet to true for built-in sizing of control valve and optional pump
Booleanuse_dp1use_sizSet to true to enable dp1_nominal
Booleanuse_dp2use_siz and typPum <> Buildi...Set to true to enable dp2_nominal
ValvetypValBuildings.Fluid.HydronicConf...Type of control valve
Booleanhave_typVartrueSet to true to enable the choice of the controlled variable
Nominal condition
MassFlowRatem1_flow_nominal Mass flow rate in primary circuit at design conditions [kg/s]
MassFlowRatem2_flow_nominal Mass flow rate in consumer circuit at design conditions [kg/s]
PressureDifferencedp1_nominal Primary circuit pressure differential at design conditions [Pa]
PressureDifferencedp2_nominal Consumer circuit pressure differential at design conditions [Pa]
Control valve
ValveCharacteristictypChaBuildings.Fluid.HydronicConf...Control valve characteristic
PressureDifferencedpValve_nominaldp1_nominal/2Control valve pressure drop at design conditions [Pa]
GenericflowCharacteristics Table with flow characteristics
GenericflowCharacteristics1 Table with flow characteristics for direct flow path at port_1
GenericflowCharacteristics3 Table with flow characteristics for bypass flow path at port_3
Pump
PumptypPumBuildings.Fluid.HydronicConf...Type of secondary pump
PumpModeltypPumModBuildings.Fluid.HydronicConf...Type of pump model
MassFlowRatemPum_flow_nominalm2_flow_nominalPump head at design conditions [kg/s]
PressureDifferencedpPum_nominaldp2_nominal + dpBal2_nominalPump head at design conditions [Pa]
GenericperPumredeclare parameter Movers.D...Pump parameters
Controls
ControltypCtlBuildings.Fluid.HydronicConf...Type of built-in controls
ControlVariabletypVarBuildings.Fluid.HydronicConf...Controlled variable
SimpleControllercontrollerTypeBuildings.Controls.OBC.CDL.T...Type of controller
Realk0.1Gain of controller
RealTi120Time constant of integrator block [s]
Balancing valves
PressureDifferencedpBal1_nominal0Primary balancing valve pressure drop at design conditions [Pa]
PressureDifferencedpBal2_nominal0Secondary balancing valve pressure drop at design conditions [Pa]
PressureDifferencedpBal3_nominal0Bypass balancing valve pressure drop at design conditions [Pa]
Assumptions
Booleanuse_lumFloRestrueSet to true to use a lumped flow resistance when possible
BooleanallowFlowReversaltrue= false to simplify equations, assuming, but not enforcing, no flow reversal for medium 1
Dynamics
Conservation equations
DynamicsenergyDynamicsModelica.Fluid.Types.Dynamic...Type of energy balance: dynamic (3 initialization options) or steady state
Advanced
Diagnostics
Booleanshow_Tfalse= true, if actual temperature at port is computed

Connectors

TypeNameDescription
FluidPort_aport_a1Primary supply port
FluidPort_bport_b1Primary return port
FluidPort_aport_a2Secondary return port
FluidPort_bport_b2Secondary supply port
input RealInputyValValve control signal [1]
input RealInputsetSet point [K]
input RealInputyPumPump control signal (variable speed) [1]
input IntegerInputmodeOperating mode
output RealOutputyVal_actualValve position feedback [1]
output RealOutputyPum_actualActual pump input value that is used for computations [1]
output RealOutputPPumPump electrical power [W]

Modelica definition

model InjectionTwoWay "Injection circuit with two-way valve" extends HydronicConfigurations.Interfaces.PartialHydronicConfiguration( set(final unit="K", displayUnit="degC"), dpValve_nominal=dp1_nominal / 2, final dpBal3_nominal=0, final typVal=Buildings.Fluid.HydronicConfigurations.Types.Valve.TwoWay, final have_typVar=true, final use_dp1=use_siz, final use_dp2=use_siz and typPum<>Buildings.Fluid.HydronicConfigurations.Types.Pump.None); FixedResistances.Junction junSup( redeclare final package Medium = Medium, final energyDynamics=energyDynamics, final portFlowDirection_1=if allowFlowReversal then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Entering, final portFlowDirection_2=if allowFlowReversal then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Leaving, final portFlowDirection_3=if allowFlowReversal then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Leaving, final m_flow_nominal=m2_flow_nominal .* {1,-1,1}, final dp_nominal=fill(0, 3)) "Junction"; Components.Pump pum( redeclare final package Medium = Medium, final typ=typPum, final typMod=typPumMod, final m_flow_nominal=mPum_flow_nominal, final dp_nominal=dpPum_nominal, final energyDynamics=energyDynamics, final allowFlowReversal=allowFlowReversal, use_inputFilter=energyDynamics <> Modelica.Fluid.Types.Dynamics.SteadyState, final per=perPum) "Pump"; Components.TwoWayValve val( redeclare final package Medium = Medium, final typCha=typCha, use_inputFilter=energyDynamics <> Modelica.Fluid.Types.Dynamics.SteadyState, final allowFlowReversal=allowFlowReversal, final m_flow_nominal=m1_flow_nominal, final dpValve_nominal=dpValve_nominal, final dpFixed_nominal=if use_lumFloRes then dpBal1_nominal else 0, final flowCharacteristics=flowCharacteristics) "Control valve"; Sensors.TemperatureTwoPort T2Sup( redeclare final package Medium = Medium, final m_flow_nominal=m2_flow_nominal, final allowFlowReversal=allowFlowReversal, tau=if energyDynamics == Modelica.Fluid.Types.Dynamics.SteadyState then 0 else 1) "Consumer circuit supply temperature sensor"; FixedResistances.Junction junRet( redeclare final package Medium = Medium, final energyDynamics=energyDynamics, final portFlowDirection_1=if allowFlowReversal then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Entering, final portFlowDirection_2=if allowFlowReversal then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Leaving, final portFlowDirection_3=if allowFlowReversal then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Leaving, final m_flow_nominal=m2_flow_nominal .* {1,-1,-1}, final dp_nominal=fill(0, 3)) "Junction"; FixedResistances.PressureDrop res2( redeclare final package Medium = Medium, final allowFlowReversal=allowFlowReversal, final m_flow_nominal=m2_flow_nominal, final dp_nominal=dpBal2_nominal) "Secondary balancing valve"; FixedResistances.PressureDrop res1( redeclare final package Medium = Medium, final allowFlowReversal=allowFlowReversal, final m_flow_nominal=m1_flow_nominal, final dp_nominal=if use_lumFloRes then 0 else dpBal1_nominal) "Primary balancing valve"; Sensors.TemperatureTwoPort T2Ret( redeclare final package Medium = Medium, final m_flow_nominal=m2_flow_nominal, final allowFlowReversal=allowFlowReversal, tau=if energyDynamics == Modelica.Fluid.Types.Dynamics.SteadyState then 0 else 1) "Consumer circuit return temperature sensor"; Controls.PIDWithOperatingMode ctl( u_s(final unit="K", displayUnit="degC"), u_m(final unit="K", displayUnit="degC"), final reverseActing=typCtl == Buildings.Fluid.HydronicConfigurations.Types.Control.Heating, final yMin=0, final yMax=1, final controllerType=controllerType, final k=k, final Ti=Ti) if typCtl<>Buildings.Fluid.HydronicConfigurations.Types.Control.None "Controller"; Buildings.Controls.OBC.CDL.Integers.GreaterThreshold isEna(final t=Controls.OperatingModes.disabled) "Returns true if enabled"; Buildings.Controls.OBC.CDL.Routing.RealExtractor extIndSig(final nin=2) "Select measured signal"; replaceable FixedResistances.LosslessPipe res3( redeclare final package Medium =Medium, m_flow_nominal=m2_flow_nominal) "Fluid pass-through that can be replaced by check valve"; Buildings.Controls.OBC.CDL.Integers.Sources.Constant ctlVar( final k=Integer(typVar)) "Controlled variable selector"; initial equation if m2_flow_nominal <= m1_flow_nominal then Modelica.Utilities.Streams.print( "*** Warning: In " + getInstanceName() + ": Primary mass flow rate should be strictly lower than consumer circuit mass flow rate " + "at design conditions to ensure an actual variable flow in the primary."); end if; if typPum==Buildings.Fluid.HydronicConfigurations.Types.Pump.VariableInput and typVar==Buildings.Fluid.HydronicConfigurations.Types.ControlVariable.ReturnTemperature then Modelica.Utilities.Streams.print( "*** Warning: In " + getInstanceName() + ": Return temperature control is likely not compatible with a variable flow consumer circuit."); end if; equation connect(junSup.port_2, pum.port_a); connect(junSup.port_1, port_a1); connect(pum.port_b, T2Sup.port_a); connect(T2Sup.port_b, port_b2); connect(junRet.port_1,res2. port_b); connect(val.port_b,res1. port_a); connect(res1.port_b, port_b1); connect(res2.port_a, T2Ret.port_b); connect(T2Ret.port_a, port_a2); connect(ctl.y, val.y); connect(set, ctl.u_s); connect(mode, isEna.u); connect(T2Sup.T, extIndSig.u[2]); connect(T2Ret.T, extIndSig.u[1]); connect(junRet.port_2, val.port_a); connect(extIndSig.y, ctl.u_m); connect(mode, ctl.mode); connect(junRet.port_3, res3.port_a); connect(res3.port_b, junSup.port_3); connect(ctlVar.y, extIndSig.index); connect(yVal, val.y); connect(pum.P, PPum); connect(pum.y_actual, yPum_actual); connect(val.y_actual, yVal_actual); connect(isEna.y, pum.y1); connect(yPum, pum.y); end InjectionTwoWay;

Buildings.Fluid.HydronicConfigurations.ActiveNetworks.InjectionTwoWayCheckValve Buildings.Fluid.HydronicConfigurations.ActiveNetworks.InjectionTwoWayCheckValve

Injection circuit with two-way valve and check valve in bypass branch

Buildings.Fluid.HydronicConfigurations.ActiveNetworks.InjectionTwoWayCheckValve

Information

Summary

This configuration (see schematic hereunder) is nearly similar to Buildings.Fluid.HydronicConfigurations.ActiveNetworks.InjectionTwoWay except for the check valve that is added into the bypass. If used in DHC systems and if the control valve is not properly sized to maintain the set point at all loads, the check valve prevents recirculation in the service line which degrades the ΔT in the distribution system. If used to connect a heating coil, the check valve reduces the risk of freezing in case of secondary pump failure.

Schematic

See the documentation of Buildings.Fluid.HydronicConfigurations.ActiveNetworks.InjectionTwoWay for a summary table of the main characteristics of this configuration. In addition, the following non-recommended applications should be mentioned, and the control valve authority is reduced by the check valve pressure drop.

Non-recommended applications Radiant systems due to the risk of overheating or condensation in case of secondary pump failure
Constant flow consumer circuits due to the risk of elevated secondary pressure when the check valve is closed and the primary and secondary pumps are in series
Control valve authority
(See the nomenclature in the schematic.)
β = ΔpA-B / (Δp1 + ΔpA-J)

Additional comments

With this configuration, if the check valve is closed, the primary pressure differential is transmitted to the consumer circuit, lowering the authority of the terminal control valves. Therefore this configuration is rather recommended in conjunction with a variable flow consumer circuit where the circulation pump speed is modulated to track a differential pressure set point. Hence, when the primary and secondary pumps are in series, the secondary pump is operated at a lower speed.

The check valve is configured with a default pressure drop res3.dpValve_nominal=5e3 Pa for a mass flow rate equal to the maximum value of m2_flow_nominal and the check valve fully open. Note that with a variable flow consumer circuit the bypass line may be sized with a lower design flow rate. Hence the parameter res3.m_flow_nominal is not assigned a final value and may be overwritten. The pressure drop through the check valve is compensated by the secondary pump, while the pressure drop through the control valve is compensated by the primary pump.

Extends from Fluid.HydronicConfigurations.ActiveNetworks.InjectionTwoWay (Injection circuit with two-way valve).

Parameters

TypeNameDefaultDescription
replaceable package MediumWaterMedium in the component
Configuration
Booleanuse_siztrueSet to true for built-in sizing of control valve and optional pump
Nominal condition
MassFlowRatem1_flow_nominal Mass flow rate in primary circuit at design conditions [kg/s]
MassFlowRatem2_flow_nominal Mass flow rate in consumer circuit at design conditions [kg/s]
PressureDifferencedp1_nominal Primary circuit pressure differential at design conditions [Pa]
PressureDifferencedp2_nominal Consumer circuit pressure differential at design conditions [Pa]
Control valve
ValveCharacteristictypChaBuildings.Fluid.HydronicConf...Control valve characteristic
PressureDifferencedpValve_nominaldp1_nominal/2Control valve pressure drop at design conditions [Pa]
GenericflowCharacteristics Table with flow characteristics
GenericflowCharacteristics1 Table with flow characteristics for direct flow path at port_1
GenericflowCharacteristics3 Table with flow characteristics for bypass flow path at port_3
Pump
PumptypPumBuildings.Fluid.HydronicConf...Type of secondary pump
PumpModeltypPumModBuildings.Fluid.HydronicConf...Type of pump model
MassFlowRatemPum_flow_nominalm2_flow_nominalPump head at design conditions [kg/s]
PressureDifferencedpPum_nominaldp2_nominal + dpBal2_nominal...Pump head at design conditions [Pa]
GenericperPumredeclare parameter Movers.D...Pump parameters
Controls
ControltypCtlBuildings.Fluid.HydronicConf...Type of built-in controls
ControlVariabletypVarBuildings.Fluid.HydronicConf...Controlled variable
SimpleControllercontrollerTypeBuildings.Controls.OBC.CDL.T...Type of controller
Realk0.1Gain of controller
RealTi120Time constant of integrator block [s]
Balancing valves
PressureDifferencedpBal1_nominal0Primary balancing valve pressure drop at design conditions [Pa]
PressureDifferencedpBal2_nominal0Secondary balancing valve pressure drop at design conditions [Pa]
Assumptions
Booleanuse_lumFloRestrueSet to true to use a lumped flow resistance when possible
BooleanallowFlowReversaltrue= false to simplify equations, assuming, but not enforcing, no flow reversal for medium 1
Dynamics
Conservation equations
DynamicsenergyDynamicsModelica.Fluid.Types.Dynamic...Type of energy balance: dynamic (3 initialization options) or steady state
Advanced
Diagnostics
Booleanshow_Tfalse= true, if actual temperature at port is computed

Connectors

TypeNameDescription
FluidPort_aport_a1Primary supply port
FluidPort_bport_b1Primary return port
FluidPort_aport_a2Secondary return port
FluidPort_bport_b2Secondary supply port
input RealInputyValValve control signal [1]
input RealInputsetSet point [K]
input RealInputyPumPump control signal (variable speed) [1]
input IntegerInputmodeOperating mode
output RealOutputyVal_actualValve position feedback [1]
output RealOutputyPum_actualActual pump input value that is used for computations [1]
output RealOutputPPumPump electrical power [W]

Modelica definition

model InjectionTwoWayCheckValve "Injection circuit with two-way valve and check valve in bypass branch" extends Fluid.HydronicConfigurations.ActiveNetworks.InjectionTwoWay( dpPum_nominal=dp2_nominal + dpBal2_nominal + res3.dpValve_nominal, redeclare FixedResistances.CheckValve res3( final dpValve_nominal=5e3, final allowFlowReversal=allowFlowReversal, final CvData=Buildings.Fluid.Types.CvTypes.OpPoint, final dpFixed_nominal=0)); end InjectionTwoWayCheckValve;

Buildings.Fluid.HydronicConfigurations.ActiveNetworks.SingleMixing Buildings.Fluid.HydronicConfigurations.ActiveNetworks.SingleMixing

Single mixing circuit

Buildings.Fluid.HydronicConfigurations.ActiveNetworks.SingleMixing

Information

Summary

This configuration (see schematic below) is used for variable flow primary circuits and either constant flow or variable flow secondary circuits that have a design supply temperature close or identical to the primary circuit but a varying set point during operation. The control valve should be sized with a pressure drop equal to the primary pressure differential. That pressure drop must be compensated for by the secondary pump which excludes the use of this configuration to applications with a high primary pressure differential.

Schematic

The following table presents the main characteristics of this configuration.

Primary circuit Variable flow
Secondary (consumer) circuit Constant or variable flow
Typical applications Circuits that have a design supply temperature close or identical to the primary circuit but a varying set point during operation.
Non-recommended applications Applications with a high primary pressure differential such as DHC systems due to the constraints on the control valve and secondary pump selection: for those applications use either Buildings.Fluid.HydronicConfigurations.ActiveNetworks.InjectionTwoWay, or Buildings.Fluid.HydronicConfigurations.ActiveNetworks.Decoupling in conjunction with Buildings.Fluid.HydronicConfigurations.PassiveNetworks.SingleMixing.
Built-in valve control options Supply temperature
Control valve selection β = ΔpA-AB / (Δp1 + ΔpA-AB)
The valve is sized with a pressure drop of Δp1 which yields an authority close to 0.5.
Balancing requirement The primary balancing valve should compensate for the primary pressure differential (see additional comments below).
Bypass balancing valve not recommended.
Lumped flow resistances include
(With the setting use_lumFloRes=true.)
Direct branch: control valve direct branch val.res1 and whole consumer circuit between b2 and a2
Bypass branch: control valve bypass branch val.res3 and bypass balancing valve res3

Additional comments

The primary pressure differential tends to oppose the bypass flow rate. It is possible to reach zero bypass flow at partial valve opening and a negative bypass flow for even lower opening values. Therefore, a balancing valve in the bypass is not recommended as it would further reduce the bypass flow rate. When using that model, one should keep the default setting dpBal3_nominal=0 Pa.

The balancing procedure should ensure that the primary pressure differential is compensated for by the primary balancing valve. Otherwise, the flow may reverse in the bypass branch and the mixing function of the three-way valve cannot be achieved. The control valve pressure drop must be compensated for by the secondary pump.

Extends from BaseClasses.SingleMixing (Single mixing circuit).

Parameters

TypeNameDefaultDescription
replaceable package MediumWaterMedium in the component
Configuration
Booleanuse_siztrueSet to true for built-in sizing of control valve and optional pump
Nominal condition
MassFlowRatem2_flow_nominal Mass flow rate in consumer circuit at design conditions [kg/s]
PressureDifferencedp1_nominal Primary circuit pressure differential at design conditions [Pa]
PressureDifferencedp2_nominal Consumer circuit pressure differential at design conditions [Pa]
Control valve
ValveCharacteristictypChaBuildings.Fluid.HydronicConf...Control valve characteristic
PressureDifferencedpValve_nominalmax(dp1_nominal, 3E3)Control valve pressure drop at design conditions [Pa]
GenericflowCharacteristics Table with flow characteristics
GenericflowCharacteristics1 Table with flow characteristics for direct flow path at port_1
GenericflowCharacteristics3 Table with flow characteristics for bypass flow path at port_3
Pump
PumptypPumBuildings.Fluid.HydronicConf...Type of secondary pump
PumpModeltypPumModBuildings.Fluid.HydronicConf...Type of pump model
MassFlowRatemPum_flow_nominalm2_flow_nominalPump head at design conditions [kg/s]
PressureDifferencedpPum_nominaldp2_nominal + dpBal2_nominal...Pump head at design conditions [Pa]
GenericperPumredeclare parameter Movers.D...Pump parameters
Controls
ControltypCtlBuildings.Fluid.HydronicConf...Type of built-in controls
ControlVariabletypVarBuildings.Fluid.HydronicConf...Controlled variable
SimpleControllercontrollerTypeBuildings.Controls.OBC.CDL.T...Type of controller
Realk0.1Gain of controller
RealTi120Time constant of integrator block [s]
Balancing valves
PressureDifferencedpBal1_nominal0Primary balancing valve pressure drop at design conditions [Pa]
PressureDifferencedpBal2_nominal0Secondary balancing valve pressure drop at design conditions [Pa]
PressureDifferencedpBal3_nominal0Bypass balancing valve pressure drop at design conditions [Pa]
Assumptions
Booleanuse_lumFloRestrueSet to true to use a lumped flow resistance when possible
BooleanallowFlowReversaltrue= false to simplify equations, assuming, but not enforcing, no flow reversal for medium 1
Dynamics
Conservation equations
DynamicsenergyDynamicsModelica.Fluid.Types.Dynamic...Type of energy balance: dynamic (3 initialization options) or steady state
Advanced
Diagnostics
Booleanshow_Tfalse= true, if actual temperature at port is computed

Connectors

TypeNameDescription
FluidPort_aport_a1Primary supply port
FluidPort_bport_b1Primary return port
FluidPort_aport_a2Secondary return port
FluidPort_bport_b2Secondary supply port
input RealInputyValValve control signal [1]
input RealInputsetSet point [K]
input RealInputyPumPump control signal (variable speed) [1]
input IntegerInputmodeOperating mode
output RealOutputyVal_actualValve position feedback [1]
output RealOutputyPum_actualActual pump input value that is used for computations [1]
output RealOutputPPumPump electrical power [W]

Modelica definition

model SingleMixing "Single mixing circuit" extends BaseClasses.SingleMixing( final dpBal3_nominal=0); end SingleMixing;

Buildings.Fluid.HydronicConfigurations.ActiveNetworks.Throttle Buildings.Fluid.HydronicConfigurations.ActiveNetworks.Throttle

Throttle circuit

Buildings.Fluid.HydronicConfigurations.ActiveNetworks.Throttle

Information

This configuration (see schematic below) is used for variable flow primary and consumer circuits that have the same supply temperature set point.

Schematic

The following table presents the main characteristics of this configuration.

Primary circuit Constant flow
Secondary (consumer) circuit Variable flow
Typical applications Single heating or cooling coil served by a variable flow circuit
DHC system energy transfer station with intermediary heat exchanger
Non-recommended applications
Built-in valve control options No built-in controls
Control valve selection β = ΔpA-B / Δp1 = ΔpA-B / (ΔpA-B + Δp2 + ΔpB-b1)
The valve is sized with a pressure drop equal to the one of the consumer circuit and of the primary balancing valve (if any) at design flow rate, yielding an authority of 0.5.
Balancing requirement No strict requirements: see additional comments below.
Lumped flow resistances include
(With the setting use_lumFloRes=true.)
Control valve val, whole consumer circuit between b2 and a2
and primary balancing valve res1

Additional comments

Some authors such as Taylor (2002, 2017) claim that variable flow circuits with variable speed pumps and terminal units with two-valves should not be balanced. The reason is that the circuit can only be balanced at one operating point. At partial load, if remote consumers have a low demand while the consumers closest to the pump have a high demand, the latter ones will experience a flow shortage due to the balancing valve that generates too much pressure drop for the lower available pressure differential due to the lower pump speed. In addition, there is no clear balancing procedure when a load diversity factor is taken into account. The example Buildings.Fluid.HydronicConfigurations.ActiveNetworks.Examples.ThrottleOpenLoop allows drawing similar conclusions.

References

Taylor, S. T., 2002. Balancing variable flow hydronic systems. ASHRAE Journal. URL: https://tayloreng.egnyte.com/dl/CZVS52ZTVB/ASHRAE_Journal_-_Balancing_Variable_Flow_Hydronic_Systems.pdf_

Taylor, S. T., 2017. Doubling down on not balancing variable flow hydronic systems. ASHRAE Journal. URL: https://tayloreng.egnyte.com/dl/W8sfOOuoni/ASHRAE_Journal_-_Doubling-Down_on_NOT_Balancing_Variable_Flow_Hydronic_Systems.pdf_

Extends from Fluid.HydronicConfigurations.Interfaces.PartialHydronicConfiguration.

Parameters

TypeNameDefaultDescription
replaceable package MediumWaterMedium in the component
Configuration
Booleanuse_siztrueSet to true for built-in sizing of control valve and optional pump
Booleanuse_dp1falseSet to true to enable dp1_nominal
Booleanuse_dp2use_lumFloRes or use_sizSet to true to enable dp2_nominal
ValvetypValBuildings.Fluid.HydronicConf...Type of control valve
Booleanhave_typVarfalseSet to true to enable the choice of the controlled variable
Nominal condition
MassFlowRatem1_flow_nominalm2_flow_nominalMass flow rate in primary circuit at design conditions [kg/s]
MassFlowRatem2_flow_nominal Mass flow rate in consumer circuit at design conditions [kg/s]
PressureDifferencedp1_nominal Primary circuit pressure differential at design conditions [Pa]
PressureDifferencedp2_nominal Consumer circuit pressure differential at design conditions [Pa]
Control valve
ValveCharacteristictypChaBuildings.Fluid.HydronicConf...Control valve characteristic
PressureDifferencedpValve_nominaldp2_nominal + dpBal1_nominalControl valve pressure drop at design conditions [Pa]
GenericflowCharacteristics Table with flow characteristics
GenericflowCharacteristics1 Table with flow characteristics for direct flow path at port_1
GenericflowCharacteristics3 Table with flow characteristics for bypass flow path at port_3
Pump
PumptypPumBuildings.Fluid.HydronicConf...Type of secondary pump
PumpModeltypPumModBuildings.Fluid.HydronicConf...Type of pump model
MassFlowRatemPum_flow_nominalm2_flow_nominalPump head at design conditions [kg/s]
PressureDifferencedpPum_nominaldp2_nominal + dpBal2_nominalPump head at design conditions [Pa]
GenericperPumredeclare parameter Movers.D...Pump parameters
Controls
ControltypCtlBuildings.Fluid.HydronicConf...Type of built-in controls
ControlVariabletypVarBuildings.Fluid.HydronicConf...Controlled variable
SimpleControllercontrollerTypeBuildings.Controls.OBC.CDL.T...Type of controller
Realk0.1Gain of controller
RealTi120Time constant of integrator block [s]
Balancing valves
PressureDifferencedpBal1_nominal0Primary balancing valve pressure drop at design conditions [Pa]
PressureDifferencedpBal2_nominal0Secondary balancing valve pressure drop at design conditions [Pa]
PressureDifferencedpBal3_nominal0Bypass balancing valve pressure drop at design conditions [Pa]
Assumptions
Booleanuse_lumFloRestrueSet to true to use a lumped flow resistance when possible
BooleanallowFlowReversaltrue= false to simplify equations, assuming, but not enforcing, no flow reversal for medium 1
Dynamics
Conservation equations
DynamicsenergyDynamicsModelica.Fluid.Types.Dynamic...Type of energy balance: dynamic (3 initialization options) or steady state
Advanced
Diagnostics
Booleanshow_Tfalse= true, if actual temperature at port is computed

Connectors

TypeNameDescription
FluidPort_aport_a1Primary supply port
FluidPort_bport_b1Primary return port
FluidPort_aport_a2Secondary return port
FluidPort_bport_b2Secondary supply port
input RealInputyValValve control signal [1]
input RealInputsetSet point
input RealInputyPumPump control signal (variable speed) [1]
input IntegerInputmodeOperating mode
output RealOutputyVal_actualValve position feedback [1]
output RealOutputyPum_actualActual pump input value that is used for computations [1]
output RealOutputPPumPump electrical power [W]

Modelica definition

model Throttle "Throttle circuit" extends Fluid.HydronicConfigurations.Interfaces.PartialHydronicConfiguration( dpValve_nominal=dp2_nominal + dpBal1_nominal, final dpBal2_nominal=0, final dpBal3_nominal=0, final m1_flow_nominal=m2_flow_nominal, final typVal=Buildings.Fluid.HydronicConfigurations.Types.Valve.TwoWay, final typPum=Buildings.Fluid.HydronicConfigurations.Types.Pump.None, final typCtl=Buildings.Fluid.HydronicConfigurations.Types.Control.None, final have_typVar=false, final use_dp1=false, final use_dp2=use_lumFloRes or use_siz); Buildings.Fluid.HydronicConfigurations.Components.TwoWayValve val( redeclare final package Medium=Medium, final typCha=typCha, use_inputFilter=energyDynamics<>Modelica.Fluid.Types.Dynamics.SteadyState, final allowFlowReversal=allowFlowReversal, final m_flow_nominal=m2_flow_nominal, final dpValve_nominal=dpValve_nominal, final dpFixed_nominal=if use_lumFloRes then dpBal1_nominal + dp2_nominal else 0, final flowCharacteristics=flowCharacteristics) "Control valve"; Buildings.Fluid.FixedResistances.PressureDrop res1( redeclare final package Medium=Medium, final allowFlowReversal=allowFlowReversal, final m_flow_nominal=m1_flow_nominal, final dp_nominal=if use_lumFloRes then 0 else dpBal1_nominal) "Primary balancing valve"; equation connect(res1.port_b, port_b1); connect(port_b2, port_a1); connect(val.port_b,res1. port_a); connect(val.port_a, port_a2); connect(yVal, val.y); connect(val.y_actual, yVal_actual); end Throttle;