diff --git a/IDEAS/Fluid/HeatPumps/BaseClasses/HeatSource_CondensingGasBurner.mo b/IDEAS/Fluid/HeatPumps/BaseClasses/HeatSource_CondensingGasBurner.mo deleted file mode 100644 index 75c033df96..0000000000 --- a/IDEAS/Fluid/HeatPumps/BaseClasses/HeatSource_CondensingGasBurner.mo +++ /dev/null @@ -1,193 +0,0 @@ -within IDEAS.Fluid.HeatPumps.BaseClasses; -model HeatSource_CondensingGasBurner - "Burner for use in Boiler, based on interpolation data. Takes into account losses of the boiler to the environment" - replaceable package Medium = - Modelica.Media.Interfaces.PartialMedium "Medium in the component"; - final parameter Real[6] modVector={0,20,40,60,80,100} "6 modulation steps, %"; - Real eta "Instantaneous efficiency of the boiler (higher heating value)"; - Real[6] etaVector - "Thermal efficiency (higher heating value) for 6 modulation steps, base 1"; - Real[6] QVector "Thermal power for 6 modulation steps, in kW"; - Modelica.Units.SI.Power QMax - "Maximum thermal power at specified evap and condr temperatures, in W"; - Modelica.Units.SI.Power QAsked(start=0); - parameter Modelica.Units.SI.ThermalConductance UALoss - "UA of heat losses of HP to environment"; - parameter Modelica.Units.SI.Power QNom "The power at nominal conditions"; - final parameter Modelica.Units.SI.Power QNom0=10100 - "Nominal power of the boiler from which the power data are used in this model"; - constant Real etaNom=0.922 - "Nominal efficiency (higher heating value)of the xxx boiler at 50/30degC. See datafile"; - parameter Real modulationMin(max=29) = 10 "Minimal modulation percentage"; - parameter Real modulationStart(min=min(30, modulationMin + 5)) = 20 - "Min estimated modulation level required for start of HP"; - Real modulationInit "Initial modulation, decides on start/stop of the boiler"; - Real modulation(min=0, max=1) "Current modulation percentage"; - Modelica.Units.SI.Power PFuel "Resulting fuel consumption"; - input Modelica.Units.SI.Temperature THxIn "Condensor temperature"; - input Modelica.Units.SI.Temperature TBoilerSet - "Condensor setpoint temperature. Not always possible to reach it"; - input Modelica.Units.SI.MassFlowRate m_flowHx "Condensor mass flow rate"; - input Modelica.Units.SI.Temperature TEnvironment - "Temperature of environment for heat losses"; - input Modelica.Units.SI.SpecificEnthalpy hIn "Specific enthalpy at the inlet"; -protected - Real m_flowHx_scaled = IDEAS.Utilities.Math.Functions.smoothMax(x1=m_flowHx, x2=0,deltaX=0.001) * QNom0/QNom - "mass flow rate, scaled with the original and the actual nominal power of the boiler"; - constant Real kgps2lph=3600/Medium.density(Medium.setState_pTX(Medium.p_default, Medium.T_default, Medium.X_default))*1000 - "Conversion from kg/s to l/h"; - Modelica.Blocks.Tables.CombiTable2Ds eta100(smoothness=Modelica.Blocks.Types.Smoothness.ContinuousDerivative, - table=[0,100,400,700,1000,1300; 20.0,0.9015,0.9441,0.9599,0.9691,0.9753; - 30.0,0.8824,0.9184,0.9324,0.941,0.9471; 40.0,0.8736,0.8909,0.902,0.9092, - 0.9143; 50.0,0.8676,0.8731,0.8741,0.8746,0.8774; 60.0,0.8,0.867,0.8681, - 0.8686,0.8689; 70.0,0.8,0.8609,0.8619,0.8625,0.8628; 80.0,0.8,0.8547, - 0.8558,0.8563,0.8566]) - annotation (Placement(transformation(extent={{-58,66},{-38,86}}))); - Modelica.Blocks.Tables.CombiTable2Ds eta80(smoothness=Modelica.Blocks.Types.Smoothness.ContinuousDerivative, - table=[0,100,400,700,1000,1300; 20.0,0.9155,0.9587,0.9733,0.9813,0.9866; - 30.0,0.8937,0.9311,0.9449,0.953,0.9585; 40.0,0.8753,0.9007,0.9121, - 0.9192,0.9242; 50.0,0.8691,0.8734,0.8755,0.8804,0.884; 60.0,0.8628, - 0.8671,0.8679,0.8683,0.8686; 70.0,0.7415,0.8607,0.8616,0.862,0.8622; - 80.0,0.6952,0.8544,0.8552,0.8556,0.8559]) - annotation (Placement(transformation(extent={{-58,32},{-38,52}}))); - Modelica.Blocks.Tables.CombiTable2Ds eta60(smoothness=Modelica.Blocks.Types.Smoothness.ContinuousDerivative, - table=[0,100,400,700,1000,1300; 20.0,0.9349,0.9759,0.9879,0.9941,0.998; - 30.0,0.9096,0.9471,0.9595,0.9664,0.9709; 40.0,0.8831,0.9136,0.9247, - 0.9313,0.9357; 50.0,0.8701,0.8759,0.8838,0.8887,0.8921; 60.0,0.8634, - 0.8666,0.8672,0.8675,0.8677; 70.0,0.8498,0.8599,0.8605,0.8608,0.861; - 80.0,0.8488,0.8532,0.8538,0.8541,0.8543]) - annotation (Placement(transformation(extent={{-58,-6},{-38,14}}))); - Modelica.Blocks.Tables.CombiTable2Ds eta40(smoothness=Modelica.Blocks.Types.Smoothness.ContinuousDerivative, - table=[0,100,400,700,1000,1300; 20.0,0.9624,0.9947,0.9985,0.9989,0.999; - 30.0,0.9333,0.9661,0.9756,0.9803,0.9833; 40.0,0.901,0.9306,0.94,0.9451, - 0.9485; 50.0,0.8699,0.8871,0.8946,0.8989,0.9018; 60.0,0.8626,0.8647, - 0.8651,0.8653,0.8655; 70.0,0.8553,0.8573,0.8577,0.8579,0.8581; 80.0, - 0.8479,0.8499,0.8503,0.8505,0.8506]) - annotation (Placement(transformation(extent={{-58,-44},{-38,-24}}))); - Modelica.Blocks.Tables.CombiTable2Ds eta20(smoothness=Modelica.Blocks.Types.Smoothness.ContinuousDerivative, - table=[0,100,400,700,1000,1300; 20.0,0.9969,0.9987,0.999,0.999,0.999; - 30.0,0.9671,0.9859,0.99,0.9921,0.9934; 40.0,0.9293,0.9498,0.9549,0.9575, - 0.9592; 50.0,0.8831,0.9003,0.9056,0.9083,0.9101; 60.0,0.8562,0.857, - 0.8575,0.8576,0.8577; 70.0,0.8398,0.8479,0.8481,0.8482,0.8483; 80.0, - 0.8374,0.8384,0.8386,0.8387,0.8388]) - annotation (Placement(transformation(extent={{-58,-86},{-38,-66}}))); - Modelica.Units.SI.HeatFlowRate QLossesToCompensate "Environment losses"; - Integer i "Integer to select data interval"; -public - Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a heatPort - "heatPort connection to water in condensor" - annotation (Placement(transformation(extent={{90,-10},{110,10}}))); - Controls.Discrete.HysteresisRelease onOff( - use_input=false, - enableRelease=true, - uLow_val=modulationMin, - uHigh_val=modulationStart, - y(start=0), - release(start=0)) - annotation (Placement(transformation(extent={{20,20},{40,40}}))); - Modelica.Blocks.Sources.RealExpression realExpression(y=modulationInit) - annotation (Placement(transformation(extent={{-12,20},{8,40}}))); -algorithm - // efficiency coefficients - eta100.u1 :=THxIn - 273.15; - eta100.u2 :=m_flowHx_scaled*kgps2lph; - eta80.u1 :=THxIn - 273.15; - eta80.u2 :=m_flowHx_scaled*kgps2lph; - eta60.u1 :=THxIn - 273.15; - eta60.u2 :=m_flowHx_scaled*kgps2lph; - eta40.u1 :=THxIn - 273.15; - eta40.u2 :=m_flowHx_scaled*kgps2lph; - eta20.u1 :=THxIn - 273.15; - eta20.u2 :=m_flowHx_scaled*kgps2lph; - // all these are in kW - etaVector[1] :=0; - etaVector[2] :=eta20.y; - etaVector[3] :=eta40.y; - etaVector[4] :=eta60.y; - etaVector[5] :=eta80.y; - etaVector[6] :=eta100.y; - QVector :=etaVector/etaNom .* modVector/100*QNom; - // in W - QMax :=QVector[6]; - // Interpolation if QVector[1] QVector[j] then - i := j; - end if; - end for; - modulationInit := - IDEAS.Utilities.Math.Functions.cubicHermiteLinearExtrapolation( - x=QAsked, - x1=QVector[i], - x2=QVector[i + 1], - y1=modVector[i], - y2=modVector[i + 1], - y1d=0, - y2d=0); - modulation :=onOff.y*min(modulationInit, 100); - eta :=IDEAS.Utilities.Math.Functions.cubicHermiteLinearExtrapolation( - x=modulation, - x1=modVector[i], - x2=modVector[i + 1], - y1=etaVector[i], - y2=etaVector[i + 1], - y1d=0, - y2d=0); - heatPort.Q_flow :=- - IDEAS.Utilities.Math.Functions.cubicHermiteLinearExtrapolation( - x=modulation, - x1=modVector[i], - x2=modVector[i + 1], - y1=QVector[i], - y2=QVector[i + 1], - y1d=0, - y2d=0) - onOff.y*QLossesToCompensate; -equation - assert(TBoilerSet < 80+273.15 and TBoilerSet > 20 + 273.15, "The given set point temperature is not inside the covered range (20 -> 80 degC)"); - assert(m_flowHx_scaled*kgps2lph < 1300, "The given mass flow rate is outside the allowed range. Make sure that the mass flow - is positive and not too high. The current mass flow equals " + String(m_flowHx) + " [kg/s] but its maximum value is for the chosen QNom is " + String(1300*QNom/QNom0/kgps2lph)); - onOff.release = if noEvent(m_flowHx > Modelica.Constants.eps) then 1.0 else 0.0; - QAsked = IDEAS.Utilities.Math.Functions.smoothMax(0, m_flowHx*(Medium.specificEnthalpy(Medium.setState_pTX(Medium.p_default,TBoilerSet, Medium.X_default)) -hIn), 10); - // compensation of heat losses (only when the hp is operating) - QLossesToCompensate = if noEvent(modulation > 0) then UALoss*(heatPort.T - - TEnvironment) else 0; - PFuel = if onOff.release > 0.5 and noEvent(eta>Modelica.Constants.eps) then -heatPort.Q_flow/eta else 0; - connect(realExpression.y, onOff.u) annotation (Line( - points={{9,30},{18,30}}, - color={0,0,127}, - smooth=Smooth.None)); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-100, - -100},{100,100}}), - graphics), Documentation(info=" -

