Buildings.DHC.ETS.Combined.Subsystems

Package of models for subsystems of fifth generation DHC ETS

Information

This package contains models for subsystems composing energy transfer stations in fifth generation district heating and cooling systems.

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

Package Content

Name Description
Buildings.DHC.ETS.Combined.Subsystems.DHWConsumption DHWConsumption DHW tank, HX, thermostatic mixing valve, and sink
Buildings.DHC.ETS.Combined.Subsystems.HeatExchanger HeatExchanger Base subsystem with district heat exchanger
Buildings.DHC.ETS.Combined.Subsystems.HeatPump HeatPump Base subsystem with water-to-water heat pump
Buildings.DHC.ETS.Combined.Subsystems.HeatPumpDHWTank HeatPumpDHWTank Base subsystem with water-to-water heat pump with storage tank for domestic hot water
Buildings.DHC.ETS.Combined.Subsystems.HeatPumpModular HeatPumpModular Base subsystem with modular heat recovery heat pump
Buildings.DHC.ETS.Combined.Subsystems.StorageTankWithExternalHeatExchanger StorageTankWithExternalHeatExchanger A model of a storage tank with external heat exchanger to produce hot water
Buildings.DHC.ETS.Combined.Subsystems.StratifiedTankWithCommand StratifiedTankWithCommand Stratified buffer tank model
Buildings.DHC.ETS.Combined.Subsystems.SwitchBox SwitchBox Model for mass flow rate redirection with three-port two-position directional valves
Buildings.DHC.ETS.Combined.Subsystems.WatersideEconomizer WatersideEconomizer Base subsystem with waterside economizer
Buildings.DHC.ETS.Combined.Subsystems.Validation Validation Collection of validation models
Buildings.DHC.ETS.Combined.Subsystems.BaseClasses BaseClasses Contains base classes for Subsystems

Buildings.DHC.ETS.Combined.Subsystems.DHWConsumption Buildings.DHC.ETS.Combined.Subsystems.DHWConsumption

DHW tank, HX, thermostatic mixing valve, and sink

Buildings.DHC.ETS.Combined.Subsystems.DHWConsumption

Information

Model with fresh water station and domestic hot water load.

This model integrates a fresh water station, using Buildings.DHC.ETS.Combined.Subsystems.StorageTankWithExternalHeatExchanger with a domestic hot water load. The load is served at a specified temperature, using Buildings.DHC.Loads.HotWater.ThermostaticMixingValve to mix cold and hot water in order to meet the required hot water load.

The hot water load is specified through the input QReqHotWat_flow, rather than the hot water mass flow rate, in order to take into account the actual temperature of the hot water after the heat exchanger of the fresh water station.

Parameters

TypeNameDefaultDescription
replaceable package MediumModelica.Media.Interfaces.Pa...Medium in the component
GenericDomesticHotWaterWithHeatExchangerdat Performance data
Nominal condition
HeatFlowRateQHotWat_flow_nominal Nominal capacity of heat pump condenser for hot water production system (>=0) [W]
TemperatureDifferencedT_nominal Nominal temperature difference from the condenser [K]
Assumptions
BooleanallowFlowReversaltrue= false to simplify equations, assuming, but not enforcing, no flow reversal
Initialization
TemperatureT_startMedium.T_defaultTemperature start value of the tank [K]

Connectors

TypeNameDescription
replaceable package MediumMedium in the component
FluidPort_aport_aFluid connector a (positive design flow direction is from port_a to port_b)
FluidPort_bport_bFluid connector b (positive design flow direction is from port_a to port_b)
input RealInputTHotWatSupSetDomestic hot water temperature set point for supply to fixtures [K]
input RealInputTColWatCold water temperature [K]
input RealInputQReqHotWat_flowService hot water load [W]
output RealOutputPEleElectric power required for pumping equipment [W]
output BooleanOutputchargeOutput true if tank needs to be charged, false if it is sufficiently charged
output RealOutputTTanTopTop temperature of tank [K]
output RealOutputdHFloEnthalpy flow rate [W]

Modelica definition

model DHWConsumption "DHW tank, HX, thermostatic mixing valve, and sink" replaceable package Medium = Modelica.Media.Interfaces.PartialMedium "Medium in the component"; parameter Boolean allowFlowReversal = true "= false to simplify equations, assuming, but not enforcing, no flow reversal"; parameter Buildings.DHC.Loads.HotWater.Data.GenericDomesticHotWaterWithHeatExchanger dat "Performance data"; parameter Modelica.Units.SI.HeatFlowRate QHotWat_flow_nominal(min=0) "Nominal capacity of heat pump condenser for hot water production system (>=0)"; parameter Modelica.Units.SI.TemperatureDifference dT_nominal(min=Modelica.Constants.eps) "Nominal temperature difference from the condenser"; final parameter Modelica.Units.SI.MassFlowRate m_flow_nominal=QHotWat_flow_nominal/4200/dT_nominal "Nominal mass flow rate"; parameter Medium.Temperature T_start=Medium.T_default "Temperature start value of the tank"; Modelica.Fluid.Interfaces.FluidPort_a port_a( redeclare final package Medium = Medium, m_flow(min=if allowFlowReversal then -Modelica.Constants.inf else 0), h_outflow( start = Medium.h_default, nominal = Medium.h_default), Xi_outflow(each nominal=0.01)) "Fluid connector a (positive design flow direction is from port_a to port_b)"; Modelica.Fluid.Interfaces.FluidPort_b port_b( redeclare final package Medium = Medium, m_flow(max=if allowFlowReversal then +Modelica.Constants.inf else 0), h_outflow( start = Medium.h_default, nominal = Medium.h_default), Xi_outflow(each nominal=0.01)) "Fluid connector b (positive design flow direction is from port_a to port_b)"; Buildings.DHC.ETS.Combined.Subsystems.StorageTankWithExternalHeatExchanger domHotWatTan( redeclare final package MediumDom = Medium, redeclare final package MediumHea = Medium, final dat=dat, final TTan_start=T_start) "Storage tank with fresh water station"; Buildings.DHC.Loads.HotWater.ThermostaticMixingValve theMixVal( redeclare final package Medium = Medium, mMix_flow_nominal=1.2*dat.mDom_flow_nominal) "Thermostatic mixing valve"; Buildings.Fluid.Sources.Boundary_pT souDCW( redeclare final package Medium = Medium, use_T_in=true, nPorts=1) "Source for domestic cold water"; Buildings.DHC.ETS.BaseClasses.Junction dcwSpl( redeclare final package Medium = Medium, portFlowDirection_1=Modelica.Fluid.Types.PortFlowDirection.Entering, portFlowDirection_2=Modelica.Fluid.Types.PortFlowDirection.Leaving, portFlowDirection_3=Modelica.Fluid.Types.PortFlowDirection.Leaving, final m_flow_nominal=m_flow_nominal*{1,-1,-1}) "Splitter for domestic cold water"; Buildings.Controls.OBC.CDL.Interfaces.RealInput THotWatSupSet( final unit="K", displayUnit="degC") "Domestic hot water temperature set point for supply to fixtures"; Buildings.Controls.OBC.CDL.Interfaces.RealInput TColWat( final unit="K", displayUnit="degC") "Cold water temperature"; Buildings.Controls.OBC.CDL.Interfaces.RealInput QReqHotWat_flow( final unit="W") "Service hot water load"; Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai(k=1/QHotWat_flow_nominal) "Gain to normalize hot water signal"; Modelica.Blocks.Interfaces.RealOutput PEle(unit="W") "Electric power required for pumping equipment"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput charge "Output true if tank needs to be charged, false if it is sufficiently charged"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput TTanTop( final unit="K", displayUnit="degC") "Top temperature of tank"; Modelica.Blocks.Sources.RealExpression expTTanTop( y=domHotWatTan.TTanTop.T) "Top temperature of tank"; Buildings.DHC.Networks.BaseClasses.DifferenceEnthalpyFlowRate dHFlow( redeclare final package Medium1 = Medium, redeclare final package Medium2 = Medium, final m_flow_nominal=m_flow_nominal, allowFlowReversal=false) "Enthalpy flow rate"; Modelica.Blocks.Interfaces.RealOutput dHFlo(unit="W") "Enthalpy flow rate"; equation connect(port_a, domHotWatTan.port_aHea); connect(domHotWatTan.port_bHea, port_b); connect(souDCW.ports[1], dcwSpl.port_1); connect(dcwSpl.port_2, theMixVal.port_col); connect(souDCW.T_in, TColWat); connect(theMixVal.yMixSet, gai.y); connect(QReqHotWat_flow, gai.u); connect(THotWatSupSet, theMixVal.TMixSet); connect(THotWatSupSet, domHotWatTan.TDomSet); connect(domHotWatTan.PEle, PEle); connect(domHotWatTan.charge, charge); connect(expTTanTop.y, TTanTop); connect(domHotWatTan.port_bDom, dHFlow.port_a1); connect(dHFlow.port_b1, theMixVal.port_hot); connect(dcwSpl.port_3, dHFlow.port_a2); connect(dHFlow.port_b2, domHotWatTan.port_aDom); connect(dHFlow.dH_flow, dHFlo); end DHWConsumption;

Buildings.DHC.ETS.Combined.Subsystems.HeatExchanger Buildings.DHC.ETS.Combined.Subsystems.HeatExchanger

Base subsystem with district heat exchanger

Buildings.DHC.ETS.Combined.Subsystems.HeatExchanger

Information

This is a model for a district heat exchanger system with a variable speed pump on the secondary side, and a variable speed pump (in case of a passive network) or a two-way modulating valve (in case of an active network) on the primary side.

