Buildings.Fluid.Chillers.ModularReversible.RefrigerantCycle

Package for chiller refrigerant cycle modules

Information

This package contains models and data to for dynamic refrigerant cycles with stationary data points, evaporator frosting, and cycle inertia.

Extends from Modelica.Icons.MaterialPropertiesPackage (Icon for package containing property classes).

Package Content

Name Description
Buildings.Fluid.Chillers.ModularReversible.RefrigerantCycle.ConstantCarnotEffectiveness ConstantCarnotEffectiveness Carnot EER with a constant Carnot effectiveness
Buildings.Fluid.Chillers.ModularReversible.RefrigerantCycle.TableData2D TableData2D Performance data based on condenser outlet and evaporator inlet temperature
Buildings.Fluid.Chillers.ModularReversible.RefrigerantCycle.TableData2DLoadDep TableData2DLoadDep Data-based model dependent on evaporator and condenser entering or leaving temperarure and PLR
Buildings.Fluid.Chillers.ModularReversible.RefrigerantCycle.BaseClasses BaseClasses Package with partial classes of performance Data

Buildings.Fluid.Chillers.ModularReversible.RefrigerantCycle.ConstantCarnotEffectiveness Buildings.Fluid.Chillers.ModularReversible.RefrigerantCycle.ConstantCarnotEffectiveness

Carnot EER with a constant Carnot effectiveness

Buildings.Fluid.Chillers.ModularReversible.RefrigerantCycle.ConstantCarnotEffectiveness

Information

This model uses a constant Carnot effectiveness approach to compute the efficiency of the chiller.

PEle_nominal is computed from the provided QCoo_flow_nominal and other nominal conditions. PEle_nominal stays constant over all boundary conditions and is used to calculate PEle by multiplying it with the relative compressor speed. QEva_flow is computed using the Carnot approach:

QEva_flow = PEle_nominal * etaCarnot_nominal * yMea * (TEvaOut - TAppEva) / (TConOut + TAppCon - (TEvaOut - TAppEva))

PEle = PEle_nominal * yMea

These equations follow the same methods used in Buildings.Fluid.Chillers.Carnot_y Similarly, the variables TAppCon and TAppEva define the approach (pinch) temperature differences.

The approach temperatures are calculated using the following equation:

TApp = TApp_nominal * Q_flow / Q_flow_nominal

This introduces nonlinear equations to the model, which can lead to solver issues for reversible operation. You can use the nominal values as a constant by enabling use_constAppTem

Extends from Buildings.Fluid.Chillers.ModularReversible.RefrigerantCycle.BaseClasses.PartialChillerCycle (Partial model of refrigerant cycle used for chiller applications), Buildings.Fluid.HeatPumps.ModularReversible.RefrigerantCycle.BaseClasses.PartialCarnot (Model with components for Carnot efficiency calculation).

Parameters