Description

-

This model is based on data from a Remeha boiler. It is used in the Boiler model.

-

The nominal power of the original boiler is 10.1 kW at  50/30 degC water temperatures.   The efficiency in this point is 92.2% on higher heating value. 

-

First, the efficiency is interpolated for the  return water temperature and flowrate at 5 different modulation levels. These modulation levels are the FUEL input power to the boiler.  The results  are rescaled to the nominal power of the modelled heatpump (with QNom/QNom_data) and  stored in a vector, eta_vector.

-

Finally, the initial modulation is calculated based on the asked power and the max power at  operating conditions: 

- -

If the boiler is on another modulation, interpolation is made to get eta at the real modulation.

-

ATTENTION

-

This model takes into account environmental heat losses of the boiler.  In order to keep the same nominal eta's during operation, these heat losses are added to the computed power.  Therefore, the heat losses are only really 'losses' when the boiler is NOT operating. 

-

The eta is calculated as the heat delivered to the heatedFluid divided by the fuel consumption PFuel. 

-

Assumptions and limitations

-
    -
  1. Based on interpolation in manufacturer data for Remeha condensing gas boiler
  2. -
-

Model use

-

This model is used in the Boiler model. If a different gas boiler is to be simulated, copy this Burner model and adapt the interpolation tables.

-

Validation

-

See the Boiler model.