The system is controlled based on the logic described in Buildings.Obsolete.DHC.ETS.Combined.Controls.HeatExchanger. The pump flow rate is considered proportional to the pump speed under the assumption of a constant flow resistance in both the primary and the secondary loops.

Extends from Buildings.Fluid.Interfaces.PartialFourPortInterface (Partial model with four ports and declaration of quantities that are used by many models).

Parameters

TypeNameDefaultDescription
replaceable package Medium1PartialMediumMedium 1 in the component
replaceable package Medium2PartialMediumMedium 2 in the component
ConnectionConfigurationconCon District connection configuration
Nominal condition
MassFlowRatem1_flow_nominalabs(Q_flow_nominal/4200/(T_b...Nominal mass flow rate [kg/s]
MassFlowRatem2_flow_nominalabs(Q_flow_nominal/4200/(T_b...Nominal mass flow rate [kg/s]
PressureDifferencedp1Hex_nominal Nominal pressure drop across heat exchanger on district side [Pa]
PressureDifferencedp2Hex_nominal Nominal pressure drop across heat exchanger on building side [Pa]
PressureDifferencedpVal1_nominaldp1Hex_nominal/2Nominal pressure drop of primary control valve [Pa]
PressureDifferencedpVal2_nominaldp2Hex_nominal/2Nominal pressure drop of secondary control valve [Pa]
HeatFlowRateQ_flow_nominal Nominal heat flow rate (from district to building) [W]
TemperatureT_a1_nominal Nominal water inlet temperature on district side [K]
TemperatureT_b1_nominal Nominal water outlet temperature on district side [K]
TemperatureT_a2_nominal Nominal water inlet temperature on building side [K]
TemperatureT_b2_nominal Nominal water outlet temperature on building side [K]
Controls
RealspePum1Min0.1Heat exchanger primary pump minimum speed (fractional) [1]
RealspePum2Min0.1Heat exchanger secondary pump minimum speed (fractional) [1]
Assumptions
BooleanallowFlowReversal1true= false to simplify equations, assuming, but not enforcing, no flow reversal for medium 1
BooleanallowFlowReversal2true= false to simplify equations, assuming, but not enforcing, no flow reversal for medium 2
Advanced
MassFlowRatem1_flow_small1E-4*abs(m1_flow_nominal)Small mass flow rate for regularization of zero flow [kg/s]
MassFlowRatem2_flow_small1E-4*abs(m2_flow_nominal)Small mass flow rate for regularization of zero flow [kg/s]
Diagnostics
Booleanshow_Tfalse= true, if actual temperature at port is computed

Connectors

TypeNameDescription
FluidPort_aport_a1Fluid connector a1 (positive design flow direction is from port_a1 to port_b1)
FluidPort_bport_b1Fluid connector b1 (positive design flow direction is from port_a1 to port_b1)
FluidPort_aport_a2Fluid connector a2 (positive design flow direction is from port_a2 to port_b2)
FluidPort_bport_b2Fluid connector b2 (positive design flow direction is from port_a2 to port_b2)
input BooleanInputonControl signal for secondary side (from supervisory). Set to true to operate subsystem
output RealOutputPPumPower drawn by pump motors [W]

Modelica definition

model HeatExchanger "Base subsystem with district heat exchanger" extends Buildings.Fluid.Interfaces.PartialFourPortInterface( final m1_flow_nominal=abs(Q_flow_nominal/4200/(T_b1_nominal - T_a1_nominal)), final m2_flow_nominal=abs(Q_flow_nominal/4200/(T_b2_nominal - T_a2_nominal))); parameter DHC.ETS.Types.ConnectionConfiguration conCon "District connection configuration"; parameter Modelica.Units.SI.PressureDifference dp1Hex_nominal(displayUnit= "Pa") "Nominal pressure drop across heat exchanger on district side"; parameter Modelica.Units.SI.PressureDifference dp2Hex_nominal(displayUnit= "Pa") "Nominal pressure drop across heat exchanger on building side"; parameter Modelica.Units.SI.PressureDifference dpVal1_nominal(displayUnit= "Pa") = dp1Hex_nominal/2 "Nominal pressure drop of primary control valve"; parameter Modelica.Units.SI.PressureDifference dpVal2_nominal(displayUnit= "Pa") = dp2Hex_nominal/2 "Nominal pressure drop of secondary control valve"; parameter Modelica.Units.SI.HeatFlowRate Q_flow_nominal "Nominal heat flow rate (from district to building)"; parameter Modelica.Units.SI.Temperature T_a1_nominal "Nominal water inlet temperature on district side"; parameter Modelica.Units.SI.Temperature T_b1_nominal "Nominal water outlet temperature on district side"; parameter Modelica.Units.SI.Temperature T_a2_nominal "Nominal water inlet temperature on building side"; parameter Modelica.Units.SI.Temperature T_b2_nominal "Nominal water outlet temperature on building side"; parameter Real spePum1Min(unit="1")=0.1 "Heat exchanger primary pump minimum speed (fractional)"; parameter Real spePum2Min(unit="1")=0.1 "Heat exchanger secondary pump minimum speed (fractional)"; // IO CONNECTORS Buildings.Controls.OBC.CDL.Interfaces.BooleanInput on "Control signal for secondary side (from supervisory). Set to true to operate subsystem"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput PPum( final unit="W") "Power drawn by pump motors"; // COMPONENTS Buildings.Fluid.HeatExchangers.PlateHeatExchangerEffectivenessNTU hex( redeclare final package Medium1 = Medium1, redeclare final package Medium2 = Medium2, show_T=true, final use_Q_flow_nominal=true, configuration=Buildings.Fluid.Types.HeatExchangerConfiguration.CounterFlow, final allowFlowReversal1=allowFlowReversal1, final allowFlowReversal2=allowFlowReversal2, final dp1_nominal=if have_val1 then 0 else dp1Hex_nominal, final dp2_nominal=0, final m1_flow_nominal=m1_flow_nominal, final m2_flow_nominal=m2_flow_nominal, final Q_flow_nominal=Q_flow_nominal, final T_a1_nominal=T_a1_nominal, final T_a2_nominal=T_a2_nominal) "Heat exchanger"; DHC.ETS.BaseClasses.Pump_m_flow pum1( redeclare final package Medium = Medium1, final m_flow_nominal=m1_flow_nominal, final dp_nominal=dp1Hex_nominal, final allowFlowReversal=allowFlowReversal1) if not have_val1 "District heat exchanger primary pump"; DHC.ETS.BaseClasses.Pump_m_flow pum2( redeclare final package Medium = Medium2, final m_flow_nominal=m2_flow_nominal, final dp_nominal=dp2Hex_nominal, final allowFlowReversal=allowFlowReversal2) "Secondary pump"; Buildings.Fluid.Sensors.TemperatureTwoPort senT2WatEnt( redeclare final package Medium = Medium2, final m_flow_nominal=m2_flow_nominal, final allowFlowReversal=allowFlowReversal2) "Heat exchanger secondary water entering temperature"; Buildings.Fluid.Sensors.TemperatureTwoPort senT2WatLvg( redeclare final package Medium = Medium2, final m_flow_nominal=m2_flow_nominal, final allowFlowReversal=allowFlowReversal2) "Heat exchanger secondary water leaving temperature"; Fluid.Actuators.Valves.TwoWayPressureIndependent val1( redeclare final package Medium = Medium1, final m_flow_nominal=m1_flow_nominal, from_dp=true, final dpValve_nominal=dpVal1_nominal, use_strokeTime=false, final dpFixed_nominal=dp1Hex_nominal) if have_val1 "Heat exchanger primary control valve"; Buildings.Controls.OBC.CDL.Reals.MultiSum totPPum( final nin= if have_val1 then 1 else 2) "Total pump power"; Buildings.Controls.OBC.CDL.Conversions.BooleanToReal mPum1_flow( realTrue=m1_flow_nominal) if not have_val1 "Set mass flow rate of pump 1"; Buildings.Controls.OBC.CDL.Conversions.BooleanToReal mPum2_flow2( realTrue=m2_flow_nominal) "Set mass flow rate of pump 2"; Buildings.Controls.OBC.CDL.Conversions.BooleanToReal yVal(realTrue=1) if have_val1 "Control signal for valves"; protected parameter Boolean have_val1= conCon == DHC.ETS.Types.ConnectionConfiguration.TwoWayValve "True in case of control valve on district side, false in case of a pump"; equation if have_val1 then connect(port_a1, hex.port_a1); else connect(hex.port_b1, port_b1); end if; connect(port_a1,pum1.port_a); connect(val1.port_b,port_b1); connect(pum2.port_b,senT2WatEnt.port_a); connect(senT2WatEnt.port_b,hex.port_a2); connect(pum1.P,totPPum.u[2]); connect(pum2.P,totPPum.u[1]); connect(totPPum.y,PPum); connect(hex.port_b2,senT2WatLvg.port_a); connect(hex.port_b1, val1.port_a); connect(pum1.port_b, hex.port_a1); connect(pum1.m_flow_in, mPum1_flow.y); connect(pum2.m_flow_in, mPum2_flow2.y); connect(yVal.y, val1.y); connect(port_a2, pum2.port_a); connect(senT2WatLvg.port_b, port_b2); connect(on, yVal.u); connect(on, mPum2_flow2.u); connect(mPum1_flow.u, on); end HeatExchanger;

Buildings.DHC.ETS.Combined.Subsystems.HeatPump Buildings.DHC.ETS.Combined.Subsystems.HeatPump

Base subsystem with water-to-water heat pump

Buildings.DHC.ETS.Combined.Subsystems.HeatPump

Information

This model represents a water-to-water heat pump, an evaporator water pump, and a condenser water pump. The heat pump model is described in Buildings.Fluid.HeatPumps.Carnot_TCon. By default, a variable speed condenser pump is considered, but a constant speed pump may also be represented by setting have_varFloCon to false. The evaporator hydronics and control are described in Buildings.DHC.ETS.Combined.Subsystems.BaseClasses.PartialHeatPump.

Condenser Controls

The system is enabled when the input control signal uEna switches to true. When enabled, on the condenser side,

Extends from Buildings.DHC.ETS.Combined.Subsystems.BaseClasses.PartialHeatPump (Partial base class for subsystems containing a heat pump).

Parameters

TypeNameDefaultDescription
replaceable package Medium1PartialMediumMedium model on condenser side
replaceable package Medium2PartialMediumMedium model on evaporator side
Booleanhave_varFloContrueSet to true for a variable condenser flow
Nominal condition
RealCOP_nominal Heat pump COP [1]
TemperatureTCon_nominal Condenser outlet temperature used to compute COP_nominal [K]
TemperatureTEva_nominal Evaporator outlet temperature used to compute COP_nominal [K]
TemperatureDifferencedT_nominal5Water temperature drop/increase accross load and source-side HX (always positive) [K]
Pressuredp1_nominal Pressure difference over condenser [Pa]
Pressuredp2_nominal Pressure difference over evaporator [Pa]
HeatFlowRateQ1_flow_nominal Heating heat flow rate [W]
Initialization
BooleanInputuEna.startfalseEnable signal
Assumptions
BooleanallowFlowReversal1falseSet to true to allow flow reversal on condenser side
BooleanallowFlowReversal2falseSet to true to allow flow reversal on evaporator side

Connectors

TypeNameDescription
FluidPort_aport_a2Fluid port for entering evaporator water
FluidPort_bport_b2Fluid port for leaving evaporator water
FluidPort_aport_a1Fluid port for cold domestic water
FluidPort_bport_b1Fluid port for heated domestic hot water
output RealOutputPHeaHeat pump power [W]
output RealOutputPPumPump power [W]
output RealOutputmEva_flowEvaporator water mass flow rate [kg/s]
input RealInputTSupSetSupply temperature set point [K]
input RealInputm1_flowCondenser mass flow rate [kg/s]
Initialization
input BooleanInputuEnaEnable signal

Modelica definition

model HeatPump "Base subsystem with water-to-water heat pump" extends Buildings.DHC.ETS.Combined.Subsystems.BaseClasses.PartialHeatPump ( heaPum(QCon_flow_nominal=Q1_flow_nominal)); parameter Boolean have_varFloCon = true "Set to true for a variable condenser flow"; parameter Modelica.Units.SI.HeatFlowRate Q1_flow_nominal(min=0) "Heating heat flow rate"; // IO CONNECTORS Buildings.Controls.OBC.CDL.Interfaces.RealInput TSupSet( final unit="K", displayUnit="degC") "Supply temperature set point"; Buildings.Controls.OBC.CDL.Interfaces.RealInput m1_flow( final unit="kg/s") if have_varFloCon "Condenser mass flow rate"; // COMPONENTS Buildings.Controls.OBC.CDL.Reals.Sources.Constant floConNom( final k=mCon_flow_nominal) if not have_varFloCon "Nominal flow rate"; Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToRea; Buildings.Controls.OBC.CDL.Reals.Multiply floCon "Zero flow rate if not enabled"; equation connect(booToRea.y, floCon.u1); connect(m1_flow, floCon.u2); connect(floConNom.y, floCon.u2); connect(port_a1, heaPum.port_a1); connect(pumCon.port_b, port_b1); connect(TSupSet, heaPum.TSet); connect(floCon.y, pumCon.m_flow_in); connect(conPI.trigger, floEva.u); connect(addPPum.y, PPum); connect(uEna, booToRea.u); connect(uEna, floEva.u); end HeatPump;

Buildings.DHC.ETS.Combined.Subsystems.HeatPumpDHWTank Buildings.DHC.ETS.Combined.Subsystems.HeatPumpDHWTank

Base subsystem with water-to-water heat pump with storage tank for domestic hot water

Buildings.DHC.ETS.Combined.Subsystems.HeatPumpDHWTank

Information

Model of a water-to-water heat pump with temperature control on evaporator side, with the heat pump being connected to a domestic hot water tank with fresh water stations.

Heat pump with domestic hot water tank

The heat pump model with storage tank is described in Buildings.DHC.Loads.HotWater.StorageTankWithExternalHeatExchanger. The evaporator hydronics and control are described in Buildings.DHC.ETS.Combined.Subsystems.BaseClasses.PartialHeatPump.

Condenser Controls

The system is enabled when the tank charge control signal switches to true. When enabled,

Extends from Buildings.DHC.ETS.Combined.Subsystems.BaseClasses.PartialHeatPump (Partial base class for subsystems containing a heat pump).

Parameters

TypeNameDefaultDescription
replaceable package Medium1PartialMediumMedium model on condenser side
replaceable package Medium2PartialMediumMedium model on evaporator side
GenericDomesticHotWaterWithHeatExchangerdatWatHea Performance data
Nominal condition
RealCOP_nominal Heat pump COP [1]
TemperatureTCon_nominal Condenser outlet temperature used to compute COP_nominal [K]
TemperatureTEva_nominal Evaporator outlet temperature used to compute COP_nominal [K]
TemperatureDifferencedT_nominal5Water temperature drop/increase accross load and source-side HX (always positive) [K]
Pressuredp1_nominal Pressure difference over condenser [Pa]
Pressuredp2_nominal Pressure difference over evaporator [Pa]
HeatFlowRateQHotWat_flow_nominal Nominal capacity of heat pump condenser for hot water production system (>=0) [W]
Initialization
BooleanInputuEna.startfalseEnable signal
Assumptions
BooleanallowFlowReversal1falseSet to true to allow flow reversal on condenser side
BooleanallowFlowReversal2falseSet to true to allow flow reversal on evaporator side

Connectors

TypeNameDescription
FluidPort_aport_a2Fluid port for entering evaporator water
FluidPort_bport_b2Fluid port for leaving evaporator water
FluidPort_aport_a1Fluid port for cold domestic water
FluidPort_bport_b1Fluid port for heated domestic hot water
output RealOutputPHeaHeat pump power [W]
output RealOutputPPumPump power [W]
output RealOutputmEva_flowEvaporator water mass flow rate [kg/s]
Initialization
input BooleanInputuEnaEnable signal

Modelica definition

model HeatPumpDHWTank "Base subsystem with water-to-water heat pump with storage tank for domestic hot water" extends Buildings.DHC.ETS.Combined.Subsystems.BaseClasses.PartialHeatPump ( heaPum( QCon_flow_nominal=QHotWat_flow_nominal, QCon_flow_max=QHotWat_flow_nominal), pumCon(use_riseTime=true), pumEva(use_riseTime=true)); parameter Buildings.DHC.Loads.HotWater.Data.GenericDomesticHotWaterWithHeatExchanger datWatHea "Performance data"; parameter Modelica.Units.SI.HeatFlowRate QHotWat_flow_nominal(min=0) "Nominal capacity of heat pump condenser for hot water production system (>=0)"; Buildings.Controls.OBC.CDL.Conversions.BooleanToReal floCon(realTrue= mCon_flow_nominal) "Condenser mass flow rate"; Buildings.DHC.Loads.HotWater.StorageTankWithExternalHeatExchanger heaPumTan( redeclare package MediumDom = Medium1, redeclare package MediumHea = Medium2, final dat=datWatHea) "Heat pump with storage tank for domestic hot water"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant THotSouSet( k=datWatHea.TDom_nominal) "Set point of water in hot water tank"; Buildings.Fluid.Sources.Boundary_pT preRef( redeclare package Medium = Medium2, p(displayUnit="bar"), nPorts=1) "Reference pressure for loop"; Buildings.Fluid.Sensors.TemperatureTwoPort senTemHeaPumRet( redeclare package Medium = Medium1, allowFlowReversal=false, m_flow_nominal=mCon_flow_nominal, tau=0) "Sensor for return temperature to heat pump"; Buildings.Controls.OBC.CDL.Reals.AddParameter addPar( p=dT_nominal) "dT for heater"; Modelica.Blocks.Math.Add addPPum1 "Electricity use for pumps"; Buildings.Controls.OBC.CDL.Logical.And and2 "Outputs true if boiler needs to be charged and plant is enabled"; equation connect(THotSouSet.y, heaPumTan.TDomSet); connect(heaPumTan.port_bHea, senTemHeaPumRet.port_a); connect(senTemHeaPumRet.T, addPar.u); connect(floCon.y, pumCon.m_flow_in); connect(heaPumTan.port_aHea, pumCon.port_b); connect(senTemHeaPumRet.port_b, heaPum.port_a1); connect(addPPum.y, addPPum1.u1); connect(heaPumTan.PEle, addPPum1.u2); connect(addPPum1.y, PPum); connect(addPar.y, heaPum.TSet); connect(heaPumTan.port_bDom, port_b1); connect(port_a1, heaPumTan.port_aDom); connect(uEna, and2.u1); connect(heaPumTan.charge, and2.u2); connect(and2.y, floEva.u); connect(and2.y, floCon.u); connect(and2.y, conPI.trigger); connect(preRef.ports[1], heaPum.port_b1); end HeatPumpDHWTank;

Buildings.DHC.ETS.Combined.Subsystems.HeatPumpModular Buildings.DHC.ETS.Combined.Subsystems.HeatPumpModular

Base subsystem with modular heat recovery heat pump

Buildings.DHC.ETS.Combined.Subsystems.HeatPumpModular

Information

This is a model for a heat pump system with constant speed evaporator and condenser pumps, and mixing valves modulated to maintain a minimum condenser inlet temperature (resp. maximum evaporator inlet temperature).

The system is controlled based on the logic described in Buildings.DHC.ETS.Combined.Controls.HeatPumpModular.

Parameters

TypeNameDefaultDescription
replaceable package MediumModelica.Media.Interfaces.Pa...Medium model
GenericHeatPumpdat Heat pump performance data
TemperatureDifferencedTOffSetHea Temperature to be added to the set point in order to be slightly above what the heating load requires [K]
TemperatureDifferencedTOffSetCoo Temperature to be added to the set point in order to be slightly below what the cooling load requires [K]
Nominal condition
PressureDifferencedpCon_nominal Nominal pressure drop accross condenser [Pa]
PressureDifferencedpEva_nominal Nominal pressure drop accross evaporator [Pa]
PressuredpValCon_nominaldpCon_nominal/2Nominal pressure drop accross control valve on condenser side [Pa]
PressuredpValEva_nominaldpEva_nominal/2Nominal pressure drop accross control valve on evaporator side [Pa]
Controls
RealTHeaWatSupSetMin Minimum value of heating water supply temperature set point [K]
RealTChiWatSupSetMax Maximum value of chilled water supply temperature set point [K]
Assumptions
BooleanallowFlowReversalfalse= true to allow flow reversal, false restricts to design direction (port_a -> port_b)

Connectors

TypeNameDescription
replaceable package MediumMedium model
input BooleanInputuHeaSpaTrue if space heating is required from tank
input BooleanInputuHeaDhwTrue if domestic hot water heating is required from tank
input BooleanInputuCooTrue if cooling is required from tank
input RealInputTChiWatSupSetChilled water supply temperature set point (may be reset down) [K]
FluidPort_aport_aChiWatFluid port for chilled water return
FluidPort_bport_bChiWatFluid port for chilled water supply
FluidPort_aport_aHeaWatFluid port for heating water return
FluidPort_bport_bHeaWatFluid port for heating water supply
output RealOutputPChiChiller power [W]
output RealOutputPPumPump power [W]
input RealInputTHeaWatSupSetHeating water supply temperature set point [K]

Modelica definition

model HeatPumpModular "Base subsystem with modular heat recovery heat pump" replaceable package Medium=Modelica.Media.Interfaces.PartialMedium "Medium model"; parameter Boolean allowFlowReversal=false "= true to allow flow reversal, false restricts to design direction (port_a -> port_b)"; parameter Buildings.DHC.ETS.Combined.Data.GenericHeatPump dat "Heat pump performance data"; parameter Modelica.Units.SI.PressureDifference dpCon_nominal(displayUnit="Pa") "Nominal pressure drop accross condenser"; parameter Modelica.Units.SI.PressureDifference dpEva_nominal(displayUnit="Pa") "Nominal pressure drop accross evaporator"; parameter Modelica.Units.SI.Pressure dpValCon_nominal=dpCon_nominal/2 "Nominal pressure drop accross control valve on condenser side"; parameter Modelica.Units.SI.Pressure dpValEva_nominal=dpEva_nominal/2 "Nominal pressure drop accross control valve on evaporator side"; parameter Real THeaWatSupSetMin( final quantity="ThermodynamicTemperature", final unit="K", displayUnit="degC") "Minimum value of heating water supply temperature set point"; parameter Real TChiWatSupSetMax( final quantity="ThermodynamicTemperature", final unit="K", displayUnit="degC") "Maximum value of chilled water supply temperature set point"; parameter Modelica.Units.SI.TemperatureDifference dTOffSetHea( min=0.5, displayUnit="K") "Temperature to be added to the set point in order to be slightly above what the heating load requires"; parameter Modelica.Units.SI.TemperatureDifference dTOffSetCoo( max=-0.5, displayUnit="K") "Temperature to be added to the set point in order to be slightly below what the cooling load requires"; // IO CONNECTORS Buildings.Controls.OBC.CDL.Interfaces.BooleanInput uHeaSpa "True if space heating is required from tank"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput uHeaDhw "True if domestic hot water heating is required from tank"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput uCoo "True if cooling is required from tank"; Buildings.Controls.OBC.CDL.Interfaces.RealInput TChiWatSupSet( final unit="K", displayUnit="degC") "Chilled water supply temperature set point (may be reset down)"; Modelica.Fluid.Interfaces.FluidPort_a port_aChiWat( redeclare final package Medium=Medium, m_flow( min= if allowFlowReversal then -Modelica.Constants.inf else 0), h_outflow( start=Medium.h_default, nominal=Medium.h_default)) "Fluid port for chilled water return"; Modelica.Fluid.Interfaces.FluidPort_b port_bChiWat( redeclare final package Medium=Medium, m_flow( max= if allowFlowReversal then +Modelica.Constants.inf else 0), h_outflow( start=Medium.h_default, nominal=Medium.h_default)) "Fluid port for chilled water supply"; Modelica.Fluid.Interfaces.FluidPort_a port_aHeaWat( redeclare final package Medium=Medium, m_flow( min= if allowFlowReversal then -Modelica.Constants.inf else 0), h_outflow( start=Medium.h_default, nominal=Medium.h_default)) "Fluid port for heating water return"; Modelica.Fluid.Interfaces.FluidPort_b port_bHeaWat( redeclare final package Medium=Medium, m_flow( max= if allowFlowReversal then +Modelica.Constants.inf else 0), h_outflow( start=Medium.h_default, nominal=Medium.h_default)) "Fluid port for heating water supply"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput PChi( final unit="W") "Chiller power"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput PPum( final unit="W") "Pump power"; // COMPONENTS Buildings.Fluid.HeatPumps.ModularReversible.Modular heaPum( redeclare package MediumCon = Medium, redeclare package MediumEva = Medium, redeclare model RefrigerantCycleHeatPumpCooling = Buildings.Fluid.Chillers.ModularReversible.RefrigerantCycle.BaseClasses.NoCooling, redeclare model RefrigerantCycleHeatPumpHeating = Buildings.Fluid.HeatPumps.ModularReversible.RefrigerantCycle.TableData2D ( redeclare final Buildings.Fluid.HeatPumps.ModularReversible.RefrigerantCycle.Frosting.NoFrosting iceFacCal, mCon_flow_nominal=dat.mCon_flow_nominal, mEva_flow_nominal=dat.mEva_flow_nominal, final smoothness=Modelica.Blocks.Types.Smoothness.LinearSegments, final extrapolation=Modelica.Blocks.Types.Extrapolation.LastTwoPoints, final datTab=dat.datHeaSca), redeclare model RefrigerantCycleInertia = Buildings.Fluid.HeatPumps.ModularReversible.RefrigerantCycle.Inertias.NoInertia, final use_rev=false, final allowDifferentDeviceIdentifiers=true, final allowFlowReversalEva=allowFlowReversal, final allowFlowReversalCon=allowFlowReversal, final dTCon_nominal=dat.dTCon_nominal, final dTEva_nominal=dat.dTEva_nominal, final QHea_flow_nominal=dat.QHeaDes_flow_nominal, final TConHea_nominal=dat.THeaConLvg_nominal, final TEvaHea_nominal=dat.THeaEvaLvg_nominal, final TConCoo_nominal=dat.TCooConLvg_nominal, final TEvaCoo_nominal=dat.TCooEvaLvg_nominal, mCon_flow_nominal=dat.mCon_flow_nominal, mEva_flow_nominal=dat.mEva_flow_nominal, final dpCon_nominal(displayUnit="Pa") = dpCon_nominal, final dpEva_nominal(displayUnit="Pa") = dpEva_nominal, energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, GEvaIns=0, GEvaOut=0, CEva=0, use_evaCap=false, GConIns=0, GConOut=0, CCon=0, use_conCap=false, show_T=true, use_intSafCtr=false, limWarSca=0.98) "Heat recovery heat pump"; Buildings.DHC.ETS.BaseClasses.Pump_m_flow pumCon( redeclare final package Medium=Medium, final allowFlowReversal=allowFlowReversal, use_riseTime=true, final m_flow_nominal=dat.mCon_flow_nominal, final dp_nominal=dpCon_nominal + dpValCon_nominal + 2*0.05*dpValCon_nominal, dpMax=5*(dpCon_nominal + dpValCon_nominal + 2*0.05*dpValCon_nominal)) "Condenser pump"; Buildings.DHC.ETS.BaseClasses.Pump_m_flow pumEva( redeclare final package Medium=Medium, final allowFlowReversal=allowFlowReversal, use_riseTime=true, final m_flow_nominal=dat.mEva_flow_nominal, final dp_nominal=dpEva_nominal + dpValEva_nominal + dpEva_nominal*0.05, dpMax=5*(dpEva_nominal + dpValEva_nominal + dpEva_nominal*0.05)) "Evaporator pump"; Buildings.DHC.ETS.Combined.Controls.HeatPumpModular con( final PLRMin=dat.PLRMin, THeaWatSupSetMin=THeaWatSupSetMin, TChiWatSupSetMax=TChiWatSupSetMax, final dTOffSetHea=dTOffSetHea, final dTOffSetCoo=dTOffSetCoo) "Controller"; Buildings.Fluid.Sensors.TemperatureTwoPort senTConLvg( redeclare final package Medium=Medium, final allowFlowReversal=allowFlowReversal, final m_flow_nominal=dat.mCon_flow_nominal) "Condenser water leaving temperature"; Buildings.Fluid.Sensors.TemperatureTwoPort senTConEnt( redeclare final package Medium=Medium, final allowFlowReversal=allowFlowReversal, final m_flow_nominal=dat.mCon_flow_nominal) "Condenser water entering temperature"; Buildings.Fluid.Sensors.TemperatureTwoPort senTEvaEnt( redeclare final package Medium=Medium, final allowFlowReversal=allowFlowReversal, final m_flow_nominal=dat.mEva_flow_nominal) "Evaporator water entering temperature"; Buildings.Fluid.Sensors.TemperatureTwoPort senTEvaLvg( redeclare final package Medium=Medium, final allowFlowReversal=allowFlowReversal, final m_flow_nominal=dat.mEva_flow_nominal) "Evaporator water leaving temperature"; Buildings.DHC.ETS.BaseClasses.Junction splEva( redeclare final package Medium=Medium, energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, 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, m_flow_nominal=dat.mEva_flow_nominal*{1,-1,-1}) "Flow splitter for the evaporator water circuit"; Buildings.DHC.ETS.BaseClasses.Junction splConMix( redeclare final package Medium=Medium, energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, 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, m_flow_nominal=dat.mCon_flow_nominal*{1,-1,-1}) "Flow splitter"; Buildings.Fluid.Actuators.Valves.ThreeWayEqualPercentageLinear valEva( redeclare final package Medium = Medium, 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, energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, from_dp=false, use_strokeTime=false, final m_flow_nominal=dat.mEva_flow_nominal, final dpValve_nominal=dpValEva_nominal, linearized={true,true}) "Control valve for maximum evaporator water entering temperature"; Buildings.Fluid.Actuators.Valves.ThreeWayEqualPercentageLinear valCon( redeclare final package Medium = Medium, 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, energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, from_dp=false, use_strokeTime=false, final m_flow_nominal=dat.mCon_flow_nominal, final dpValve_nominal=dpValCon_nominal, linearized={true,true}) "Control valve for minimum condenser water entering temperature"; Buildings.Controls.OBC.CDL.Conversions.BooleanToReal booToRea "Constant speed primary pumps control signal"; Buildings.Controls.OBC.CDL.Reals.Add add2; Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai1(final k=dat.mCon_flow_nominal) "Scale to nominal mass flow rate"; Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai2(final k=dat.mEva_flow_nominal) "Scale to nominal mass flow rate"; Buildings.Controls.OBC.CDL.Interfaces.RealInput THeaWatSupSet(final unit="K", displayUnit="degC") "Heating water supply temperature set point"; Fluid.Sensors.TemperatureTwoPort senTHeaWatRet( redeclare package Medium = Medium, allowFlowReversal=true, final m_flow_nominal=dat.mCon_flow_nominal) "Return heating water temperature to heat pump"; Fluid.Sensors.TemperatureTwoPort senTChiWatRet( redeclare package Medium = Medium, allowFlowReversal=true, final m_flow_nominal=dat.mCon_flow_nominal) "Return chilled water temperature to chiller, prior to chiller valve"; protected final parameter Medium.ThermodynamicState sta_default=Medium.setState_pTX( T=Medium.T_default, p=Medium.p_default, X=Medium.X_default[1:Medium.nXi]) "Medium state at default properties"; final parameter Modelica.Units.SI.SpecificHeatCapacity cp_default= Medium.specificHeatCapacityCp(sta_default) "Specific heat capacity of the fluid"; initial equation assert(dat.QCooAct_flow_nominal <= dat.QCooDes_flow_nominal, "In " + getInstanceName() + ": The heat pump is sized for heating. However, at the cooling design conditions, this results in a cooling capacity of QCooAct_flow_nominal = " + String(dat.QCooAct_flow_nominal) + " W, but the desired cooling capacity is QCooDes_flow_nominal = " + String(dat.QCooDes_flow_nominal) + " W. You need to size the heat pump for a bigger heating load.", level=AssertionLevel.warning); equation connect(splConMix.port_3,valCon.port_3); connect(valCon.port_2,pumCon.port_a); connect(pumEva.port_b,splEva.port_1); connect(splEva.port_3,valEva.port_3); connect(con.yValEva,valEva.y); connect(con.yValCon,valCon.y); connect(uHeaSpa, con.uHeaSpa); connect(uCoo,con.uCoo); connect(splConMix.port_2,port_bHeaWat); connect(splEva.port_2,port_bChiWat); connect(valEva.port_2,senTEvaEnt.port_a); connect(senTEvaLvg.port_b,pumEva.port_a); connect(senTEvaLvg.port_a, heaPum.port_b2); connect(senTEvaEnt.port_b, heaPum.port_a2); connect(heaPum.port_b1, senTConLvg.port_a); connect(senTConLvg.port_b,splConMix.port_1); connect(pumCon.port_b,senTConEnt.port_a); connect(senTConEnt.port_b, heaPum.port_a1); connect(heaPum.P, PChi); connect(add2.y,PPum); connect(pumEva.P,add2.u2); connect(pumCon.P,add2.u1); connect(con.yPum,booToRea.u); connect(booToRea.y,gai2.u); connect(gai2.y,pumEva.m_flow_in); connect(gai1.y,pumCon.m_flow_in); connect(booToRea.y,gai1.u); connect(con.TChiWatSupSet, TChiWatSupSet); connect(con.TEvaWatLvg, senTEvaLvg.T); connect(con.yCom, heaPum.ySet); connect(con.THeaWatSupSet, THeaWatSupSet); connect(senTConLvg.T, con.TConWatLvg); connect(con.uHeaDhw, uHeaDhw); connect(senTHeaWatRet.port_a, port_aHeaWat); connect(senTHeaWatRet.port_b, valCon.port_1); connect(port_aChiWat, senTChiWatRet.port_a); connect(senTChiWatRet.port_b, valEva.port_1); end HeatPumpModular;

Buildings.DHC.ETS.Combined.Subsystems.StorageTankWithExternalHeatExchanger Buildings.DHC.ETS.Combined.Subsystems.StorageTankWithExternalHeatExchanger

A model of a storage tank with external heat exchanger to produce hot water

Buildings.DHC.ETS.Combined.Subsystems.StorageTankWithExternalHeatExchanger

Information

This model implements a heating hot water tank with external heat exchanger that heats domestic hot water.

The storage tank model is described in Buildings.Fluid.Storage.StratifiedEnhancedInternalHex. The heat pump and storage tank system should be parameterized altogether using Buildings.DHC.Loads.HotWater.Data.GenericDomesticHotWaterWithHeatExchanger.

image

It is based on Fig. 3 in Evaluations of different domestic hot water preparing methods with ultra-low-temperature district heating by X. Yang, H. Li, and S. Svendsen at doi.org/10.1016/j.energy.2016.04.109, as well as the Advanced Energy Design Guide for Multifamily Buildings-Achieving Zero Energy published by ASHRAE in 2022 at https://www.ashrae.org/technical-resources/aedgs/zero-energy-aedg-free-download.

For a model that connects this hot water system to a heat pump, see Buildings.DHC.ETS.Combined.Subsystems.HeatPumpDHWTank.

Extends from Buildings.DHC.Loads.HotWater.BaseClasses.PartialFourPortDHW (A partial model for domestic water heating).

Parameters

TypeNameDefaultDescription
replaceable package MediumDomPartialMediumMedium for domestic water in the component
replaceable package MediumHeaPartialMediumMedium for heating source in the component
GenericDomesticHotWaterWithHeatExchangerdat Performance data
Realk0.1Proportional gain of circulation pump controller
RealTi60Integrator time constant of circulation pump controller
Assumptions
BooleanallowFlowReversalDomtrue= false to simplify equations, assuming, but not enforcing, no flow reversal for domestic water
BooleanallowFlowReversalHeatrue= false to simplify equations, assuming, but not enforcing, no flow reversal for heating water
Initialization
TemperatureTTan_start323.15Start value of tank temperature [K]

Connectors

TypeNameDescription
FluidPort_aport_aDomFluid connector for cold water (or recirculation water)
FluidPort_bport_bDomFluid connector for heated domestic hot water
FluidPort_aport_aHeaFluid connector for heating water (positive design flow direction is from port_a to port_b)
FluidPort_bport_bHeaFluid connector b for heating water (positive design flow direction is from port_a to port_b)
input RealInputTDomSetTemperature setpoint for heated domestic water [K]
output RealOutputPEleElectric power required for pumping equipment [W]
output BooleanOutputchargeOutput true if tank needs to be charged, false if it is sufficiently charged

Modelica definition

model StorageTankWithExternalHeatExchanger "A model of a storage tank with external heat exchanger to produce hot water" extends Buildings.DHC.Loads.HotWater.BaseClasses.PartialFourPortDHW; parameter Buildings.DHC.Loads.HotWater.Data.GenericDomesticHotWaterWithHeatExchanger dat "Performance data"; parameter Real k=0.1 "Proportional gain of circulation pump controller"; parameter Real Ti=60 "Integrator time constant of circulation pump controller"; parameter Modelica.Media.Interfaces.Types.Temperature TTan_start=323.15 "Start value of tank temperature"; final parameter Real eps = dat.QHex_flow_nominal / CMin_flow_nominal / ( dat.TDom_nominal + dat.dTHexApp_nominal - dat.TCol_nominal) "Heat exchanger effectiveness"; Buildings.Fluid.Movers.Preconfigured.FlowControlled_dp pumHex( redeclare package Medium = MediumHea, energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, riseTime=10, m_flow_nominal=dat.mHex_flow_nominal, dp_nominal=dat.dpHexHea_nominal) "Pump with head as input"; Buildings.Fluid.Storage.Stratified tan( redeclare package Medium = MediumHea, kIns=dat.kIns, final T_start=TTan_start, hTan=dat.hTan, dIns=dat.dIns, VTan=dat.VTan, nSeg=dat.nSeg, m_flow_nominal=dat.mHex_flow_nominal) "Heating water tank"; Modelica.Blocks.Interfaces.RealOutput PEle(unit="W") "Electric power required for pumping equipment"; Buildings.Fluid.Sensors.TemperatureTwoPort senTemHot( redeclare package Medium = MediumDom, final allowFlowReversal=allowFlowReversalDom, m_flow_nominal=dat.mDom_flow_nominal) "Temperature sensor for hot water supply"; Buildings.Fluid.HeatExchangers.ConstantEffectiveness hex( redeclare package Medium1 = MediumDom, redeclare package Medium2 = MediumHea, final allowFlowReversal1=allowFlowReversalDom, m1_flow_nominal=dat.mDom_flow_nominal, m2_flow_nominal=dat.mHex_flow_nominal, dp1_nominal=dat.dpHexHea_nominal, from_dp2=true, dp2_nominal=dat.dpHexDom_nominal, eps=eps); Buildings.Fluid.FixedResistances.Junction junTop( redeclare package Medium = MediumHea, energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, m_flow_nominal=dat.mHex_flow_nominal*{1,1,1}, dp_nominal=zeros(3)) "Flow junction at top of tank"; Buildings.Fluid.Sensors.MassFlowRate senMasFlo(redeclare package Medium = MediumDom) "Mass flow rate of domestic hot water"; Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensor TTanTop( T(displayUnit="degC")) "Fluid temperature at the top of the tank"; Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensor TTanBot( T(displayUnit="degC")) "Fluid temperature at the bottom of the tank"; Buildings.DHC.Loads.HotWater.BaseClasses.HeatExchangerPumpController conPum(final mDom_flow_nominal=dat.mDom_flow_nominal, final dpPum_nominal=dat.dpHexHea_nominal) "Controller for pump of heat exchanger"; Buildings.DHC.Loads.HotWater.BaseClasses.TankChargingController conCha "Controller for tank charge signal"; Buildings.Fluid.Actuators.Valves.ThreeWayLinear divVal( redeclare package Medium = MediumHea, energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, m_flow_nominal=dat.mHex_flow_nominal, dpValve_nominal=1000) "Diversion valve to reduce mixing in tank"; Buildings.Fluid.Sensors.TemperatureTwoPort senTemRet( redeclare package Medium = MediumHea, m_flow_nominal=dat.mHex_flow_nominal) "Temperature sensor for return heating water from heat exchanger"; Buildings.DHC.Loads.HotWater.BaseClasses.TankValveController conVal "Diversion valve controller"; Buildings.Controls.OBC.CDL.Reals.AddParameter dTHexApp(p=dat.dTHexApp_nominal) "Offset for heat exchanger approach temperature"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput charge "Output true if tank needs to be charged, false if it is sufficiently charged"; Buildings.Fluid.Sensors.TemperatureTwoPort senTemHeaSup( redeclare package Medium = MediumHea, final allowFlowReversal=allowFlowReversalHea, final m_flow_nominal=dat.mHex_flow_nominal) "Temperature sensor for supply water temperature from heating system"; protected parameter Modelica.Units.SI.SpecificHeatCapacity cpHea_default = MediumHea.specificHeatCapacityCp(MediumHea.setState_pTX( MediumHea.p_default, MediumHea.T_default, MediumHea.X_default)) "Specific heat capacity of heating medium at default medium state"; parameter Modelica.Units.SI.SpecificHeatCapacity cpDom_default = MediumDom.specificHeatCapacityCp(MediumDom.setState_pTX( MediumDom.p_default, MediumDom.T_default, MediumDom.X_default)) "Specific heat capacity of domestic hot water medium at default medium state"; parameter Modelica.Units.SI.ThermalConductance CMin_flow_nominal = min(dat.mHex_flow_nominal*cpHea_default, dat.mDom_flow_nominal*cpDom_default) "Minimum heat capacity flow rate"; initial equation assert(eps < 1, "In " + getInstanceName() + ": Heat exchanger effectivness must be below 1, received eps = " + String(eps) + ". Check sizing."); equation connect(tan.port_a, junTop.port_3); connect(pumHex.P, PEle); connect(hex.port_b1, senMasFlo.port_a); connect(senMasFlo.port_b, senTemHot.port_a); connect(TTanTop.port, tan.heaPorVol[1]); connect(senMasFlo.m_flow, conPum.mDom_flow); connect(senTemHot.T, conPum.TDom); connect(conPum.TDomSet, TDomSet); connect(conCha.TTanTop, TTanTop.T); connect(conCha.charge, charge); connect(senTemHot.port_b, port_bDom); connect(conPum.dpPumHex, pumHex.dp_in); connect(port_aDom, hex.port_a1); connect(junTop.port_1, hex.port_a2); connect(hex.port_b2, pumHex.port_a); connect(senTemRet.port_b, divVal.port_2); connect(divVal.port_1, tan.fluPorVol[integer(dat.nSeg/2)]); connect(senTemRet.T, conVal.TRet); connect(conVal.y, divVal.y); connect(TTanBot.port, tan.heaPorVol[dat.nSeg]); connect(conCha.TTanTopSet, dTHexApp.y); connect(dTHexApp.u, TDomSet); connect(divVal.port_3, tan.fluPorVol[dat.nSeg]); connect(tan.port_b, port_bHea); connect(pumHex.port_b, senTemRet.port_a); connect(TTanBot.T, conCha.TTanBot); connect(junTop.port_2, senTemHeaSup.port_b); connect(senTemHeaSup.port_a, port_aHea); end StorageTankWithExternalHeatExchanger;

Buildings.DHC.ETS.Combined.Subsystems.StratifiedTankWithCommand Buildings.DHC.ETS.Combined.Subsystems.StratifiedTankWithCommand

Stratified buffer tank model

Buildings.DHC.ETS.Combined.Subsystems.StratifiedTankWithCommand

Information

This is a four-port tank model based on Buildings.Fluid.Storage.Stratified which includes the following features.

Parameters

TypeNameDefaultDescription
replaceable package MediumModelica.Media.Interfaces.Pa...Medium model
VolumeVTan Tank volume [m3]
LengthhTan Height of tank (without insulation) [m]
LengthdIns Thickness of insulation [m]
ThermalConductivitykIns0.04Specific heat conductivity of insulation [W/(m.K)]
IntegernSeg3Number of volume segments
BooleanisHotWat True if the tank supplies hot water, false for chilled water
TemperatureDifferencedTOffSetif tanCha.isHotWat then +1 e...Offset for set point to have a slightly higher (or lower) temperature than the required supply from the load [K]
Nominal condition
MassFlowRatem_flow_nominal Nominal mass flow rate [kg/s]
Initialization
TemperatureT_startMedium.T_defaultTemperature start value [K]

Connectors

TypeNameDescription
replaceable package MediumMedium model
FluidPort_aport_genTopTank top port on generation side
FluidPort_bport_genBotTank bottom port on generation side
FluidPort_aport_loaBotTank bottom port on load side
FluidPort_bport_loaTopTank top port on load side
output RealOutputQl_flowHeat loss of tank (positive if heat flows from tank to ambient) [W]
output RealOutputTTopFluid temperature at tank top [K]
output RealOutputTBotFluid temperature at tank bottom [K]
HeatPort_aheaPorAmbHeat port at interface with ambient (outside insulation)
input RealInputTTanSetTank temperature set point, top for hot tank and bottom for cold tank [K]
output BooleanOutputchargeOutputs true if tank should be charged

Modelica definition

model StratifiedTankWithCommand "Stratified buffer tank model" replaceable package Medium=Modelica.Media.Interfaces.PartialMedium "Medium model"; final parameter Boolean allowFlowReversal=true "= true to allow flow reversal, false restricts to design direction (port_a -> port_b)"; parameter Modelica.Units.SI.Volume VTan "Tank volume"; parameter Modelica.Units.SI.Length hTan "Height of tank (without insulation)"; parameter Modelica.Units.SI.Length dIns "Thickness of insulation"; parameter Modelica.Units.SI.ThermalConductivity kIns=0.04 "Specific heat conductivity of insulation"; parameter Integer nSeg( min=2)=3 "Number of volume segments"; parameter Modelica.Units.SI.MassFlowRate m_flow_nominal "Nominal mass flow rate"; parameter Medium.Temperature T_start=Medium.T_default "Temperature start value"; parameter Boolean isHotWat "True if the tank supplies hot water, false for chilled water"; parameter Modelica.Units.SI.TemperatureDifference dTOffSet=if tanCha.isHotWat then +1 else -1 "Offset for set point to have a slightly higher (or lower) temperature than the required supply from the load"; // IO CONNECTORS Modelica.Fluid.Interfaces.FluidPort_a port_genTop( redeclare final package Medium = Medium, m_flow(min=if allowFlowReversal then -Modelica.Constants.inf else 0), h_outflow(start=Medium.h_default, nominal=Medium.h_default)) "Tank top port on generation side"; Modelica.Fluid.Interfaces.FluidPort_b port_genBot( redeclare final package Medium = Medium, m_flow(max=if allowFlowReversal then +Modelica.Constants.inf else 0), h_outflow(start=Medium.h_default, nominal=Medium.h_default)) "Tank bottom port on generation side"; Modelica.Fluid.Interfaces.FluidPort_a port_loaBot( redeclare final package Medium = Medium, m_flow(min=if allowFlowReversal then -Modelica.Constants.inf else 0), h_outflow(start=Medium.h_default, nominal=Medium.h_default)) "Tank bottom port on load side"; Modelica.Fluid.Interfaces.FluidPort_b port_loaTop( redeclare final package Medium = Medium, m_flow(max=if allowFlowReversal then +Modelica.Constants.inf else 0), h_outflow(start=Medium.h_default, nominal=Medium.h_default)) "Tank top port on load side"; Modelica.Blocks.Interfaces.RealOutput Ql_flow( final unit="W") "Heat loss of tank (positive if heat flows from tank to ambient)"; Modelica.Blocks.Interfaces.RealOutput TTop( final unit="K", displayUnit="degC") "Fluid temperature at tank top"; Modelica.Blocks.Interfaces.RealOutput TBot( final unit="K", displayUnit="degC") "Fluid temperature at tank bottom"; Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a heaPorAmb "Heat port at interface with ambient (outside insulation)"; // COMPONENTS Buildings.Fluid.Storage.Stratified tan( redeclare final package Medium = Medium, final m_flow_nominal=m_flow_nominal, final VTan=VTan, final hTan=hTan, final dIns=dIns, final kIns=kIns, final nSeg=nSeg, final T_start=T_start) "Stratified tank"; Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensor senTBot "Tank bottom temperature"; Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensor senTTop "Tank top temperature"; Buildings.DHC.ETS.Combined.Controls.TankChargingController tanCha(final dTOffSet=dTOffSet, final isHotWat=isHotWat) "Tank charging command"; Modelica.Blocks.Interfaces.RealInput TTanSet( final unit="K", displayUnit="degC") "Tank temperature set point, top for hot tank and bottom for cold tank"; Buildings.Controls.OBC.CDL.Interfaces.BooleanOutput charge "Outputs true if tank should be charged"; Buildings.Fluid.FixedResistances.Junction junTop( redeclare package Medium = Medium, energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, T_start=T_start, m_flow_nominal=m_flow_nominal*{1,-1,-1}, dp_nominal=zeros(3)) "Fluid junction at top of tank"; Buildings.Fluid.FixedResistances.Junction junBot( redeclare package Medium = Medium, energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, T_start=T_start, m_flow_nominal=m_flow_nominal*{1,-1,1}, dp_nominal=zeros(3)) "Fluid junction at bottom of tank"; protected Modelica.Thermal.HeatTransfer.Components.ThermalCollector theCol( m=3) "Connector to assign multiple heat ports to one heat port"; equation connect(tan.Ql_flow,Ql_flow); connect(tan.heaPorVol[nSeg],senTBot.port); connect(tan.heaPorVol[1],senTTop.port); connect(senTTop.T,TTop); connect(senTBot.T,TBot); connect(heaPorAmb,theCol.port_b); connect(theCol.port_a[1],tan.heaPorTop); connect(theCol.port_a[2],tan.heaPorSid); connect(theCol.port_a[3],tan.heaPorBot); connect(senTTop.T, tanCha.TTanTop); connect(senTBot.T, tanCha.TTanBot); connect(tanCha.charge, charge); connect(junTop.port_3, tan.port_a); connect(tan.port_b, junBot.port_3); connect(port_loaBot, junBot.port_1); connect(junBot.port_2, port_genBot); connect(port_loaTop, junTop.port_2); connect(junTop.port_1, port_genTop); connect(TTanSet, tanCha.TTanSet); end StratifiedTankWithCommand;

Buildings.DHC.ETS.Combined.Subsystems.SwitchBox Buildings.DHC.ETS.Combined.Subsystems.SwitchBox

Model for mass flow rate redirection with three-port two-position directional valves

Buildings.DHC.ETS.Combined.Subsystems.SwitchBox

Information

This model represents a hydronic arrangement avoid flow reversal in the service line, for instance when connecting an energy transfer station such as the one modeled in Buildings.DHC.ETS.Combined.HeatPumpHeatExchanger. For that intent, two three-port two-position directional valves are used. The valves are actuated based on the logic described in Buildings.DHC.ETS.Combined.Controls.SwitchBox.

Parameters

TypeNameDefaultDescription
replaceable package MediumModelica.Media.Interfaces.Pa...Medium model
RealtrueHoldDuration60true hold duration [s]
RealfalseHoldDurationtrueHoldDurationfalse hold duration [s]
Nominal condition
MassFlowRatem_flow_nominal Nominal mass flow rate [kg/s]
PressureDifferencedpValve_nominal5000Valve pressure drop at nominal conditions [Pa]
Dynamics
Conservation equations
DynamicsenergyDynamicsModelica.Fluid.Types.Dynamic...Type of energy balance (except for the pump always modeled in steady state)

Connectors

TypeNameDescription
replaceable package MediumMedium model
FluidPort_bport_bSupSupply line outlet port
FluidPort_bport_bRetReturn line outlet port
FluidPort_aport_aSupSupply line inlet port
FluidPort_aport_aRetReturn line inlet port
input RealInputmRev_flowService water mass flow rate in reverse direction [kg/s]
input RealInputmPos_flowService water mass flow rate in positive direction [kg/s]

Modelica definition

model SwitchBox "Model for mass flow rate redirection with three-port two-position directional valves" replaceable package Medium = Modelica.Media.Interfaces.PartialMedium "Medium model"; parameter Modelica.Units.SI.MassFlowRate m_flow_nominal "Nominal mass flow rate"; parameter Modelica.Units.SI.PressureDifference dpValve_nominal( min=0, displayUnit="Pa") = 5000 "Valve pressure drop at nominal conditions"; parameter Real trueHoldDuration( final unit="s") = 60 "true hold duration"; parameter Real falseHoldDuration( final unit="s") = trueHoldDuration "false hold duration"; parameter Modelica.Fluid.Types.Dynamics energyDynamics= Modelica.Fluid.Types.Dynamics.FixedInitial "Type of energy balance (except for the pump always modeled in steady state)"; // IO CONECTORS Modelica.Fluid.Interfaces.FluidPort_b port_bSup( redeclare package Medium = Medium) "Supply line outlet port"; Modelica.Fluid.Interfaces.FluidPort_b port_bRet( redeclare final package Medium = Medium) "Return line outlet port"; Modelica.Fluid.Interfaces.FluidPort_a port_aSup( redeclare final package Medium = Medium) "Supply line inlet port"; Modelica.Fluid.Interfaces.FluidPort_a port_aRet( redeclare final package Medium = Medium) "Return line inlet port"; Buildings.Controls.OBC.CDL.Interfaces.RealInput mRev_flow(final unit="kg/s") "Service water mass flow rate in reverse direction"; Buildings.Controls.OBC.CDL.Interfaces.RealInput mPos_flow(final unit="kg/s") "Service water mass flow rate in positive direction"; // COMPONENTS Buildings.DHC.ETS.BaseClasses.Junction splSup( redeclare final package Medium = Medium, m_flow_nominal={1,1,1}*m_flow_nominal) "Flow splitter"; Buildings.DHC.ETS.BaseClasses.Junction splRet( redeclare final package Medium = Medium, m_flow_nominal={1,1,1}*m_flow_nominal) "Flow splitter"; Buildings.DHC.ETS.Combined.Controls.SwitchBox con( final m_flow_nominal=m_flow_nominal, final trueHoldDuration=trueHoldDuration, final falseHoldDuration=falseHoldDuration) "Switch box controller"; Fluid.Actuators.Valves.ThreeWayEqualPercentageLinear valSup( redeclare package Medium = Medium, dpValve_nominal=dpValve_nominal, use_strokeTime=false, m_flow_nominal=m_flow_nominal, linearized={true,true}, energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState) "Directional valve"; Fluid.Actuators.Valves.ThreeWayEqualPercentageLinear valRet( redeclare package Medium = Medium, dpValve_nominal=dpValve_nominal, use_strokeTime=false, m_flow_nominal=m_flow_nominal, linearized={true,true}, energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState) "Directional valve"; equation connect(port_bSup, splSup.port_2); connect(mRev_flow, con.mRev_flow); connect(splRet.port_1, port_aRet); connect(valSup.port_1, splSup.port_1); connect(valSup.port_3, splRet.port_3); connect(splRet.port_2, valRet.port_1); connect(splSup.port_3, valRet.port_3); connect(valRet.port_2, port_bRet); connect(valSup.port_2, port_aSup); connect(con.y, valRet.y); connect(mPos_flow, con.mPos_flow); connect(con.y, valSup.y); end SwitchBox;

Buildings.DHC.ETS.Combined.Subsystems.WatersideEconomizer Buildings.DHC.ETS.Combined.Subsystems.WatersideEconomizer

Base subsystem with waterside economizer

Buildings.DHC.ETS.Combined.Subsystems.WatersideEconomizer

Information

This is a model for a waterside economizer for sidestream integration (in series with the chillers). The primary side is typically connected to the service line. The primary flow rate is modulated either with a variable speed pump or with a two-way valve. The secondary side is typically connected to the chilled water return, using a three-port two-position directional control valve.

The system is controlled based on the logic described in Buildings.DHC.ETS.Combined.Controls.WatersideEconomizer.

Extends from Buildings.Fluid.Interfaces.PartialFourPortInterface (Partial model with four ports and declaration of quantities that are used by many models).

Parameters

TypeNameDefaultDescription
replaceable package Medium1PartialMediumMedium 1 in the component
replaceable package Medium2PartialMediumMedium 2 in the component
ConnectionConfigurationconCon District connection configuration
Nominal condition
MassFlowRatem1_flow_nominalabs(Q_flow_nominal/4200/(T_b...Nominal mass flow rate [kg/s]
MassFlowRatem2_flow_nominalabs(Q_flow_nominal/4200/(T_b...Nominal mass flow rate [kg/s]
PressureDifferencedp1Hex_nominal Nominal pressure drop across heat exchanger on district side [Pa]
PressureDifferencedp2Hex_nominal Nominal pressure drop across heat exchanger on building side [Pa]
PressureDifferencedpVal1_nominalif have_val1 then dp1Hex_nom...Nominal pressure drop of primary control valve [Pa]
PressureDifferencedpVal2_nominaldp2Hex_nominal/10Nominal pressure drop of heat exchanger bypass valve [Pa]
HeatFlowRateQ_flow_nominal Nominal heat flow rate (from district to building) [W]
TemperatureT_a1_nominal Nominal water inlet temperature on district side [K]
TemperatureT_b1_nominal Nominal water outlet temperature on district side [K]
TemperatureT_a2_nominal Nominal water inlet temperature on building side [K]
TemperatureT_b2_nominal Nominal water outlet temperature on building side [K]
Controls
Realy1Min0.05Minimum pump flow rate or valve opening for temperature measurement (fractional) [1]
TemperatureDifferencedTEna1Minimum delta-T above predicted heat exchanger leaving water temperature to enable WSE [K]
TemperatureDifferencedTDis0.5Minimum delta-T across heat exchanger before disabling WSE [K]
Realk1Gain of controller
TimeTi60Time constant of integrator block [s]
Assumptions
BooleanallowFlowReversal1true= false to simplify equations, assuming, but not enforcing, no flow reversal for medium 1
BooleanallowFlowReversal2true= false to simplify equations, assuming, but not enforcing, no flow reversal for medium 2
Advanced
MassFlowRatem1_flow_small1E-4*abs(m1_flow_nominal)Small mass flow rate for regularization of zero flow [kg/s]
MassFlowRatem2_flow_small1E-4*abs(m2_flow_nominal)Small mass flow rate for regularization of zero flow [kg/s]
Diagnostics
Booleanshow_Tfalse= true, if actual temperature at port is computed

Connectors

TypeNameDescription
FluidPort_aport_a1Fluid connector a1 (positive design flow direction is from port_a1 to port_b1)
FluidPort_bport_b1Fluid connector b1 (positive design flow direction is from port_a1 to port_b1)
FluidPort_aport_a2Fluid connector a2 (positive design flow direction is from port_a2 to port_b2)
FluidPort_bport_b2Fluid connector b2 (positive design flow direction is from port_a2 to port_b2)
output RealOutputPPumPower drawn by pump motors [W]
input BooleanInputuCooCooling enable signal
input RealInputyValIsoEva_actualReturn position of evaporator to ambient loop isolation valve [1]

Modelica definition

model WatersideEconomizer "Base subsystem with waterside economizer" extends Buildings.Fluid.Interfaces.PartialFourPortInterface( final m1_flow_nominal=abs(Q_flow_nominal/4200/(T_b1_nominal - T_a1_nominal)), final m2_flow_nominal=abs(Q_flow_nominal/4200/(T_b2_nominal - T_a2_nominal))); parameter DHC.ETS.Types.ConnectionConfiguration conCon "District connection configuration"; parameter Modelica.Units.SI.PressureDifference dp1Hex_nominal(displayUnit= "Pa") "Nominal pressure drop across heat exchanger on district side"; parameter Modelica.Units.SI.PressureDifference dp2Hex_nominal(displayUnit= "Pa") "Nominal pressure drop across heat exchanger on building side"; parameter Modelica.Units.SI.PressureDifference dpVal1_nominal(displayUnit= "Pa") = if have_val1 then dp1Hex_nominal/2 else 0 "Nominal pressure drop of primary control valve"; parameter Modelica.Units.SI.PressureDifference dpVal2_nominal(displayUnit= "Pa") = dp2Hex_nominal/10 "Nominal pressure drop of heat exchanger bypass valve"; parameter Modelica.Units.SI.HeatFlowRate Q_flow_nominal "Nominal heat flow rate (from district to building)"; parameter Modelica.Units.SI.Temperature T_a1_nominal "Nominal water inlet temperature on district side"; parameter Modelica.Units.SI.Temperature T_b1_nominal "Nominal water outlet temperature on district side"; parameter Modelica.Units.SI.Temperature T_a2_nominal "Nominal water inlet temperature on building side"; parameter Modelica.Units.SI.Temperature T_b2_nominal "Nominal water outlet temperature on building side"; parameter Real y1Min(final unit="1")=0.05 "Minimum pump flow rate or valve opening for temperature measurement (fractional)"; parameter Modelica.Units.SI.TemperatureDifference dTEna=1 "Minimum delta-T above predicted heat exchanger leaving water temperature to enable WSE"; parameter Modelica.Units.SI.TemperatureDifference dTDis=0.5 "Minimum delta-T across heat exchanger before disabling WSE"; parameter Real k( min=0)=1 "Gain of controller"; parameter Modelica.Units.SI.Time Ti(min=Buildings.Controls.OBC.CDL.Constants.small)= 60 "Time constant of integrator block"; // IO CONNECTORS Buildings.Controls.OBC.CDL.Interfaces.RealOutput PPum( final unit="W") if not have_val1 "Power drawn by pump motors"; // COMPONENTS Buildings.DHC.ETS.Combined.Controls.WatersideEconomizer conWSE( final m2_flow_nominal=m2_flow_nominal, final y1Min=y1Min, final T_a1_nominal=T_a1_nominal, final T_b2_nominal=T_b2_nominal, final dTEna=dTEna, final dTDis=dTDis) "District heat exchanger loop controller"; Buildings.Fluid.HeatExchangers.PlateHeatExchangerEffectivenessNTU hex( redeclare final package Medium1 = Medium1, redeclare final package Medium2 = Medium2, final use_Q_flow_nominal=true, configuration=Buildings.Fluid.Types.HeatExchangerConfiguration.CounterFlow, final allowFlowReversal1=allowFlowReversal1, final allowFlowReversal2=allowFlowReversal2, final dp1_nominal=if have_val1 then 0 else dp1Hex_nominal, final dp2_nominal=0, final m1_flow_nominal=m1_flow_nominal, final m2_flow_nominal=m2_flow_nominal, final Q_flow_nominal=Q_flow_nominal, final T_a1_nominal=T_a1_nominal, final T_a2_nominal=T_a2_nominal) "Heat exchanger"; DHC.ETS.BaseClasses.Pump_m_flow pum1( redeclare final package Medium = Medium1, final m_flow_nominal=m1_flow_nominal, final dp_nominal=dp1Hex_nominal, final allowFlowReversal=allowFlowReversal1) if not have_val1 "District heat exchanger primary pump"; Buildings.Fluid.Sensors.TemperatureTwoPort senT2WatEnt( redeclare final package Medium = Medium2, final m_flow_nominal=m2_flow_nominal, final allowFlowReversal=allowFlowReversal2) "Heat exchanger secondary water entering temperature"; Buildings.Fluid.Sensors.TemperatureTwoPort senT2WatLvg( redeclare final package Medium = Medium2, final m_flow_nominal=m2_flow_nominal, final allowFlowReversal=allowFlowReversal2) "Heat exchanger secondary water leaving temperature"; Buildings.Fluid.Actuators.Valves.TwoWayPressureIndependent val1( redeclare final package Medium = Medium1, final m_flow_nominal=m1_flow_nominal, from_dp=true, final dpValve_nominal=dpVal1_nominal, final dpFixed_nominal=dp1Hex_nominal, use_strokeTime=false) if have_val1 "Heat exchanger primary control valve"; Buildings.Controls.OBC.CDL.Reals.MultiplyByParameter gai1(final k= m1_flow_nominal) if not have_val1 "Scale to nominal mass flow rate"; Buildings.Fluid.Actuators.Valves.ThreeWayLinear val2( redeclare final package Medium = Medium2, energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, use_strokeTime=false, final m_flow_nominal=m2_flow_nominal, final dpValve_nominal=dpVal2_nominal, final dpFixed_nominal={dp2Hex_nominal,0}, fraK=1) "Heat exchanger secondary actuation valve (open or close)"; Buildings.Fluid.Sensors.TemperatureTwoPort senT1WatEnt( redeclare final package Medium = Medium1, final m_flow_nominal=m1_flow_nominal, final allowFlowReversal=allowFlowReversal1) "Heat exchanger primary water entering temperature"; Buildings.Controls.OBC.CDL.Interfaces.BooleanInput uCoo "Cooling enable signal"; Buildings.Controls.OBC.CDL.Interfaces.RealInput yValIsoEva_actual(final unit="1") "Return position of evaporator to ambient loop isolation valve"; Buildings.Fluid.Sensors.MassFlowRate senMasFlo2(redeclare final package Medium = Medium2, final allowFlowReversal=allowFlowReversal2) "Heat exchanger secondary mass flow rate"; protected parameter Boolean have_val1= conCon ==Buildings.DHC.ETS.Types.ConnectionConfiguration.TwoWayValve "True in case of control valve on district side, false in case of a pump"; equation if not have_val1 then connect(hex.port_b1, port_b1); else connect(port_a1, senT1WatEnt.port_a); end if; connect(port_a1,pum1.port_a); connect(val1.port_b,port_b1); connect(conWSE.y1, val1.y); connect(conWSE.y1, gai1.u); connect(gai1.y,pum1.m_flow_in); connect(PPum, pum1.P); connect(conWSE.yVal2, val2.y); connect(port_a2, senT2WatEnt.port_a); connect(senT1WatEnt.port_b, hex.port_a1); connect(senT1WatEnt.port_a, pum1.port_b); connect(hex.port_b1, val1.port_a); connect(uCoo, conWSE.uCoo); connect(senT1WatEnt.T, conWSE.T1WatEnt); connect(conWSE.T2WatEnt, senT2WatEnt.T); connect(senT2WatLvg.T, conWSE.T2WatLvg); connect(yValIsoEva_actual, conWSE.yValIsoEva_actual); connect(port_b2, senMasFlo2.port_b); connect(senMasFlo2.port_a, senT2WatLvg.port_b); connect(senMasFlo2.m_flow, conWSE.m2_flow); connect(val2.port_2, senT2WatLvg.port_a); connect(val2.port_3, senT2WatEnt.port_b); connect(val2.port_1, hex.port_b2); connect(hex.port_a2, senT2WatEnt.port_b); end WatersideEconomizer;