This package contains base classes that are used to construct the models in Buildings.Fluid.Chillers.
Extends from Modelica.Icons.BasesPackage (Icon for packages containing base classes).Name | Description |
---|---|
PartialElectric | Partial model for electric chiller based on the model in DOE-2, CoolTools and EnergyPlus |
warnIfPerformanceOutOfBounds | Function that checks the performance and writes a warning if it is outside of 0.9 to 1.1 |
Base class for model of an electric chiller, based on the DOE-2.1 chiller model and the
CoolTools chiller model that are implemented in EnergyPlus as the models
Chiller:Electric:EIR
and Chiller:Electric:ReformulatedEIR
.
The model takes as an input the set point for the leaving chilled water temperature, which is met if the chiller has sufficient capacity. Thus, the model has a built-in, ideal temperature control. The model has three tests on the part load ratio and the cycling ratio:
PLR1 =min(QEva_flow_set/QEva_flow_ava, PLRMax);ensures that the chiller capacity does not exceed the chiller capacity specified by the parameter
PLRMax
.
CR = min(PLR1/per.PRLMin, 1.0);computes a cycling ratio. This ratio expresses the fraction of time that a chiller would run if it were to cycle because its load is smaller than the minimal load at which it can operature. Notice that this model does continuously operature even if the part load ratio is below the minimum part load ratio. Its leaving evaporator and condenser temperature can therefore be considered as an average temperature between the modes where the compressor is off and on.
PLR2 = max(PLRMinUnl, PLR1);computes the part load ratio of the compressor. The assumption is that for a part load ratio below
PLRMinUnl
,
the chiller uses hot gas bypass to reduce the capacity, while the compressor
power draw does not change.
The electric power only contains the power for the compressor, but not any power for pumps or fans.
Models that extend from this base class need to provide three functions to predict capacity and power consumption:
capFunT
.
EIRFunT
.
EIRFunPLR
.
Type | Name | Default | Description |
---|---|---|---|
replaceable package Medium1 | PartialMedium | Medium 1 in the component | |
replaceable package Medium2 | PartialMedium | Medium 2 in the component | |
Nominal condition | |||
MassFlowRate | m1_flow_nominal | mCon_flow_nominal | Nominal mass flow rate [kg/s] |
MassFlowRate | m2_flow_nominal | mEva_flow_nominal | Nominal mass flow rate [kg/s] |
Pressure | dp1_nominal | Pressure [Pa] | |
Pressure | dp2_nominal | Pressure [Pa] | |
Initialization | |||
MassFlowRate | m1_flow.start | 0 | Mass flow rate from port_a1 to port_b1 (m1_flow > 0 is design flow direction) [kg/s] |
Pressure | dp1.start | 0 | Pressure difference between port_a1 and port_b1 [Pa] |
MassFlowRate | m2_flow.start | 0 | Mass flow rate from port_a2 to port_b2 (m2_flow > 0 is design flow direction) [kg/s] |
Pressure | dp2.start | 0 | Pressure difference between port_a2 and port_b2 [Pa] |
Assumptions | |||
Boolean | allowFlowReversal1 | system.allowFlowReversal | = true to allow flow reversal in medium 1, false restricts to design direction (port_a -> port_b) |
Boolean | allowFlowReversal2 | system.allowFlowReversal | = true to allow flow reversal in medium 2, false restricts to design direction (port_a -> port_b) |
Advanced | |||
MassFlowRate | m1_flow_small | 1E-4*abs(m1_flow_nominal) | Small mass flow rate for regularization of zero flow [kg/s] |
MassFlowRate | m2_flow_small | 1E-4*abs(m2_flow_nominal) | Small mass flow rate for regularization of zero flow [kg/s] |
Boolean | homotopyInitialization | true | = true, use homotopy method |
Diagnostics | |||
Boolean | show_T | false | = true, if actual temperature at port is computed |
Flow resistance | |||
Medium 1 | |||
Boolean | from_dp1 | false | = true, use m_flow = f(dp) else dp = f(m_flow) |
Boolean | linearizeFlowResistance1 | false | = true, use linear relation between m_flow and dp for any flow rate |
Real | deltaM1 | 0.1 | Fraction of nominal flow rate where flow transitions to laminar |
Medium 2 | |||
Boolean | from_dp2 | false | = true, use m_flow = f(dp) else dp = f(m_flow) |
Boolean | linearizeFlowResistance2 | false | = true, use linear relation between m_flow and dp for any flow rate |
Real | deltaM2 | 0.1 | Fraction of nominal flow rate where flow transitions to laminar |
Dynamics | |||
Nominal condition | |||
Time | tau1 | 30 | Time constant at nominal flow [s] |
Time | tau2 | 30 | Time constant at nominal flow [s] |
Equations | |||
Dynamics | energyDynamics | Modelica.Fluid.Types.Dynamic... | Formulation of energy balance |
Dynamics | massDynamics | energyDynamics | Formulation of mass balance |
Initialization | |||
Medium 1 | |||
AbsolutePressure | p1_start | Medium1.p_default | Start value of pressure [Pa] |
Temperature | T1_start | 273.15 + 25 | Start value of temperature [K] |
MassFraction | X1_start[Medium1.nX] | Medium1.X_default | Start value of mass fractions m_i/m [kg/kg] |
ExtraProperty | C1_start[Medium1.nC] | fill(0, Medium1.nC) | Start value of trace substances |
ExtraProperty | C1_nominal[Medium1.nC] | fill(1E-2, Medium1.nC) | Nominal value of trace substances. (Set to typical order of magnitude.) |
Medium 2 | |||
AbsolutePressure | p2_start | Medium2.p_default | Start value of pressure [Pa] |
Temperature | T2_start | 273.15 + 5 | Start value of temperature [K] |
MassFraction | X2_start[Medium2.nX] | Medium2.X_default | Start value of mass fractions m_i/m [kg/kg] |
ExtraProperty | C2_start[Medium2.nC] | fill(0, Medium2.nC) | Start value of trace substances |
ExtraProperty | C2_nominal[Medium2.nC] | fill(1E-2, Medium2.nC) | Nominal value of trace substances. (Set to typical order of magnitude.) |
Type | Name | Description |
---|---|---|
FluidPort_a | port_a1 | Fluid connector a1 (positive design flow direction is from port_a1 to port_b1) |
FluidPort_b | port_b1 | Fluid connector b1 (positive design flow direction is from port_a1 to port_b1) |
FluidPort_a | port_a2 | Fluid connector a2 (positive design flow direction is from port_a2 to port_b2) |
FluidPort_b | port_b2 | Fluid connector b2 (positive design flow direction is from port_a2 to port_b2) |
input BooleanInput | on | Set to true to enable compressor, or false to disable compressor |
input RealInput | TSet | Set point for leaving chilled water temperature [K] |
output RealOutput | P | Electric power consumed by compressor [W] |
partial model PartialElectric "Partial model for electric chiller based on the model in DOE-2, CoolTools and EnergyPlus" extends Buildings.Fluid.Interfaces.FourPortHeatMassExchanger( m1_flow_nominal = mCon_flow_nominal, m2_flow_nominal = mEva_flow_nominal, T1_start = 273.15+25, T2_start = 273.15+5, redeclare final Buildings.Fluid.MixingVolumes.MixingVolume vol2( V=m2_flow_nominal*tau2/rho2_nominal, nPorts=2, final prescribedHeatFlowRate=true), vol1( final prescribedHeatFlowRate=true));Modelica.Blocks.Interfaces.BooleanInput on "Set to true to enable compressor, or false to disable compressor"; Modelica.Blocks.Interfaces.RealInput TSet(unit="K", displayUnit="degC") "Set point for leaving chilled water temperature"; Modelica.SIunits.Temperature TEvaEnt "Evaporator entering temperature"; Modelica.SIunits.Temperature TEvaLvg "Evaporator leaving temperature"; Modelica.SIunits.Temperature TConEnt "Condenser entering temperature"; Modelica.SIunits.Temperature TConLvg "Condenser leaving temperature"; Real COP(min=0) "Coefficient of performance"; Modelica.SIunits.HeatFlowRate QCon_flow "Condenser heat input"; Modelica.SIunits.HeatFlowRate QEva_flow "Evaporator heat input";Modelica.Blocks.Interfaces.RealOutput P(final quantity="Power", unit="W") "Electric power consumed by compressor"; Real capFunT(min=0, nominal=1, start=1) "Cooling capacity factor function of temperature curve"; Real EIRFunT(min=0, nominal=1, start=1) "Power input to cooling capacity ratio function of temperature curve"; Real EIRFunPLR(min=0, nominal=1, start=1) "Power input to cooling capacity ratio function of part load ratio"; Real PLR1(min=0, nominal=1, start=1) "Part load ratio"; Real PLR2(min=0, nominal=1, start=1) "Part load ratio"; Real CR(min=0, nominal=1, start=1) "Cycling ratio"; protected Modelica.SIunits.HeatFlowRate QEva_flow_ava(nominal=QEva_flow_nominal,start=QEva_flow_nominal) "Cooling capacity available at evaporator"; Modelica.SIunits.HeatFlowRate QEva_flow_set(nominal=QEva_flow_nominal,start=QEva_flow_nominal) "Cooling capacity required to cool to set point temperature"; Modelica.SIunits.SpecificEnthalpy hSet "Enthalpy setpoint for leaving chilled water"; // Performance data parameter Modelica.SIunits.HeatFlowRate QEva_flow_nominal(max=0) "Reference capacity (negative number)"; parameter Real COP_nominal "Reference coefficient of performance"; parameter Real PLRMax(min=0) "Maximum part load ratio"; parameter Real PLRMinUnl(min=0) "Minimum part unload ratio"; parameter Real PLRMin(min=0) "Minimum part load ratio"; parameter Real etaMotor(min=0, max=1) "Fraction of compressor motor heat entering refrigerant"; parameter Modelica.SIunits.MassFlowRate mEva_flow_nominal "Nominal mass flow at evaporator"; parameter Modelica.SIunits.MassFlowRate mCon_flow_nominal "Nominal mass flow at condenser"; parameter Modelica.SIunits.Temperature TEvaLvg_nominal "Temperature of fluid leaving evaporator at nominal condition"; final parameter Modelica.SIunits.Conversions.NonSIunits.Temperature_degC TEvaLvg_nominal_degC= Modelica.SIunits.Conversions.to_degC(TEvaLvg_nominal) "Temperature of fluid leaving evaporator at nominal condition"; Modelica.SIunits.Conversions.NonSIunits.Temperature_degC TEvaLvg_degC "Temperature of fluid leaving evaporator"; parameter Modelica.SIunits.HeatFlowRate Q_flow_small = QEva_flow_nominal*1E-9 "Small value for heat flow rate or power, used to avoid division by zero";Buildings.HeatTransfer.Sources.PrescribedHeatFlow preHeaFloEva "Prescribed heat flow rate"; Buildings.HeatTransfer.Sources.PrescribedHeatFlow preHeaFloCon "Prescribed heat flow rate"; Modelica.Blocks.Sources.RealExpression QEva_flow_in(y=QEva_flow) "Evaporator heat flow rate"; Modelica.Blocks.Sources.RealExpression QCon_flow_in(y=QCon_flow) "Condenser heat flow rate"; initial equation assert(QEva_flow_nominal < 0, "Parameter QEva_flow_nominal must be smaller than zero."); assert(PLRMinUnl >= PLRMin, "Parameter PLRMinUnl must be bigger or equal to PLRMin"); assert(PLRMax > PLRMinUnl, "Parameter PLRMax must be bigger than PLRMinUnl"); equation // Condenser temperatures TConEnt = Medium1.temperature(Medium1.setState_phX(port_a1.p, inStream(port_a1.h_outflow))); TConLvg = vol1.heatPort.T; // Evaporator temperatures TEvaEnt = Medium2.temperature(Medium2.setState_phX(port_a2.p, inStream(port_a2.h_outflow))); TEvaLvg = vol2.heatPort.T; TEvaLvg_degC=Modelica.SIunits.Conversions.to_degC(TEvaLvg); // Enthalpy of temperature setpoint hSet = Medium2.specificEnthalpy_pTX( p=port_b2.p, T=TSet, X=cat(1, port_b2.Xi_outflow, {1-sum(port_b2.Xi_outflow)})); if on then // Available cooling capacity QEva_flow_ava = QEva_flow_nominal*capFunT; // Cooling capacity required to chill water to setpoint QEva_flow_set = min(m2_flow*(hSet-inStream(port_a2.h_outflow)),0); // Part load ratio PLR1 = min(QEva_flow_set/(QEva_flow_ava+Q_flow_small), PLRMax); // PLR2 is the compressor part load ratio. The lower bound PLRMinUnl is // since for PLR1<PLRMinUnl, the chiller uses hot gas bypass, under which // condition the compressor power is assumed to be the same as if the chiller // were to operate at PLRMinUnl PLR2 = max(PLRMinUnl, PLR1); // Cycling ratio CR = min(PLR1/PLRMin,1.0); // Compressor power. P = -QEva_flow_ava/COP_nominal*EIRFunT*EIRFunPLR*CR; // Heat flow rates into evaporator and condenser QEva_flow = max(QEva_flow_set, QEva_flow_ava); QCon_flow = -QEva_flow + P*etaMotor; // Coefficient of performance COP = -QEva_flow/(P-Q_flow_small); else QEva_flow_ava = 0; QEva_flow_set = 0; PLR1 = 0; PLR2 = 0; CR = 0; P = 0; QEva_flow = 0; QCon_flow = 0; COP = 0; end if;connect(QCon_flow_in.y, preHeaFloCon.Q_flow); connect(preHeaFloCon.port, vol1.heatPort); connect(QEva_flow_in.y, preHeaFloEva.Q_flow); connect(preHeaFloEva.port, vol2.heatPort); end PartialElectric;
This function checks if the numeric argument is outside of the interval 0.9 to 1.1. If this is the case, the function writes a warning.
Type | Name | Default | Description |
---|---|---|---|
Real | x | Argument to be checked | |
String | msg | String to be added to warning message | |
String | curveName | Name of the curve that was tested |
Type | Name | Description |
---|---|---|
Integer | retVal | 0 if x is inside bounds, -1 if it is below bounds, or +1 if it is above bounds |
function warnIfPerformanceOutOfBounds "Function that checks the performance and writes a warning if it is outside of 0.9 to 1.1" input Real x "Argument to be checked"; input String msg "String to be added to warning message"; input String curveName "Name of the curve that was tested"; output Integer retVal "0 if x is inside bounds, -1 if it is below bounds, or +1 if it is above bounds"; algorithm if (x > 1.1) then retVal :=1; elseif ( x < 0.9) then retVal :=-1; else retVal :=0; end if; if (retVal <> 0) then Modelica.Utilities.Streams.print("************************************************************************************"); Modelica.Utilities.Streams.print("*** Warning: Chiller performance curves at nominal conditions are outside of bounds."); Modelica.Utilities.Streams.print(msg + " is outside of bounds 0.9 to 1.1."); Modelica.Utilities.Streams.print("The value of the curve fit is " + String(x)); Modelica.Utilities.Streams.print("Check the coefficients of the function " + curveName); Modelica.Utilities.Streams.print("************************************************************************************"); end if;end warnIfPerformanceOutOfBounds;