-", revisions=" - -")); -end HeatSource_CondensingGasBurner; diff --git a/IDEAS/Fluid/HeatPumps/BaseClasses/HeatSource_HP_AW.mo b/IDEAS/Fluid/HeatPumps/BaseClasses/HeatSource_HP_AW.mo index 973f716753..2e3c9006c7 100644 --- a/IDEAS/Fluid/HeatPumps/BaseClasses/HeatSource_HP_AW.mo +++ b/IDEAS/Fluid/HeatPumps/BaseClasses/HeatSource_HP_AW.mo @@ -1,150 +1,157 @@ within IDEAS.Fluid.HeatPumps.BaseClasses; model HeatSource_HP_AW - "Computation of theoretical condensation power of the refrigerant based on interpolation data. Takes into account losses of the heat pump to the environment" - //fixme: adaptation of heatSource_CondensingGasBurner should also be applied on this model. - /* - This model is based on data we received from Daikin from an Altherma heat pump. - The nominal power of the original heat pump is 7177W at 2/35degC - - First, the thermal power and electricity consumption are interpolated for the - evaporator and condensing temperature at 4 different modulation levels. The results - are rescaled to the nominal power of the modelled heatpump (with QNom/QNom_data) and - stored in 2 different vectors, Q_vector and P_vector. - - Finally, the modulation is calculated based on the asked power and the max power at - operating conditions: - - if modulation_init < modulation_min, the heat pump is OFF, modulation = 0. - - if modulation_init > 100%, the modulation is 100% - - if modulation_init between modulation_min and modulation_start: hysteresis for on/off cycling. - - If the heat pump is on another modulation, interpolation is made to get P and Q at the real modulation. - - ATTENTION - This model takes into account environmental heat losses of the heat pump (at condensor side). - In order to keep the same nominal COP's during operation of the heat pump, these heat losses are added - to the computed power. Therefore, the heat losses are only really 'losses' when the heat pump is - NOT operating. - - The COP is calculated as the heat delivered to the condensor divided by the electrical consumption (P). - - */ - //protected - replaceable package Medium = - Modelica.Media.Interfaces.PartialMedium "Medium in the component"; + "Computation of theoretical condensation power of the refrigerant based on interpolation data. Takes into account losses of the heat pump to the environment" + + replaceable package Medium = Modelica.Media.Interfaces.PartialMedium + "Medium in the component"; + final parameter Modelica.Units.SI.Power QNomRef=7177 "Nominal power of the Daikin Altherma. See datafile"; - final parameter Real[5] mod_vector={0,30,50,90,100} "5 modulation steps, %"; - Real[5] Q_vector "Thermal power for 5 modulation steps, in kW"; - Real[5] P_vector "Electrical power for 5 modulation steps, in kW"; - Modelica.Units.SI.Power QMax - "Maximum thermal power at specified evap and condr temperatures, in W"; - Modelica.Units.SI.Power QAsked(start=0); - parameter Modelica.Units.SI.ThermalConductance UALoss - "UA of heat losses of HP to environment"; parameter Modelica.Units.SI.Power QNom "The power at nominal conditions (2/35)"; -public - parameter Real modulation_min(max=29) = 20 "Minimal modulation percentage"; - // dont' set this to 0 or very low values, you might get negative P at very low modulations because of wrong extrapolation + + parameter Boolean useMinMod = true; + parameter Real modulation_min(max=29) = 20 + "Minimal modulation percentage. Don't set this to 0 or very low values, you might get negative P at very low modulations because of wrong extrapolation"; parameter Real modulation_start(min=min(30, modulation_min + 5)) = 35 "Min estimated modulation level required for start of HP"; - Real modulationInit "Initial modulation, decides on start/stop of the HP"; - Real modulation(min=0, max=100) "Current modulation percentage"; - Modelica.Units.SI.Power PEl "Resulting electrical power"; - input Modelica.Units.SI.Temperature TEvaporator "Evaporator temperature"; - input Modelica.Units.SI.Temperature TEnvironment - "Temperature of environment for heat losses"; - input Modelica.Units.SI.SpecificEnthalpy hIn "Specific enthalpy at the inlet"; + final parameter Real[5] mod_vector={0,30,50,90,100} + "5 modulation steps, %"; + + parameter Modelica.Units.SI.ThermalConductance UALoss + "UA of heat losses of HP to environment"; + + Modelica.Units.SI.HeatFlowRate QAsked(start=0); + Modelica.Units.SI.HeatFlowRate QMax + "Maximum thermal power at specified evaporator and condensor temperatures, in W"; + Modelica.Units.SI.HeatFlowRate QLossesToCompensate "Environment losses"; + Real[5] Q_vector + "Thermal power for 5 modulation steps, in kW"; + + Modelica.Units.SI.Power PEl + "Resulting electrical power"; + Real[5] P_vector + "Electrical power for 5 modulation steps, in kW"; + + Real modulationInit + "Initial modulation, decides on start/stop of the HP"; + Real modulation(min=0, max=100) + "Current modulation percentage"; + + Modelica.Blocks.Interfaces.BooleanInput on + annotation (Placement( + transformation(extent={{-120,40},{-80,80}}), iconTransformation(extent={{-110,20}, + {-90,40}}))); + Modelica.Blocks.Interfaces.RealInput TCondensor_set + annotation (Placement( + transformation(extent={{-120,-50},{-80,-10}}),iconTransformation(extent={{-110, + -10},{-90,10}}))); + Modelica.Blocks.Interfaces.RealInput TCondensor_in + annotation (Placement(transformation( + extent={{-120,-80},{-80,-40}}), iconTransformation( + extent={{-10,-10},{10,10}}, + rotation=90, + origin={-50,-100}))); + Modelica.Blocks.Interfaces.RealInput m_flowCondensor + annotation (Placement(transformation( + extent={{-120,-110},{-80,-70}}),iconTransformation( + extent={{-10,-10},{10,10}}, + rotation=90, + origin={-20,-100}))); + Modelica.Blocks.Interfaces.RealInput TEvaporator + annotation (Placement(transformation(extent={{-120,-20},{-80,20}}), iconTransformation(extent={{-10,-10},{10,10}}, + rotation=270, + origin={-80,100}))); + Modelica.Blocks.Interfaces.RealInput TEnvironment + annotation (Placement(transformation(extent={{-120,10},{-80,50}}), iconTransformation(extent={{-10,-10},{10,10}}, + rotation=90, + origin={-80,-100}))); + + Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a heatPort + "heatPort connection to water in condensor" + annotation (Placement(transformation(extent={{90,-10},{110,10}}))); + Modelica.Blocks.Tables.CombiTable2Ds P100(smoothness=Modelica.Blocks.Types.Smoothness.ContinuousDerivative, table=[0,-15,-10,-7,-2,2,7,12,18,30; 30,1.96,2.026,2.041,2.068,2.075,2.28, 2.289,2.277,2.277; 35,2.08,2.174,2.199,2.245,2.266,2.508,2.537,2.547, 2.547; 40,2.23,2.338,2.374,2.439,2.473,2.755,2.804,2.838,2.838; 45,2.39, 2.519,2.566,2.65,2.699,3.022,3.091,3.149,3.149; 50,2.56,2.718,2.777, 2.88,2.942,3.309,3.399,3.481,3.481]) - annotation (Placement(transformation(extent={{4,-14},{24,6}}))); + annotation (Placement(transformation(extent={{10,30},{30,50}}))); Modelica.Blocks.Tables.CombiTable2Ds P90(smoothness=Modelica.Blocks.Types.Smoothness.ContinuousDerivative, table=[0,-15,-10,-7,-2,2,7,12,18,30; 30,1.76,1.79,1.8,1.81,1.81,1.94,1.93, 1.9,1.9; 35,1.88,1.96,1.98,1.98,1.99,2.19,2.16,2.15,2.15; 40,2.01,2.11, 2.14,2.16,2.18,2.42,2.4,2.41,2.41; 45,2.16,2.28,2.32,2.39,2.39,2.66, 2.71,2.69,2.69; 50,2.32,2.46,2.51,2.6,2.61,2.92,2.99,3.05,3.05]) - annotation (Placement(transformation(extent={{4,-40},{24,-20}}))); + annotation (Placement(transformation(extent={{10,-10},{30,10}}))); Modelica.Blocks.Tables.CombiTable2Ds P50(smoothness=Modelica.Blocks.Types.Smoothness.ContinuousDerivative, table=[0,-15,-10,-7,-2,2,7,12,18,30; 30,1.14,1.11,1.09,1.02,0.98,0.98, 0.92,0.81,0.81; 35,1.26,1.24,1.22,1.16,1.12,1.14,1.09,0.98,0.98; 40, 1.39,1.39,1.37,1.35,1.28,1.36,1.28,1.21,1.21; 45,1.54,1.55,1.53,1.49, 1.46,1.52,1.49,1.38,1.38; 50,1.68,1.73,1.72,1.68,1.66,1.75,1.72,1.62, - 1.62]) annotation (Placement(transformation(extent={{4,-66},{24,-46}}))); + 1.62]) annotation (Placement(transformation(extent={{10,-50},{30,-30}}))); Modelica.Blocks.Tables.CombiTable2Ds P30(smoothness=Modelica.Blocks.Types.Smoothness.ContinuousDerivative, table=[0,-15,-10,-7,-2,2,7,12,18,30; 30,0.78,0.7,0.62,0.534,0.496,0.494, 0.416,0.388,0.388; 35,0.9,0.82,0.71,0.602,0.561,0.563,0.477,0.453,0.453; 40,1.04,0.97,0.88,0.696,0.65,0.653,0.552,0.531,0.531; 45,1.17,1.13,1.04, 0.86,0.774,0.773,0.646,0.625,0.625; 50,1.35,1.28,1.23,1.11,0.96,0.931, 0.765,0.739,0.739]) - annotation (Placement(transformation(extent={{4,-92},{24,-72}}))); + annotation (Placement(transformation(extent={{10,-90},{30,-70}}))); Modelica.Blocks.Tables.CombiTable2Ds Q100(smoothness=Modelica.Blocks.Types.Smoothness.ContinuousDerivative, table=[0,-15,-10,-7,-2,2,7,12,18,30; 30,4.82,5.576,6.023,6.892,7.642, 10.208,11.652,13.518,13.518; 35,4.59,5.279,5.685,6.484,7.177,9.578, 10.931,12.692,12.692; 40,4.43,5.056,5.43,6.174,6.824,9.1,10.386,12.072, 12.072; 45,4.32,4.906,5.255,5.957,6.576,8.765,10.008,11.647,11.647; 50, 4.27,4.824,5.155,5.828,6.426,8.564,9.786,11.408,11.408]) - annotation (Placement(transformation(extent={{42,-14},{62,6}}))); + annotation (Placement(transformation(extent={{50,30},{70,50}}))); Modelica.Blocks.Tables.CombiTable2Ds Q90(smoothness=Modelica.Blocks.Types.Smoothness.ContinuousDerivative, table=[0,-15,-10,-7,-2,2,7,12,18,30; 30,4.338,5.019,5.42,6.203,6.877, 9.188,10.486,12.166,12.166; 35,4.131,4.751,5.117,5.836,6.459,8.62,9.838, 11.423,11.423; 40,3.987,4.551,4.887,5.556,6.141,8.19,9.348,10.865, 10.865; 45,3.888,4.415,4.73,5.361,5.918,7.888,9.007,10.483,10.483; 50, 3.843,4.342,4.639,5.245,5.784,7.708,8.807,10.267,10.267]) - annotation (Placement(transformation(extent={{42,-40},{62,-20}}))); + annotation (Placement(transformation(extent={{50,-10},{70,10}}))); Modelica.Blocks.Tables.CombiTable2Ds Q50(smoothness=Modelica.Blocks.Types.Smoothness.ContinuousDerivative, table=[0,-15,-10,-7,-2,2,7,12,18,30; 30,2.41,2.788,3.011,3.446,3.821, 5.104,5.826,6.759,6.759; 35,2.295,2.639,2.843,3.242,3.589,4.789,5.466, 6.346,6.346; 40,2.215,2.528,2.715,3.087,3.412,4.55,5.193,6.036,6.036; 45,2.16,2.453,2.628,2.979,3.288,4.382,5.004,5.824,5.824; 50,2.135,2.412, 2.577,2.914,3.213,4.282,4.893,5.704,5.704]) - annotation (Placement(transformation(extent={{42,-66},{62,-46}}))); + annotation (Placement(transformation(extent={{50,-50},{70,-30}}))); Modelica.Blocks.Tables.CombiTable2Ds Q30(smoothness=Modelica.Blocks.Types.Smoothness.ContinuousDerivative, table=[0,-15,-10,-7,-2,2,7,12,18,30; 30,1.446,1.673,1.807,2.068,2.292, 3.063,3.495,4.055,4.055; 35,1.377,1.584,1.706,1.945,2.153,2.873,3.279, 3.808,3.808; 40,1.329,1.517,1.629,1.852,2.047,2.73,3.116,3.622,3.622; 45,1.296,1.472,1.577,1.787,1.973,2.629,3.002,3.494,3.494; 50,1.281, 1.447,1.546,1.748,1.928,2.569,2.936,3.422,3.422]) - annotation (Placement(transformation(extent={{42,-92},{62,-72}}))); - Modelica.Units.SI.HeatFlowRate QLossesToCompensate "Environment losses"; - Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a heatPort - "heatPort connection to water in condensor" - annotation (Placement(transformation(extent={{90,-10},{110,10}}))); - Controls.Discrete.HysteresisRelease_boolean - onOff( + annotation (Placement(transformation(extent={{50,-90},{70,-70}}))); + + Controls.Discrete.HysteresisRelease_boolean onOff( enableRelease=true, y(start=0), release(start=false)) - annotation (Placement(transformation(extent={{10,70},{30,90}}))); + annotation (Placement(transformation(extent={{-10,66},{10,86}}))); Modelica.Blocks.Sources.RealExpression realExpression(y=modulationInit) - annotation (Placement(transformation(extent={{-24,70},{-2,90}}))); + annotation (Placement(transformation(extent={{-53,86},{-31,106}}))); Modelica.Blocks.Sources.RealExpression realExpression1(y=modulation_start) - annotation (Placement(transformation(extent={{-50,64},{-26,84}}))); + annotation (Placement(transformation(extent={{-52,72},{-32,92}}))); Modelica.Blocks.Sources.RealExpression realExpression2(y=modulation_min) - annotation (Placement(transformation(extent={{-76,54},{-52,74}}))); - Modelica.Blocks.Interfaces.RealInput TCondensor_set annotation (Placement( - transformation(extent={{-120,-20},{-80,20}}), iconTransformation(extent={{-110, - -10},{-90,10}}))); - Modelica.Blocks.Interfaces.BooleanInput on annotation (Placement( - transformation(extent={{-120,20},{-80,60}}), iconTransformation(extent={{-110,20}, - {-90,40}}))); - Modelica.Blocks.Interfaces.RealInput TCondensor_in - "In-comming condensor temperature" annotation (Placement(transformation( - extent={{-120,-60},{-80,-20}}), iconTransformation( - extent={{-10,-10},{10,10}}, - rotation=90, - origin={-50,-100}))); - Modelica.Blocks.Interfaces.RealInput m_flowCondensor - "Condenor mass-flow rate" annotation (Placement(transformation( - extent={{-120,-100},{-80,-60}}),iconTransformation( - extent={{-10,-10},{10,10}}, - rotation=90, - origin={-20,-100}))); + annotation (Placement(transformation(extent={{-52,58},{-32,78}}))); + +protected + parameter Medium.ThermodynamicState sta_default = Medium.setState_pTX( + p=Medium.p_default, + T=Medium.T_default, + X=Medium.X_default[1:Medium.nXi]) + "Medium state at default properties"; + parameter Modelica.Units.SI.SpecificHeatCapacity cp_default = + Medium.specificHeatCapacityCp(sta_default) + "Specific heat capacity at default properties"; + equation - QAsked = IDEAS.Utilities.Math.Functions.smoothMax(0, m_flowCondensor*(Medium.specificEnthalpy(Medium.setState_pTX(Medium.p_default,TCondensor_set, Medium.X_default)) -hIn), 10); + QAsked = IDEAS.Utilities.Math.Functions.smoothMax(0, m_flowCondensor*cp_default*(TCondensor_set-TCondensor_in), 10); + + // Temperatures P100.u1 = heatPort.T - 273.15; P100.u2 = TEvaporator - 273.15; P90.u1 = heatPort.T - 273.15; @@ -161,7 +168,8 @@ equation Q50.u2 = TEvaporator - 273.15; Q30.u1 = heatPort.T - 273.15; Q30.u2 = TEvaporator - 273.15; - // all these are in kW + + // Heat and power flows; all these are in kW Q_vector[1] = 0; Q_vector[2] = Q30.y*QNom/QNomRef; Q_vector[3] = Q50.y*QNom/QNomRef; @@ -173,11 +181,17 @@ equation P_vector[4] = P90.y*QNom/QNomRef; P_vector[5] = P100.y*QNom/QNomRef; QMax = 1000*Q100.y*QNom/QNomRef; + + // Modulation degree modulationInit = QAsked/QMax*100; - modulation = onOff.y*IDEAS.Utilities.Math.Functions.smoothMin(modulationInit, 100,1); - // compensation of heat losses (only when the hp is operating) - QLossesToCompensate = if noEvent(modulation > 0) then UALoss*(heatPort.T - - TEnvironment) else 0; + if useMinMod then + modulation = onOff.y*IDEAS.Utilities.Math.Functions.smoothMin(modulationInit, 100,1); + else + modulation = IDEAS.Utilities.Math.Functions.smoothMin(modulationInit, 100,1); + end if; + + // Compensation of heat losses (only when the heat pump is operating) + QLossesToCompensate = if noEvent(modulation > 0) then UALoss*(heatPort.T - TEnvironment) else 0; heatPort.Q_flow = -1000*Modelica.Math.Vectors.interpolate( mod_vector, Q_vector, @@ -186,49 +200,27 @@ equation mod_vector, P_vector, modulation); + + // Others connect(realExpression.y, onOff.u) annotation (Line( - points={{-0.9,80},{8,80}}, + points={{-29.9,96},{-20,96},{-20,76},{-12,76}}, color={0,0,127}, smooth=Smooth.None)); connect(realExpression1.y, onOff.uHigh) annotation (Line( - points={{-24.8,74},{0,74},{0,76},{8,76}}, + points={{-31,82},{-24,82},{-24,72},{-12,72}}, color={0,0,127}, smooth=Smooth.None)); connect(realExpression2.y, onOff.uLow) annotation (Line( - points={{-50.8,64},{-24,64},{-24,64},{0,64},{0,72},{8,72}}, + points={{-31,68},{-12,68}}, color={0,0,127}, smooth=Smooth.None)); connect(on, onOff.release) annotation (Line( - points={{-100,40},{20,40},{20,68}}, + points={{-100,60},{0,60},{0,64}}, color={255,0,255}, smooth=Smooth.None)); annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-100, -100},{100,100}}), - graphics), Documentation(info=" -