TypeNameDefaultDescription
StringdevIde"ConstantCarnotEffectiveness"Indicates the data source, used to warn users about different vapor compression devices in reversible models
BooleanuseInChitrue=false to indicate that this model is used as a heat pump
BooleanuseForChitrue=false to use in heat pump models
Nominal condition
PowerPEle_nominal-QCoo_flow_nominal/EER_nominalNominal electrical power consumption [W]
TemperatureTCon_nominal Nominal temperature at secondary condenser side [K]
TemperatureTEva_nominal Nominal temperature at secondary evaporator side [K]
HeatFlowRateQCoo_flow_nominal Nominal cooling capacity [W]
RealetaCarnot_nominal0.3Constant Carnot effectiveness
RealEER_nominaletaCarnot_nominal*(TEva_nomi...Nominal EER [1]
Frosting supression
NoFrostingiceFacCalredeclare Buildings.Fluid.He...Replaceable model to calculate the icing factor
Efficiency
Booleanuse_constAppTemfalse=true to fix approach temperatures at nominal values. This can improve simulation speed
TemperatureDifferenceTAppCon_nominalif cpCon < 1500 then 5 else 2Temperature difference between refrigerant and working fluid outlet in condenser [K]
TemperatureDifferenceTAppEva_nominalif cpEva < 1500 then 5 else 2Temperature difference between refrigerant and working fluid outlet in evaporator [K]
Advanced
Medium properties
SpecificHeatCapacitycpCon Evaporator medium specific heat capacity [J/(kg.K)]
SpecificHeatCapacitycpEva Evaporator medium specific heat capacity [J/(kg.K)]
TemperatureDifferencedTCarMin5Minimal temperature difference, used to avoid division errors [K]

Connectors

TypeNameDescription
output RealOutputPEleElectrical Power consumed by the device [W]
output RealOutputQCon_flowHeat flow rate through condenser [W]
RefrigerantMachineControlBussigBusBus-connector
output RealOutputQEva_flowHeat flow rate through evaporator [W]

Modelica definition

model ConstantCarnotEffectiveness "Carnot EER with a constant Carnot effectiveness" extends Buildings.Fluid.Chillers.ModularReversible.RefrigerantCycle.BaseClasses.PartialChillerCycle ( useInChi=true, PEle_nominal=-QCoo_flow_nominal/EER_nominal, devIde="ConstantCarnotEffectiveness"); extends Buildings.Fluid.HeatPumps.ModularReversible.RefrigerantCycle.BaseClasses.PartialCarnot ( TAppCon_nominal=if cpCon < 1500 then 5 else 2, TAppEva_nominal=if cpEva < 1500 then 5 else 2, final useForChi=true, final QEva_flow_nominal=QCoo_flow_nominal, final QCon_flow_nominal=PEle_nominal-QCoo_flow_nominal, constPEle(final k=PEle_nominal), proQUse_flow(nu=4)); parameter Real EER_nominal( min=0, final unit="1") = etaCarnot_nominal*(TEva_nominal - TAppEva_nominal)/( TCon_nominal + TAppCon_nominal - (TEva_nominal - TAppEva_nominal)) "Nominal EER"; Modelica.Blocks.Sources.Constant constNegOne(final k=-1) "Negative one to negative evaporator heat flow rate"; equation connect(swiQUse.u2, sigBus.onOffMea); connect(swiPEle.y, redQCon.u2); connect(swiPEle.y, PEle); connect(swiPEle.u2, sigBus.onOffMea); connect(pasThrYMea.u, sigBus.yMea); if useInChi then connect(pasThrTCon.u, sigBus.TConOutMea); connect(pasThrTEva.u, sigBus.TEvaOutMea); else connect(pasThrTCon.u, sigBus.TEvaOutMea); connect(pasThrTEva.u, sigBus.TConOutMea); end if; connect(swiQUse.y, proRedQEva.u2); connect(constNegOne.y, proQUse_flow.u[4]); end ConstantCarnotEffectiveness;

Buildings.Fluid.Chillers.ModularReversible.RefrigerantCycle.TableData2D Buildings.Fluid.Chillers.ModularReversible.RefrigerantCycle.TableData2D

Performance data based on condenser outlet and evaporator inlet temperature

Buildings.Fluid.Chillers.ModularReversible.RefrigerantCycle.TableData2D

Information

This model uses two-dimensional table data typically given by manufacturers as required by e.g. European Norm 14511 or ASHRAE 205 to calculate QEva_flow and PEle.

For different condenser outlet and evaporator inlet temperatures, the tables must provide two of the three following values: electrical power consumption, evaporator heat flow rate, and COP.

Note that losses are often implicitly included in measured data. In this case, the frosting modules should be disabled.

Scaling factor

For the scaling factor, the table data for evaporator heat flow rate (QEvaTabDat_flow) is evaluated at nominal conditions. Hence, the scaling factor is

scaFac = QEva_flow_nominal/QEvaTabDat_flow(TEva_nominal, TCon_nominal).

Using scaFac, the table data is scaled linearly. This implies a constant COP over different design sizes:

QEva_flow = scaFac * tabQEva_flow.y

PEle = scaFac * tabPel.y

Known Limitations

References

EN 14511-2018: Air conditioners, liquid chilling packages and heat pumps for space heating and cooling and process chillers, with electrically driven compressors https://www.beuth.de/de/norm/din-en-14511-1/298537524

Extends from Buildings.Fluid.Chillers.ModularReversible.RefrigerantCycle.BaseClasses.PartialChillerCycle (Partial model of refrigerant cycle used for chiller applications), Buildings.Fluid.HeatPumps.ModularReversible.RefrigerantCycle.BaseClasses.PartialTableData2D (Partial model with components for TableData2D approach for heat pumps and chillers).

Parameters

TypeNameDefaultDescription
StringdevIdedatTab.devIdeIndicates the data source, used to warn users about different vapor compression devices in reversible models
BooleanuseInChi =false to indicate that this model is used as a heat pump
RealscaFacQCoo_flow_nominal/QCooNoSca_...Scaling factor
Booleanuse_TEvaOutForTabdatTab.use_TEvaOutForTabif true, use evaporator outlet temperature, otherwise use inlet
Booleanuse_TConOutForTabdatTab.use_TConOutForTabif true, use condenser outlet temperature, otherwise use inlet
GenericdatTabredeclare parameter Building...Data Table of Chiller
Nominal condition
PowerPEle_nominalModelica.Blocks.Tables.Inter...Nominal electrical power consumption [W]
TemperatureTCon_nominal Nominal temperature at secondary condenser side [K]
TemperatureTEva_nominal Nominal temperature at secondary evaporator side [K]
HeatFlowRateQCoo_flow_nominal Nominal cooling capacity [W]
MassFlowRatemCon_flow_nominaldatTab.mCon_flow_nominal*sca...Nominal mass flow rate in secondary condenser side [kg/s]
MassFlowRatemEva_flow_nominaldatTab.mEva_flow_nominal*sca...Nominal mass flow rate in secondary evaporator side [kg/s]
HeatFlowRateQCooNoSca_flow_nominalModelica.Blocks.Tables.Inter...Unscaled nominal cooling capacity [W]
Frosting supression
NoFrostingiceFacCalredeclare Buildings.Fluid.He...Replaceable model to calculate the icing factor
Data handling
SmoothnesssmoothnessModelica.Blocks.Types.Smooth...Smoothness of table interpolation
ExtrapolationextrapolationModelica.Blocks.Types.Extrap...Extrapolation of data outside the definition range
Advanced
Medium properties
SpecificHeatCapacitycpCon Evaporator medium specific heat capacity [J/(kg.K)]
SpecificHeatCapacitycpEva Evaporator medium specific heat capacity [J/(kg.K)]

Connectors

TypeNameDescription
output RealOutputPEleElectrical Power consumed by the device [W]
output RealOutputQCon_flowHeat flow rate through condenser [W]
RefrigerantMachineControlBussigBusBus-connector
output RealOutputQEva_flowHeat flow rate through evaporator [W]

Modelica definition

model TableData2D "Performance data based on condenser outlet and evaporator inlet temperature" extends Buildings.Fluid.Chillers.ModularReversible.RefrigerantCycle.BaseClasses.PartialChillerCycle ( final devIde=datTab.devIde, PEle_nominal=Modelica.Blocks.Tables.Internal.getTable2DValueNoDer2( tabIdePEle, TEva_nominal, TCon_nominal) * scaFac); extends Buildings.Fluid.HeatPumps.ModularReversible.RefrigerantCycle.BaseClasses.PartialTableData2D ( final useInRevDev=not useInChi, final use_TConOutForTab=datTab.use_TConOutForTab, final use_TEvaOutForTab=datTab.use_TEvaOutForTab, tabQUse_flow(final table=datTab.tabQEva_flow), tabPEle(final table=datTab.tabPEle), scaFac=QCoo_flow_nominal/QCooNoSca_flow_nominal, mEva_flow_nominal=datTab.mEva_flow_nominal*scaFac, mCon_flow_nominal=datTab.mCon_flow_nominal*scaFac, final valTabQEva_flow = {{-tabQUse_flow.table[j, i] for i in 2:numCol} for j in 2:numRow}, final valTabQCon_flow = valTabQEva_flow .+ valTabPEle, final mCon_flow_max=max(valTabQCon_flow) * scaFac / cpCon / dTMin, final mCon_flow_min=min(valTabQCon_flow) * scaFac / cpCon / dTMax, final mEva_flow_min=min(valTabQEva_flow) * scaFac / cpEva / dTMax, final mEva_flow_max=max(valTabQEva_flow) * scaFac / cpEva / dTMin); parameter Modelica.Units.SI.HeatFlowRate QCooNoSca_flow_nominal= Modelica.Blocks.Tables.Internal.getTable2DValueNoDer2( tabIdeQUse_flow, TEva_nominal, TCon_nominal) "Unscaled nominal cooling capacity "; replaceable parameter Buildings.Fluid.Chillers.ModularReversible.Data.TableData2D.Generic datTab "Data Table of Chiller"; equation connect(scaFacTimPel.y, PEle); connect(scaFacTimPel.y, redQCon.u2); connect(scaFacTimQUse_flow.y, proRedQEva.u2); connect(yMeaTimScaFac.u1, sigBus.yMea); connect(reaPasThrTEvaOut.u, sigBus.TEvaOutMea); connect(reaPasThrTEvaIn.u, sigBus.TEvaInMea); connect(reaPasThrTConIn.u, sigBus.TConInMea); connect(reaPasThrTConOut.u, sigBus.TConOutMea); if useInChi then connect(reaPasThrTConOut.y, tabPEle.u2); connect(reaPasThrTConIn.y, tabPEle.u2); connect(reaPasThrTConIn.y, tabQUse_flow.u2); connect(reaPasThrTConOut.y, tabQUse_flow.u2); connect(reaPasThrTEvaOut.y, tabQUse_flow.u1); connect(reaPasThrTEvaIn.y, tabQUse_flow.u1); connect(reaPasThrTEvaOut.y, tabPEle.u1); connect(reaPasThrTEvaIn.y, tabPEle.u1); else connect(reaPasThrTConOut.y, tabPEle.u1); connect(reaPasThrTConOut.y, tabQUse_flow.u1); connect(reaPasThrTConIn.y, tabQUse_flow.u1); connect(reaPasThrTConIn.y, tabPEle.u1); connect(reaPasThrTEvaOut.y, tabPEle.u2); connect(reaPasThrTEvaOut.y, tabQUse_flow.u2); connect(reaPasThrTEvaIn.y, tabQUse_flow.u2); connect(reaPasThrTEvaIn.y, tabPEle.u2); end if; end TableData2D;

Buildings.Fluid.Chillers.ModularReversible.RefrigerantCycle.TableData2DLoadDep Buildings.Fluid.Chillers.ModularReversible.RefrigerantCycle.TableData2DLoadDep

Data-based model dependent on evaporator and condenser entering or leaving temperarure and PLR

Buildings.Fluid.Chillers.ModularReversible.RefrigerantCycle.TableData2DLoadDep

Information

This model serves as a wrapper class to integrate the block Buildings.Fluid.HeatPumps.ModularReversible.RefrigerantCycle.BaseClasses.TableData2DLoadDep into chiller models. For a complete description of all modeling assumptions, please refer to the documentation of this block.

Extends from Buildings.Fluid.Chillers.ModularReversible.RefrigerantCycle.BaseClasses.PartialChillerCycle (Partial model of refrigerant cycle used for chiller applications).

Parameters

TypeNameDefaultDescription
StringdevIdedat.devIdeIndicates the data source, used to warn users about different vapor compression devices in reversible models
BooleanuseInChi =false to indicate that this model is used as a heat pump
Booleanhave_switchoverfalseSet to true for heat recovery chiller with built-in switchover
Booleanuse_TLoaLvgForCtltrueSet to true for leaving temperature control, false for entering temperature control
Genericdatredeclare parameter Building...Table with performance data
PowerP_min0Minimum power when system is enabled with compressor cycled off [W]
Nominal condition
PowerPEle_nominalcalQUseP.P_nominal*scaFacNominal electrical power consumption [W]
TemperatureTCon_nominal Nominal temperature at secondary condenser side [K]
TemperatureTEva_nominal Nominal temperature at secondary evaporator side [K]
HeatFlowRateQCoo_flow_nominal Nominal cooling capacity [W]
Frosting supression
NoFrostingiceFacCalredeclare Buildings.Fluid.He...Replaceable model to calculate the icing factor
Advanced
Medium properties
SpecificHeatCapacitycpCon Evaporator medium specific heat capacity [J/(kg.K)]
SpecificHeatCapacitycpEva Evaporator medium specific heat capacity [J/(kg.K)]

Connectors

TypeNameDescription
output RealOutputPEleElectrical Power consumed by the device [W]
output RealOutputQCon_flowHeat flow rate through condenser [W]
RefrigerantMachineControlBussigBusBus-connector
output RealOutputQEva_flowHeat flow rate through evaporator [W]

Modelica definition

model TableData2DLoadDep "Data-based model dependent on evaporator and condenser entering or leaving temperarure and PLR" extends Buildings.Fluid.Chillers.ModularReversible.RefrigerantCycle.BaseClasses.PartialChillerCycle( final devIde=dat.devIde, PEle_nominal=calQUseP.P_nominal * scaFac); parameter Boolean have_switchover=false "Set to true for heat recovery chiller with built-in switchover"; final parameter Real scaFac=QCoo_flow_nominal / calQUseP.Q_flow_nominal "Scaling factor"; final parameter Boolean use_TEvaOutForTab=dat.use_TEvaOutForTab "=true to use evaporator outlet temperature, false for inlet"; final parameter Boolean use_TConOutForTab=dat.use_TConOutForTab "=true to use condenser outlet temperature, false for inlet"; parameter Boolean use_TLoaLvgForCtl=true "Set to true for leaving temperature control, false for entering temperature control"; replaceable parameter Buildings.Fluid.Chillers.ModularReversible.Data.TableData2DLoadDep.Generic dat "Table with performance data"; parameter Modelica.Units.SI.Power P_min(final min=0)=0 "Minimum power when system is enabled with compressor cycled off"; HeatPumps.ModularReversible.RefrigerantCycle.BaseClasses.TableData2DLoadDep calQUseP( typ=if have_switchover then 2 else 1, final scaFac=scaFac, final TLoa_nominal=TEva_nominal, final TAmb_nominal=TCon_nominal, final use_TEvaOutForTab=use_TEvaOutForTab, final use_TConOutForTab=use_TConOutForTab, final use_TLoaLvgForCtl=use_TLoaLvgForCtl, final PLRSup=dat.PLRSup, final PLRCyc_min=dat.PLRCyc_min, final P_min=P_min, final fileName=dat.fileName, final tabNamQ=dat.tabNamQ, final tabNamP=dat.tabNamP) "Compute heat flow rate and input power"; Buildings.Controls.OBC.CDL.Routing.RealExtractor extBusSig[6]( each final nin=2) "Extract bus signals depending on application and operating mode"; Buildings.Controls.OBC.CDL.Reals.Sources.Constant cp[2]( k={cpEva, cpCon}) "Specific heat capacity"; Buildings.Controls.OBC.CDL.Routing.BooleanScalarReplicator coo( nout=1) if have_switchover "Extract bus signals depending on application"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant have_swi( final k=have_switchover) "Constant Boolean"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant use_inChi( final k=useInChi) "Constant Boolean"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant plaCoo( final k=true) if not have_switchover "Placeholder signal"; Buildings.Controls.OBC.CDL.Integers.Sources.Constant cst[2]( k={1, 2}) "Constants"; Buildings.Controls.OBC.CDL.Logical.And havSwiAndCoo "True if have_switchover and cooling mode enabled"; Buildings.Controls.OBC.CDL.Logical.Not notHavSwi "True if not have_switchover"; Buildings.Controls.OBC.CDL.Integers.Switch intSwi "Selection index: 1 to use evaporator as load side, 2 to use condenser"; Buildings.Controls.OBC.CDL.Logical.And cooLoaAndUseChi "True if tracking a CHW setpoint and used in a chiller cycle model"; Buildings.Controls.OBC.CDL.Logical.Or cooLoa "True if tracking a CHW setpoint"; Buildings.Controls.OBC.CDL.Routing.IntegerScalarReplicator intScaRep( nout=6) "Replicate selection index"; Buildings.Controls.OBC.CDL.Logical.Not notHea if not useInChi "Heating disabled (if used in reversible heat pump)"; Buildings.Controls.OBC.CDL.Logical.Sources.Constant tru(final k=true) if useInChi "Placeholder signal for cooling-only system"; Buildings.Controls.OBC.CDL.Logical.And onAndCoo "True if on and (used in chiller or used in HP and enabled in cooling mode)"; Buildings.Controls.OBC.CDL.Reals.Switch TSetAct "Switch between CHW and HW temperature setpoint"; equation connect(sigBus.TConInMea, extBusSig[1].u[1]); connect(sigBus.TEvaInMea, extBusSig[1].u[2]); connect(sigBus.TConOutMea, extBusSig[2].u[1]); connect(sigBus.TEvaOutMea, extBusSig[2].u[2]); connect(sigBus.TEvaInMea, extBusSig[3].u[1]); connect(sigBus.TConInMea, extBusSig[3].u[2]); connect(sigBus.TEvaOutMea, extBusSig[4].u[1]); connect(sigBus.TConOutMea, extBusSig[4].u[2]); connect(sigBus.mEvaMea_flow, extBusSig[5].u[1]); connect(sigBus.mConMea_flow, extBusSig[5].u[2]); connect(cp[1].y, extBusSig[6].u[1]); connect(cp[2].y, extBusSig[6].u[2]); connect(extBusSig[1].y,calQUseP.TAmbEnt); connect(extBusSig[2].y,calQUseP.TAmbLvg); connect(extBusSig[3].y, calQUseP.TLoaEnt); connect(extBusSig[4].y, calQUseP.TLoaLvg); connect(extBusSig[5].y, calQUseP.mLoa_flow); connect(extBusSig[6].y, calQUseP.cpLoa); connect(calQUseP.PLR, sigBus.PLRCoo); connect(sigBus.yMea, calQUseP.yMea); connect(calQUseP.P, PEle); connect(calQUseP.Q_flow, proRedQEva.u2); connect(calQUseP.P, redQCon.u2); connect(sigBus.coo, coo.u); connect(have_swi.y, havSwiAndCoo.u2); connect(coo.y[1], havSwiAndCoo.u1); connect(plaCoo.y, havSwiAndCoo.u1); connect(have_swi.y, notHavSwi.u); connect(use_inChi.y, cooLoaAndUseChi.u2); connect(notHavSwi.y, cooLoa.u2); connect(havSwiAndCoo.y, cooLoa.u1); connect(cooLoa.y, cooLoaAndUseChi.u1); connect(cooLoaAndUseChi.y, intSwi.u2); connect(extBusSig.index, intScaRep.y); connect(intScaRep.u, intSwi.y); connect(cst[1].y, intSwi.u1); connect(cst[2].y, intSwi.u3); connect(coo.y[1], calQUseP.coo); connect(sigBus.hea, notHea.u); connect(tru.y, onAndCoo.u2); connect(sigBus.onOffMea, onAndCoo.u1); connect(notHea.y, onAndCoo.u2); connect(onAndCoo.y, calQUseP.on); connect(cooLoa.y, TSetAct.u2); connect(sigBus.TChwSet, TSetAct.u1); connect(sigBus.THwSet, TSetAct.u3); connect(TSetAct.y, calQUseP.TSet); end TableData2DLoadDep;