Description

-

This model is based on data received from Daikin from an Altherma heat pump, and the full heat pump is implemented as IDEAS.Thermal.Components.Production.HP_AWMod_Losses. (vermoedelijk IDEAS.Thermal.Components.Production.HP_AirWater

-

The nominal power of the original heat pump is 7177 W at 2/35 degC.

-

First, the thermal power and electricity consumption are interpolated for the evaporator and condensing temperature at 4 different modulation levels.  The results are rescaled to the nominal power of the modelled heatpump (with QNom/QNom_data) and stored in 2 different vectors, Q_vector and P_vector.

-

Finally, the modulation is calculated based on the asked power and the max power at operating conditions: 

- -

If the heat pump is on another modulation level, interpolation is made to get P and Q at the real modulation.

-

ATTENTION

-

This model takes into account environmental heat losses of the heat pump.  In order to keep the same nominal efficiency during operation, these heat losses are added to the computed power.  Therefore, the heat losses are only really 'losses' when the heat pump is NOT operating. 

-

The COP is calculated as the heat delivered to the condensor divided by the electrical consumption (P).

-

Assumptions and limitations

-
    -
  1. Based on interpolation in manufacturer data for Daikin Altherma heat pump
  2. -
  3. Ensure not to operate the heat pump outside of the manufacturer data. No check is made if this happens, and this can lead to strange and wrong results.
  4. -
-

Model use

-

This model is used in the HP_AirWater model. If a different heat pump is to be simulated, copy this model and adapt the interpolation tables.

-

Validation

-

See the air-water heat pmp model.

-"), + graphics), Icon(coordinateSystem(preserveAspectRatio=false, extent={{-100,-100},{100,100}}), graphics={ Line( @@ -272,5 +264,80 @@ equation smooth=Smooth.None, fillColor={0,0,0}, fillPattern=FillPattern.Solid), - Rectangle(extent={{-100,100},{100,-100}}, lineColor={135,135,135})})); + Rectangle(extent={{-100,100},{100,-100}}, lineColor={135,135,135})}), +Documentation(info=" +

+Model description +

+

+This model is based on data received from Daikin from an Altherma heat pump, +and the full heat pump is implemented as +IDEAS.Fluid.HeatPumps.HP_AirWater_TSet. +

+The nominal power of the original heat pump is 7177 W at 2/35 degC. +

+

+First, the thermal power and electricity consumption are interpolated +for the evaporator and condensing temperature at 4 different modulation levels. +The results are rescaled to the nominal power of the modelled heat pump (with QNom/QNom_data) +and stored in 2 different vectors, Q_vector and P_vector. +

+

+Finally, the modulation is calculated based on the asked power and the max power at operating conditions: +

+

+

+If the heat pump is on another modulation level, interpolation is made to get P and Q at the real modulation. +

+

+This model takes into account environmental heat losses of the heat pump. +In order to keep the same nominal efficiency during operation, these heat losses are added to the computed power. +Therefore, the heat losses are only really 'losses' when the heat pump is NOT operating. +

+

+The COP is calculated as the heat delivered to the condensor divided by the electrical power consumption. +

+

+Assumptions and limitations +

+
    +
  1. +Based on interpolation in manufacturer data for Daikin Altherma heat pump +
  2. +
  3. +Ensure not to operate the heat pump outside of the manufacturer data. +No check is made if this happens, and this can lead to strange and wrong results. +
  4. +
+

+Model use +

+

+This model is used in the IDEAS.Fluid.HeatPumps.HP_AirWater_TSet model. +If a different heat pump is to be simulated, copy this model and adapt the interpolation tables. +

+

+", revisions=" + +")); end HeatSource_HP_AW; diff --git a/IDEAS/Fluid/HeatPumps/BaseClasses/HeatSource_HP_AW2.mo b/IDEAS/Fluid/HeatPumps/BaseClasses/HeatSource_HP_AW2.mo deleted file mode 100644 index f579131784..0000000000 --- a/IDEAS/Fluid/HeatPumps/BaseClasses/HeatSource_HP_AW2.mo +++ /dev/null @@ -1,249 +0,0 @@ -within IDEAS.Fluid.HeatPumps.BaseClasses; -model HeatSource_HP_AW2 - "Computation of theoretical condensation power of the refrigerant based on interpolation data. Takes into account losses of the heat pump to the environment" - //fixme: adaptation of heatSource_CondensingGasBurner should also be applied on this model. - /* - This model is based on data we received from Daikin from an Altherma heat pump. - The nominal power of the original heat pump is 7177W at 2/35degC - - First, the thermal power and electricity consumption are interpolated for the - evaporator and condensing temperature at 4 different modulation levels. The results - are rescaled to the nominal power of the modelled heatpump (with QNom/QNom_data) and - stored in 2 different vectors, Q_vector and P_vector. - - Finally, the modulation is calculated based on the asked power and the max power at - operating conditions: - - if modulation_init < modulation_min, the heat pump is OFF, modulation = 0. - - if modulation_init > 100%, the modulation is 100% - - if modulation_init between modulation_min and modulation_start: hysteresis for on/off cycling. - - If the heat pump is on another modulation, interpolation is made to get P and Q at the real modulation. - - ATTENTION - This model takes into account environmental heat losses of the heat pump (at condensor side). - In order to keep the same nominal COP's during operation of the heat pump, these heat losses are added - to the computed power. Therefore, the heat losses are only really 'losses' when the heat pump is - NOT operating. - - The COP is calculated as the heat delivered to the condensor divided by the electrical consumption (P). - - */ - //protected - replaceable package Medium = - Modelica.Media.Interfaces.PartialMedium "Medium in the component"; - final parameter Modelica.Units.SI.Power QNomRef=7177 - "Nominal power of the Daikin Altherma. See datafile"; - final parameter Real[5] mod_vector={0,30,50,90,100} "5 modulation steps, %"; - Real[5] Q_vector "Thermal power for 5 modulation steps, in kW"; - Real[5] P_vector "Electrical power for 5 modulation steps, in kW"; - Modelica.Units.SI.Power QMax - "Maximum thermal power at specified evap and condr temperatures, in W"; - Modelica.Units.SI.Power QAsked(start=0); - parameter Modelica.Units.SI.ThermalConductance UALoss - "UA of heat losses of HP to environment"; - parameter Modelica.Units.SI.Power QNom - "The power at nominal conditions (2/35)"; -public - parameter Real modulation_min(max=29) = 20 "Minimal modulation percentage"; - // dont' set this to 0 or very low values, you might get negative P at very low modulations because of wrong extrapolation - parameter Real modulation_start(min=min(30, modulation_min + 5)) = 35 - "Min estimated modulation level required for start of HP"; - Real modulationInit "Initial modulation, decides on start/stop of the HP"; - Real modulation(min=0, max=100) "Current modulation percentage"; - Modelica.Units.SI.Power PEl "Resulting electrical power"; - input Modelica.Units.SI.Temperature TEvaporator "Evaporator temperature"; - input Modelica.Units.SI.Temperature TEnvironment - "Temperature of environment for heat losses"; - input Modelica.Units.SI.SpecificEnthalpy hIn "Specific enthalpy at the inlet"; - Modelica.Blocks.Tables.CombiTable2Ds P100(smoothness=Modelica.Blocks.Types.Smoothness.ContinuousDerivative, - table=[0,-15,-10,-7,-2,2,7,12,18,30; 30,1.96,2.026,2.041,2.068,2.075,2.28, - 2.289,2.277,2.277; 35,2.08,2.174,2.199,2.245,2.266,2.508,2.537,2.547, - 2.547; 40,2.23,2.338,2.374,2.439,2.473,2.755,2.804,2.838,2.838; 45,2.39, - 2.519,2.566,2.65,2.699,3.022,3.091,3.149,3.149; 50,2.56,2.718,2.777, - 2.88,2.942,3.309,3.399,3.481,3.481]) - annotation (Placement(transformation(extent={{4,-14},{24,6}}))); - Modelica.Blocks.Tables.CombiTable2Ds P90(smoothness=Modelica.Blocks.Types.Smoothness.ContinuousDerivative, - table=[0,-15,-10,-7,-2,2,7,12,18,30; 30,1.76,1.79,1.8,1.81,1.81,1.94,1.93, - 1.9,1.9; 35,1.88,1.96,1.98,1.98,1.99,2.19,2.16,2.15,2.15; 40,2.01,2.11, - 2.14,2.16,2.18,2.42,2.4,2.41,2.41; 45,2.16,2.28,2.32,2.39,2.39,2.66, - 2.71,2.69,2.69; 50,2.32,2.46,2.51,2.6,2.61,2.92,2.99,3.05,3.05]) - annotation (Placement(transformation(extent={{4,-40},{24,-20}}))); - Modelica.Blocks.Tables.CombiTable2Ds P50(smoothness=Modelica.Blocks.Types.Smoothness.ContinuousDerivative, - table=[0,-15,-10,-7,-2,2,7,12,18,30; 30,1.14,1.11,1.09,1.02,0.98,0.98, - 0.92,0.81,0.81; 35,1.26,1.24,1.22,1.16,1.12,1.14,1.09,0.98,0.98; 40, - 1.39,1.39,1.37,1.35,1.28,1.36,1.28,1.21,1.21; 45,1.54,1.55,1.53,1.49, - 1.46,1.52,1.49,1.38,1.38; 50,1.68,1.73,1.72,1.68,1.66,1.75,1.72,1.62, - 1.62]) annotation (Placement(transformation(extent={{4,-66},{24,-46}}))); - Modelica.Blocks.Tables.CombiTable2Ds P30(smoothness=Modelica.Blocks.Types.Smoothness.ContinuousDerivative, - table=[0,-15,-10,-7,-2,2,7,12,18,30; 30,0.78,0.7,0.62,0.534,0.496,0.494, - 0.416,0.388,0.388; 35,0.9,0.82,0.71,0.602,0.561,0.563,0.477,0.453,0.453; - 40,1.04,0.97,0.88,0.696,0.65,0.653,0.552,0.531,0.531; 45,1.17,1.13,1.04, - 0.86,0.774,0.773,0.646,0.625,0.625; 50,1.35,1.28,1.23,1.11,0.96,0.931, - 0.765,0.739,0.739]) - annotation (Placement(transformation(extent={{4,-92},{24,-72}}))); - Modelica.Blocks.Tables.CombiTable2Ds Q100(smoothness=Modelica.Blocks.Types.Smoothness.ContinuousDerivative, - table=[0,-15,-10,-7,-2,2,7,12,18,30; 30,4.82,5.576,6.023,6.892,7.642, - 10.208,11.652,13.518,13.518; 35,4.59,5.279,5.685,6.484,7.177,9.578, - 10.931,12.692,12.692; 40,4.43,5.056,5.43,6.174,6.824,9.1,10.386,12.072, - 12.072; 45,4.32,4.906,5.255,5.957,6.576,8.765,10.008,11.647,11.647; 50, - 4.27,4.824,5.155,5.828,6.426,8.564,9.786,11.408,11.408]) - annotation (Placement(transformation(extent={{42,-14},{62,6}}))); - Modelica.Blocks.Tables.CombiTable2Ds Q90(smoothness=Modelica.Blocks.Types.Smoothness.ContinuousDerivative, - table=[0,-15,-10,-7,-2,2,7,12,18,30; 30,4.338,5.019,5.42,6.203,6.877, - 9.188,10.486,12.166,12.166; 35,4.131,4.751,5.117,5.836,6.459,8.62,9.838, - 11.423,11.423; 40,3.987,4.551,4.887,5.556,6.141,8.19,9.348,10.865, - 10.865; 45,3.888,4.415,4.73,5.361,5.918,7.888,9.007,10.483,10.483; 50, - 3.843,4.342,4.639,5.245,5.784,7.708,8.807,10.267,10.267]) - annotation (Placement(transformation(extent={{42,-40},{62,-20}}))); - Modelica.Blocks.Tables.CombiTable2Ds Q50(smoothness=Modelica.Blocks.Types.Smoothness.ContinuousDerivative, - table=[0,-15,-10,-7,-2,2,7,12,18,30; 30,2.41,2.788,3.011,3.446,3.821, - 5.104,5.826,6.759,6.759; 35,2.295,2.639,2.843,3.242,3.589,4.789,5.466, - 6.346,6.346; 40,2.215,2.528,2.715,3.087,3.412,4.55,5.193,6.036,6.036; - 45,2.16,2.453,2.628,2.979,3.288,4.382,5.004,5.824,5.824; 50,2.135,2.412, - 2.577,2.914,3.213,4.282,4.893,5.704,5.704]) - annotation (Placement(transformation(extent={{42,-66},{62,-46}}))); - Modelica.Blocks.Tables.CombiTable2Ds Q30(smoothness=Modelica.Blocks.Types.Smoothness.ContinuousDerivative, - table=[0,-15,-10,-7,-2,2,7,12,18,30; 30,1.446,1.673,1.807,2.068,2.292, - 3.063,3.495,4.055,4.055; 35,1.377,1.584,1.706,1.945,2.153,2.873,3.279, - 3.808,3.808; 40,1.329,1.517,1.629,1.852,2.047,2.73,3.116,3.622,3.622; - 45,1.296,1.472,1.577,1.787,1.973,2.629,3.002,3.494,3.494; 50,1.281, - 1.447,1.546,1.748,1.928,2.569,2.936,3.422,3.422]) - annotation (Placement(transformation(extent={{42,-92},{62,-72}}))); - Modelica.Units.SI.HeatFlowRate QLossesToCompensate "Environment losses"; - Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_a heatPort - "heatPort connection to water in condensor" - annotation (Placement(transformation(extent={{90,-10},{110,10}}))); - Modelica.Blocks.Interfaces.RealInput TCondensor_set annotation (Placement( - transformation(extent={{-120,-20},{-80,20}}), iconTransformation(extent={{-110, - -10},{-90,10}}))); - Modelica.Blocks.Interfaces.BooleanInput on annotation (Placement( - transformation(extent={{-120,20},{-80,60}}), iconTransformation(extent={{-110,20}, - {-90,40}}))); - Modelica.Blocks.Interfaces.RealInput TCondensor_in - "In-comming condensor temperature" annotation (Placement(transformation( - extent={{-120,-60},{-80,-20}}), iconTransformation( - extent={{-10,-10},{10,10}}, - rotation=90, - origin={-50,-100}))); - Modelica.Blocks.Interfaces.RealInput m_flowCondensor - "Condenor mass-flow rate" annotation (Placement(transformation( - extent={{-120,-100},{-80,-60}}),iconTransformation( - extent={{-10,-10},{10,10}}, - rotation=90, - origin={-20,-100}))); -equation - - QAsked = IDEAS.Utilities.Math.Functions.smoothMax(0, m_flowCondensor*(Medium.specificEnthalpy(Medium.setState_pTX(Medium.p_default,TCondensor_set, Medium.X_default)) -hIn), 10); - P100.u1 = heatPort.T - 273.15; - P100.u2 = TEvaporator - 273.15; - P90.u1 = heatPort.T - 273.15; - P90.u2 = TEvaporator - 273.15; - P50.u1 = heatPort.T - 273.15; - P50.u2 = TEvaporator - 273.15; - P30.u1 = heatPort.T - 273.15; - P30.u2 = TEvaporator - 273.15; - Q100.u1 = heatPort.T - 273.15; - Q100.u2 = TEvaporator - 273.15; - Q90.u1 = heatPort.T - 273.15; - Q90.u2 = TEvaporator - 273.15; - Q50.u1 = heatPort.T - 273.15; - Q50.u2 = TEvaporator - 273.15; - Q30.u1 = heatPort.T - 273.15; - Q30.u2 = TEvaporator - 273.15; - // all these are in kW - Q_vector[1] = 0; - Q_vector[2] = Q30.y*QNom/QNomRef; - Q_vector[3] = Q50.y*QNom/QNomRef; - Q_vector[4] = Q90.y*QNom/QNomRef; - Q_vector[5] = Q100.y*QNom/QNomRef; - P_vector[1] = 0; - P_vector[2] = P30.y*QNom/QNomRef; - P_vector[3] = P50.y*QNom/QNomRef; - P_vector[4] = P90.y*QNom/QNomRef; - P_vector[5] = P100.y*QNom/QNomRef; - QMax = 1000*Q100.y*QNom/QNomRef; - modulationInit = QAsked/QMax*100; - modulation = IDEAS.Utilities.Math.Functions.smoothMin(modulationInit, 100,1); - // compensation of heat losses (only when the hp is operating) - QLossesToCompensate = if noEvent(modulation > 0) then UALoss*(heatPort.T - - TEnvironment) else 0; - heatPort.Q_flow = -1000*Modelica.Math.Vectors.interpolate( - mod_vector, - Q_vector, - modulation) - QLossesToCompensate; - PEl = 1000*Modelica.Math.Vectors.interpolate( - mod_vector, - P_vector, - modulation); - annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-100, - -100},{100,100}}), - graphics), Documentation(info=" -

Description

-

This model is based on data received from Daikin from an Altherma heat pump, and the full heat pump is implemented as IDEAS.Thermal.Components.Production.HP_AWMod_Losses. (vermoedelijk IDEAS.Thermal.Components.Production.HP_AirWater

-

The nominal power of the original heat pump is 7177 W at 2/35 degC.

-

First, the thermal power and electricity consumption are interpolated for the evaporator and condensing temperature at 4 different modulation levels.  The results are rescaled to the nominal power of the modelled heatpump (with QNom/QNom_data) and stored in 2 different vectors, Q_vector and P_vector.

-

Finally, the modulation is calculated based on the asked power and the max power at operating conditions: 

- -

If the heat pump is on another modulation level, interpolation is made to get P and Q at the real modulation.

-

ATTENTION

-

This model takes into account environmental heat losses of the heat pump.  In order to keep the same nominal efficiency during operation, these heat losses are added to the computed power.  Therefore, the heat losses are only really 'losses' when the heat pump is NOT operating. 

-

The COP is calculated as the heat delivered to the condensor divided by the electrical consumption (P).

-

Assumptions and limitations

-
    -
  1. Based on interpolation in manufacturer data for Daikin Altherma heat pump
  2. -
  3. Ensure not to operate the heat pump outside of the manufacturer data. No check is made if this happens, and this can lead to strange and wrong results.
  4. -
-

Model use

-

This model is used in the HP_AirWater model. If a different heat pump is to be simulated, copy this model and adapt the interpolation tables.

-

Validation

-

See the air-water heat pmp model.

-"), - Icon(coordinateSystem(preserveAspectRatio=false, extent={{-100,-100},{100,100}}), - graphics={ - Line( - points={{-70,-20},{30,-20}}, - color={191,0,0}, - thickness=0.5), - Line( - points={{-70,20},{30,20}}, - color={191,0,0}, - thickness=0.5), - Line( - points={{-90,0},{-70,-20}}, - color={191,0,0}, - thickness=0.5), - Line( - points={{-90,0},{-70,20}}, - color={191,0,0}, - thickness=0.5), - Polygon( - points={{30,0},{30,40},{60,20},{30,0}}, - lineColor={191,0,0}, - fillColor={191,0,0}, - fillPattern=FillPattern.Solid), - Polygon( - points={{30,-40},{30,0},{60,-20},{30,-40}}, - lineColor={191,0,0}, - fillColor={191,0,0}, - fillPattern=FillPattern.Solid), - Rectangle( - extent={{60,40},{80,-40}}, - lineColor={191,0,0}, - fillColor={191,0,0}, - fillPattern=FillPattern.Solid), - Line( - points={{-70,-40},{30,60}}, - color={0,0,0}, - smooth=Smooth.None), - Polygon( - points={{24,74},{44,54},{40,50},{20,70},{24,74}}, - lineColor={0,0,0}, - smooth=Smooth.None, - fillColor={0,0,0}, - fillPattern=FillPattern.Solid), - Rectangle(extent={{-100,100},{100,-100}}, lineColor={135,135,135})})); -end HeatSource_HP_AW2; diff --git a/IDEAS/Fluid/HeatPumps/BaseClasses/package.order b/IDEAS/Fluid/HeatPumps/BaseClasses/package.order index ebc14caab9..1ddace48ab 100644 --- a/IDEAS/Fluid/HeatPumps/BaseClasses/package.order +++ b/IDEAS/Fluid/HeatPumps/BaseClasses/package.order @@ -1,6 +1,4 @@ -HeatSource_CondensingGasBurner HeatSource_HP_AW -HeatSource_HP_AW2 PartialHeatPump PartialWaterToWater HeatPumpData diff --git a/IDEAS/Fluid/HeatPumps/Deprecated.mo b/IDEAS/Fluid/HeatPumps/Deprecated.mo deleted file mode 100644 index c064dd5267..0000000000 --- a/IDEAS/Fluid/HeatPumps/Deprecated.mo +++ /dev/null @@ -1,116 +0,0 @@ -within IDEAS.Fluid.HeatPumps; -package Deprecated "Deprecated models" - extends Modelica.Icons.ObsoleteModel; - model Boiler - "Modulating boiler with losses to environment, based on performance tables" - extends IDEAS.Fluid.HeatPumps.Interfaces.PartialDynamicHeaterWithLosses( - final heaterType=BaseClasses.HeaterType.Boiler); - - Real eta "Instanteanous efficiency"; - - IDEAS.Fluid.HeatPumps.BaseClasses.HeatSource_CondensingGasBurner heatSource( - QNom=QNom, - TBoilerSet=TSet, - TEnvironment=heatPort.T, - UALoss=UALoss, - modulationMin=modulationMin, - modulationStart=modulationStart, - THxIn=Tin.T, - hIn=inStream(port_a.h_outflow), - m_flowHx=port_a.m_flow, - redeclare package Medium = Medium) - annotation (Placement(transformation(extent={{-80,20},{-60,40}}))); - parameter Real modulationMin=25 "Minimal modulation percentage"; - parameter Real modulationStart=35 - "Min estimated modulation level required for start of HP"; - equation - // Electricity consumption for electronics and fan only. Pump is covered by pumpHeater; - // This data is taken from Viessmann VitoDens 300W, smallest model. So only valid for - // very small household condensing gas boilers. - PEl = 7 + heatSource.modulation/100*(33 - 7); - PFuel = heatSource.PFuel; - eta = heatSource.eta; - connect(heatSource.heatPort, vol.heatPort) annotation (Line( - points={{-60,30},{40,30},{40,-20}}, - color={191,0,0}, - smooth=Smooth.None)); - annotation ( - Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-100,-100},{100, - 120}}), - graphics), - Icon(graphics={ - Ellipse( - extent={{-60,60},{58,-60}}, - lineColor={0,0,0}, - fillPattern=FillPattern.Solid, - fillColor={95,95,95}), - Ellipse(extent={{-48,46},{46,-46}}, lineColor={0,0,0}, - fillColor={175,175,175}, - fillPattern=FillPattern.Solid), - Line( - points={{-32,34},{30,-34}}, - color={0,0,0}, - smooth=Smooth.None), - Line( - points={{100,60},{44,60}}, - color={0,0,127}, - smooth=Smooth.None), - Line( - points={{44,60},{34,48}}, - color={0,0,127}, - smooth=Smooth.None), - Line( - points={{44,-60},{34,-48}}, - color={0,0,127}, - smooth=Smooth.None, - pattern=LinePattern.Dash), - Line( - points={{100,-60},{44,-60}}, - color={0,0,127}, - smooth=Smooth.None, - pattern=LinePattern.Dash)}), - Documentation(info=" -

-This model is deprecated since it is not sufficiently generic. -Consider using a different model such as -Heater_T. -

-

Description

-

Dynamic boiler model, based on interpolation in performance tables. The boiler has thermal losses to the environment which are often not mentioned in the performance tables. Therefore, the additional environmental heat losses are added to the heat production in order to ensure the same performance as in the manufacturers data, while still obtaining a dynamic model with heat losses (also when boiler is off). The heatSource will compute the required power and the environmental heat losses, and try to reach the set point.

-

See IDEAS.Thermal.Components.Production.Interfaces.PartialDynamicHeaterWithLosses for more details about the heat losses and dynamics.

-

Assumptions and limitations

-
    -
  1. Dynamic model based on water content and lumped dry capacity
  2. -
  3. Limited power (based on QNom and interpolation tables in heatSource)
  4. -
  5. Heat losses to environment which are compensated 'artifically' to meet the manufacturers data in steady state conditions
  6. -
  7. No enforced min on or min off time; Hysteresis on start/stop thanks to different parameters for minimum modulation to start and stop the heat pump
  8. -
-

Model use

-

This model is based on performance tables of a specific boiler, as specified by IDEAS.Thermal.Components.Production.BaseClasses.HeatSource_CondensingGasBurner. If a different gas boiler is to be simulated, create a different Burner model with adapted interpolation tables.

-
    -
  1. Specify medium and initial temperature (of the water + dry mass)
  2. -
  3. Specify the nominal power
  4. -
  5. Specify the minimum required modulation level for the boiler to start (modulation_start) and the minimum modulation level when the boiler is operating (modulation_min). The difference between both will ensure some off-time in case of low heat demands
  6. -
  7. Connect TSet, the flowPorts and the heatPort to environment.
  8. -
-

See also IDEAS.Thermal.Components.Production.Interfaces.PartialDynamicHeaterWithLosses for more details about the heat losses and dynamics.

-

Validation

-

The model has been verified in order to check if the 'artificial' heat loss compensation still leads to correct steady state efficiencies according to the manufacturer data. This verification is integrated in the example model IDEAS.Thermal.Components.Examples.Boiler_validation.

-

Example

-

See validation.

-", revisions=" - -")); - end Boiler; - annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram( - coordinateSystem(preserveAspectRatio=false))); -end Deprecated; diff --git a/IDEAS/Fluid/HeatPumps/Examples/HeatPump_AirWater.mo b/IDEAS/Fluid/HeatPumps/Examples/HeatPump_AirWater.mo index e1dffa3631..1de4dd9f4c 100644 --- a/IDEAS/Fluid/HeatPumps/Examples/HeatPump_AirWater.mo +++ b/IDEAS/Fluid/HeatPumps/Examples/HeatPump_AirWater.mo @@ -2,29 +2,34 @@ within IDEAS.Fluid.HeatPumps.Examples; model HeatPump_AirWater "General example and tester for a modulating air-to-water heat pump" extends Modelica.Icons.Example; - package Medium = Modelica.Media.Water.ConstantPropertyLiquidWater - annotation (choicesAllMatching=true); - IDEAS.Fluid.Movers.FlowControlled_m_flow pump( + package Medium = IDEAS.Media.Water; + + inner BoundaryConditions.SimInfoManager sim + annotation (Placement(transformation(extent={{-100,80},{-80,100}}))); + + parameter Modelica.Units.SI.MassFlowRate m_flow_nominal=0.2 + "Nominal mass flow rate"; + + IDEAS.Fluid.Movers.FlowControlled_m_flow pump( redeclare package Medium = Medium, tau=30, use_riseTime=false, m_flow_nominal=m_flow_nominal, inputType=IDEAS.Fluid.Types.InputType.Constant, energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState) - annotation (Placement(transformation(extent={{-14,-24},{-34,-4}}))); - HP_AirWater_TSet heater( + annotation (Placement(transformation(extent={{-10,-30},{-30,-10}}))); + IDEAS.Fluid.HeatPumps.HP_AirWater_TSet heaPum( + redeclare package Medium = Medium, + energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, tauHeatLoss=3600, - cDry=10000, + CDry=10000, mWater=4, QNom=12000, - redeclare package Medium = Medium, m_flow_nominal=m_flow_nominal) - annotation (Placement(transformation(extent={{-74,14},{-56,34}}))); - Modelica.Thermal.HeatTransfer.Sources.FixedTemperature fixedTemperature(T= - 293.15) + annotation (Placement(transformation(extent={{-80,20},{-60,40}}))); + Modelica.Thermal.HeatTransfer.Sources.FixedTemperature fixedTemperature(T=293.15) annotation (Placement(transformation(extent={{-94,-20},{-80,-6}}))); - Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature TReturn annotation (Placement(transformation(extent={{-60,-60},{-40,-40}}))); Modelica.Blocks.Sources.Sine sine( @@ -33,55 +38,61 @@ model HeatPump_AirWater amplitude=4, offset=273.15 + 30) annotation (Placement(transformation(extent={{-100,-60},{-80,-40}}))); - Sources.Boundary_pT bou( redeclare package Medium = Medium, + Sources.Boundary_pT bou( + redeclare package Medium = Medium, p=200000, nPorts=1) annotation (Placement(transformation(extent={{40,-20},{20,0}}))); - constant Modelica.Units.SI.MassFlowRate m_flow_nominal=0.2 - "Nominal mass flow rate"; - inner BoundaryConditions.SimInfoManager - sim - annotation (Placement(transformation(extent={{-100,80},{-80,100}}))); Modelica.Blocks.Sources.Constant Tset(k=273.15 + 35) "Temperature set point" - annotation (Placement(transformation(extent={{-22,44},{-42,64}}))); -equation + annotation (Placement(transformation(extent={{-40,50},{-60,70}}))); - connect(heater.heatPort, fixedTemperature.port) annotation (Line( - points={{-65,14},{-70,14},{-70,-12},{-76,-12},{-76,-13},{-80,-13}}, +equation + connect(heaPum.heatPort, fixedTemperature.port) annotation (Line( + points={{-70,20},{-70,-13},{-80,-13}}, color={191,0,0}, smooth=Smooth.None)); connect(sine.y, TReturn.T) annotation (Line( points={{-79,-50},{-62,-50}}, color={0,0,127}, smooth=Smooth.None)); - connect(pump.port_b, heater.port_a) annotation (Line( - points={{-34,-14},{-56,-14},{-56,18}}, + connect(pump.port_b,heaPum. port_a) annotation (Line( + points={{-30,-20},{-60,-20},{-60,24}}, color={0,0,255}, smooth=Smooth.None)); - connect(Tset.y, heater.TSet) annotation (Line(points={{-43,54},{-70.4,54},{-70.4, - 36}}, color={0,0,127})); - connect(pump.port_a, heater.port_b) annotation (Line(points={{-14,-14},{12, - -14},{12,30},{-56,30}}, color={0,127,255})); - connect(bou.ports[1], pump.port_a) annotation (Line(points={{20,-10},{4,-10}, - {4,-14},{-14,-14}}, color={0,127,255})); - connect(TReturn.port, pump.heatPort) annotation (Line(points={{-40,-50},{-24, - -50},{-24,-20.8}}, color={191,0,0})); + connect(Tset.y,heaPum. TSet) annotation (Line(points={{-61,60},{-76,60},{-76,42}}, + color={0,0,127})); + connect(pump.port_a,heaPum. port_b) annotation (Line(points={{-10,-20},{10,-20},{10,36},{-60,36}}, + color={0,127,255})); + connect(bou.ports[1], pump.port_a) annotation (Line(points={{20,-10},{10,-10},{10,-20},{-10,-20}}, + color={0,127,255})); + connect(TReturn.port, pump.heatPort) annotation (Line(points={{-40,-50},{-20,-50},{-20,-26.8}}, + color={191,0,0})); annotation ( Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-100,-100},{100, 100}})), experiment(StopTime=15000, Tolerance=1e-06), __Dymola_experimentSetupOutput, Icon(coordinateSystem(preserveAspectRatio=true, extent={{-100,-100},{100, - 100}})), - Commands(file= + 100}})), + __Dymola_Commands(file= "Resources/Scripts/Dymola/Fluid/HeatPumps/Examples/HeatPump_AirWater.mos" "Simulate and plot"), Documentation(info=" -

This example shows the modulation behaviour of an inverter controlled air-to-water heat pump when the inlet water temperature is changed.

-

The modulation level can be seen from heater.heatSource.modulation.

+

+This example shows the modulation behaviour of +an inverter controlled air-to-water heat pump when the inlet water temperature is changed. +

+

+The modulation level can be seen from heaPum.heatSource.modulation. +

", revisions="