diff --git a/AixLib/Controls/Interfaces/BoilerControlBus.mo b/AixLib/Controls/Interfaces/BoilerControlBus.mo index c2cf95dd2d..b7e993ffcf 100644 --- a/AixLib/Controls/Interfaces/BoilerControlBus.mo +++ b/AixLib/Controls/Interfaces/BoilerControlBus.mo @@ -6,8 +6,18 @@ expandable connector BoilerControlBus Boolean isOn "Switches Controller on and off"; Modelica.SIunits.Temperature TAmbient "Ambient air temperature"; Boolean switchToNightMode "Switches the boiler to night mode"; -Modelica.SIunits.Power chemicalEnergyFlowRate - "Flow of primary (chemical) energy into boiler"; +Modelica.SIunits.Power chemicalEnergyFlowRate "Flow of primary (chemical) energy into boiler"; + + +// BoilerNotManufacturer +Real PLR "Part load ratio"; +Modelica.SIunits.TemperatureDifference DeltaTWater "Setpoint temperature difference heat circuit"; +Modelica.SIunits.Temperature TCold "Sensor output TCold"; +Modelica.SIunits.Temperature THot "Sensor output THot"; +Modelica.SIunits.Power EnergyDemand "Energy Demand"; + + + annotation ( Icon(coordinateSystem(preserveAspectRatio=false)), diff --git a/AixLib/Controls/Interfaces/CHPControlBus.mo b/AixLib/Controls/Interfaces/CHPControlBus.mo index ebb21286d0..99a8abe3e2 100644 --- a/AixLib/Controls/Interfaces/CHPControlBus.mo +++ b/AixLib/Controls/Interfaces/CHPControlBus.mo @@ -148,6 +148,19 @@ expandable connector CHPControlBus "= false to use a prescibed heating circuit mass flow, = true to use a prescribed volume flow" annotation (Dialog(tab="Operation point", group="CHP Unit")); + // Definition of variables describing CHPNotManufacturer + // + Real PLR "Partload ratio of electric Power"; + Modelica.SIunits.Energy ElectricEnergy + "Produced electric energy" + annotation(Dialog(tab="NotManufacturer")); + Modelica.SIunits.Energy EnergyConsumption + "Energy consumption" + annotation(Dialog(tab="NotManufacturer")); + Modelica.SIunits.Temperature TVolume + "temperature cooling water exhaust heat exchanger exit"; +Modelica.SIunits.Temperature TCold "Sensor output TCold"; +Modelica.SIunits.Temperature THot "Sensor output THot"; annotation (Documentation(revisions="
According to manufacturer's data which was inter- and extrapolated linearly; EN14511
-")); - end AlphaInnotec_LW80MA; - - record Dimplex_LA11AS "Dimplex LA 11 AS" - extends - AixLib.DataBase.ThermalMachines.HeatPump.HeatPumpBaseDataDefinition( - tableP_ele=[0,-7,2,7,10; 35,2444,2839,3139,3103; 45,2783,2974,3097, - 3013], - tableQdot_con=[0,-7,2,7,10; 35,6600,8800,11300,12100; 45,6400,7898, - 9600,10145], - mFlow_conNom=11300/4180/5, - mFlow_evaNom=1, - tableUppBou=[-25,58; 35,58], - tableLowBou=[-25,18; 35,18]); - - annotation(preferedView="text", DymolaStoredErrors, - Icon, - Documentation(revisions=" -According to data from Dimplex data sheets; EN14511
-")); - end Dimplex_LA11AS; - - record Ochsner_GMLW_19 "Ochsner GMLW 19" - extends - AixLib.DataBase.ThermalMachines.HeatPump.HeatPumpBaseDataDefinition( - tableP_ele=[0,-10,2,7; 35,4300,4400,4600; 50,6300,6400,6600], - tableQdot_con=[0,-10,2,7; 35,11600,17000,20200; 50,10200,15600,18800], - mFlow_conNom=20200/4180/5, - mFlow_evaNom=1, - tableUppBou=[-15,55; 40,55], - tableLowBou=[-15,0; 40,0]); - - annotation(preferedView="text", DymolaStoredErrors, - Icon, - Documentation(revisions=" -According to data from Ochsner data sheets; EN14511
-")); - end Ochsner_GMLW_19; - - record Ochsner_GMLW_19plus "Ochsner GMLW 19 plus" - extends - AixLib.DataBase.ThermalMachines.HeatPump.HeatPumpBaseDataDefinition( - tableP_ele=[0,-10,2,7; 35,4100,4300,4400; 50,5500,5700,5800; 60,6300, - 6500,6600], - tableQdot_con=[0,-10,2,7; 35,12600,16800,19800; 50,11700,15900,18900; - 60,11400,15600,18600], - mFlow_conNom=19800/4180/5, - mFlow_evaNom=1, - tableUppBou=[-24,52; -15,55; -10,65; 40,65], - tableLowBou=[-24,0; 40,0]); - - annotation(preferedView="text", DymolaStoredErrors, - Icon, - Documentation(revisions=" -According to data from Ochsner data sheets; EN14511
-")); - end Ochsner_GMLW_19plus; - - record Ochsner_GMSW_15plus "Ochsner GMSW 15 plus" - extends - AixLib.DataBase.ThermalMachines.HeatPump.HeatPumpBaseDataDefinition( - tableP_ele=[0,-5,0,5; 35,3225,3300,3300; 45,4000,4000,4000; 55,4825, - 4900,4900], - tableQdot_con=[0,-5,0,5; 35,12762,14500,16100; 45,12100,13900,15600; - 55,11513,13200,14900], - mFlow_conNom=14500/4180/5, - mFlow_evaNom=(14500 - 3300)/3600/3, - tableUppBou=[-8,52; 0,65; 20,65], - tableLowBou=[-8,10; 20,27]); - - annotation(preferedView="text", DymolaStoredErrors, - Icon, - Documentation(revisions=" -According to data from WPZ Buchs, Swiss; EN14511
-")); - end Ochsner_GMSW_15plus; - - record StiebelEltron_WPL18 "Stiebel Eltron WPL 18" - extends - AixLib.DataBase.ThermalMachines.HeatPump.HeatPumpBaseDataDefinition( - tableP_ele=[0,-7,2,7,10,20; 35,3300,3400,3500,3700,3800; 50,4500,4400, - 4600,5000,5100], - tableQdot_con=[0,-7,2,7,10,20; 35,9700,11600,13000,14800,16300; 50, - 10000,11200,12900,16700,17500], - mFlow_conNom=13000/4180/5, - mFlow_evaNom=1, - tableUppBou=[-25,65; 40,65], - tableLowBou=[-25,0; 40,0]); - //These boundary-tables are not from the datasheet but default values. - - annotation(preferedView="text", DymolaStoredErrors, - Icon, - Documentation(revisions=" -According to data from WPZ Buchs, Swiss; EN14511
-")); - end StiebelEltron_WPL18; - - record Vaillant_VWL_101 "Vaillant VWL10-1" - extends - AixLib.DataBase.ThermalMachines.HeatPump.HeatPumpBaseDataDefinition( - tableP_ele=[0,-15,-7,2,7; 35,2138,2177,2444,2444; 45,2558,2673,2864, - 3055; 55,2902,3131,3360,3513], - tableQdot_con=[0,-15,-7,2,7; 35,5842,7523,9776,10807; 45,5842,7332, - 9050,10387; 55,5728,7179,9050,10043], - mFlow_conNom=9776/4180/5, - mFlow_evaNom=1, - tableUppBou=[-25,65; 40,65], - tableLowBou=[-25,0; 40,0]); - //These boundary-tables are not from the datasheet but default values. - - annotation(preferedView="text", DymolaStoredErrors, - Icon, - Documentation(revisions=" -According to data from Vaillant data sheets; EN14511
-")); - end Vaillant_VWL_101; - - record Vitocal200AWO201 - "Vitocal200AWO201" - extends - AixLib.DataBase.ThermalMachines.HeatPump.HeatPumpBaseDataDefinition( - tableP_ele=[0,-15,-7,2,7,10,20,30; 35,1290.0,1310.0,730.0,870.0,850.0, - 830.0,780.0; 45,1550.0,1600.0,870.0,1110.0,1090.0,1080.0,1040.0; - 55,1870.0,1940.0,1170.0,1370.0,1370.0,1370.0,1350.0], - tableQdot_con=[0,-15,-7,2,7,10,20,30; 35,3020,3810,2610,3960,4340, - 5350,6610; 45,3020,3780,2220,3870,4120,5110,6310; 55,3120,3790, - 2430,3610,3910,4850,6000], - mFlow_conNom=3960/4180/5, - mFlow_evaNom=(2250*1.2)/3600, - tableUppBou=[-20,50; -10,60; 30,60; 35,55], - tableLowBou=[-20,25; 25,25; 35,35]); - - annotation ( - Icon(coordinateSystem(preserveAspectRatio=false)), - Diagram(coordinateSystem(preserveAspectRatio=false)), - Documentation(info=" -Data record for type AWO-M/AWO-M-E-AC 201.A04, obtained from the technical guide in the UK.
-", revisions=" -According to manufacturer's data which was inter- and extrapolated linearly; EN14511
+")); +end AlphaInnotec_LW80MA; diff --git a/AixLib/DataBase/ThermalMachines/HeatPump/EN14511/Dimplex_LA11AS.mo b/AixLib/DataBase/ThermalMachines/HeatPump/EN14511/Dimplex_LA11AS.mo new file mode 100644 index 0000000000..b4c1b6add7 --- /dev/null +++ b/AixLib/DataBase/ThermalMachines/HeatPump/EN14511/Dimplex_LA11AS.mo @@ -0,0 +1,23 @@ +within AixLib.DataBase.ThermalMachines.HeatPump.EN14511; +record Dimplex_LA11AS "Dimplex LA 11 AS" + extends + AixLib.DataBase.ThermalMachines.HeatPump.HeatPumpBaseDataDefinition( + tableP_ele=[0,-7,2,7,10; 35,2444,2839,3139,3103; 45,2783,2974,3097, + 3013], + tableQdot_con=[0,-7,2,7,10; 35,6600,8800,11300,12100; 45,6400,7898, + 9600,10145], + mFlow_conNom=11300/4180/5, + mFlow_evaNom=1, + tableUppBou=[-25,58; 35,58], + tableLowBou=[-25,18; 35,18]); + + annotation(preferedView="text", DymolaStoredErrors, + Icon, + Documentation(revisions=" +According to data from Dimplex data sheets; EN14511
+")); +end Dimplex_LA11AS; diff --git a/AixLib/DataBase/ThermalMachines/HeatPump/EN14511/Ochsner_GMLW_19.mo b/AixLib/DataBase/ThermalMachines/HeatPump/EN14511/Ochsner_GMLW_19.mo new file mode 100644 index 0000000000..e7b5e398b8 --- /dev/null +++ b/AixLib/DataBase/ThermalMachines/HeatPump/EN14511/Ochsner_GMLW_19.mo @@ -0,0 +1,21 @@ +within AixLib.DataBase.ThermalMachines.HeatPump.EN14511; +record Ochsner_GMLW_19 "Ochsner GMLW 19" + extends + AixLib.DataBase.ThermalMachines.HeatPump.HeatPumpBaseDataDefinition( + tableP_ele=[0,-10,2,7; 35,4300,4400,4600; 50,6300,6400,6600], + tableQdot_con=[0,-10,2,7; 35,11600,17000,20200; 50,10200,15600,18800], + mFlow_conNom=20200/4180/5, + mFlow_evaNom=1, + tableUppBou=[-15,55; 40,55], + tableLowBou=[-15,0; 40,0]); + + annotation(preferedView="text", DymolaStoredErrors, + Icon, + Documentation(revisions=" +According to data from Ochsner data sheets; EN14511
+")); +end Ochsner_GMLW_19; diff --git a/AixLib/DataBase/ThermalMachines/HeatPump/EN14511/Ochsner_GMLW_19plus.mo b/AixLib/DataBase/ThermalMachines/HeatPump/EN14511/Ochsner_GMLW_19plus.mo new file mode 100644 index 0000000000..0430707435 --- /dev/null +++ b/AixLib/DataBase/ThermalMachines/HeatPump/EN14511/Ochsner_GMLW_19plus.mo @@ -0,0 +1,23 @@ +within AixLib.DataBase.ThermalMachines.HeatPump.EN14511; +record Ochsner_GMLW_19plus "Ochsner GMLW 19 plus" + extends + AixLib.DataBase.ThermalMachines.HeatPump.HeatPumpBaseDataDefinition( + tableP_ele=[0,-10,2,7; 35,4100,4300,4400; 50,5500,5700,5800; 60,6300, + 6500,6600], + tableQdot_con=[0,-10,2,7; 35,12600,16800,19800; 50,11700,15900,18900; + 60,11400,15600,18600], + mFlow_conNom=19800/4180/5, + mFlow_evaNom=1, + tableUppBou=[-24,52; -15,55; -10,65; 40,65], + tableLowBou=[-24,0; 40,0]); + + annotation(preferedView="text", DymolaStoredErrors, + Icon, + Documentation(revisions=" +According to data from Ochsner data sheets; EN14511
+")); +end Ochsner_GMLW_19plus; diff --git a/AixLib/DataBase/ThermalMachines/HeatPump/EN14511/Ochsner_GMSW_15plus.mo b/AixLib/DataBase/ThermalMachines/HeatPump/EN14511/Ochsner_GMSW_15plus.mo new file mode 100644 index 0000000000..cca2a9a3c0 --- /dev/null +++ b/AixLib/DataBase/ThermalMachines/HeatPump/EN14511/Ochsner_GMSW_15plus.mo @@ -0,0 +1,23 @@ +within AixLib.DataBase.ThermalMachines.HeatPump.EN14511; +record Ochsner_GMSW_15plus "Ochsner GMSW 15 plus" + extends + AixLib.DataBase.ThermalMachines.HeatPump.HeatPumpBaseDataDefinition( + tableP_ele=[0,-5,0,5; 35,3225,3300,3300; 45,4000,4000,4000; 55,4825, + 4900,4900], + tableQdot_con=[0,-5,0,5; 35,12762,14500,16100; 45,12100,13900,15600; + 55,11513,13200,14900], + mFlow_conNom=14500/4180/5, + mFlow_evaNom=(14500 - 3300)/3600/3, + tableUppBou=[-8,52; 0,65; 20,65], + tableLowBou=[-8,10; 20,27]); + + annotation(preferedView="text", DymolaStoredErrors, + Icon, + Documentation(revisions=" +According to data from WPZ Buchs, Swiss; EN14511
+")); +end Ochsner_GMSW_15plus; diff --git a/AixLib/DataBase/ThermalMachines/HeatPump/EN14511/StiebelEltron_WPL18.mo b/AixLib/DataBase/ThermalMachines/HeatPump/EN14511/StiebelEltron_WPL18.mo new file mode 100644 index 0000000000..d349ab6cd4 --- /dev/null +++ b/AixLib/DataBase/ThermalMachines/HeatPump/EN14511/StiebelEltron_WPL18.mo @@ -0,0 +1,24 @@ +within AixLib.DataBase.ThermalMachines.HeatPump.EN14511; +record StiebelEltron_WPL18 "Stiebel Eltron WPL 18" + extends + AixLib.DataBase.ThermalMachines.HeatPump.HeatPumpBaseDataDefinition( + tableP_ele=[0,-7,2,7,10,20; 35,3300,3400,3500,3700,3800; 50,4500,4400, + 4600,5000,5100], + tableQdot_con=[0,-7,2,7,10,20; 35,9700,11600,13000,14800,16300; 50, + 10000,11200,12900,16700,17500], + mFlow_conNom=13000/4180/5, + mFlow_evaNom=1, + tableUppBou=[-25,65; 40,65], + tableLowBou=[-25,0; 40,0]); + //These boundary-tables are not from the datasheet but default values. + + annotation(preferedView="text", DymolaStoredErrors, + Icon, + Documentation(revisions=" +According to data from WPZ Buchs, Swiss; EN14511
+")); +end StiebelEltron_WPL18; diff --git a/AixLib/DataBase/ThermalMachines/HeatPump/EN14511/Vaillant_VWL_101.mo b/AixLib/DataBase/ThermalMachines/HeatPump/EN14511/Vaillant_VWL_101.mo new file mode 100644 index 0000000000..6ba3bce3a1 --- /dev/null +++ b/AixLib/DataBase/ThermalMachines/HeatPump/EN14511/Vaillant_VWL_101.mo @@ -0,0 +1,25 @@ +within AixLib.DataBase.ThermalMachines.HeatPump.EN14511; +record Vaillant_VWL_101 "Vaillant VWL10-1" + extends + AixLib.DataBase.ThermalMachines.HeatPump.HeatPumpBaseDataDefinition( + tableP_ele=[0,-15,-7,2,7; 35,2138,2177,2444,2444; 45,2558,2673,2864, + 3055; 55,2902,3131,3360,3513], + tableQdot_con=[0,-15,-7,2,7; 35,5842,7523,9776,10807; 45,5842,7332, + 9050,10387; 55,5728,7179,9050,10043], + mFlow_conNom=9776/4180/5, + mFlow_evaNom=1, + tableUppBou=[-25,65; 40,65], + tableLowBou=[-25,0; 40,0]); + //These boundary-tables are not from the datasheet but default values. + + annotation(preferedView="text", DymolaStoredErrors, + Icon, + Documentation(revisions=" +According to data from Vaillant data sheets; EN14511
+")); +end Vaillant_VWL_101; diff --git a/AixLib/DataBase/ThermalMachines/HeatPump/EN14511/Vitocal200AWO201.mo b/AixLib/DataBase/ThermalMachines/HeatPump/EN14511/Vitocal200AWO201.mo new file mode 100644 index 0000000000..130e24a03b --- /dev/null +++ b/AixLib/DataBase/ThermalMachines/HeatPump/EN14511/Vitocal200AWO201.mo @@ -0,0 +1,30 @@ +within AixLib.DataBase.ThermalMachines.HeatPump.EN14511; +record Vitocal200AWO201 + "Vitocal200AWO201" + extends + AixLib.DataBase.ThermalMachines.HeatPump.HeatPumpBaseDataDefinition( + tableP_ele=[0,-15,-7,2,7,10,20,30; 35,1290.0,1310.0,730.0,870.0,850.0, + 830.0,780.0; 45,1550.0,1600.0,870.0,1110.0,1090.0,1080.0,1040.0; + 55,1870.0,1940.0,1170.0,1370.0,1370.0,1370.0,1350.0], + tableQdot_con=[0,-15,-7,2,7,10,20,30; 35,3020,3810,2610,3960,4340, + 5350,6610; 45,3020,3780,2220,3870,4120,5110,6310; 55,3120,3790, + 2430,3610,3910,4850,6000], + mFlow_conNom=3960/4180/5, + mFlow_evaNom=(2250*1.2)/3600, + tableUppBou=[-20,50; -10,60; 30,60; 35,55], + tableLowBou=[-20,25; 25,25; 35,35]); + + annotation ( + Icon(coordinateSystem(preserveAspectRatio=false)), + Diagram(coordinateSystem(preserveAspectRatio=false)), + Documentation(info=" +Data record for type AWO-M/AWO-M-E-AC 201.A04, obtained from the technical guide in the UK.
+", revisions=" +According to data from WPZ Buchs, Swiss; EN 255.
-", revisions=" -According to manufacturer's data; EN 255.
-", revisions=" -Data from manufacturer's data sheet (Viessmann). These exact curves are given in the data sheet for measurement procedure according to EN 255.
-", revisions=" -Data from manufacturer's data sheet (Viessmann). These exact curves are given in the data sheet for measurement procedure according to EN 255.
-", revisions=" -Data from manufacturer's data sheet (Viessmann). These exact curves are given in the data sheet for measurement procedure according to EN 255.
-", revisions=" -According to data from WPZ Buchs, Swiss; EN 255.
+", revisions=" +According to manufacturer's data; EN 255.
+", revisions=" +Data from manufacturer's data sheet (Viessmann). These exact curves are given in the data sheet for measurement procedure according to EN 255.
+", revisions=" +Data from manufacturer's data sheet (Viessmann). These exact curves are given in the data sheet for measurement procedure according to EN 255.
+", revisions=" +Data from manufacturer's data sheet (Viessmann). These exact curves are given in the data sheet for measurement procedure according to EN 255.
+", revisions=" +Carnot CoP and constant electric power, no dependency on speed or mass flow rates!
-", - revisions=" -Carnot CoP multiplied with constant quality grade and constant electric power, no dependency on speed or mass flow rates!
-", - revisions=" -Base funtion used in HeatPump model. It defines the inputs speed N (1/min), condenser outlet temperature T_co (K) and evaporator inlet temperature T_ev (K). The output is the vector Char: first value is compressor power, second value is the condenser heat flow rate.
-", - revisions=" -This function emulated the the Carnot model (AixLib.Fluid.Chillers.BaseClasses.Carnot). See this description for more info on assumptions etc.
-")); - end CarnotFunction; - - function PolynomalApproach - "Function to emulate the polynomal approach of the TRNSYS Type 401 heat pump model" - extends PartialBaseFct; - parameter Modelica.SIunits.Power p[6] = {0,0,0,0,0,0} - "Polynomal coefficient for the electrical power"; - parameter Modelica.SIunits.HeatFlowRate q[6] = {0,0,0,0,0,0} - "Polynomal coefficient for the condenser heat flow"; - - protected - Real TEva_n = T_eva/273.15 + 1 "Normalized evaporator temperature"; - Real TCon_n = T_con/273.15 + 1 "Normalized condenser temperature"; - algorithm - if N >= Modelica.Constants.eps then - Char[1] := p[1] + p[2]*TEva_n + p[3]*TCon_n + p[4]*TCon_n*TEva_n + p[5]*TEva_n^2 + p[6]*TCon_n^2; //Pel - Char[2] := q[1] + q[2]*TEva_n + q[3]*TCon_n + q[4]*TCon_n*TEva_n + q[5]*TEva_n^2 + q[6]*TCon_n^2; //QCon - else //Maybe something better could be used such as smooth() - Char[1] := 0; - Char[2] := 0; - end if; - annotation (Documentation(revisions=" -Based on the work of Afjej and Wetter, 1997 [1] and the TRNYS Type 401 heat pump model, this function uses a six-coefficient polynom to calculate the electrical power and the heat flow to the condenser. The coefficients are calculated based on the data in DIN EN 14511 with a minimization-problem in python using the root-mean-square-error.
-The normalized input temperatures are calculated with the formular:
-T_n = (T/273.15) + 1
-The coefficients for the polynomal functions are stored inside the record for heat pumps in AixLib.DataBase.HeatPump.
-[1]: https://www.trnsys.de/download/en/ts_type_401_en.pdf
-")); - end PolynomalApproach; - end Characteristics; - - package DefrostCorrection - extends Modelica.Icons.Package; - - function NoModel "No model" - extends - AixLib.DataBase.ThermalMachines.HeatPump.Functions.DefrostCorrection.PartialBaseFct( - T_eva); - - algorithm - f_CoPicing:=1; - - annotation (Documentation(info=" -No correction factor for icing/defrosting: f_cop_icing=1.
-", - revisions=" -Base funtion used in HeatPump model. Input is the evaporator inlet temperature, output is a CoP-correction factor f_cop_icing.
-", - revisions=" -Correction of CoP (Icing, Defrost) according to Wetter,Afjei 1996.
-", - revisions=" -This function can be used to implement a simple icing approach, e.g. based on outdoor air temperature or time based.
-")); - end BasicIcingApproach; - - partial function PartialBaseFct "Base function for all icing factor functions" - extends Modelica.Icons.Function; - input Modelica.SIunits.ThermodynamicTemperature T_flow_ev "Evaporator supply temperature"; - input Modelica.SIunits.ThermodynamicTemperature T_ret_ev "Evaporator return temperature"; - input Modelica.SIunits.ThermodynamicTemperature T_oda "Outdoor air temperature"; - input Modelica.SIunits.MassFlowRate m_flow_ev "Mass flow rate at the evaporator"; - output Real iceFac(min=0, max=1) "Icing factor, normalized value between 0 and 1"; - - annotation (Documentation(revisions=" -Base function for calculation of the icing factor. The normalized value represents reduction of heat exchange as a result of icing of the evaporator.
-")); - end PartialBaseFct; - - function WetterAfjei1996 - "Correction of CoP (Icing, Defrost) according to Wetter,Afjei 1996" - extends - AixLib.DataBase.ThermalMachines.HeatPump.Functions.IcingFactor.PartialBaseFct; - - parameter Real A=0.03; - parameter Real B=-0.004; - parameter Real C=0.1534; - parameter Real D=0.8869; - parameter Real E=26.06; - protected - Real factor; - Real linear_term; - Real gauss_curve; - algorithm - linear_term:=A + B*T_flow_ev; - gauss_curve:=C*Modelica.Math.exp(-(T_flow_ev - D)*(T_flow_ev - D)/E); - if linear_term>0 then - factor:=linear_term + gauss_curve; - else - factor:=gauss_curve; - end if; - iceFac:=1-factor; - annotation (Documentation(info=" -Correction of CoP (Icing, Defrost) according to Wetter,Afjei 1996.
-", - revisions=" -This package contains functions for calculation of an icing factor used in AixLib.Fluid.HeatPumps.BaseClasses.PerformanceData.IcingBlock.
-")); - end IcingFactor; -end Functions; diff --git a/AixLib/DataBase/ThermalMachines/HeatPump/Functions/Characteristics/CarnotFunction.mo b/AixLib/DataBase/ThermalMachines/HeatPump/Functions/Characteristics/CarnotFunction.mo new file mode 100644 index 0000000000..e860264dc2 --- /dev/null +++ b/AixLib/DataBase/ThermalMachines/HeatPump/Functions/Characteristics/CarnotFunction.mo @@ -0,0 +1,36 @@ +within AixLib.DataBase.ThermalMachines.HeatPump.Functions.Characteristics; +function CarnotFunction + "Function to emulate the polynomal approach of the Carnot_y heat pump model" + extends PartialBaseFct; + parameter Modelica.SIunits.Power Pel_nominal=2000 + "Constant nominal electric power"; + parameter Real etaCarnot_nominal(unit="1") = 0.5 + "Carnot effectiveness (=COP/COP_Carnot) used if use_eta_Carnot_nominal = true" + annotation (Dialog(group="Efficiency", enable=use_eta_Carnot_nominal)); + + parameter Real a[:] = {1} + "Coefficients for efficiency curve (need p(a=a, yPL=1)=1)" + annotation (Dialog(group="Efficiency")); +protected + Modelica.SIunits.Power Pel; + Real COP; + Real COP_carnot; + Real etaPartLoad = AixLib.Utilities.Math.Functions.polynomial(a=a, x=N); +algorithm + assert(abs(T_con - T_eva)>Modelica.Constants.eps, "Temperatures have to differ to calculate the Carnot efficiency", AssertionLevel.warning); + COP_carnot :=T_con/(T_con - T_eva); + Pel :=Pel_nominal*N; + COP :=etaCarnot_nominal*etaPartLoad*COP_carnot; + Char[1] :=Pel; + Char[2] :=COP*Pel; + annotation (Documentation(revisions=" +This function emulated the the Carnot model (AixLib.Fluid.Chillers.BaseClasses.Carnot). See this description for more info on assumptions etc.
+")); +end CarnotFunction; diff --git a/AixLib/DataBase/ThermalMachines/HeatPump/Functions/Characteristics/ConstantCoP.mo b/AixLib/DataBase/ThermalMachines/HeatPump/Functions/Characteristics/ConstantCoP.mo new file mode 100644 index 0000000000..380b7dd33d --- /dev/null +++ b/AixLib/DataBase/ThermalMachines/HeatPump/Functions/Characteristics/ConstantCoP.mo @@ -0,0 +1,25 @@ +within AixLib.DataBase.ThermalMachines.HeatPump.Functions.Characteristics; +function ConstantCoP "Constant CoP and constant electric power" + extends + AixLib.DataBase.ThermalMachines.HeatPump.Functions.Characteristics.PartialBaseFct( + N, + T_con, + T_eva, + mFlow_eva, + mFlow_con); + parameter Modelica.SIunits.Power powerCompressor=2000 + "Constant electric power input for compressor"; + parameter Real CoP "Constant CoP"; +algorithm + Char:= {powerCompressor,powerCompressor*CoP}; + + annotation (Documentation(info=" +Carnot CoP and constant electric power, no dependency on speed or mass flow rates!
+", + revisions=" +Carnot CoP multiplied with constant quality grade and constant electric power, no dependency on speed or mass flow rates!
+", + revisions=" +Base funtion used in HeatPump model. It defines the inputs speed N (1/min), condenser outlet temperature T_co (K) and evaporator inlet temperature T_ev (K). The output is the vector Char: first value is compressor power, second value is the condenser heat flow rate.
+", + revisions=" +Based on the work of Afjej and Wetter, 1997 [1] and the TRNYS Type 401 heat pump model, this function uses a six-coefficient polynom to calculate the electrical power and the heat flow to the condenser. The coefficients are calculated based on the data in DIN EN 14511 with a minimization-problem in python using the root-mean-square-error.
+The normalized input temperatures are calculated with the formular:
+T_n = (T/273.15) + 1
+The coefficients for the polynomal functions are stored inside the record for heat pumps in AixLib.DataBase.HeatPump.
+[1]: https://www.trnsys.de/download/en/ts_type_401_en.pdf
+")); +end PolynomalApproach; diff --git a/AixLib/DataBase/ThermalMachines/HeatPump/Functions/Characteristics/package.mo b/AixLib/DataBase/ThermalMachines/HeatPump/Functions/Characteristics/package.mo new file mode 100644 index 0000000000..2f7cdfb6b5 --- /dev/null +++ b/AixLib/DataBase/ThermalMachines/HeatPump/Functions/Characteristics/package.mo @@ -0,0 +1,9 @@ +within AixLib.DataBase.ThermalMachines.HeatPump.Functions; +package Characteristics + extends Modelica.Icons.Package; + + + + + +end Characteristics; diff --git a/AixLib/DataBase/ThermalMachines/HeatPump/Functions/Characteristics/package.order b/AixLib/DataBase/ThermalMachines/HeatPump/Functions/Characteristics/package.order new file mode 100644 index 0000000000..093783254e --- /dev/null +++ b/AixLib/DataBase/ThermalMachines/HeatPump/Functions/Characteristics/package.order @@ -0,0 +1,5 @@ +ConstantCoP +ConstantQualityGrade +PartialBaseFct +CarnotFunction +PolynomalApproach diff --git a/AixLib/DataBase/ThermalMachines/HeatPump/Functions/DefrostCorrection/NoModel.mo b/AixLib/DataBase/ThermalMachines/HeatPump/Functions/DefrostCorrection/NoModel.mo new file mode 100644 index 0000000000..64b6b0806c --- /dev/null +++ b/AixLib/DataBase/ThermalMachines/HeatPump/Functions/DefrostCorrection/NoModel.mo @@ -0,0 +1,18 @@ +within AixLib.DataBase.ThermalMachines.HeatPump.Functions.DefrostCorrection; +function NoModel "No model" + extends + AixLib.DataBase.ThermalMachines.HeatPump.Functions.DefrostCorrection.PartialBaseFct( + T_eva); + +algorithm +f_CoPicing:=1; + + annotation (Documentation(info=" +No correction factor for icing/defrosting: f_cop_icing=1.
+", + revisions=" +Base funtion used in HeatPump model. Input is the evaporator inlet temperature, output is a CoP-correction factor f_cop_icing.
+", + revisions=" +Correction of CoP (Icing, Defrost) according to Wetter,Afjei 1996.
+", + revisions=" +This function can be used to implement a simple icing approach, e.g. based on outdoor air temperature or time based.
+")); +end BasicIcingApproach; diff --git a/AixLib/DataBase/ThermalMachines/HeatPump/Functions/IcingFactor/PartialBaseFct.mo b/AixLib/DataBase/ThermalMachines/HeatPump/Functions/IcingFactor/PartialBaseFct.mo new file mode 100644 index 0000000000..b3a4759861 --- /dev/null +++ b/AixLib/DataBase/ThermalMachines/HeatPump/Functions/IcingFactor/PartialBaseFct.mo @@ -0,0 +1,20 @@ +within AixLib.DataBase.ThermalMachines.HeatPump.Functions.IcingFactor; +partial function PartialBaseFct "Base function for all icing factor functions" + extends Modelica.Icons.Function; + input Modelica.SIunits.ThermodynamicTemperature T_flow_ev "Evaporator supply temperature"; + input Modelica.SIunits.ThermodynamicTemperature T_ret_ev "Evaporator return temperature"; + input Modelica.SIunits.ThermodynamicTemperature T_oda "Outdoor air temperature"; + input Modelica.SIunits.MassFlowRate m_flow_ev "Mass flow rate at the evaporator"; + output Real iceFac(min=0, max=1) "Icing factor, normalized value between 0 and 1"; + + annotation (Documentation(revisions=" +Base function for calculation of the icing factor. The normalized value represents reduction of heat exchange as a result of icing of the evaporator.
+")); +end PartialBaseFct; diff --git a/AixLib/DataBase/ThermalMachines/HeatPump/Functions/IcingFactor/WetterAfjei1996.mo b/AixLib/DataBase/ThermalMachines/HeatPump/Functions/IcingFactor/WetterAfjei1996.mo new file mode 100644 index 0000000000..22be08f03a --- /dev/null +++ b/AixLib/DataBase/ThermalMachines/HeatPump/Functions/IcingFactor/WetterAfjei1996.mo @@ -0,0 +1,36 @@ +within AixLib.DataBase.ThermalMachines.HeatPump.Functions.IcingFactor; +function WetterAfjei1996 + "Correction of CoP (Icing, Defrost) according to Wetter,Afjei 1996" + extends + AixLib.DataBase.ThermalMachines.HeatPump.Functions.IcingFactor.PartialBaseFct; + +parameter Real A=0.03; +parameter Real B=-0.004; +parameter Real C=0.1534; +parameter Real D=0.8869; +parameter Real E=26.06; +protected +Real factor; +Real linear_term; +Real gauss_curve; +algorithm +linear_term:=A + B*T_flow_ev; +gauss_curve:=C*Modelica.Math.exp(-(T_flow_ev - D)*(T_flow_ev - D)/E); +if linear_term>0 then + factor:=linear_term + gauss_curve; +else + factor:=gauss_curve; +end if; +iceFac:=1-factor; + annotation (Documentation(info=" +Correction of CoP (Icing, Defrost) according to Wetter,Afjei 1996.
+", + revisions=" +This package contains functions for calculation of an icing factor used in AixLib.Fluid.HeatPumps.BaseClasses.PerformanceData.IcingBlock.
+")); +end IcingFactor; diff --git a/AixLib/DataBase/ThermalMachines/HeatPump/Functions/IcingFactor/package.order b/AixLib/DataBase/ThermalMachines/HeatPump/Functions/IcingFactor/package.order new file mode 100644 index 0000000000..24d54b820d --- /dev/null +++ b/AixLib/DataBase/ThermalMachines/HeatPump/Functions/IcingFactor/package.order @@ -0,0 +1,3 @@ +BasicIcingApproach +PartialBaseFct +WetterAfjei1996 diff --git a/AixLib/DataBase/ThermalMachines/HeatPump/Functions/package.mo b/AixLib/DataBase/ThermalMachines/HeatPump/Functions/package.mo new file mode 100644 index 0000000000..638aecf044 --- /dev/null +++ b/AixLib/DataBase/ThermalMachines/HeatPump/Functions/package.mo @@ -0,0 +1,6 @@ +within AixLib.DataBase.ThermalMachines.HeatPump; +package Functions "Functions for AixLib.Fluid.HeatPumps" +extends Modelica.Icons.Package; + + +end Functions; diff --git a/AixLib/DataBase/ThermalMachines/HeatPump/Functions/package.order b/AixLib/DataBase/ThermalMachines/HeatPump/Functions/package.order new file mode 100644 index 0000000000..4b9ff6a5eb --- /dev/null +++ b/AixLib/DataBase/ThermalMachines/HeatPump/Functions/package.order @@ -0,0 +1,3 @@ +Characteristics +DefrostCorrection +IcingFactor diff --git a/AixLib/DataBase/ThermalMachines/HeatPump/PerformanceData.mo b/AixLib/DataBase/ThermalMachines/HeatPump/PerformanceData.mo deleted file mode 100644 index 5ac9d01f2e..0000000000 --- a/AixLib/DataBase/ThermalMachines/HeatPump/PerformanceData.mo +++ /dev/null @@ -1,829 +0,0 @@ -within AixLib.DataBase.ThermalMachines.HeatPump; -package PerformanceData "Different models used for a black box heat pump model" - model IcingBlock - "Block which decreases evaporator power by an icing factor" - AixLib.Utilities.Time.CalendarTime calTim(zerTim=zerTim, yearRef=yearRef); - parameter Integer hourDay=16 - "Hour of the day"; - parameter AixLib.Utilities.Time.Types.ZeroTime zerTim=AixLib.Utilities.Time.Types.ZeroTime.NY2016 - "Enumeration for choosing how reference time (time = 0) should be defined"; - parameter Integer yearRef=2016 "Year when time = 0, used if zerTim=Custom"; - replaceable function iceFunc = - Functions.IcingFactor.BasicIcingApproach constrainedby - AixLib.DataBase.ThermalMachines.HeatPump.Functions.IcingFactor.PartialBaseFct - "Replaceable function to calculate current icing factor" annotation(choicesAllMatching=true); - Modelica.Blocks.Interfaces.RealInput T_flow_ev(unit="K", displayUnit="degC") - "Temperature at evaporator inlet" - annotation (Placement(transformation(extent={{-128,0},{-100,28}}), - iconTransformation(extent={{-116,12},{-100,28}}))); - - Modelica.Blocks.Interfaces.RealInput T_ret_ev(unit="K", displayUnit="degC") - "Temperature at evaporator outlet" annotation (Placement(transformation( - extent={{-128,-40},{-100,-12}}),iconTransformation(extent={{-116,-28}, - {-100,-12}}))); - Modelica.Blocks.Interfaces.RealInput T_oda(unit="K", displayUnit="degC") "Outdoor air temperature" - annotation (Placement(transformation(extent={{-128,46},{-100,74}}), - iconTransformation(extent={{-116,52},{-100,68}}))); - Modelica.Blocks.Interfaces.RealInput m_flow_ev(unit="kg/s") "Mass flow rate at evaporator" - annotation (Placement(transformation(extent={{-128,-80},{-100,-52}}), - iconTransformation(extent={{-116,-68},{-100,-52}}))); - Modelica.Blocks.Interfaces.RealOutput iceFac(min=0, max=1) "Output of current icing factor" - annotation (Placement(transformation( - extent={{-10,-10},{10,10}}, - rotation=0, - origin={110,0}))); - protected - Real iceFac_internal "Calculated value of icing factor"; - equation - iceFac_internal = iceFunc(T_flow_ev,T_ret_ev,T_oda,m_flow_ev); - iceFac = iceFac_internal; - annotation (Icon(coordinateSystem(preserveAspectRatio=false), graphics={ - Text( - lineColor={0,0,255}, - extent={{-150,105},{150,145}}, - textString="%name"), - Ellipse( - lineColor = {108,88,49}, - fillColor = {255,215,136}, - fillPattern = FillPattern.Solid, - extent = {{-100,-100},{100,100}}), - Text( - lineColor={108,88,49}, - extent={{-90.0,-90.0},{90.0,90.0}}, - textString="f")}), Diagram( - coordinateSystem(preserveAspectRatio=false)), - Documentation(revisions="- Model for calculation of the icing factor. The replaceable function - uses the inputs to calculate the resulting icing factor. -
-")); - end IcingBlock; - - model LookUpTable2D "Performance data coming from manufacturer" - extends - AixLib.DataBase.ThermalMachines.HeatPump.PerformanceData.BaseClasses.PartialPerformanceData; - - parameter Modelica.Blocks.Types.Smoothness smoothness=Modelica.Blocks.Types.Smoothness.LinearSegments - "Smoothness of table interpolation"; - parameter HeatPumpBaseDataDefinition dataTable= - AixLib.DataBase.ThermalMachines.HeatPump.EN255.Vitocal350AWI114() - "Data Table of HP" annotation (choicesAllMatching=true); - parameter Boolean extrapolation=true "False to hold last value"; - parameter Boolean printAsserts=false - "WARNING: This will lead to a lot of state-events if extrapolation occurs frequently! If extrapolation is enabled, the user will get warnings when extrapolation occurs." - annotation (Dialog(enable=extrapolation)); - - Utilities.Tables.CombiTable2DExtra Qdot_ConTable( - final smoothness=smoothness, - final u1(unit="degC"), - final u2(unit="degC"), - final y(unit="W", displayUnit="kW"), - final extrapolation=extrapolation, - final table=dataTable.tableQdot_con) - annotation (extent=[-60,40; -40,60], Placement(transformation(extent={{-14,-14}, - {14,14}}, - rotation=-90, - origin={46,34}))); - Utilities.Tables.CombiTable2DExtra P_eleTable( - final smoothness=smoothness, - extrapolation=extrapolation, - final u1(unit="degC"), - final u2(unit="degC"), - final y(unit="W", displayUnit="kW"), - final table=dataTable.tableP_ele) - "Electrical power table" - annotation (extent=[-60,-20; -40,0], Placement(transformation(extent={{-14,-14}, - {14,14}}, - rotation=-90, - origin={-60,36}))); - - Modelica.Blocks.Math.UnitConversions.To_degC t_Ev_in - annotation (extent=[-88,38; -76,50], Placement(transformation(extent={{-6,-6}, - {6,6}}, - rotation=270, - origin={52,72}))); - Modelica.Blocks.Math.UnitConversions.To_degC t_Co_ou annotation (extent=[-88,38; - -76,50], Placement(transformation(extent={{-6,-6},{6,6}}, - rotation=270, - origin={-54,76}))); - Modelica.Blocks.Math.Product nTimesPel annotation (Placement(transformation( - extent={{-7,-7},{7,7}}, - rotation=-90, - origin={-47,-3}))); - Modelica.Blocks.Math.Product nTimesQCon annotation (Placement(transformation( - extent={{-6,-6},{6,6}}, - rotation=-90, - origin={40,-10}))); - Modelica.Blocks.Math.Product proRedQEva - "Based on the icing factor, the heat flow to the evaporator is reduced" - annotation (Placement(transformation( - extent={{-6,-6},{6,6}}, - rotation=270, - origin={-78,-62}))); - Modelica.Blocks.Math.Add calcRedQCon - "Based on redcued heat flow to the evaporator, the heat flow to the condenser is also reduced" - annotation (Placement(transformation( - extent={{-6,-6},{6,6}}, - rotation=270, - origin={82,-70}))); - - Modelica.Blocks.Math.Product nTimesSF - "Create the product of the scaling factor and relative compressor speed" - annotation (Placement(transformation( - extent={{-7,-7},{7,7}}, - rotation=-90, - origin={-11,23}))); - - protected - parameter Real minSou = min(dataTable.tableP_ele[1,2:end]); - parameter Real minSup = min(dataTable.tableP_ele[2:end,1]); - parameter Real maxSou = max(dataTable.tableP_ele[1,2:end]); - parameter Real maxSup = max(dataTable.tableP_ele[2:end,1]); - Modelica.Blocks.Sources.Constant realCorr(final k=scalingFactor) - "Calculates correction of table output based on scaling factor" - annotation (Placement(transformation( - extent={{-3,-3},{3,3}}, - rotation=270, - origin={-15,43}))); - Modelica.Blocks.Math.Feedback feedbackHeatFlowEvaporator - "Calculates evaporator heat flow with total energy balance" annotation(Placement(transformation(extent={{-5,-5}, - {5,5}}, - rotation=270, - origin={-81,-43}))); - - equation - if printAsserts then - assert( - minSou + 273.15 < sigBus.T_flow_ev, - "Current T_flow_ev is too low. Extrapolation of data will result in unrealistic results", - level=AssertionLevel.warning); - assert( - maxSou + 273.15 > sigBus.T_flow_ev, - "Current T_flow_ev is too high. Extrapolation of data will result in unrealistic results", - level=AssertionLevel.warning); - assert( - minSup + 273.15 < sigBus.T_ret_co, - "Current T_ret_co is too low. Extrapolation of data will result in unrealistic results", - level=AssertionLevel.warning); - assert( - maxSup + 273.15 > sigBus.T_ret_co, - "Current T_ret_co is too high. Extrapolation of data will result in unrealistic results", - level=AssertionLevel.warning); - else - end if; - connect(t_Ev_in.y, Qdot_ConTable.u2) annotation (Line(points={{52,65.4},{52, - 60},{37.6,60},{37.6,50.8}}, color={0,0,127})); - connect(t_Ev_in.y, P_eleTable.u2) annotation (Line(points={{52,65.4},{-68.4, - 65.4},{-68.4,52.8}}, color={0,0,127})); - connect(t_Co_ou.y, P_eleTable.u1) annotation (Line(points={{-54,69.4},{-54, - 52.8},{-51.6,52.8}}, color={0,0,127})); - connect(t_Co_ou.y, Qdot_ConTable.u1) annotation (Line(points={{-54,69.4},{-54, - 60},{52,60},{52,50.8},{54.4,50.8}}, - color={0,0,127})); - connect(sigBus.T_ret_co, t_Co_ou.u) annotation (Line( - points={{1.075,104.07},{-54,104.07},{-54,83.2}}, - color={255,204,51}, - thickness=0.5), Text( - string="%first", - index=-1, - extent={{-6,3},{-6,3}})); - connect(sigBus.T_flow_ev, t_Ev_in.u) annotation (Line( - points={{1.075,104.07},{2,104.07},{2,104},{52,104},{52,79.2}}, - color={255,204,51}, - thickness=0.5), Text( - string="%first", - index=-1, - extent={{-6,3},{-6,3}})); - connect(P_eleTable.y, nTimesPel.u2) annotation (Line(points={{-60,20.6},{-60, - 10},{-51.2,10},{-51.2,5.4}}, - color={0,0,127})); - connect(Qdot_ConTable.y, nTimesQCon.u1) annotation (Line(points={{46,18.6},{ - 46,-2.8},{43.6,-2.8}}, color={0,0,127})); - connect(QCon, calcRedQCon.y) - annotation (Line(points={{-80,-110},{-80,-92},{82,-92},{82,-76.6}}, - color={0,0,127})); - connect(proRedQEva.y, calcRedQCon.u1) annotation (Line(points={{-78,-68.6}, - {-78,-72},{-4,-72},{-4,-58},{85.6,-58},{85.6,-62.8}}, color= - {0,0,127})); - connect(proRedQEva.y, QEva) - annotation (Line(points={{-78,-68.6},{-78,-86},{80,-86},{80,-110}}, - color={0,0,127})); - connect(feedbackHeatFlowEvaporator.y, proRedQEva.u2) annotation (Line(points={{-81, - -47.5},{-81,-54},{-81.6,-54},{-81.6,-54.8}}, color={0,0,127})); - connect(sigBus.iceFac, proRedQEva.u1) annotation (Line( - points={{1.075,104.07},{14,104.07},{14,-52},{-74,-52},{-74,-54.8},{ - -74.4,-54.8}}, - color={255,204,51}, - thickness=0.5), Text( - string="%first", - index=-1, - extent={{6,3},{6,3}}, - horizontalAlignment=TextAlignment.Left)); - connect(nTimesQCon.y, feedbackHeatFlowEvaporator.u1) annotation (Line(points={{40, - -16.6},{40,-32},{-81,-32},{-81,-39}}, color={0,0,127})); - connect(nTimesPel.y, feedbackHeatFlowEvaporator.u2) annotation (Line(points={{-47, - -10.7},{-47,-22},{-90,-22},{-90,-43},{-85,-43}}, color={0,0,127})); - connect(nTimesPel.y, Pel) annotation (Line(points={{-47,-10.7},{-47,-80},{0, - -80},{0,-110}}, color={0,0,127})); - connect(realCorr.y, nTimesSF.u2) annotation (Line(points={{-15,39.7},{-15, - 31.4},{-15.2,31.4}}, color={0,0,127})); - connect(sigBus.N, nTimesSF.u1) annotation (Line( - points={{1.075,104.07},{-2,104.07},{-2,31.4},{-6.8,31.4}}, - color={255,204,51}, - thickness=0.5), Text( - string="%first", - index=-1, - extent={{6,3},{6,3}}, - horizontalAlignment=TextAlignment.Left)); - connect(nTimesSF.y, nTimesPel.u1) annotation (Line(points={{-11,15.3},{-11, - 8},{-42.8,8},{-42.8,5.4}}, color={0,0,127})); - connect(nTimesSF.y, nTimesQCon.u2) annotation (Line(points={{-11,15.3},{-11, - 8},{36.4,8},{36.4,-2.8}}, color={0,0,127})); - connect(nTimesPel.y, calcRedQCon.u2) annotation (Line(points={{-47,-10.7},{ - -47,-22},{78.4,-22},{78.4,-62.8}}, color={0,0,127})); - annotation (Icon(graphics={ - Line(points={{-60.0,40.0},{-60.0,-40.0},{60.0,-40.0},{60.0,40.0},{30.0,40.0},{30.0,-40.0},{-30.0,-40.0},{-30.0,40.0},{-60.0,40.0},{-60.0,20.0},{60.0,20.0},{60.0,0.0},{-60.0,0.0},{-60.0,-20.0},{60.0,-20.0},{60.0,-40.0},{-60.0,-40.0},{-60.0,40.0},{60.0,40.0},{60.0,-40.0}}), - Line(points={{0.0,40.0},{0.0,-40.0}}), - Rectangle(fillColor={255,215,136}, - fillPattern=FillPattern.Solid, - extent={{-60.0,20.0},{-30.0,40.0}}), - Rectangle(fillColor={255,215,136}, - fillPattern=FillPattern.Solid, - extent={{-60.0,0.0},{-30.0,20.0}}), - Rectangle(fillColor={255,215,136}, - fillPattern=FillPattern.Solid, - extent={{-60.0,-20.0},{-30.0,0.0}}), - Rectangle(fillColor={255,215,136}, - fillPattern=FillPattern.Solid, - extent={{-60.0,-40.0},{-30.0,-20.0}})}), Documentation(revisions="- This model uses the 2-dimensional table data given in the DIN EN - 14511 (formerly EN255) to calculate QCon and P_el. To - model an inverter controlled heat pump, the relative compressor - speed n is scaled linearly with the ouput of the tables. - Furthermore, the design of a heat pump is modeled via a scaling - factor. As a result, the equations follow below: -
-- QCon,n = n * scalingFactor * TableQCon.y -
-- P_el = n * scalingFactor * TablePel.y -
-- To simulate possible icing of the evaporator on air-source heat - pumps, the icing factor is used to influence the output as well. As - the factor resembles the reduction of heat transfer between - refrigerant and source, the factor is implemented as follows: -
-- QEva = iceFac * (QCon,n-P_el,n) -
-- With iceFac as a relative value between 0 and 1: -
-- iceFac = kA/kA_noIce -
-- Finally, to follow the first law of thermodynamics: -
-- QCon = P_el,n + QEva -
-- The model CombiTable2DExtra - is able to disallow extrapolation by holding the last value. If one - extrapolates the given perfomance data, warnings about occuring - extrapolations are emitted. CAUTION: Checking for possible - extrapolations will trigger state events which results in higher - computing time. -
-")); - end LookUpTable2D; - - model LookUpTableND "N-dimensional table with data for heat pump" - extends - AixLib.DataBase.ThermalMachines.HeatPump.PerformanceData.BaseClasses.PartialPerformanceData; - parameter Real nConv=100 - "Gain value multiplied with relative compressor speed n to calculate matching value based on sdf tables"; - parameter SDF.Types.InterpolationMethod interpMethod=SDF.Types.InterpolationMethod.Linear - "Interpolation method"; - parameter SDF.Types.ExtrapolationMethod extrapMethod=SDF.Types.ExtrapolationMethod.None - "Extrapolation method"; - parameter String filename_Pel= - "modelica://Resources/Data/Fluid/BaseClasses/PerformanceData/LookUpTableND/VZH088AG.sdf" - "File name of sdf table data" - annotation (Dialog(group="Electrical Power",loadSelector(filter="SDF Files (*.sdf);;All Files (*.*)", caption="Select SDF file"))); - parameter String dataset_Pel="/Pel" - "Dataset name" - annotation (Dialog(group="Electrical Power")); - parameter String dataUnit_Pel="W" - "Data unit" - annotation (Dialog(group="Electrical Power")); - parameter String scaleUnits_Pel[3]={"K","K",""} - "Scale units" - annotation (Dialog(group="Electrical Power")); - parameter String filename_QCon= - "modelica://Resources/Data/Fluid/BaseClasses/PerformanceData/LookUpTableND/VZH088AG.sdf" - "File name of sdf table data" - annotation (Dialog(group="Condenser heat flow",loadSelector(filter="SDF Files (*.sdf);;All Files (*.*)", caption="Select SDF file"))); - parameter String dataset_QCon="/QCon" - "Dataset name" - annotation (Dialog(group="Condenser heat flow")); - parameter String dataUnit_QCon="W" - "Data unit" - annotation (Dialog(group="Condenser heat flow")); - parameter String scaleUnits_QCon[3]={"K","K",""} - "Scale units" - annotation (Dialog(group="Condenser heat flow")); - - Modelica.Blocks.Math.Gain nConGain(final k=nConv) - "Convert relative speed n to an absolute value for interpolation in sdf tables" - annotation (Placement(transformation( - extent={{-8,-8},{8,8}}, - rotation=-90, - origin={0,68}))); - Modelica.Blocks.Math.UnitConversions.To_degC t_Ev_in - annotation (extent=[-88,38; -76,50], Placement(transformation(extent={{-6,-6}, - {6,6}}, - rotation=-90, - origin={46,44}))); - Modelica.Blocks.Math.UnitConversions.To_degC t_Co_ou annotation (extent=[-88,38; - -76,50], Placement(transformation(extent={{-6,-6},{6,6}}, - rotation=-90, - origin={-40,46}))); - Modelica.Blocks.Math.Feedback feedbackHeatFlowEvaporator - "Calculates evaporator heat flow with total energy balance" annotation(Placement(transformation(extent={{-6,-6}, - {6,6}}, - rotation=-90, - origin={80,-82}))); - Utilities.Logical.SmoothSwitch switchPel - "If HP is off, no heat will be exchanged" - annotation (Placement(transformation(extent={{-10,-10},{10,10}}, - rotation=-90, - origin={50,-60}))); - Utilities.Logical.SmoothSwitch switchQCon - "If HP is off, no heat will be exchanged" - annotation (Placement(transformation(extent={{-10,-10},{10,10}}, - rotation=-90, - origin={-50,-56}))); - Modelica.Blocks.Sources.Constant constZero(final k=0) - "Power if HP is turned off" - annotation (Placement(transformation(extent={{-6,-6},{6,6}}, - rotation=-90, - origin={-4,-18}))); - SDF.NDTable nDTableQCon( - final nin=3, - final readFromFile=true, - final filename=filename_QCon, - final dataset=dataset_QCon, - final dataUnit=dataUnit_QCon, - final scaleUnits=scaleUnits_QCon, - final interpMethod=interpMethod, - final extrapMethod=extrapMethod) "SDF-Table data for condenser heat flow" - annotation (Placement(transformation(extent={{-12,-12},{12,12}}, - rotation=-90, - origin={-42,-10}))); - SDF.NDTable nDTablePel( - final nin=3, - final readFromFile=true, - final filename=filename_Pel, - final dataset=dataset_Pel, - final dataUnit=dataUnit_Pel, - final scaleUnits=scaleUnits_Pel, - final interpMethod=interpMethod, - final extrapMethod=extrapMethod) "SDF table data for electrical power" - annotation (Placement(transformation( - extent={{-12,-12},{12,12}}, - rotation=-90, - origin={50,-10}))); - Modelica.Blocks.Routing.Multiplex3 multiplex3_1( - final n1=1, - final n2=1, - final n3=1) "Concat all inputs into an array" - annotation (Placement(transformation(extent={{-8,-8},{8,8}}, - rotation=-90, - origin={0,20}))); - - Modelica.Blocks.Logical.GreaterThreshold greaterThreshold(final threshold= - Modelica.Constants.eps) annotation (Placement(transformation( - extent={{-6,-6},{6,6}}, - rotation=270, - origin={-72,46}))); - equation - connect(feedbackHeatFlowEvaporator.y, QEva) - annotation (Line(points={{80,-87.4},{80,-110}}, - color={0,0,127})); - connect(switchPel.y, Pel) annotation (Line(points={{50,-71},{50,-82},{0,-82}, - {0,-110}}, - color={0,0,127})); - connect(switchQCon.y, QCon) annotation (Line(points={{-50,-67},{-50,-74},{ - -80,-74},{-80,-110}}, - color={0,0,127})); - - connect(constZero.y, switchQCon.u3) annotation (Line(points={{-4,-24.6},{-4, - -24},{-4,-24},{-4,-28},{-4,-30},{-58,-30},{-58,-42},{-58,-42},{-58, - -44},{-58,-44}}, color={0,0,127})); - connect(constZero.y, switchPel.u3) annotation (Line(points={{-4,-24.6},{-4, - -30},{42,-30},{42,-48}}, - color={0,0,127})); - connect(nDTableQCon.y, switchQCon.u1) - annotation (Line(points={{-42,-23.2},{-42,-44}}, - color={0,0,127})); - connect(nDTablePel.y, switchPel.u1) - annotation (Line(points={{50,-23.2},{50,-34},{58,-34},{58,-48}}, - color={0,0,127})); - connect(multiplex3_1.y, nDTableQCon.u) annotation (Line(points={{-1.55431e-15, - 11.2},{-1.55431e-15,4.4},{-42,4.4}}, - color={0,0,127})); - connect(multiplex3_1.y, nDTablePel.u) annotation (Line(points={{-1.77636e-15,11.2}, - {-1.77636e-15,4.4},{50,4.4}}, color={0,0,127})); - connect(sigBus.T_flow_ev, t_Ev_in.u) annotation (Line( - points={{1.075,104.07},{46,104.07},{46,51.2}}, - color={255,204,51}, - thickness=0.5), Text( - string="%first", - index=-1, - extent={{-6,3},{-6,3}})); - connect(sigBus.T_ret_co, t_Co_ou.u) annotation (Line( - points={{1.075,104.07},{-40,104.07},{-40,53.2}}, - color={255,204,51}, - thickness=0.5), Text( - string="%first", - index=-1, - extent={{-6,3},{-6,3}})); - connect(sigBus.N, greaterThreshold.u) annotation (Line( - points={{1.075,104.07},{-72,104.07},{-72,53.2}}, - color={255,204,51}, - thickness=0.5), Text( - string="%first", - index=-1, - extent={{-3,6},{-3,6}}, - horizontalAlignment=TextAlignment.Right)); - connect(greaterThreshold.y, switchQCon.u2) annotation (Line(points={{-72, - 39.4},{-72,-36},{-50,-36},{-50,-44}}, - color={255,0,255})); - connect(greaterThreshold.y, switchPel.u2) annotation (Line(points={{-72,39.4}, - {-72,-36},{50,-36},{50,-48}}, color={255,0,255})); - connect(sigBus.N, nConGain.u) annotation (Line( - points={{1.075,104.07},{1.77636e-15,104.07},{1.77636e-15,77.6}}, - color={255,204,51}, - thickness=0.5), Text( - string="%first", - index=-1, - extent={{-3,6},{-3,6}}, - horizontalAlignment=TextAlignment.Right)); - connect(nConGain.y, multiplex3_1.u3[1]) annotation (Line(points={{ - -1.55431e-15,59.2},{-6,59.2},{-6,29.6},{-5.6,29.6}}, color={0,0,127})); - connect(t_Co_ou.y, multiplex3_1.u1[1]) annotation (Line(points={{-40,39.4},{ - -40,36},{5.6,36},{5.6,29.6}}, color={0,0,127})); - connect(t_Ev_in.y, multiplex3_1.u2[1]) annotation (Line(points={{46,37.4},{ - 46,32},{0,32},{0,29.6}}, - color={0,0,127})); - connect(switchPel.y, feedbackHeatFlowEvaporator.u2) - annotation (Line(points={{50,-71},{50,-82},{75.2,-82}}, color={0,0,127})); - connect(switchQCon.y, feedbackHeatFlowEvaporator.u1) annotation (Line(points={{-50,-67}, - {-50,-74},{80,-74},{80,-77.2}}, color={0,0,127})); - annotation (Icon(graphics={ - Line(points={{-60.0,40.0},{-60.0,-40.0},{60.0,-40.0},{60.0,40.0},{30.0,40.0},{30.0,-40.0},{-30.0,-40.0},{-30.0,40.0},{-60.0,40.0},{-60.0,20.0},{60.0,20.0},{60.0,0.0},{-60.0,0.0},{-60.0,-20.0},{60.0,-20.0},{60.0,-40.0},{-60.0,-40.0},{-60.0,40.0},{60.0,40.0},{60.0,-40.0}}), - Line(points={{0.0,40.0},{0.0,-40.0}}), - Rectangle(fillColor={255,255,0}, - fillPattern=FillPattern.Solid, - extent={{-60.0,0.0},{-30.0,20.0}}, - lineColor={0,0,0}), - Rectangle(fillColor={255,215,136}, - fillPattern=FillPattern.Solid, - extent={{-60.0,-40.0},{-30.0,-20.0}}), - Rectangle(fillColor={255,255,0}, - fillPattern=FillPattern.Solid, - extent={{-60,-20},{-30,0}}, - lineColor={0,0,0}), - Rectangle(fillColor={255,255,0}, - fillPattern=FillPattern.Solid, - extent={{-60,-40},{-30,-20}}, - lineColor={0,0,0}), - Rectangle(fillColor={255,255,0}, - fillPattern=FillPattern.Solid, - extent={{-30,-40},{0,-20}}, - lineColor={0,0,0}), - Rectangle(fillColor={255,255,0}, - fillPattern=FillPattern.Solid, - extent={{0,-40},{30,-20}}, - lineColor={0,0,0}), - Rectangle(fillColor={255,255,0}, - fillPattern=FillPattern.Solid, - extent={{30,-40},{60,-20}}, - lineColor={0,0,0}), - Rectangle(fillColor={255,255,0}, - fillPattern=FillPattern.Solid, - extent={{30,-20},{60,0}}, - lineColor={0,0,0}), - Rectangle(fillColor={255,255,0}, - fillPattern=FillPattern.Solid, - extent={{0,-20},{30,0}}, - lineColor={0,0,0}), - Rectangle(fillColor={255,255,0}, - fillPattern=FillPattern.Solid, - extent={{0,0},{30,20}}, - lineColor={0,0,0}), - Rectangle(fillColor={255,255,0}, - fillPattern=FillPattern.Solid, - extent={{30,0},{60,20}}, - lineColor={0,0,0}), - Rectangle(fillColor={255,255,0}, - fillPattern=FillPattern.Solid, - extent={{0,20},{30,40}}, - lineColor={0,0,0}), - Rectangle(fillColor={255,255,0}, - fillPattern=FillPattern.Solid, - extent={{30,20},{60,40}}, - lineColor={0,0,0}), - Rectangle(fillColor={255,255,0}, - fillPattern=FillPattern.Solid, - extent={{-60,20},{-30,40}}, - lineColor={0,0,0}), - Rectangle(fillColor={255,255,0}, - fillPattern=FillPattern.Solid, - extent={{-30,20},{0,40}}, - lineColor={0,0,0}), - Rectangle(fillColor={255,255,0}, - fillPattern=FillPattern.Solid, - extent={{-30,0},{0,20}}, - lineColor={0,0,0}), - Rectangle(fillColor={255,255,0}, - fillPattern=FillPattern.Solid, - extent={{-30,-20},{0,0}}, - lineColor={0,0,0})}), Documentation(info="- Basic models showing the concept of using n-dimensional table data - for the innerCycle of the heat pump model. This model assumes one - provides data for inverter controlled heat pumps or chillers. - However, this basis structure can be used to create own models, where - electrical power and condenser depend on other inputs, such as - ambient temperature. -
-", revisions=" -- This model is used to calculate the three values based on a - functional approach. The user can choose between several functions or - use their own. -
-- As the - base function only returns the electrical power and the condenser - heat flow, the evaporator heat flow is calculated with the following - energy balance: -
-- QEva = QCon - P_el -
-")); - end PolynomalApproach; - - model calcCOP - "To calculate the COP or EER of a device, this model ensures no integration failure will happen" - - parameter Modelica.SIunits.Power lowBouPel "If P_el falls below this value, COP will not be calculated"; - parameter Modelica.SIunits.Time aveTime=60 "Time span for average"; - - Modelica.Blocks.Interfaces.RealInput Pel(final unit="W", final displayUnit= - "kW") - "Input for all electrical power consumed by the system" - annotation (Placement(transformation(extent={{-140,-60},{-100,-20}}), - iconTransformation(extent={{-140,-60},{-100,-20}}))); - Modelica.Blocks.Interfaces.RealInput QHeat(final unit="W", final displayUnit= - "kW") - "Input for all heating power delivered to the system" - annotation (Placement(transformation(extent={{-140,20},{-100,60}}), - iconTransformation(extent={{-140,20},{-100,60}}))); - Modelica.Blocks.Interfaces.RealOutput y_COP "Output for calculated COP value" - annotation (Placement(transformation(extent={{100,-10},{120,10}}))); - protected - AixLib.Utilities.Math.MovingAverage movAve(final aveTime=aveTime) - "To calculate the moving average of the output values"; - equation - //Check if any of the two sums are lower than the given threshold. If so, set COP to zero - if Pel < lowBouPel or QHeat < Modelica.Constants.eps then - movAve.u = 0; - else - movAve.u = QHeat/Pel; - end if; - connect(movAve.y, y_COP); - annotation (Icon(coordinateSystem(preserveAspectRatio=false), graphics={ - Line( - points={{-82,0},{-12,0}}, - color={28,108,200}, - thickness=0.5), - Text( - extent={{-92,32},{-2,12}}, - lineColor={28,108,200}, - lineThickness=0.5, - textString="QHeat"), - Text( - extent={{-92,-8},{-2,-28}}, - lineColor={28,108,200}, - lineThickness=0.5, - textString="Pel"), - Line(points={{-6,6},{22,6}}, color={28,108,200}), - Line(points={{-6,-6},{22,-6}}, color={28,108,200}), - Text( - extent={{12,8},{102,-12}}, - lineColor={28,108,200}, - lineThickness=0.5, - textString="COP")}), Diagram( - coordinateSystem(preserveAspectRatio=false)), - Documentation(revisions="- This model is used to calculate the COP or the EER of a device. As - the electrical power could get negative, a lower boundary is used to - avoid division by zero. A moving average ensure a stable calculation - of the COP or EER. -
-")); - end calcCOP; - - package BaseClasses "Package with partial classes of Performance Data" - partial model PartialPerformanceData - "Model with a replaceable for different methods of data aggregation" - - Modelica.Blocks.Interfaces.RealOutput Pel(final unit="W", final displayUnit="kW") - "Electrical Power consumed by HP" annotation (Placement( - transformation( - extent={{-10,-10},{10,10}}, - rotation=270, - origin={0,-110}))); - Modelica.Blocks.Interfaces.RealOutput QCon(final unit="W", final displayUnit="kW") - "Heat flow rate through Condenser" annotation (Placement(transformation( - extent={{-10,-10},{10,10}}, - rotation=270, - origin={-80,-110}))); - AixLib.Controls.Interfaces.ThermalMachineControlBus sigBus - "Bus-connector used in a thermal machine" annotation (Placement( - transformation( - extent={{-15,-14},{15,14}}, - rotation=0, - origin={1,104}))); - Modelica.Blocks.Interfaces.RealOutput QEva(final unit="W", final displayUnit="kW") - "Heat flow rate through Condenser" annotation (Placement( - transformation( - extent={{-10,-10},{10,10}}, - rotation=270, - origin={80,-110}))); - protected - parameter Real scalingFactor=1 "Scaling factor of heat pump"; - annotation (Icon(coordinateSystem(preserveAspectRatio=false), graphics={ - Rectangle( - extent={{-100,-100},{100,100}}, - lineColor={0,0,127}, - fillColor={255,255,255}, - fillPattern=FillPattern.Solid), Text( - extent={{-47.5,-26.5},{47.5,26.5}}, - lineColor={0,0,127}, - pattern=LinePattern.Dash, - textString="%name -", origin={0.5,60.5}, - rotation=180)}),Diagram(coordinateSystem(preserveAspectRatio=false)), - Documentation(revisions="- Partial model for calculation of P_el, QCon and QEva based on the values in the - sigBusHP. -
-")); - end PartialPerformanceData; - annotation (Icon(graphics={ - Rectangle( - lineColor={200,200,200}, - fillColor={248,248,248}, - fillPattern=FillPattern.HorizontalCylinder, - extent={{-100.0,-100.0},{100.0,100.0}}, - radius=25.0), - Rectangle( - lineColor={128,128,128}, - extent={{-100.0,-100.0},{100.0,100.0}}, - radius=25.0), - Ellipse( - extent={{-30.0,-30.0},{30.0,30.0}}, - lineColor={128,128,128}, - fillColor={255,255,255}, - fillPattern=FillPattern.Solid)}), Documentation(revisions="- This package contains base classes for the package AixLib.Fluid.HeatPumps.BaseClasses.PerformanceData. -
-")); - end BaseClasses; -annotation (Documentation(revisions="- This package contains models for the grey box heat pump model - AixLib.Fluid.HeatPumps.HeatPump. -
-")); -end PerformanceData; diff --git a/AixLib/DataBase/ThermalMachines/HeatPump/PerformanceData/BaseClasses/PartialPerformanceData.mo b/AixLib/DataBase/ThermalMachines/HeatPump/PerformanceData/BaseClasses/PartialPerformanceData.mo new file mode 100644 index 0000000000..c0ece8324b --- /dev/null +++ b/AixLib/DataBase/ThermalMachines/HeatPump/PerformanceData/BaseClasses/PartialPerformanceData.mo @@ -0,0 +1,81 @@ +within AixLib.DataBase.ThermalMachines.HeatPump.PerformanceData.BaseClasses; +partial model PartialPerformanceData + "Model with a replaceable for different methods of data aggregation" + + parameter Modelica.SIunits.Temperature THotMax=333.15 "Max. value of THot before shutdown" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + parameter Modelica.SIunits.Temperature THotNom=313.15 "Nominal temperature of THot" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + parameter Modelica.SIunits.Temperature TSourceNom=278.15 "Nominal temperature of TSource" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + parameter Modelica.SIunits.HeatFlowRate QNom=30000 "Nominal heat flow" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + parameter Real PLRMin=0.4 "Limit of PLR; less =0" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + parameter Boolean HighTemp=false "true: THot > 60°C" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + parameter Modelica.SIunits.TemperatureDifference DeltaTCon=7 "Temperature difference heat sink condenser" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + parameter Modelica.SIunits.TemperatureDifference DeltaTEvap=3 "Temperature difference heat source evaporator" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + + parameter Modelica.SIunits.Temperature TSource=280 "temperature of heat source" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + + parameter Boolean dTConFix=false + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + + Modelica.Blocks.Interfaces.RealOutput Pel(final unit="W", final displayUnit="kW") + "Electrical Power consumed by HP" annotation (Placement( + transformation( + extent={{-10,-10},{10,10}}, + rotation=270, + origin={0,-110}))); + Modelica.Blocks.Interfaces.RealOutput QCon(final unit="W", final displayUnit="kW") + "Heat flow rate through Condenser" annotation (Placement(transformation( + extent={{-10,-10},{10,10}}, + rotation=270, + origin={-80,-110}))); + AixLib.Controls.Interfaces.ThermalMachineControlBus sigBus + "Bus-connector used in a thermal machine" annotation (Placement( + transformation( + extent={{-15,-14},{15,14}}, + rotation=0, + origin={1,104}))); + Modelica.Blocks.Interfaces.RealOutput QEva(final unit="W", final displayUnit="kW") + "Heat flow rate through Condenser" annotation (Placement( + transformation( + extent={{-10,-10},{10,10}}, + rotation=270, + origin={80,-110}))); +protected + parameter Real scalingFactor=1 "Scaling factor of heat pump"; + annotation (Icon(coordinateSystem(preserveAspectRatio=false), graphics={ + Rectangle( + extent={{-100,-100},{100,100}}, + lineColor={0,0,127}, + fillColor={255,255,255}, + fillPattern=FillPattern.Solid), Text( + extent={{-47.5,-26.5},{47.5,26.5}}, + lineColor={0,0,127}, + pattern=LinePattern.Dash, + textString="%name +", origin={0.5,60.5}, + rotation=180)}),Diagram(coordinateSystem(preserveAspectRatio=false)), + Documentation(revisions="+ Partial model for calculation of P_el, QCon and QEva based on the values in the + sigBusHP. +
+")); +end PartialPerformanceData; diff --git a/AixLib/DataBase/ThermalMachines/HeatPump/PerformanceData/BaseClasses/package.mo b/AixLib/DataBase/ThermalMachines/HeatPump/PerformanceData/BaseClasses/package.mo new file mode 100644 index 0000000000..aff71e85ef --- /dev/null +++ b/AixLib/DataBase/ThermalMachines/HeatPump/PerformanceData/BaseClasses/package.mo @@ -0,0 +1,31 @@ +within AixLib.DataBase.ThermalMachines.HeatPump.PerformanceData; +package BaseClasses "Package with partial classes of Performance Data" +annotation (Icon(graphics={ + Rectangle( + lineColor={200,200,200}, + fillColor={248,248,248}, + fillPattern=FillPattern.HorizontalCylinder, + extent={{-100.0,-100.0},{100.0,100.0}}, + radius=25.0), + Rectangle( + lineColor={128,128,128}, + extent={{-100.0,-100.0},{100.0,100.0}}, + radius=25.0), + Ellipse( + extent={{-30.0,-30.0},{30.0,30.0}}, + lineColor={128,128,128}, + fillColor={255,255,255}, + fillPattern=FillPattern.Solid)}), Documentation(revisions="+ This package contains base classes for the package AixLib.Fluid.HeatPumps.BaseClasses.PerformanceData. +
+")); +end BaseClasses; diff --git a/AixLib/DataBase/ThermalMachines/HeatPump/PerformanceData/BaseClasses/package.order b/AixLib/DataBase/ThermalMachines/HeatPump/PerformanceData/BaseClasses/package.order new file mode 100644 index 0000000000..9a4468158b --- /dev/null +++ b/AixLib/DataBase/ThermalMachines/HeatPump/PerformanceData/BaseClasses/package.order @@ -0,0 +1 @@ +PartialPerformanceData diff --git a/AixLib/DataBase/ThermalMachines/HeatPump/PerformanceData/IcingBlock.mo b/AixLib/DataBase/ThermalMachines/HeatPump/PerformanceData/IcingBlock.mo new file mode 100644 index 0000000000..2263b1e37d --- /dev/null +++ b/AixLib/DataBase/ThermalMachines/HeatPump/PerformanceData/IcingBlock.mo @@ -0,0 +1,67 @@ +within AixLib.DataBase.ThermalMachines.HeatPump.PerformanceData; +model IcingBlock + "Block which decreases evaporator power by an icing factor" + AixLib.Utilities.Time.CalendarTime calTim(zerTim=zerTim, yearRef=yearRef); + parameter Integer hourDay=16 + "Hour of the day"; + parameter AixLib.Utilities.Time.Types.ZeroTime zerTim=AixLib.Utilities.Time.Types.ZeroTime.NY2016 + "Enumeration for choosing how reference time (time = 0) should be defined"; + parameter Integer yearRef=2016 "Year when time = 0, used if zerTim=Custom"; + replaceable function iceFunc = + Functions.IcingFactor.BasicIcingApproach constrainedby + AixLib.DataBase.ThermalMachines.HeatPump.Functions.IcingFactor.PartialBaseFct + "Replaceable function to calculate current icing factor" annotation(choicesAllMatching=true); + Modelica.Blocks.Interfaces.RealInput T_flow_ev(unit="K", displayUnit="degC") + "Temperature at evaporator inlet" + annotation (Placement(transformation(extent={{-128,0},{-100,28}}), + iconTransformation(extent={{-116,12},{-100,28}}))); + + Modelica.Blocks.Interfaces.RealInput T_ret_ev(unit="K", displayUnit="degC") + "Temperature at evaporator outlet" annotation (Placement(transformation( + extent={{-128,-40},{-100,-12}}),iconTransformation(extent={{-116,-28}, + {-100,-12}}))); + Modelica.Blocks.Interfaces.RealInput T_oda(unit="K", displayUnit="degC") "Outdoor air temperature" + annotation (Placement(transformation(extent={{-128,46},{-100,74}}), + iconTransformation(extent={{-116,52},{-100,68}}))); + Modelica.Blocks.Interfaces.RealInput m_flow_ev(unit="kg/s") "Mass flow rate at evaporator" + annotation (Placement(transformation(extent={{-128,-80},{-100,-52}}), + iconTransformation(extent={{-116,-68},{-100,-52}}))); + Modelica.Blocks.Interfaces.RealOutput iceFac(min=0, max=1) "Output of current icing factor" + annotation (Placement(transformation( + extent={{-10,-10},{10,10}}, + rotation=0, + origin={110,0}))); +protected + Real iceFac_internal "Calculated value of icing factor"; +equation + iceFac_internal = iceFunc(T_flow_ev,T_ret_ev,T_oda,m_flow_ev); + iceFac = iceFac_internal; + annotation (Icon(coordinateSystem(preserveAspectRatio=false), graphics={ + Text( + lineColor={0,0,255}, + extent={{-150,105},{150,145}}, + textString="%name"), + Ellipse( + lineColor = {108,88,49}, + fillColor = {255,215,136}, + fillPattern = FillPattern.Solid, + extent = {{-100,-100},{100,100}}), + Text( + lineColor={108,88,49}, + extent={{-90.0,-90.0},{90.0,90.0}}, + textString="f")}), Diagram( + coordinateSystem(preserveAspectRatio=false)), + Documentation(revisions="+ Model for calculation of the icing factor. The replaceable function + uses the inputs to calculate the resulting icing factor. +
+")); +end IcingBlock; diff --git a/AixLib/DataBase/ThermalMachines/HeatPump/PerformanceData/LookUpTable2D.mo b/AixLib/DataBase/ThermalMachines/HeatPump/PerformanceData/LookUpTable2D.mo new file mode 100644 index 0000000000..86cc35101c --- /dev/null +++ b/AixLib/DataBase/ThermalMachines/HeatPump/PerformanceData/LookUpTable2D.mo @@ -0,0 +1,254 @@ +within AixLib.DataBase.ThermalMachines.HeatPump.PerformanceData; +model LookUpTable2D "Performance data coming from manufacturer" + extends + AixLib.DataBase.ThermalMachines.HeatPump.PerformanceData.BaseClasses.PartialPerformanceData; + + parameter Modelica.Blocks.Types.Smoothness smoothness=Modelica.Blocks.Types.Smoothness.LinearSegments + "Smoothness of table interpolation"; + parameter HeatPumpBaseDataDefinition dataTable= + AixLib.DataBase.ThermalMachines.HeatPump.EN255.Vitocal350AWI114() + "Data Table of HP" annotation (choicesAllMatching=true); + parameter Boolean extrapolation=true "False to hold last value"; + parameter Boolean printAsserts=false + "WARNING: This will lead to a lot of state-events if extrapolation occurs frequently! If extrapolation is enabled, the user will get warnings when extrapolation occurs." + annotation (Dialog(enable=extrapolation)); + + Utilities.Tables.CombiTable2DExtra Qdot_ConTable( + final smoothness=smoothness, + final u1(unit="degC"), + final u2(unit="degC"), + final y(unit="W", displayUnit="kW"), + final extrapolation=extrapolation, + final table=dataTable.tableQdot_con) + annotation (extent=[-60,40; -40,60], Placement(transformation(extent={{-14,-14}, + {14,14}}, + rotation=-90, + origin={46,34}))); + Utilities.Tables.CombiTable2DExtra P_eleTable( + final smoothness=smoothness, + extrapolation=extrapolation, + final u1(unit="degC"), + final u2(unit="degC"), + final y(unit="W", displayUnit="kW"), + final table=dataTable.tableP_ele) + "Electrical power table" + annotation (extent=[-60,-20; -40,0], Placement(transformation(extent={{-14,-14}, + {14,14}}, + rotation=-90, + origin={-60,36}))); + + Modelica.Blocks.Math.UnitConversions.To_degC t_Ev_in + annotation (extent=[-88,38; -76,50], Placement(transformation(extent={{-6,-6}, + {6,6}}, + rotation=270, + origin={52,72}))); + Modelica.Blocks.Math.UnitConversions.To_degC t_Co_ou annotation (extent=[-88,38; + -76,50], Placement(transformation(extent={{-6,-6},{6,6}}, + rotation=270, + origin={-54,76}))); + Modelica.Blocks.Math.Product nTimesPel annotation (Placement(transformation( + extent={{-7,-7},{7,7}}, + rotation=-90, + origin={-47,-3}))); + Modelica.Blocks.Math.Product nTimesQCon annotation (Placement(transformation( + extent={{-6,-6},{6,6}}, + rotation=-90, + origin={40,-10}))); + Modelica.Blocks.Math.Product proRedQEva + "Based on the icing factor, the heat flow to the evaporator is reduced" + annotation (Placement(transformation( + extent={{-6,-6},{6,6}}, + rotation=270, + origin={-78,-62}))); + Modelica.Blocks.Math.Add calcRedQCon + "Based on redcued heat flow to the evaporator, the heat flow to the condenser is also reduced" + annotation (Placement(transformation( + extent={{-6,-6},{6,6}}, + rotation=270, + origin={82,-70}))); + + Modelica.Blocks.Math.Product nTimesSF + "Create the product of the scaling factor and relative compressor speed" + annotation (Placement(transformation( + extent={{-7,-7},{7,7}}, + rotation=-90, + origin={-11,23}))); + +protected + parameter Real minSou = min(dataTable.tableP_ele[1,2:end]); + parameter Real minSup = min(dataTable.tableP_ele[2:end,1]); + parameter Real maxSou = max(dataTable.tableP_ele[1,2:end]); + parameter Real maxSup = max(dataTable.tableP_ele[2:end,1]); + Modelica.Blocks.Sources.Constant realCorr(final k=scalingFactor) + "Calculates correction of table output based on scaling factor" + annotation (Placement(transformation( + extent={{-3,-3},{3,3}}, + rotation=270, + origin={-15,43}))); + Modelica.Blocks.Math.Feedback feedbackHeatFlowEvaporator + "Calculates evaporator heat flow with total energy balance" annotation(Placement(transformation(extent={{-5,-5}, + {5,5}}, + rotation=270, + origin={-81,-43}))); + +equation + if printAsserts then + assert( + minSou + 273.15 < sigBus.T_flow_ev, + "Current T_flow_ev is too low. Extrapolation of data will result in unrealistic results", + level=AssertionLevel.warning); + assert( + maxSou + 273.15 > sigBus.T_flow_ev, + "Current T_flow_ev is too high. Extrapolation of data will result in unrealistic results", + level=AssertionLevel.warning); + assert( + minSup + 273.15 < sigBus.T_ret_co, + "Current T_ret_co is too low. Extrapolation of data will result in unrealistic results", + level=AssertionLevel.warning); + assert( + maxSup + 273.15 > sigBus.T_ret_co, + "Current T_ret_co is too high. Extrapolation of data will result in unrealistic results", + level=AssertionLevel.warning); + else + end if; + connect(t_Ev_in.y, Qdot_ConTable.u2) annotation (Line(points={{52,65.4},{52, + 60},{37.6,60},{37.6,50.8}}, color={0,0,127})); + connect(t_Ev_in.y, P_eleTable.u2) annotation (Line(points={{52,65.4},{-68.4, + 65.4},{-68.4,52.8}}, color={0,0,127})); + connect(t_Co_ou.y, P_eleTable.u1) annotation (Line(points={{-54,69.4},{-54, + 52.8},{-51.6,52.8}}, color={0,0,127})); + connect(t_Co_ou.y, Qdot_ConTable.u1) annotation (Line(points={{-54,69.4},{-54, + 60},{52,60},{52,50.8},{54.4,50.8}}, + color={0,0,127})); + connect(sigBus.T_ret_co, t_Co_ou.u) annotation (Line( + points={{1.075,104.07},{-54,104.07},{-54,83.2}}, + color={255,204,51}, + thickness=0.5), Text( + string="%first", + index=-1, + extent={{-6,3},{-6,3}})); + connect(sigBus.T_flow_ev, t_Ev_in.u) annotation (Line( + points={{1.075,104.07},{2,104.07},{2,104},{52,104},{52,79.2}}, + color={255,204,51}, + thickness=0.5), Text( + string="%first", + index=-1, + extent={{-6,3},{-6,3}})); + connect(P_eleTable.y, nTimesPel.u2) annotation (Line(points={{-60,20.6},{-60, + 10},{-51.2,10},{-51.2,5.4}}, + color={0,0,127})); + connect(Qdot_ConTable.y, nTimesQCon.u1) annotation (Line(points={{46,18.6},{ + 46,-2.8},{43.6,-2.8}}, color={0,0,127})); + connect(QCon, calcRedQCon.y) + annotation (Line(points={{-80,-110},{-80,-92},{82,-92},{82,-76.6}}, + color={0,0,127})); + connect(proRedQEva.y, calcRedQCon.u1) annotation (Line(points={{-78,-68.6}, + {-78,-72},{-4,-72},{-4,-58},{85.6,-58},{85.6,-62.8}}, color= + {0,0,127})); + connect(proRedQEva.y, QEva) + annotation (Line(points={{-78,-68.6},{-78,-86},{80,-86},{80,-110}}, + color={0,0,127})); + connect(feedbackHeatFlowEvaporator.y, proRedQEva.u2) annotation (Line(points={{-81, + -47.5},{-81,-54},{-81.6,-54},{-81.6,-54.8}}, color={0,0,127})); + connect(sigBus.iceFac, proRedQEva.u1) annotation (Line( + points={{1.075,104.07},{14,104.07},{14,-52},{-74,-52},{-74,-54.8},{ + -74.4,-54.8}}, + color={255,204,51}, + thickness=0.5), Text( + string="%first", + index=-1, + extent={{6,3},{6,3}}, + horizontalAlignment=TextAlignment.Left)); + connect(nTimesQCon.y, feedbackHeatFlowEvaporator.u1) annotation (Line(points={{40, + -16.6},{40,-32},{-81,-32},{-81,-39}}, color={0,0,127})); + connect(nTimesPel.y, feedbackHeatFlowEvaporator.u2) annotation (Line(points={{-47, + -10.7},{-47,-22},{-90,-22},{-90,-43},{-85,-43}}, color={0,0,127})); + connect(nTimesPel.y, Pel) annotation (Line(points={{-47,-10.7},{-47,-80},{0, + -80},{0,-110}}, color={0,0,127})); + connect(realCorr.y, nTimesSF.u2) annotation (Line(points={{-15,39.7},{-15, + 31.4},{-15.2,31.4}}, color={0,0,127})); + connect(sigBus.N, nTimesSF.u1) annotation (Line( + points={{1.075,104.07},{-2,104.07},{-2,31.4},{-6.8,31.4}}, + color={255,204,51}, + thickness=0.5), Text( + string="%first", + index=-1, + extent={{6,3},{6,3}}, + horizontalAlignment=TextAlignment.Left)); + connect(nTimesSF.y, nTimesPel.u1) annotation (Line(points={{-11,15.3},{-11, + 8},{-42.8,8},{-42.8,5.4}}, color={0,0,127})); + connect(nTimesSF.y, nTimesQCon.u2) annotation (Line(points={{-11,15.3},{-11, + 8},{36.4,8},{36.4,-2.8}}, color={0,0,127})); + connect(nTimesPel.y, calcRedQCon.u2) annotation (Line(points={{-47,-10.7},{ + -47,-22},{78.4,-22},{78.4,-62.8}}, color={0,0,127})); + annotation (Icon(graphics={ + Line(points={{-60.0,40.0},{-60.0,-40.0},{60.0,-40.0},{60.0,40.0},{30.0,40.0},{30.0,-40.0},{-30.0,-40.0},{-30.0,40.0},{-60.0,40.0},{-60.0,20.0},{60.0,20.0},{60.0,0.0},{-60.0,0.0},{-60.0,-20.0},{60.0,-20.0},{60.0,-40.0},{-60.0,-40.0},{-60.0,40.0},{60.0,40.0},{60.0,-40.0}}), + Line(points={{0.0,40.0},{0.0,-40.0}}), + Rectangle(fillColor={255,215,136}, + fillPattern=FillPattern.Solid, + extent={{-60.0,20.0},{-30.0,40.0}}), + Rectangle(fillColor={255,215,136}, + fillPattern=FillPattern.Solid, + extent={{-60.0,0.0},{-30.0,20.0}}), + Rectangle(fillColor={255,215,136}, + fillPattern=FillPattern.Solid, + extent={{-60.0,-20.0},{-30.0,0.0}}), + Rectangle(fillColor={255,215,136}, + fillPattern=FillPattern.Solid, + extent={{-60.0,-40.0},{-30.0,-20.0}})}), Documentation(revisions="+ This model uses the 2-dimensional table data given in the DIN EN + 14511 (formerly EN255) to calculate QCon and P_el. To + model an inverter controlled heat pump, the relative compressor + speed n is scaled linearly with the ouput of the tables. + Furthermore, the design of a heat pump is modeled via a scaling + factor. As a result, the equations follow below: +
++ QCon,n = n * scalingFactor * TableQCon.y +
++ P_el = n * scalingFactor * TablePel.y +
++ To simulate possible icing of the evaporator on air-source heat + pumps, the icing factor is used to influence the output as well. As + the factor resembles the reduction of heat transfer between + refrigerant and source, the factor is implemented as follows: +
++ QEva = iceFac * (QCon,n-P_el,n) +
++ With iceFac as a relative value between 0 and 1: +
++ iceFac = kA/kA_noIce +
++ Finally, to follow the first law of thermodynamics: +
++ QCon = P_el,n + QEva +
++ The model CombiTable2DExtra + is able to disallow extrapolation by holding the last value. If one + extrapolates the given perfomance data, warnings about occuring + extrapolations are emitted. CAUTION: Checking for possible + extrapolations will trigger state events which results in higher + computing time. +
+")); +end LookUpTable2D; diff --git a/AixLib/DataBase/ThermalMachines/HeatPump/PerformanceData/LookUpTableND.mo b/AixLib/DataBase/ThermalMachines/HeatPump/PerformanceData/LookUpTableND.mo new file mode 100644 index 0000000000..4215dc2999 --- /dev/null +++ b/AixLib/DataBase/ThermalMachines/HeatPump/PerformanceData/LookUpTableND.mo @@ -0,0 +1,271 @@ +within AixLib.DataBase.ThermalMachines.HeatPump.PerformanceData; +model LookUpTableND "N-dimensional table with data for heat pump" + extends + AixLib.DataBase.ThermalMachines.HeatPump.PerformanceData.BaseClasses.PartialPerformanceData; + parameter Real nConv=100 + "Gain value multiplied with relative compressor speed n to calculate matching value based on sdf tables"; + parameter SDF.Types.InterpolationMethod interpMethod=SDF.Types.InterpolationMethod.Linear + "Interpolation method"; + parameter SDF.Types.ExtrapolationMethod extrapMethod=SDF.Types.ExtrapolationMethod.None + "Extrapolation method"; + parameter String filename_Pel= + "modelica://Resources/Data/Fluid/BaseClasses/PerformanceData/LookUpTableND/VZH088AG.sdf" + "File name of sdf table data" + annotation (Dialog(group="Electrical Power",loadSelector(filter="SDF Files (*.sdf);;All Files (*.*)", caption="Select SDF file"))); + parameter String dataset_Pel="/Pel" + "Dataset name" + annotation (Dialog(group="Electrical Power")); + parameter String dataUnit_Pel="W" + "Data unit" + annotation (Dialog(group="Electrical Power")); + parameter String scaleUnits_Pel[3]={"K","K",""} + "Scale units" + annotation (Dialog(group="Electrical Power")); + parameter String filename_QCon= + "modelica://Resources/Data/Fluid/BaseClasses/PerformanceData/LookUpTableND/VZH088AG.sdf" + "File name of sdf table data" + annotation (Dialog(group="Condenser heat flow",loadSelector(filter="SDF Files (*.sdf);;All Files (*.*)", caption="Select SDF file"))); + parameter String dataset_QCon="/QCon" + "Dataset name" + annotation (Dialog(group="Condenser heat flow")); + parameter String dataUnit_QCon="W" + "Data unit" + annotation (Dialog(group="Condenser heat flow")); + parameter String scaleUnits_QCon[3]={"K","K",""} + "Scale units" + annotation (Dialog(group="Condenser heat flow")); + + Modelica.Blocks.Math.Gain nConGain(final k=nConv) + "Convert relative speed n to an absolute value for interpolation in sdf tables" + annotation (Placement(transformation( + extent={{-8,-8},{8,8}}, + rotation=-90, + origin={0,68}))); + Modelica.Blocks.Math.UnitConversions.To_degC t_Ev_in + annotation (extent=[-88,38; -76,50], Placement(transformation(extent={{-6,-6}, + {6,6}}, + rotation=-90, + origin={46,44}))); + Modelica.Blocks.Math.UnitConversions.To_degC t_Co_ou annotation (extent=[-88,38; + -76,50], Placement(transformation(extent={{-6,-6},{6,6}}, + rotation=-90, + origin={-40,46}))); + Modelica.Blocks.Math.Feedback feedbackHeatFlowEvaporator + "Calculates evaporator heat flow with total energy balance" annotation(Placement(transformation(extent={{-6,-6}, + {6,6}}, + rotation=-90, + origin={80,-82}))); + Utilities.Logical.SmoothSwitch switchPel + "If HP is off, no heat will be exchanged" + annotation (Placement(transformation(extent={{-10,-10},{10,10}}, + rotation=-90, + origin={50,-60}))); + Utilities.Logical.SmoothSwitch switchQCon + "If HP is off, no heat will be exchanged" + annotation (Placement(transformation(extent={{-10,-10},{10,10}}, + rotation=-90, + origin={-50,-56}))); + Modelica.Blocks.Sources.Constant constZero(final k=0) + "Power if HP is turned off" + annotation (Placement(transformation(extent={{-6,-6},{6,6}}, + rotation=-90, + origin={-4,-18}))); + SDF.NDTable nDTableQCon( + final nin=3, + final readFromFile=true, + final filename=filename_QCon, + final dataset=dataset_QCon, + final dataUnit=dataUnit_QCon, + final scaleUnits=scaleUnits_QCon, + final interpMethod=interpMethod, + final extrapMethod=extrapMethod) "SDF-Table data for condenser heat flow" + annotation (Placement(transformation(extent={{-12,-12},{12,12}}, + rotation=-90, + origin={-42,-10}))); + SDF.NDTable nDTablePel( + final nin=3, + final readFromFile=true, + final filename=filename_Pel, + final dataset=dataset_Pel, + final dataUnit=dataUnit_Pel, + final scaleUnits=scaleUnits_Pel, + final interpMethod=interpMethod, + final extrapMethod=extrapMethod) "SDF table data for electrical power" + annotation (Placement(transformation( + extent={{-12,-12},{12,12}}, + rotation=-90, + origin={50,-10}))); + Modelica.Blocks.Routing.Multiplex3 multiplex3_1( + final n1=1, + final n2=1, + final n3=1) "Concat all inputs into an array" + annotation (Placement(transformation(extent={{-8,-8},{8,8}}, + rotation=-90, + origin={0,20}))); + + Modelica.Blocks.Logical.GreaterThreshold greaterThreshold(final threshold= + Modelica.Constants.eps) annotation (Placement(transformation( + extent={{-6,-6},{6,6}}, + rotation=270, + origin={-72,46}))); +equation + connect(feedbackHeatFlowEvaporator.y, QEva) + annotation (Line(points={{80,-87.4},{80,-110}}, + color={0,0,127})); + connect(switchPel.y, Pel) annotation (Line(points={{50,-71},{50,-82},{0,-82}, + {0,-110}}, + color={0,0,127})); + connect(switchQCon.y, QCon) annotation (Line(points={{-50,-67},{-50,-74},{ + -80,-74},{-80,-110}}, + color={0,0,127})); + + connect(constZero.y, switchQCon.u3) annotation (Line(points={{-4,-24.6},{-4, + -24},{-4,-24},{-4,-28},{-4,-30},{-58,-30},{-58,-42},{-58,-42},{-58, + -44},{-58,-44}}, color={0,0,127})); + connect(constZero.y, switchPel.u3) annotation (Line(points={{-4,-24.6},{-4, + -30},{42,-30},{42,-48}}, + color={0,0,127})); + connect(nDTableQCon.y, switchQCon.u1) + annotation (Line(points={{-42,-23.2},{-42,-44}}, + color={0,0,127})); + connect(nDTablePel.y, switchPel.u1) + annotation (Line(points={{50,-23.2},{50,-34},{58,-34},{58,-48}}, + color={0,0,127})); + connect(multiplex3_1.y, nDTableQCon.u) annotation (Line(points={{-1.55431e-15, + 11.2},{-1.55431e-15,4.4},{-42,4.4}}, + color={0,0,127})); + connect(multiplex3_1.y, nDTablePel.u) annotation (Line(points={{-1.77636e-15,11.2}, + {-1.77636e-15,4.4},{50,4.4}}, color={0,0,127})); + connect(sigBus.T_flow_ev, t_Ev_in.u) annotation (Line( + points={{1.075,104.07},{46,104.07},{46,51.2}}, + color={255,204,51}, + thickness=0.5), Text( + string="%first", + index=-1, + extent={{-6,3},{-6,3}})); + connect(sigBus.T_ret_co, t_Co_ou.u) annotation (Line( + points={{1.075,104.07},{-40,104.07},{-40,53.2}}, + color={255,204,51}, + thickness=0.5), Text( + string="%first", + index=-1, + extent={{-6,3},{-6,3}})); + connect(sigBus.N, greaterThreshold.u) annotation (Line( + points={{1.075,104.07},{-72,104.07},{-72,53.2}}, + color={255,204,51}, + thickness=0.5), Text( + string="%first", + index=-1, + extent={{-3,6},{-3,6}}, + horizontalAlignment=TextAlignment.Right)); + connect(greaterThreshold.y, switchQCon.u2) annotation (Line(points={{-72, + 39.4},{-72,-36},{-50,-36},{-50,-44}}, + color={255,0,255})); + connect(greaterThreshold.y, switchPel.u2) annotation (Line(points={{-72,39.4}, + {-72,-36},{50,-36},{50,-48}}, color={255,0,255})); + connect(sigBus.N, nConGain.u) annotation (Line( + points={{1.075,104.07},{1.77636e-15,104.07},{1.77636e-15,77.6}}, + color={255,204,51}, + thickness=0.5), Text( + string="%first", + index=-1, + extent={{-3,6},{-3,6}}, + horizontalAlignment=TextAlignment.Right)); + connect(nConGain.y, multiplex3_1.u3[1]) annotation (Line(points={{ + -1.55431e-15,59.2},{-6,59.2},{-6,29.6},{-5.6,29.6}}, color={0,0,127})); + connect(t_Co_ou.y, multiplex3_1.u1[1]) annotation (Line(points={{-40,39.4},{ + -40,36},{5.6,36},{5.6,29.6}}, color={0,0,127})); + connect(t_Ev_in.y, multiplex3_1.u2[1]) annotation (Line(points={{46,37.4},{ + 46,32},{0,32},{0,29.6}}, + color={0,0,127})); + connect(switchPel.y, feedbackHeatFlowEvaporator.u2) + annotation (Line(points={{50,-71},{50,-82},{75.2,-82}}, color={0,0,127})); + connect(switchQCon.y, feedbackHeatFlowEvaporator.u1) annotation (Line(points={{-50,-67}, + {-50,-74},{80,-74},{80,-77.2}}, color={0,0,127})); + annotation (Icon(graphics={ + Line(points={{-60.0,40.0},{-60.0,-40.0},{60.0,-40.0},{60.0,40.0},{30.0,40.0},{30.0,-40.0},{-30.0,-40.0},{-30.0,40.0},{-60.0,40.0},{-60.0,20.0},{60.0,20.0},{60.0,0.0},{-60.0,0.0},{-60.0,-20.0},{60.0,-20.0},{60.0,-40.0},{-60.0,-40.0},{-60.0,40.0},{60.0,40.0},{60.0,-40.0}}), + Line(points={{0.0,40.0},{0.0,-40.0}}), + Rectangle(fillColor={255,255,0}, + fillPattern=FillPattern.Solid, + extent={{-60.0,0.0},{-30.0,20.0}}, + lineColor={0,0,0}), + Rectangle(fillColor={255,215,136}, + fillPattern=FillPattern.Solid, + extent={{-60.0,-40.0},{-30.0,-20.0}}), + Rectangle(fillColor={255,255,0}, + fillPattern=FillPattern.Solid, + extent={{-60,-20},{-30,0}}, + lineColor={0,0,0}), + Rectangle(fillColor={255,255,0}, + fillPattern=FillPattern.Solid, + extent={{-60,-40},{-30,-20}}, + lineColor={0,0,0}), + Rectangle(fillColor={255,255,0}, + fillPattern=FillPattern.Solid, + extent={{-30,-40},{0,-20}}, + lineColor={0,0,0}), + Rectangle(fillColor={255,255,0}, + fillPattern=FillPattern.Solid, + extent={{0,-40},{30,-20}}, + lineColor={0,0,0}), + Rectangle(fillColor={255,255,0}, + fillPattern=FillPattern.Solid, + extent={{30,-40},{60,-20}}, + lineColor={0,0,0}), + Rectangle(fillColor={255,255,0}, + fillPattern=FillPattern.Solid, + extent={{30,-20},{60,0}}, + lineColor={0,0,0}), + Rectangle(fillColor={255,255,0}, + fillPattern=FillPattern.Solid, + extent={{0,-20},{30,0}}, + lineColor={0,0,0}), + Rectangle(fillColor={255,255,0}, + fillPattern=FillPattern.Solid, + extent={{0,0},{30,20}}, + lineColor={0,0,0}), + Rectangle(fillColor={255,255,0}, + fillPattern=FillPattern.Solid, + extent={{30,0},{60,20}}, + lineColor={0,0,0}), + Rectangle(fillColor={255,255,0}, + fillPattern=FillPattern.Solid, + extent={{0,20},{30,40}}, + lineColor={0,0,0}), + Rectangle(fillColor={255,255,0}, + fillPattern=FillPattern.Solid, + extent={{30,20},{60,40}}, + lineColor={0,0,0}), + Rectangle(fillColor={255,255,0}, + fillPattern=FillPattern.Solid, + extent={{-60,20},{-30,40}}, + lineColor={0,0,0}), + Rectangle(fillColor={255,255,0}, + fillPattern=FillPattern.Solid, + extent={{-30,20},{0,40}}, + lineColor={0,0,0}), + Rectangle(fillColor={255,255,0}, + fillPattern=FillPattern.Solid, + extent={{-30,0},{0,20}}, + lineColor={0,0,0}), + Rectangle(fillColor={255,255,0}, + fillPattern=FillPattern.Solid, + extent={{-30,-20},{0,0}}, + lineColor={0,0,0})}), Documentation(info="+ Basic models showing the concept of using n-dimensional table data + for the innerCycle of the heat pump model. This model assumes one + provides data for inverter controlled heat pumps or chillers. + However, this basis structure can be used to create own models, where + electrical power and condenser depend on other inputs, such as + ambient temperature. +
+", revisions=" +This model uses 4-dimensional table data, wich are calculated for a simplyfied refrigerant circuit with the use of isentropic compressor efficienciecs as a function of pressure gradient and frequency, superheating and calibration of minimal temperature differencees in condeser and evaporater. The table data ist a function of THot, TSource, deltaTCon and relative power, which represents compressor frequency.
+Auslegung des Betriebspunktes indem die maximale elektrische Leistung vorliegt
+")); +end NominalHeatPumpNotManufacturer; diff --git a/AixLib/DataBase/ThermalMachines/HeatPump/PerformanceData/PolynomalApproach.mo b/AixLib/DataBase/ThermalMachines/HeatPump/PerformanceData/PolynomalApproach.mo new file mode 100644 index 0000000000..dbbb0a95a1 --- /dev/null +++ b/AixLib/DataBase/ThermalMachines/HeatPump/PerformanceData/PolynomalApproach.mo @@ -0,0 +1,65 @@ +within AixLib.DataBase.ThermalMachines.HeatPump.PerformanceData; +model PolynomalApproach + "Calculating heat pump data based on a polynomal approach" + extends + AixLib.DataBase.ThermalMachines.HeatPump.PerformanceData.BaseClasses.PartialPerformanceData; + + replaceable function PolyData = + AixLib.DataBase.ThermalMachines.HeatPump.Functions.Characteristics.PartialBaseFct + "Function to calculate peformance Data" annotation(choicesAllMatching=true); +protected + Real Char[2]; +equation + Char =PolyData( + sigBus.N, + sigBus.T_ret_co, + sigBus.T_flow_ev, + sigBus.m_flow_co, + sigBus.m_flow_ev); + if sigBus.N > Modelica.Constants.eps then + //Get's the data from the signal Bus and calculates the power and heat flow based on the function one chooses. + QCon = Char[2]; + Pel = Char[1]; + else //If heat pump is turned off, all values become zero. + QCon = 0; + Pel = 0; + end if; + QEva = -(QCon - Pel); + annotation (Icon(graphics={ + Text( + lineColor={0,0,255}, + extent={{-136,109},{164,149}}, + textString="%name"), + Ellipse( + lineColor = {108,88,49}, + fillColor = {255,215,136}, + fillPattern = FillPattern.Solid, + extent={{-86,-96},{88,64}}), + Text( + lineColor={108,88,49}, + extent={{-90,-108},{90,72}}, + textString="f")}), Documentation(revisions="+ This model is used to calculate the three values based on a + functional approach. The user can choose between several functions or + use their own. +
++ As the + base function only returns the electrical power and the condenser + heat flow, the evaporator heat flow is calculated with the following + energy balance: +
++ QEva = QCon - P_el +
+")); +end PolynomalApproach; diff --git a/AixLib/DataBase/ThermalMachines/HeatPump/PerformanceData/calcCOP.mo b/AixLib/DataBase/ThermalMachines/HeatPump/PerformanceData/calcCOP.mo new file mode 100644 index 0000000000..1d13a2dd35 --- /dev/null +++ b/AixLib/DataBase/ThermalMachines/HeatPump/PerformanceData/calcCOP.mo @@ -0,0 +1,69 @@ +within AixLib.DataBase.ThermalMachines.HeatPump.PerformanceData; +model calcCOP + "To calculate the COP or EER of a device, this model ensures no integration failure will happen" + + parameter Modelica.SIunits.Power lowBouPel "If P_el falls below this value, COP will not be calculated"; + parameter Modelica.SIunits.Time aveTime=60 "Time span for average"; + + Modelica.Blocks.Interfaces.RealInput Pel(final unit="W", final displayUnit= + "kW") + "Input for all electrical power consumed by the system" + annotation (Placement(transformation(extent={{-140,-60},{-100,-20}}), + iconTransformation(extent={{-140,-60},{-100,-20}}))); + Modelica.Blocks.Interfaces.RealInput QHeat(final unit="W", final displayUnit= + "kW") + "Input for all heating power delivered to the system" + annotation (Placement(transformation(extent={{-140,20},{-100,60}}), + iconTransformation(extent={{-140,20},{-100,60}}))); + Modelica.Blocks.Interfaces.RealOutput y_COP "Output for calculated COP value" + annotation (Placement(transformation(extent={{100,-10},{120,10}}))); +protected + AixLib.Utilities.Math.MovingAverage movAve(final aveTime=aveTime) + "To calculate the moving average of the output values"; +equation + //Check if any of the two sums are lower than the given threshold. If so, set COP to zero + if Pel < lowBouPel or QHeat < Modelica.Constants.eps then + movAve.u = 0; + else + movAve.u = QHeat/Pel; + end if; + connect(movAve.y, y_COP); + annotation (Icon(coordinateSystem(preserveAspectRatio=false), graphics={ + Line( + points={{-82,0},{-12,0}}, + color={28,108,200}, + thickness=0.5), + Text( + extent={{-92,32},{-2,12}}, + lineColor={28,108,200}, + lineThickness=0.5, + textString="QHeat"), + Text( + extent={{-92,-8},{-2,-28}}, + lineColor={28,108,200}, + lineThickness=0.5, + textString="Pel"), + Line(points={{-6,6},{22,6}}, color={28,108,200}), + Line(points={{-6,-6},{22,-6}}, color={28,108,200}), + Text( + extent={{12,8},{102,-12}}, + lineColor={28,108,200}, + lineThickness=0.5, + textString="COP")}), Diagram( + coordinateSystem(preserveAspectRatio=false)), + Documentation(revisions="+ This model is used to calculate the COP or the EER of a device. As + the electrical power could get negative, a lower boundary is used to + avoid division by zero. A moving average ensure a stable calculation + of the COP or EER. +
+")); +end calcCOP; diff --git a/AixLib/DataBase/ThermalMachines/HeatPump/PerformanceData/package.mo b/AixLib/DataBase/ThermalMachines/HeatPump/PerformanceData/package.mo new file mode 100644 index 0000000000..86da0ddcf3 --- /dev/null +++ b/AixLib/DataBase/ThermalMachines/HeatPump/PerformanceData/package.mo @@ -0,0 +1,24 @@ +within AixLib.DataBase.ThermalMachines.HeatPump; +package PerformanceData "Different models used for a black box heat pump model" + + + + + + + + +annotation (Documentation(revisions="+ This package contains models for the grey box heat pump model + AixLib.Fluid.HeatPumps.HeatPump. +
+")); +end PerformanceData; diff --git a/AixLib/DataBase/ThermalMachines/HeatPump/PerformanceData/package.order b/AixLib/DataBase/ThermalMachines/HeatPump/PerformanceData/package.order new file mode 100644 index 0000000000..2c062efb48 --- /dev/null +++ b/AixLib/DataBase/ThermalMachines/HeatPump/PerformanceData/package.order @@ -0,0 +1,8 @@ +IcingBlock +LookUpTable2D +LookUpTableND +PolynomalApproach +calcCOP +BaseClasses +LookUpTableNDNotManudacturer +NominalHeatPumpNotManufacturer diff --git a/AixLib/Fluid/BaseClasses/PartialInnerCycle.mo b/AixLib/Fluid/BaseClasses/PartialInnerCycle.mo index a21c5ec0e9..b526bf6b9e 100644 --- a/AixLib/Fluid/BaseClasses/PartialInnerCycle.mo +++ b/AixLib/Fluid/BaseClasses/PartialInnerCycle.mo @@ -5,6 +5,31 @@ partial model PartialInnerCycle parameter Boolean use_rev=true "True if the thermal machine is reversible"; parameter Real scalingFactor=1 "Scaling factor of thermal machine"; + + +//NotManufacturer + +parameter Modelica.SIunits.Temperature THotMax=333.15 "Max. value of THot before shutdown" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + parameter Modelica.SIunits.Temperature THotNom=313.15 "Nominal temperature of THot" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + parameter Modelica.SIunits.Temperature TSourceNom=278.15 "Nominal temperature of TSource" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + parameter Modelica.SIunits.HeatFlowRate QNom=30000 "Nominal heat flow" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + parameter Real PLRMin=0.4 "Limit of PLR; less =0" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + parameter Boolean HighTemp=false "true: THot > 60°C" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + parameter Modelica.SIunits.TemperatureDifference DeltaTCon=7 "Temperature difference heat sink condenser" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + parameter Modelica.SIunits.TemperatureDifference DeltaTEvap=3 "Temperature difference heat source evaporator" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + parameter Modelica.SIunits.Temperature TSource=280 "Temperature of heat source" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + parameter Boolean dTConFix=false "Constant delta T condenser" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + AixLib.Controls.Interfaces.ThermalMachineControlBus sigBus annotation ( Placement(transformation(extent={{-18,86},{18,118}}), iconTransformation( extent={{-16,88},{18,118}}))); diff --git a/AixLib/Fluid/BaseClasses/PartialReversibleThermalMachine.mo b/AixLib/Fluid/BaseClasses/PartialReversibleThermalMachine.mo index 97323bb097..641815f0fe 100644 --- a/AixLib/Fluid/BaseClasses/PartialReversibleThermalMachine.mo +++ b/AixLib/Fluid/BaseClasses/PartialReversibleThermalMachine.mo @@ -193,6 +193,29 @@ partial model PartialReversibleThermalMachine parameter Boolean linearized=false "= true, use linear relation between m_flow and dp for any flow rate" annotation (Dialog(tab="Advanced", group="Flow resistance")); +//NotManufacturer + +parameter Modelica.SIunits.Temperature THotMax=333.15 "Max. value of THot before shutdown" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + parameter Modelica.SIunits.Temperature THotNom=313.15 "Nominal temperature of THot" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + parameter Modelica.SIunits.Temperature TSourceNom=278.15 "Nominal temperature of TSource" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + parameter Modelica.SIunits.HeatFlowRate QNom=30000 "Nominal heat flow" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + parameter Real PLRMin=0.4 "Limit of PLR; less =0" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + parameter Boolean HighTemp=false "true: THot > 60°C" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + parameter Modelica.SIunits.TemperatureDifference DeltaTCon=7 "Temperature difference heat sink condenser" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + parameter Modelica.SIunits.TemperatureDifference DeltaTEvap=3 "Temperature difference heat source evaporator" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + parameter Modelica.SIunits.Temperature TSource=280 "Temperature of heat source" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + parameter Boolean dTConFix=false "Constant delta T condenser" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + AixLib.Fluid.HeatExchangers.EvaporatorCondenserWithCapacity con( redeclare final package Medium = Medium_con, @@ -559,7 +582,8 @@ equation color={0,127,255})); connect(port_b1, senT_b1.port_b) annotation (Line(points={{100,60},{72,60},{72, 92},{48,92}}, color={0,127,255})); - annotation (Icon(coordinateSystem(extent={{-100,-120},{100,120}}), graphics={ + annotation (Dialog(tab="NotManufacturer", group="General machine information"), + Icon(coordinateSystem(extent={{-100,-120},{100,120}}), graphics={ Rectangle( extent={{-16,83},{16,-83}}, fillColor={170,213,255}, diff --git a/AixLib/Fluid/BoilerCHP/BaseClasses/Controllers/ControlBoilerNotManufacturer.mo b/AixLib/Fluid/BoilerCHP/BaseClasses/Controllers/ControlBoilerNotManufacturer.mo new file mode 100644 index 0000000000..1110cf751c --- /dev/null +++ b/AixLib/Fluid/BoilerCHP/BaseClasses/Controllers/ControlBoilerNotManufacturer.mo @@ -0,0 +1,140 @@ +within AixLib.Fluid.BoilerCHP.BaseClasses.Controllers; +model ControlBoilerNotManufacturer + + parameter Modelica.SIunits.TemperatureDifference DeltaTWaterNom=20 "Temperature difference nominal"; + parameter Modelica.SIunits.Temperature TColdNom=273.15+35 "Return temperature TCold"; + parameter Modelica.SIunits.HeatFlowRate QNom=50000 "Thermal dimension power"; + parameter Boolean m_flowVar=false "Use variable water massflow"; + + parameter Boolean Pump=true "Model includes a pump"; + + + + parameter Boolean Advanced=false "dTWater is constant for different PLR"; + + parameter Modelica.SIunits.TemperatureDifference dTWaterSet=15 "Temperature difference setpoint"; + + parameter Modelica.SIunits.Temperature THotMax=273.15+90 "Maximal temperature to force shutdown"; + parameter Real PLRMin=0.15 "Minimal Part Load Ratio"; + + parameter Modelica.SIunits.Temperature TStart=273.15+20 "T start"; + + + replaceable package Medium =Media.Water constrainedby + Modelica.Media.Interfaces.PartialMedium "Medium heat source" + annotation (choices( + choice(redeclare package Medium = AixLib.Media.Water "Water"), + choice(redeclare package Medium = + AixLib.Media.Antifreeze.PropyleneGlycolWater ( + property_T=293.15, + X_a=0.40) + "Propylene glycol water, 40% mass fraction"))); + + + Modelica.Blocks.Continuous.LimPID PID( + controllerType=Modelica.Blocks.Types.SimpleController.PI, + k=0.01, + Ti=10, + yMax=1, + yMin=0) annotation (Placement(transformation(extent={{40,50},{60,70}}))); + Modelica.Blocks.Math.Add add(k1=-1) + annotation (Placement(transformation(extent={{-60,10},{-40,30}}))); + Modelica.Blocks.Logical.Switch switch6 + annotation (Placement(transformation(extent={{-80,70},{-60,50}}))); + Modelica.Blocks.Logical.Switch switch5 + annotation (Placement(transformation(extent={{76,90},{96,70}}))); + Modelica.Blocks.Interfaces.RealOutput mFlowRel "relative mass flow [0, 1]" + annotation (Placement(transformation(extent={{100,70},{120,90}}))); + Modelica.Blocks.Interfaces.RealInput DeltaTWater_a + "Temperature difference Water" + annotation (Placement(transformation(extent={{-140,-50},{-100,-10}}))); + Modelica.Blocks.Sources.RealExpression dTSetpointReal2(y=dTWaterSet) + "Real input temperature difference setpoint" + annotation (Placement(transformation(extent={{-30,-24},{-10,-4}}))); + Modelica.Blocks.Sources.BooleanExpression booleanExpression(y=m_flowVar) + annotation (Placement(transformation(extent={{-100,-106},{-82,-86}}))); + Modelica.Blocks.Logical.Switch switch2 + annotation (Placement(transformation(extent={{0,-32},{20,-12}}))); + Modelica.Blocks.Logical.Or or1 + annotation (Placement(transformation(extent={{-10,-90},{10,-70}}))); + Modelica.Blocks.Sources.BooleanExpression booleanExpression1(y=Advanced) + annotation (Placement(transformation(extent={{-100,-80},{-74,-60}}))); + Modelica.Blocks.Logical.Change change1 + annotation (Placement(transformation(extent={{-56,-80},{-36,-60}}))); + Modelica.Blocks.Logical.Switch switch1 + annotation (Placement(transformation(extent={{58,-62},{78,-42}}))); + Modelica.Blocks.Sources.RealExpression dTWaterNom(y=DeltaTWaterNom) + "Real input temperature difference dimension point" + annotation (Placement(transformation(extent={{24,-70},{50,-52}}))); + Modelica.Blocks.Interfaces.RealInput THot "Temperature hot water" + annotation (Placement(transformation(extent={{-140,-20},{-100,20}}))); + Modelica.Blocks.Interfaces.RealOutput DeltaTWater_b + annotation (Placement(transformation(extent={{100,-62},{120,-42}}))); + Modelica.Blocks.Sources.RealExpression realOne(y=1) + annotation (Placement(transformation(extent={{40,80},{50,96}}))); + Modelica.Blocks.Interfaces.RealInput TCold + "Temperature hot water" + annotation (Placement(transformation(extent={{-140,10},{-100,50}}))); + Modelica.Blocks.Math.Gain gain2(k=-1) + annotation (Placement(transformation(extent={{10,-10},{-10,10}}, + rotation=180, + origin={0,60}))); + Modelica.Blocks.Math.Gain gain1(k=-1) + annotation (Placement(transformation(extent={{10,-10},{-10,10}}, + rotation=180, + origin={0,20}))); +equation + connect(switch5.y, mFlowRel) + annotation (Line(points={{97,80},{110,80}}, color={0,0,127})); + connect(booleanExpression.y,or1. u2) annotation (Line(points={{-81.1,-96},{ + -50,-96},{-50,-88},{-12,-88}}, + color={255,0,255})); + connect(or1.y,switch1. u2) annotation (Line(points={{11,-80},{20,-80},{20,-52}, + {56,-52}}, color={255,0,255})); + connect(booleanExpression1.y,switch2. u2) annotation (Line(points={{-72.7,-70}, + {-64,-70},{-64,-22},{-2,-22}}, color={255,0, + 255})); + connect(switch1.y, switch6.u1) annotation (Line(points={{79,-52},{84,-52},{84, + -116},{-146,-116},{-146,52},{-82,52}},color={0,0,127})); + connect(or1.y, switch6.u2) annotation (Line(points={{11,-80},{20,-80},{20,-52}, + {-138,-52},{-138,60},{-82,60}}, color={255,0,255})); + connect(dTSetpointReal2.y,switch2. u1) annotation (Line(points={{-9,-14},{-2, + -14}}, color={0,0,127})); + connect(booleanExpression1.y,change1. u) annotation (Line(points={{-72.7,-70}, + {-58,-70}}, color={255,0,255})); + connect(or1.u1,change1. y) annotation (Line(points={{-12,-80},{-32,-80},{-32, + -70},{-35,-70}}, color={255,0,255})); + connect(switch2.y, switch6.u3) annotation (Line(points={{21,-22},{26,-22},{26, + -46},{-156,-46},{-156,68},{-82,68}}, color={0,0,127})); + connect(or1.y, switch5.u2) annotation (Line(points={{11,-80},{20,-80},{20,-52}, + {-138,-52},{-138,80},{74,80}}, color={255,0,255})); + connect(switch2.y,switch1. u1) annotation (Line(points={{21,-22},{42,-22},{42, + -44},{56,-44}}, color={0,0,127})); + connect(DeltaTWater_a, switch2.u3) + annotation (Line(points={{-120,-30},{-2,-30}}, color={0,0,127})); + connect(dTWaterNom.y, switch1.u3) + annotation (Line(points={{51.3,-61},{56,-61},{56,-60}}, color={0,0,127})); + connect(switch1.y, DeltaTWater_b) + annotation (Line(points={{79,-52},{110,-52}}, color={0,0,127})); + connect(realOne.y, switch5.u3) + annotation (Line(points={{50.5,88},{74,88}}, color={0,0,127})); + connect(PID.y, switch5.u1) annotation (Line(points={{61,60},{64,60},{64,72},{ + 74,72}}, color={0,0,127})); + connect(THot, add.u2) annotation (Line(points={{-120,0},{-80,0},{-80,14},{-62, + 14}}, color={0,0,127})); + connect(TCold, add.u1) annotation (Line(points={{-120,30},{-80,30},{-80,26},{ + -62,26}}, color={0,0,127})); + connect(switch6.y, gain2.u) + annotation (Line(points={{-59,60},{-12,60}}, color={0,0,127})); + connect(gain2.y, PID.u_s) + annotation (Line(points={{11,60},{38,60}}, color={0,0,127})); + connect(add.y, gain1.u) + annotation (Line(points={{-39,20},{-12,20}}, color={0,0,127})); + connect(gain1.y, PID.u_m) + annotation (Line(points={{11,20},{50,20},{50,48}}, color={0,0,127})); + annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram( + coordinateSystem(preserveAspectRatio=false)), + Documentation(info=" +Boiler control unit, which estimates the relative water mass flow and chooses the right water temperature difference.
+")); +end ControlBoilerNotManufacturer; diff --git a/AixLib/Fluid/BoilerCHP/BaseClasses/Controllers/ControlCHPNotManufacturer.mo b/AixLib/Fluid/BoilerCHP/BaseClasses/Controllers/ControlCHPNotManufacturer.mo new file mode 100644 index 0000000000..dbdcf6cc4b --- /dev/null +++ b/AixLib/Fluid/BoilerCHP/BaseClasses/Controllers/ControlCHPNotManufacturer.mo @@ -0,0 +1,116 @@ +within AixLib.Fluid.BoilerCHP.BaseClasses.Controllers; +model ControlCHPNotManufacturer + + parameter Modelica.SIunits.Power PelNom=200000 "Nominal electrical power"; + + parameter Modelica.SIunits.TemperatureDifference deltaTHeatingCircuit=20 "Nominal temperature difference heat circuit"; + + parameter Modelica.SIunits.Temperature THotCoolingWaterMax=273.15+95 "Max. water temperature THot heat circuit"; + + parameter Real PLRMin=0.5; + + parameter Modelica.SIunits.Temperature TStart=273.15+20 "T start" + annotation (Dialog(tab="Advanced")); + + + + + Modelica.Blocks.Sources.RealExpression TMin(y=273.15 + 81) "MinimalStartTemp" + annotation (Placement(transformation(extent={{-104,58},{-80,76}}))); + Modelica.Blocks.Math.Add add3 + annotation (Placement(transformation(extent={{-58,54},{-42,70}}))); + NominalBehaviourNotManufacturer nominalBehaviourNotManufacturer(PelNom= + PelNom) + annotation (Placement(transformation(extent={{-100,2},{-80,22}}))); + Modelica.Blocks.Continuous.LimPID PID3( + controllerType=Modelica.Blocks.Types.SimpleController.PI, + k=0.01, + Ti=10, + yMax=1, + yMin=0) + annotation (Placement(transformation(extent={{-34,52},{-14,72}}))); + Modelica.Blocks.Sources.RealExpression realExpression4(y=1) + annotation (Placement(transformation(extent={{-26,80},{-16,100}}))); + Modelica.Blocks.Math.Abs abs1 + annotation (Placement(transformation(extent={{0,20},{20,40}}))); + Modelica.Blocks.Nonlinear.Limiter limiter(uMax=1, uMin=0) + annotation (Placement(transformation(extent={{30,24},{42,36}}))); + Modelica.Blocks.Math.Product mflowCC + annotation (Placement(transformation(extent={{-6,-10},{14,10}}))); + Modelica.Blocks.Logical.Switch switch1 annotation (Placement(transformation( + extent={{-10,-10},{10,10}}, + rotation=0, + origin={60,-70}))); + Modelica.Blocks.Logical.Or or1 + annotation (Placement(transformation(extent={{-68,-60},{-48,-40}}))); + Modelica.Blocks.Math.Add add1(k1=-1) + annotation (Placement(transformation(extent={{0,58},{20,78}}))); + Modelica.Blocks.Interfaces.RealInput TVolume + "Temperature cooling water exhaust heat exchanger exit" + annotation (Placement(transformation(extent={{-140,10},{-100,50}}))); + Modelica.Blocks.Sources.RealExpression realExpression2(y=0) + annotation (Placement(transformation(extent={{-14,-72},{-4,-52}}))); + Modelica.Blocks.Interfaces.BooleanInput shutdown + annotation (Placement(transformation(extent={{-140,-46},{-100,-6}}))); + Modelica.Blocks.Interfaces.BooleanInput PLROff + annotation (Placement(transformation(extent={{-140,-100},{-100,-60}}))); + Modelica.Blocks.Interfaces.RealOutput mFlowRelHC "Normalized mFlow HC" + annotation (Placement(transformation(extent={{100,-80},{120,-60}}))); + Modelica.Blocks.Interfaces.RealOutput mFlowCC "Absolut mFlow CC" + annotation (Placement(transformation(extent={{100,-18},{120,2}}))); + Modelica.Blocks.Logical.Switch switch2 annotation (Placement(transformation( + extent={{-10,-10},{10,10}}, + rotation=0, + origin={74,-8}))); +equation + connect(nominalBehaviourNotManufacturer.dTCCNom,add3. u2) annotation (Line( + points={{-79,12},{-66,12},{-66,57.2},{-59.6,57.2}}, + color={0,0,127})); + connect(TMin.y,add3. u1) annotation (Line(points={{-78.8,67},{-68,67},{-68, + 66.8},{-59.6,66.8}}, color={0,0,127})); + connect(add3.y,PID3. u_s) annotation (Line(points={{-41.2,62},{-36,62}}, + color={0,0,127})); + connect(PID3.y, add1.u2) annotation (Line(points={{-13,62},{-2,62}}, + color={0,0,127})); + connect(realExpression4.y, add1.u1) annotation (Line(points={{-15.5,90},{-12, + 90},{-12,74},{-2,74}}, color={0,0,127})); + connect(add1.y,abs1. u) annotation (Line(points={{21,68},{22,68},{22,46},{-8, + 46},{-8,30},{-2,30}}, color={0,0,127})); + connect(abs1.y,limiter. u) annotation (Line(points={{21,30},{28.8,30}}, + color={0,0,127})); + connect(nominalBehaviourNotManufacturer.mWaterCC,mflowCC. u1) annotation ( + Line(points={{-79,6},{-8,6}}, color={0,0, + 127})); + connect(or1.y, switch1.u2) annotation (Line(points={{-47,-50},{-38,-50},{-38, + -70},{48,-70}}, color={255,0,255})); + connect(TVolume, PID3.u_m) + annotation (Line(points={{-120,30},{-24,30},{-24,50}}, color={0,0,127})); + connect(limiter.y, mflowCC.u2) annotation (Line(points={{42.6,30},{56,30},{56, + -6},{-8,-6}}, color={0,0,127})); + connect(shutdown, or1.u1) annotation (Line(points={{-120,-26},{-92,-26},{-92, + -50},{-70,-50}}, + color={255,0,255})); + connect(PLROff, or1.u2) annotation (Line(points={{-120,-80},{-92,-80},{-92, + -58},{-70,-58}}, color={255,0,255})); + connect(switch1.y, mFlowRelHC) + annotation (Line(points={{71,-70},{110,-70}}, color={0,0,127})); + connect(switch2.y, mFlowCC) annotation (Line(points={{85,-8},{92,-8},{92,-8}, + {110,-8}}, color={0,0,127})); + connect(or1.y, switch2.u2) annotation (Line(points={{-47,-50},{28,-50},{28,-8}, + {62,-8}}, color={255,0,255})); + connect(realExpression2.y, switch1.u1) + annotation (Line(points={{-3.5,-62},{48,-62}}, color={0,0,127})); + connect(mflowCC.y, switch2.u3) annotation (Line(points={{15,0},{44,0},{44,-16}, + {62,-16}}, color={0,0,127})); + connect(limiter.y, switch1.u3) annotation (Line(points={{42.6,30},{46,30},{46, + -40},{36,-40},{36,-78},{48,-78}}, color={0,0,127})); + connect(realExpression2.y, switch2.u1) annotation (Line(points={{-3.5,-62},{ + 30,-62},{30,2},{62,2},{62,0}}, color={0,0,127})); + annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram( + coordinateSystem(preserveAspectRatio=false)), + Documentation(info=" +Controlunit of BHKW water massflows. Both massflows depends on the temperature of the volume of PartialHeatGenerator which represents the water temperature after exhaust heat exchanger.
+To describe a realistic beahviour during a cold start the system increases water massflows after TVolume has reached nominal temperature:file:
++")); +end ControlCHPNotManufacturer; diff --git a/AixLib/Fluid/BoilerCHP/BaseClasses/Controllers/ReturnInfluence.mo b/AixLib/Fluid/BoilerCHP/BaseClasses/Controllers/ReturnInfluence.mo new file mode 100644 index 0000000000..ca8a5d4910 --- /dev/null +++ b/AixLib/Fluid/BoilerCHP/BaseClasses/Controllers/ReturnInfluence.mo @@ -0,0 +1,120 @@ +within AixLib.Fluid.BoilerCHP.BaseClasses.Controllers; +model ReturnInfluence + + parameter Modelica.SIunits.Temperature TColdNom=273.15+35 "Nominal TCold"; + parameter Modelica.SIunits.HeatFlowRate QNom=50000 "Nominal thermal power"; + parameter Modelica.SIunits.TemperatureDifference dTWaterNom=20 "Nominal temperature difference heat circuit"; + parameter Boolean m_flowVar=false; + + + Modelica.Blocks.Interfaces.RealInput TColdMeasure(final quantity= + "ThermodynamicTemperature") "Measured temperature of Water return flow" + annotation (Placement(transformation( + extent={{-20,-20},{20,20}}, + rotation=0, + origin={-120,70}))); + Modelica.Blocks.Interfaces.RealOutput Q_flow(final quantity="Power", final + unit="W") + annotation (Placement(transformation(extent={{100,-10},{120,10}}))); + + Modelica.Blocks.Interfaces.RealInput PLR "Part Load Ratio" + annotation (Placement( + transformation( + extent={{-20,-20},{20,20}}, + rotation=0, + origin={-120,0}))); + SDF.NDTable ReturnFlowBehaviour_mNom( + nin=4, + readFromFile=true, + filename=Filename, + dataset="/Eta_TCold", + dataUnit="-", + scaleUnits={"K","degC","-","K"}, + interpMethod=SDF.Types.InterpolationMethod.Linear) + annotation (Placement(transformation(extent={{36,-4},{56,16}}))); + Modelica.Blocks.Sources.RealExpression tColdNom(y=TColdNom) + "Return Water temperature Setpoint" + annotation (Placement(transformation(extent={{-102,20},{-82,40}}))); + + Modelica.Blocks.Math.Product etaCalculation + "calculates the efficiency of the boiler" annotation (Placement( + transformation( + extent={{-10,-10},{10,10}}, + rotation=0, + origin={76,0}))); + Modelica.Blocks.Math.Add add(k1=1, k2=-1) + annotation (Placement(transformation(extent={{-28,38},{-8,58}}))); + + Modelica.Blocks.Interfaces.RealInput dTWater + "temperature difference THot-TCold" annotation (Placement(transformation( + extent={{-20,-20},{20,20}}, + rotation=0, + origin={-120,-70}))); + Modelica.Thermal.HeatTransfer.Celsius.FromKelvin fromKelvin + annotation (Placement(transformation(extent={{-70,20},{-50,40}}))); + Modelica.Blocks.Routing.Multiplex4 multiplex4_1 + annotation (Placement(transformation(extent={{4,-4},{24,16}}))); + Modelica.Blocks.Sources.RealExpression qSetpoint(y=QNom) + "Return Water temperature Setpoint" + annotation (Placement(transformation(extent={{-46,-30},{-26,-10}}))); + Modelica.Blocks.Math.Product etaCalculation1 + "calculates the efficiency of the boiler" annotation (Placement( + transformation( + extent={{-10,-10},{10,10}}, + rotation=0, + origin={10,-26}))); + Modelica.Thermal.HeatTransfer.Celsius.FromKelvin fromKelvin1 + annotation (Placement(transformation(extent={{-68,60},{-48,80}}))); + Modelica.Blocks.Interfaces.RealInput QLosses "Thermal losses" annotation ( + Placement(transformation( + extent={{-20,-20},{20,20}}, + rotation=90, + origin={0,-120}))); + Modelica.Blocks.Math.Add add1(k1=1, k2=1) + annotation (Placement(transformation(extent={{68,-64},{88,-44}}))); +protected + parameter String Filename= if m_flowVar==false then "D:/dja-mzu/SDF/Boiler/Eta_TCold_mNom.sdf" else "D:/dja-mzu/SDF/Boiler/Eta_TCold_mVar.sdf"; + +equation + + + connect(tColdNom.y, fromKelvin.Kelvin) + annotation (Line(points={{-81,30},{-72,30}}, color={0,0,127})); + connect(add.y, multiplex4_1.u1[1]) annotation (Line(points={{-7,48},{0,48},{0, + 15},{2,15}}, color={0,0,127})); + connect(dTWater, multiplex4_1.u4[1]) annotation (Line(points={{-120,-70},{-60, + -70},{-60,-3},{2,-3}}, color={0,0,127})); + connect(PLR, multiplex4_1.u3[1]) annotation (Line(points={{-120,0},{-88,0},{ + -88,3},{2,3}}, color={0,0,127})); + connect(fromKelvin.Celsius, multiplex4_1.u2[1]) annotation (Line(points={{-49,30}, + {-40,30},{-40,9},{2,9}}, color={0,0,127})); + connect(multiplex4_1.y, ReturnFlowBehaviour_mNom.u) + annotation (Line(points={{25,6},{34,6}}, color={0,0,127})); + connect(qSetpoint.y, etaCalculation1.u1) + annotation (Line(points={{-25,-20},{-2,-20}}, color={0,0,127})); + connect(PLR, etaCalculation1.u2) annotation (Line(points={{-120,0},{-88,0},{ + -88,-32},{-2,-32}},color={0,0,127})); + connect(fromKelvin.Celsius, add.u2) annotation (Line(points={{-49,30},{-40,30}, + {-40,42},{-30,42}}, color={0,0,127})); + connect(etaCalculation1.y, etaCalculation.u2) annotation (Line(points={{21,-26}, + {58,-26},{58,-6},{64,-6}}, color={0,0,127})); + connect(ReturnFlowBehaviour_mNom.y, etaCalculation.u1) + annotation (Line(points={{57,6},{64,6}}, color={0,0,127})); + connect(TColdMeasure, fromKelvin1.Kelvin) + annotation (Line(points={{-120,70},{-70,70}}, color={0,0,127})); + connect(fromKelvin1.Celsius, add.u1) annotation (Line(points={{-47,70},{-40, + 70},{-40,54},{-30,54}}, color={0,0,127})); + connect(etaCalculation.y, add1.u1) annotation (Line(points={{87,0},{92,0},{92, + -38},{60,-38},{60,-48},{66,-48}}, color={0,0,127})); + connect(QLosses, add1.u2) + annotation (Line(points={{0,-120},{0,-60},{66,-60}}, color={0,0,127})); + connect(add1.y, Q_flow) annotation (Line(points={{89,-54},{98,-54},{98,0},{ + 110,0}}, color={0,0,127})); + annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram( + coordinateSystem(preserveAspectRatio=false)), + Documentation(info=" +
This Model calculates the change of efficiency and heat flow in case of TCold is different from nominal TCold. For example, if TCold decreases the exhaust temperature will decrease as well and the heatflow increases.
+ +"), + experiment(StopTime=86400, __Dymola_NumberOfIntervals=3600)); +end ReturnInfluence; diff --git a/AixLib/Fluid/BoilerCHP/BaseClasses/Controllers/StationaryBehaviour.mo b/AixLib/Fluid/BoilerCHP/BaseClasses/Controllers/StationaryBehaviour.mo new file mode 100644 index 0000000000..4313ad635d --- /dev/null +++ b/AixLib/Fluid/BoilerCHP/BaseClasses/Controllers/StationaryBehaviour.mo @@ -0,0 +1,106 @@ +within AixLib.Fluid.BoilerCHP.BaseClasses.Controllers; +model StationaryBehaviour + + parameter Modelica.SIunits.Temperature TColdNom=273.15+35 "Nominal TCold"; + parameter Modelica.SIunits.HeatFlowRate QNom=50000 "Nominal thermal power"; + parameter AixLib.DataBase.Boiler.EtaTExhaust.EtaTExhaustBaseDataDefinition paramEta=AixLib.DataBase.Boiler.EtaTExhaust.Ambient1(); + parameter Real EtaTable[:,2]=paramEta.EtaTable; + parameter Modelica.SIunits.TemperatureDifference dTWaterNom=20 "Nominal temperature difference heat circuit"; + parameter Boolean m_flowVar=false; + + + SDF.NDTable BoilerBehaviour_mNom( + nin=3, + readFromFile=true, + filename=Filename, + dataset="/ExhaustTemp", + dataUnit="degC", + scaleUnits={"degC","-","K"}, + interpMethod=SDF.Types.InterpolationMethod.Linear) + annotation (Placement(transformation(extent={{-20,36},{0,56}}))); + + Modelica.Blocks.Interfaces.RealInput PLR "Part Load Ratio" + annotation (Placement(transformation(extent={{-140,40},{-100,80}}))); + Modelica.Blocks.Sources.RealExpression Dim1(y=TColdNom) "Nominal TCold" + annotation (Placement(transformation(extent={{-100,74},{-80,94}}))); + Modelica.Blocks.Interfaces.RealOutput TExhaust(final quantity="Temperature", + final unit="degC") "Exhaust temperature" + annotation (Placement(transformation(extent={{100,36},{120,56}}))); + Modelica.Blocks.Tables.CombiTable1D combiTable1D( + tableOnFile=false, + table=EtaTable, + columns={2}, + smoothness=Modelica.Blocks.Types.Smoothness.LinearSegments) + "Table with efficiency parameters" + annotation (Placement(transformation(extent={{28,10},{48,30}}))); + Modelica.Blocks.Interfaces.RealInput QLosses "Thermal losses" annotation ( + Placement(transformation( + extent={{-20,-20},{20,20}}, + rotation=90, + origin={0,-120}))); + + Modelica.Blocks.Interfaces.RealInput dTWater + "temperature difference THot-TCold" + annotation (Placement(transformation(extent={{-140,0},{-100,40}}))); + + Modelica.Blocks.Interfaces.RealOutput PowerDemand(quantity="Power", final + unit="W") "Power demand" annotation (Placement(transformation( + extent={{-10,-10},{10,10}}, + rotation=0, + origin={110,-36}),iconTransformation( + extent={{-10,-10},{10,10}}, + rotation=90, + origin={0,110}))); + Modelica.Blocks.Sources.RealExpression qNom(y=QNom) "Nominal heat flow" + annotation (Placement(transformation(extent={{-102,-86},{-82,-66}}))); + Modelica.Blocks.Math.Product qSetPoint "Product QSetPoint" + annotation (Placement(transformation(extent={{-68,-80},{-48,-60}}))); + Modelica.Blocks.Routing.Multiplex3 multiplex3_1 + annotation (Placement(transformation(extent={{-66,36},{-46,56}}))); + Modelica.Thermal.HeatTransfer.Celsius.FromKelvin fromKelvin + annotation (Placement(transformation(extent={{-66,74},{-46,94}}))); + Modelica.Blocks.Math.Division division + annotation (Placement(transformation(extent={{-10,-50},{10,-30}}))); + Modelica.Blocks.Math.Add add1 + annotation (Placement(transformation(extent={{40,-74},{60,-54}}))); +protected + parameter String Filename= if m_flowVar==false then "D:/dja-mzu/SDF/Boiler/TAg_mNom.sdf" else "D:/dja-mzu/SDF/Boiler/TAg_mVar.sdf"; + +equation + + + connect(BoilerBehaviour_mNom.y, combiTable1D.u[1]) annotation (Line(points={{1,46},{ + 16,46},{16,20},{26,20}}, color={0,0,127})); + connect(BoilerBehaviour_mNom.y, TExhaust) + annotation (Line(points={{1,46},{110,46}}, color={0,0,127})); + connect(PLR, qSetPoint.u1) annotation (Line(points={{-120,60},{-90,60},{-90, + -64},{-70,-64}}, color={0,0,127})); + connect(qNom.y, qSetPoint.u2) + annotation (Line(points={{-81,-76},{-70,-76}}, color={0,0,127})); + connect(PLR, multiplex3_1.u2[1]) annotation (Line(points={{-120,60},{-90,60}, + {-90,46},{-68,46}}, color={0,0,127})); + connect(dTWater, multiplex3_1.u3[1]) annotation (Line(points={{-120,20},{-80, + 20},{-80,39},{-68,39}}, color={0,0,127})); + connect(multiplex3_1.y, BoilerBehaviour_mNom.u) + annotation (Line(points={{-45,46},{-22,46}}, color={0,0,127})); + connect(Dim1.y, fromKelvin.Kelvin) + annotation (Line(points={{-79,84},{-68,84}}, color={0,0,127})); + connect(fromKelvin.Celsius, multiplex3_1.u1[1]) annotation (Line(points={{-45,84}, + {-40,84},{-40,70},{-80,70},{-80,53},{-68,53}}, color={0,0,127})); + connect(qSetPoint.y, division.u1) annotation (Line(points={{-47,-70},{-34,-70}, + {-34,-34},{-12,-34}}, color={0,0,127})); + connect(combiTable1D.y[1], division.u2) annotation (Line(points={{49,20},{54, + 20},{54,-22},{-54,-22},{-54,-46},{-12,-46}}, color={0,0,127})); + connect(add1.y, PowerDemand) annotation (Line(points={{61,-64},{78,-64},{78, + -36},{110,-36}}, color={0,0,127})); + connect(QLosses, add1.u2) + annotation (Line(points={{0,-120},{0,-70},{38,-70}}, color={0,0,127})); + connect(division.y, add1.u1) annotation (Line(points={{11,-40},{20,-40},{20, + -58},{38,-58}}, color={0,0,127})); + annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram( + coordinateSystem(preserveAspectRatio=false)), + Documentation(info=" +This model estimates the exhaust temperature. The adiabatic efficiency is a function of the exhaust temperature. The power demand is the sum of the ambient losses, the given thermal power of the setpoint and the exhaust losses.
+ +")); +end StationaryBehaviour; diff --git a/AixLib/Fluid/BoilerCHP/BaseClasses/Controllers/package.order b/AixLib/Fluid/BoilerCHP/BaseClasses/Controllers/package.order index 15822897db..e6f4bfe8ed 100644 --- a/AixLib/Fluid/BoilerCHP/BaseClasses/Controllers/package.order +++ b/AixLib/Fluid/BoilerCHP/BaseClasses/Controllers/package.order @@ -5,3 +5,7 @@ ExternalControlNightDayHC InternalControl PIController PartialExternalControl +ReturnInfluence +StationaryBehaviour +ControlCHPNotManufacturer +ControlBoilerNotManufacturer diff --git a/AixLib/Fluid/BoilerCHP/BaseClasses/NominalBehaviourNotManufacturer.mo b/AixLib/Fluid/BoilerCHP/BaseClasses/NominalBehaviourNotManufacturer.mo new file mode 100644 index 0000000000..5e335aadf5 --- /dev/null +++ b/AixLib/Fluid/BoilerCHP/BaseClasses/NominalBehaviourNotManufacturer.mo @@ -0,0 +1,131 @@ +within AixLib.Fluid.BoilerCHP.BaseClasses; +model NominalBehaviourNotManufacturer + + + + parameter Modelica.SIunits.Power PelNom=100000; + + parameter String Filename_PTHR= "D:/dja-mzu/SDF/BHKW/Stromkennzahl.sdf"; + parameter String Filename_EtaEL= "D:/dja-mzu/SDF/BHKW/EtaEL.sdf"; + parameter String Filename_RCW= "D:/dja-mzu/SDF/BHKW/RatioCoolingWater.sdf"; + +parameter Modelica.SIunits.TemperatureDifference deltaTHeatingCircuit=20 "Nominal temperature difference heat circuit"; + +parameter Modelica.SIunits.TemperatureDifference deltaTCoolingCircuit=3.47 "Nominal temperature difference heat circuit"; + + + + SDF.NDTable SDFStromkennzahl( + nin=2, + readFromFile=true, + filename=Filename_PTHR, + dataset="/PTHR", + dataUnit="[-]", + scaleUnits={"W","-"}, + interpMethod=SDF.Types.InterpolationMethod.Linear, + data=SDF.Functions.readTableData( + SDFStromkennzahl.filename, + SDFStromkennzahl.dataset, + SDFStromkennzahl.dataUnit, + SDFStromkennzahl.scaleUnits)) "Gibt die Stromkennzahl aus" + annotation (Placement(transformation(extent={{-20,20},{0,40}}))); + Modelica.Blocks.Routing.Multiplex2 multiplex2_1 + annotation (Placement(transformation(extent={{-60,40},{-40,20}}))); + Modelica.Blocks.Sources.RealExpression PLRNominal(y=1) "Nominal PLR" + annotation (Placement(transformation(extent={{-100,34},{-80,54}}))); + Modelica.Blocks.Sources.RealExpression pelNom(y=PelNom) + "Nominal electric Power" + annotation (Placement(transformation(extent={{-100,14},{-84,34}}))); + SDF.NDTable SDFEta( + nin=2, + readFromFile=true, + filename=Filename_EtaEL, + dataset="/EtaEL", + dataUnit="-", + scaleUnits={"W","-"}, + interpMethod=SDF.Types.InterpolationMethod.Linear, + data=SDF.Functions.readTableData( + SDFStromkennzahl.filename, + SDFStromkennzahl.dataset, + SDFStromkennzahl.dataUnit, + SDFStromkennzahl.scaleUnits)) "Electrical Efficiency" + annotation (Placement(transformation(extent={{-20,-20},{0,0}}))); + Modelica.Blocks.Interfaces.RealOutput mWaterCC + "Water mass flow cooling circuit" + annotation (Placement(transformation(extent={{100,-70},{120,-50}}))); + Modelica.Blocks.Math.Division division + annotation (Placement(transformation(extent={{20,26},{34,40}}))); + SDF.NDTable SDFRatioCoolingWater( + nin=2, + readFromFile=true, + filename=Filename_RCW, + dataset="/RatioCoolingWater", + dataUnit="-", + scaleUnits={"W","-"}, + interpMethod=SDF.Types.InterpolationMethod.Linear, + data=SDF.Functions.readTableData( + SDFStromkennzahl.filename, + SDFStromkennzahl.dataset, + SDFStromkennzahl.dataUnit, + SDFStromkennzahl.scaleUnits)) "Ratio Cooling Water" + annotation (Placement(transformation(extent={{-20,-68},{0,-48}}))); + Modelica.Blocks.Math.Division division1 + annotation (Placement(transformation(extent={{32,-20},{46,-6}}))); + Modelica.Blocks.Math.Product product + annotation (Placement(transformation(extent={{50,-60},{64,-46}}))); + Modelica.Blocks.Sources.RealExpression TempDiffCC(y=4180*deltaTCoolingCircuit) + "Temperature difference Cooling Water Engine" + annotation (Placement(transformation(extent={{46,-90},{66,-70}}))); + Modelica.Blocks.Math.Division division2 + annotation (Placement(transformation(extent={{78,-64},{92,-50}}))); + Modelica.Blocks.Interfaces.RealOutput dTCCNom + annotation (Placement(transformation(extent={{100,-10},{120,10}}))); + Modelica.Blocks.Math.Division division4 + annotation (Placement(transformation(extent={{78,-6},{92,8}}))); + Modelica.Blocks.Math.Product product1 + annotation (Placement(transformation(extent={{76,-32},{90,-18}}))); + Modelica.Blocks.Sources.RealExpression TempDiffCC1(y=4180) + "Temperature difference Cooling Water Engine" + annotation (Placement(transformation(extent={{12,-40},{32,-20}}))); +equation + connect(multiplex2_1.y, SDFStromkennzahl.u) + annotation (Line(points={{-39,30},{-22,30}}, color={0,0,127})); + connect(PLRNominal.y, multiplex2_1.u2[1]) annotation (Line(points={{-79,44},{-72, + 44},{-72,36},{-62,36}}, color={0,0,127})); + connect(pelNom.y, multiplex2_1.u1[1]) annotation (Line(points={{-83.2,24},{-62, + 24}}, color={0,0,127})); + connect(multiplex2_1.y, SDFEta.u) annotation (Line(points={{-39,30},{-30,30},{ + -30,-10},{-22,-10}}, color={0,0,127})); + connect(SDFStromkennzahl.y, division.u2) annotation (Line(points={{1,30},{10,30}, + {10,28.8},{18.6,28.8}}, color={0,0,127})); + connect(pelNom.y, division.u1) annotation (Line(points={{-83.2,24},{-80,24},{-80, + 10},{-112,10},{-112,60},{12,60},{12,37.2},{18.6,37.2}}, color={0,0,127})); + connect(multiplex2_1.y, SDFRatioCoolingWater.u) annotation (Line(points={{-39,30}, + {-30,30},{-30,-58},{-22,-58}}, color={0,0,127})); + connect(SDFEta.y, division1.u2) annotation (Line(points={{1,-10},{14,-10},{14, + -17.2},{30.6,-17.2}}, color={0,0,127})); + connect(pelNom.y, division1.u1) annotation (Line(points={{-83.2,24},{-80,24},{ + -80,10},{20,10},{20,-8.8},{30.6,-8.8}}, color={0,0,127})); + connect(division1.y, product.u1) annotation (Line(points={{46.7,-13},{62,-13}, + {62,-28},{40,-28},{40,-48.8},{48.6,-48.8}}, color={0,0,127})); + connect(SDFRatioCoolingWater.y, product.u2) annotation (Line(points={{1,-58}, + {24,-58},{24,-57.2},{48.6,-57.2}}, color={0,0,127})); + connect(product.y, division2.u1) annotation (Line(points={{64.7,-53},{76.6, + -53},{76.6,-52.8}}, color={0,0,127})); + connect(TempDiffCC.y, division2.u2) annotation (Line(points={{67,-80},{68,-80}, + {68,-78},{72,-78},{72,-62},{76.6,-62},{76.6,-61.2}}, color={0,0,127})); + connect(division2.y, mWaterCC) annotation (Line(points={{92.7,-57},{96,-57},{ + 96,-60},{110,-60}}, color={0,0,127})); + connect(division4.y, dTCCNom) annotation (Line(points={{92.7,1},{96.35,1},{ + 96.35,0},{110,0}}, color={0,0,127})); + connect(division.y, division4.u1) annotation (Line(points={{34.7,33},{70,33}, + {70,5.2},{76.6,5.2}}, color={0,0,127})); + connect(product1.y, division4.u2) annotation (Line(points={{90.7,-25},{98,-25}, + {98,-12},{66,-12},{66,-3.2},{76.6,-3.2}}, color={0,0,127})); + connect(division2.y, product1.u2) annotation (Line(points={{92.7,-57},{100, + -57},{100,-38},{68,-38},{68,-29.2},{74.6,-29.2}}, color={0,0,127})); + connect(TempDiffCC1.y, product1.u1) annotation (Line(points={{33,-30},{54,-30}, + {54,-22},{74.6,-22},{74.6,-20.8}}, color={0,0,127})); + annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram( + coordinateSystem(preserveAspectRatio=false))); +end NominalBehaviourNotManufacturer; diff --git a/AixLib/Fluid/BoilerCHP/BaseClasses/PartialHeatGenerator_Zeta.mo b/AixLib/Fluid/BoilerCHP/BaseClasses/PartialHeatGenerator_Zeta.mo new file mode 100644 index 0000000000..378ac6ffcb --- /dev/null +++ b/AixLib/Fluid/BoilerCHP/BaseClasses/PartialHeatGenerator_Zeta.mo @@ -0,0 +1,142 @@ +within AixLib.Fluid.BoilerCHP.BaseClasses; +partial model PartialHeatGenerator_Zeta + "Partial model for heat generators" + extends AixLib.Fluid.Interfaces.PartialTwoPortInterface(redeclare package + Medium = Media.Water); + + parameter Modelica.SIunits.Time tau=1 + "Time constant of the temperature sensors at nominal flow rate" + annotation (Dialog(tab="Advanced", group="Sensor Properties")); + parameter Modelica.Blocks.Types.Init initType=Modelica.Blocks.Types.Init.InitialState + "Type of initialization (InitialState and InitialOutput are identical)" + annotation (Dialog(tab="Advanced", group="Sensor Properties")); + parameter Modelica.SIunits.Temperature T_start=Medium.T_default + "Initial or guess value of output (= state)" + annotation (Dialog(tab="Advanced", group="Initialization")); + parameter Boolean transferHeat=false + "If true, temperature T converges towards TAmb when no flow" + annotation (Dialog(tab="Advanced", group="Sensor Properties")); + parameter Modelica.SIunits.Temperature TAmb=Medium.T_default + "Fixed ambient temperature for heat transfer" + annotation (Dialog(tab="Advanced", group="Sensor Properties")); + parameter Modelica.SIunits.Time tauHeaTra=1200 + "Time constant for heat transfer, default 20 minutes" + annotation (Dialog(tab="Advanced", group="Sensor Properties")); + Sensors.TemperatureTwoPort senTCold( + redeclare final package Medium = Medium, + final tau=tau, + final m_flow_nominal=m_flow_nominal, + final initType=initType, + final T_start=T_start, + final transferHeat=transferHeat, + final TAmb=TAmb, + final tauHeaTra=tauHeaTra, + final allowFlowReversal=allowFlowReversal, + final m_flow_small=m_flow_small) + "Temperature sensor of cold side of heat generator (return)" + annotation (Placement(transformation(extent={{-80,-90},{-60,-70}}))); + Sensors.TemperatureTwoPort senTHot( + redeclare final package Medium = Medium, + final tau=tau, + final m_flow_nominal=m_flow_nominal, + final initType=initType, + final T_start=T_start, + final transferHeat=transferHeat, + final TAmb=TAmb, + final tauHeaTra=tauHeaTra, + final allowFlowReversal=allowFlowReversal, + final m_flow_small=m_flow_small) + "Temperature sensor of hot side of heat generator (supply)" + annotation (Placement(transformation(extent={{30,-90},{50,-70}}))); + Sensors.MassFlowRate senMasFlo( + redeclare final package Medium = Medium, + final allowFlowReversal=allowFlowReversal) + "Sensor for mass flwo rate" + annotation (Placement(transformation(extent={{60,-90},{80,-70}}))); + Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow heater + "Prescribed heat flow" annotation ( + Placement(transformation( + extent={{-10,-10},{10,10}}, + rotation=-90, + origin={-60,-50}))); + MixingVolumes.MixingVolume vol( + redeclare final package Medium = Medium, + final m_flow_nominal=m_flow_nominal, + final m_flow_small=m_flow_small, + final allowFlowReversal=allowFlowReversal, + final nPorts=2, + final p_start=p_start, + final T_start=T_start) + "Fluid volume" + annotation (Placement(transformation(extent={{-50,-80},{-30,-60}}))); + parameter Modelica.Media.Interfaces.Types.AbsolutePressure dp_start=0 + "Guess value of dp = port_a.p - port_b.p" + annotation (Dialog(tab="Advanced", group="Initialization")); + parameter Modelica.Media.Interfaces.PartialMedium.MassFlowRate m_flow_start=0 + "Guess value of m_flow = port_a.m_flow" + annotation (Dialog(tab="Advanced", group="Initialization")); + parameter Modelica.Media.Interfaces.Types.AbsolutePressure p_start=Medium.p_default + "Start value of pressure" + annotation (Dialog(tab="Advanced", group="Initialization")); + parameter Real a(unit="(Pa.s2)/m6") "Coefficient for quadratic term" + annotation(Dialog(group="dp = a*V_flow^2 + b*V_flow")); + + + + FixedResistances.HydraulicResistance hydraulicResistance( + redeclare final package Medium = Medium, + m_flow_nominal=m_flow_nominal, + zeta=a/8*(Modelica.Constants.pi^2)/Medium.d_const, + diameter=1) + annotation (Placement(transformation(extent={{-10,-90},{10,-70}}))); +equation + connect(port_a, senTCold.port_a) annotation (Line(points={{-100,0},{-90,0},{-90, + -80},{-80,-80}}, color={0,127,255}, + thickness=1)); + connect(senTCold.port_b, vol.ports[1]) + annotation (Line(points={{-60,-80},{-42,-80}}, color={0,127,255}, + thickness=1)); + connect(senMasFlo.port_b, port_b) annotation (Line(points={{80,-80},{90,-80},{ + 90,0},{100,0}}, color={0,127,255}, + thickness=1)); + connect(senTHot.port_b, senMasFlo.port_a) + annotation (Line(points={{50,-80},{55,-80},{60,-80}}, color={0,127,255}, + thickness=1)); + connect(heater.port, vol.heatPort) annotation (Line(points={{-60,-60},{-60,-60}, + {-60,-66},{-60,-70},{-50,-70}}, color={191,0,0})); + connect(hydraulicResistance.port_b, senTHot.port_a) + annotation (Line(points={{10,-80},{30,-80}}, color={0,127,255})); + connect(vol.ports[2], hydraulicResistance.port_a) + annotation (Line(points={{-38,-80},{-10,-80}}, color={0,127,255})); + annotation ( + Icon(coordinateSystem(preserveAspectRatio=false, extent={{-100,-100},{100, + 100}}), graphics={Rectangle( + extent={{-60,80},{60,-80}}, + lineColor={0,0,0}, + fillPattern=FillPattern.VerticalCylinder, + fillColor={170,170,255})}), + Documentation(info=" ++Partial model to implement heat generator models with one heat exchanger volume. +
++Classes that extend this model need to implement the controller which shoud also +calculate +the heat flow to the heat exchanger volume. +
++The volume of the heat exchanger as well as the pressure loss coefficient should +be set +for each heat generator separately. +
+", revisions=" +A boiler model consisting of physical components.The efficiency is based on the part load rate and the inflow water temperature.
+
Assumptions for predefined parameter values (based on Vissmann data cheat) as given by BoilerNoControl:
G: a heat loss of 0.3 % of nominal power at a temperature difference of 50 K to ambient is assumed.
+C: factor C/Q_nom is in range of 1.2 to 2 for boilers with nominal power between 460 kW and 80 kW (with c of 500J/kgK for steel). Thus, a value of 1.5 is used as default.
+
Further informations are described in the submodels "Set" and "ReturnInfluence".
Model of a CHP which is based on AixLib.Fluid.BoilerCHP.BaseClasses.PartialHeatGenerator. The model describes an adiabtaic heatflow which is brought to the volume.
+The adiabsatic heat flow is calculated with the adiabatic power to heat ratio which is based on table data for different relative electric power:
+ +")); +end CHPNotManufacturer; diff --git a/AixLib/Fluid/BoilerCHP/Examples/HeatGeneratorNoControllSystem.mo b/AixLib/Fluid/BoilerCHP/Examples/HeatGeneratorNoControllSystem.mo index 094aae7ac9..baac1b2eb9 100644 --- a/AixLib/Fluid/BoilerCHP/Examples/HeatGeneratorNoControllSystem.mo +++ b/AixLib/Fluid/BoilerCHP/Examples/HeatGeneratorNoControllSystem.mo @@ -15,13 +15,12 @@ model HeatGeneratorNoControllSystem "Example that illustrates use of heat genera Media.Specialized.Water.TemperatureDependentDensity, nPorts=1) "Sink" annotation (Placement(transformation(extent={{60,-10},{40,10}}))); - HeatGeneratorNoControl heatGeneratorNoControll( + BoilerNotManufacturer heatGeneratorNoControll( redeclare package Medium = - Media.Specialized.Water.TemperatureDependentDensity, m_flow_nominal= - 0.03, + Media.Specialized.Water.TemperatureDependentDensity, + m_flow_nominal=0.03, V=0.002, - coeffPresLoss=1e10) - "Heat generator without control" + coeffPresLoss=1e10) "Heat generator without control" annotation (Placement(transformation(extent={{-10,-10},{10,10}}))); Modelica.Blocks.Sources.Trapezoid trapezoid( rising=7200, diff --git a/AixLib/Fluid/BoilerCHP/HeatGeneratorNoControl.mo b/AixLib/Fluid/BoilerCHP/HeatGeneratorNoControl.mo deleted file mode 100644 index 7a2c6e6e9d..0000000000 --- a/AixLib/Fluid/BoilerCHP/HeatGeneratorNoControl.mo +++ /dev/null @@ -1,72 +0,0 @@ -within AixLib.Fluid.BoilerCHP; -model HeatGeneratorNoControl "Simple heat generator without control" - extends AixLib.Fluid.BoilerCHP.BaseClasses.PartialHeatGenerator(pressureDrop( - a=coeffPresLoss), vol(V=V)); - - Modelica.Blocks.Interfaces.RealInput Q_flow(final unit="W") - "Prescribed heat flow" - annotation (Placement(transformation(extent={{-100,40},{-60,80}}), - iconTransformation(extent={{-100,40},{-60,80}}))); - Modelica.Blocks.Interfaces.RealOutput TCold( - final quantity="ThermodynamicTemperature", - final unit="K", - displayUnit="degC") - "Temperature of the passing fluid" - annotation (Placement(transformation(extent={{44,76},{64,96}}), - iconTransformation( - extent={{-10,-10},{10,10}}, - rotation=90, - origin={-40,90}))); - Modelica.Blocks.Interfaces.RealOutput THot( - final quantity="ThermodynamicTemperature", - final unit="K", - displayUnit="degC") - "Temperature of the passing fluid" - annotation (Placement(transformation(extent={{100,50},{120,70}}), - iconTransformation( - extent={{-10,-10},{10,10}}, - rotation=90, - origin={0,90}))); - Modelica.Blocks.Interfaces.RealOutput massFlow(quantity="MassFlowRate", - final unit="kg/s") - "Mass flow rate from port_a to port_b" - annotation (Placement(transformation(extent={{100,30},{120,50}}), - iconTransformation( - extent={{-10,-10},{10,10}}, - rotation=90, - origin={40,90}))); - parameter Modelica.SIunits.Volume V - "Volume of the heat exchanger inside the heat generator"; - parameter Real coeffPresLoss - "Pressure loss coefficient of the heat generator"; - -equation - connect(heater.Q_flow, Q_flow) annotation (Line(points={{-60,-40},{-60,-40},{ - -60,60},{-80,60}}, - color={0,0,127})); - connect(senTCold.T,TCold) annotation (Line(points={{-70,-69},{-70,-69},{-70, - 86},{54,86}}, - color={0,0,127})); - connect(senTHot.T,THot) annotation (Line(points={{40,-69},{40,-69},{40,60},{110, - 60}}, color={0,0,127})); - connect(senMasFlo.m_flow, massFlow) annotation (Line(points={{70,-69},{70,-69}, - {70,40},{110,40}}, color={0,0,127})); - annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram( - coordinateSystem(preserveAspectRatio=false)), - Documentation(info=" -The model uses the AixLib.Fluid.BoilerCHP.BaseClasses.PartialHeatGenerator -in the most simple setup in order either test its functionalities or to use in -cases where -the controller is modelled outside the heat generator. -
-", - revisions=" -A boiler model consisting of physical components. The user has the choice to run the model for three different setpoint options:
+Model of a CHP-module with an inner cooling circuit and a control unit. Heat circuit and cooling circuit are connected with a heat exchanger. Further informations are given in the submodel discribtion.
+")); +end ModularCHPNotManufacturer; diff --git a/AixLib/Fluid/BoilerCHP/package.order b/AixLib/Fluid/BoilerCHP/package.order index 728e0d87d2..e945fe259c 100644 --- a/AixLib/Fluid/BoilerCHP/package.order +++ b/AixLib/Fluid/BoilerCHP/package.order @@ -1,8 +1,11 @@ Boiler BoilerNoControl CHP -HeatGeneratorNoControl +BoilerNotManufacturer ModularCHP Data Examples BaseClasses +ModularBoilerNotManufacturer +CHPNotManufacturer +ModularCHPNotManufacturer diff --git a/AixLib/Fluid/HeatPumps/BaseClasses/ControlMflowManufacturer2.mo b/AixLib/Fluid/HeatPumps/BaseClasses/ControlMflowManufacturer2.mo new file mode 100644 index 0000000000..337f9a5e89 --- /dev/null +++ b/AixLib/Fluid/HeatPumps/BaseClasses/ControlMflowManufacturer2.mo @@ -0,0 +1,289 @@ +within AixLib.Fluid.HeatPumps.BaseClasses; +model ControlMflowManufacturer2 + + + parameter Modelica.SIunits.Temperature THotMax=333.15 "Max. value of THot before shutdown" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + parameter Modelica.SIunits.Temperature THotNom=313.15 "Nominal temperature of THot" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + parameter Modelica.SIunits.Temperature TSourceNom=278.15 "Nominal temperature of TSource" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + parameter Modelica.SIunits.HeatFlowRate QNom=150000 + "Nominal heat flow" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + parameter Real PLRMin=0.4 "Limit of PLR; less =0" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + parameter Boolean HighTemp=false "true: THot > 60°C" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + parameter Modelica.SIunits.TemperatureDifference DeltaTCon=7 "Temperature difference heat sink condenser" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + + + + Modelica.Blocks.Sources.RealExpression mFlowConNominal(y=QNom/MediumCon.cp_const + /DeltaTCon) "nominal massflow condenser" + annotation (Placement(transformation(extent={{4,68},{-30,88}}))); + Modelica.Blocks.Logical.Switch switch1 + annotation (Placement(transformation(extent={{-10,-10},{10,10}}, + rotation=180, + origin={-50,-6}))); + Modelica.Blocks.Continuous.LimPID PI( + controllerType=Modelica.Blocks.Types.SimpleController.PI, + k=0.01, + Ti=10, + yMax=1, + yMin=0) annotation (Placement(transformation( + extent={{8,-8},{-8,8}}, + rotation=0, + origin={44,-10}))); + Modelica.Blocks.Sources.RealExpression tHotNom1(y=THotNom) + annotation (Placement(transformation(extent={{84,-24},{66,4}}))); + Modelica.Blocks.Logical.Or or1 + annotation (Placement(transformation(extent={{56,32},{40,48}}))); + Modelica.Blocks.Logical.LessThreshold pLRMin(threshold=PLRMin) + annotation (Placement(transformation(extent={{84,62},{68,78}}))); + Modelica.Blocks.Logical.Switch switch2 + annotation (Placement(transformation(extent={{10,-10},{-10,10}}, + rotation=0, + origin={40,-80}))); + Modelica.Blocks.Sources.RealExpression zero(y=0) + annotation (Placement(transformation(extent={{80,-82},{66,-62}}))); + Modelica.Blocks.Continuous.Derivative derivative(k=15, T=15) + annotation (Placement(transformation(extent={{22,-90},{2,-70}}))); + Modelica.Blocks.Math.Abs abs1 + annotation (Placement(transformation(extent={{-6,-88},{-22,-72}}))); + Modelica.Blocks.Math.Product mflowCondenser2 + "Product QExhaustLosses" + annotation (Placement(transformation(extent={{10,-10},{-10,10}}, + rotation=0, + origin={-86,0}))); + Modelica.Blocks.Logical.Switch switch3 + annotation (Placement(transformation(extent={{10,-10},{-10,10}}, + rotation=0, + origin={-16,20}))); + Modelica.Blocks.Math.Product mflowCondenser1 + "Max. massflow of setpoint (PLR)" + annotation (Placement(transformation(extent={{10,-10},{-10,10}}, + rotation=0, + origin={-50,72}))); + Modelica.Blocks.Nonlinear.Limiter limiter(uMax=1, uMin=PLRMin) + annotation (Placement(transformation(extent={{-10,-10},{10,10}}, + rotation=180, + origin={30,90}))); + Modelica.Blocks.Logical.Greater greater + annotation (Placement(transformation(extent={{56,-48},{40,-32}}))); + Modelica.Blocks.Sources.RealExpression tHotNom2(y=THotNom) + annotation (Placement(transformation(extent={{10,-12},{-10,12}}, + rotation=0, + origin={146,-66}))); + Modelica.Blocks.Sources.RealExpression one1(y=1) + annotation (Placement(transformation(extent={{78,-100},{64,-78}}))); + Modelica.Blocks.Sources.RealExpression one2(y=1) + annotation (Placement(transformation(extent={{24,38},{10,60}}))); + Modelica.Blocks.Interfaces.RealInput THot annotation (Placement( + transformation( + extent={{-20,-20},{20,20}}, + rotation=180, + origin={120,-40}))); + Modelica.Blocks.Interfaces.RealOutput mFlowCon + annotation (Placement(transformation(extent={{-100,-12},{-124,12}}))); + Modelica.Blocks.Interfaces.RealInput PLR annotation (Placement(transformation( + extent={{-20,-20},{20,20}}, + rotation=180, + origin={120,60}))); + Modelica.Blocks.Interfaces.BooleanInput Shutdown annotation (Placement( + transformation( + extent={{-20,-20},{20,20}}, + rotation=180, + origin={120,0}))); + Modelica.Blocks.Math.Division division + annotation (Placement(transformation(extent={{156,28},{136,48}}))); + Modelica.Blocks.Sources.RealExpression tHotNom3(y=DeltaTCon) + annotation (Placement(transformation(extent={{10,-12},{-10,12}}, + rotation=0, + origin={202,42}))); + Modelica.Blocks.Interfaces.RealInput TCold + annotation (Placement( + transformation( + extent={{-20,-20},{20,20}}, + rotation=180, + origin={120,-90}))); + Modelica.Blocks.Math.Add add(k1=+1, k2=-1) + annotation (Placement(transformation(extent={{148,-34},{168,-14}}))); + Modelica.Blocks.Sources.RealExpression tHotNom4(y=THotNom) + annotation (Placement(transformation(extent={{-10,-10},{10,10}}, + rotation=0, + origin={110,-24}))); + Modelica.Blocks.Sources.RealExpression TMin(y=THotNom) "MinimalStartTemp" + annotation (Placement(transformation(extent={{32,168},{64,190}}))); + Modelica.Blocks.Continuous.LimPID PID3( + controllerType=Modelica.Blocks.Types.SimpleController.PI, + k=0.01, + Ti=4, + yMax=1, + yMin=0) + annotation (Placement(transformation(extent={{78,152},{98,172}}))); + Modelica.Blocks.Sources.RealExpression realExpression4(y=1) + annotation (Placement(transformation(extent={{84,172},{94,192}}))); + Modelica.Blocks.Math.Add add2(k1=-1) + annotation (Placement(transformation(extent={{118,170},{134,186}}))); + Modelica.Blocks.Math.Abs abs2 + annotation (Placement(transformation(extent={{110,118},{130,138}}))); + Modelica.Blocks.Nonlinear.Limiter limiter2(uMax=1, uMin=0) + annotation (Placement(transformation(extent={{138,120},{150,132}}))); + Modelica.Blocks.Math.Product product2 + annotation (Placement(transformation(extent={{166,120},{178,132}}))); + Modelica.Blocks.Continuous.LimPID PID( + controllerType=Modelica.Blocks.Types.SimpleController.PI, + k=0.01, + Ti=10, + yMax=1, + yMin=0) + annotation (Placement(transformation(extent={{198,136},{218,156}}))); + Modelica.Blocks.Sources.RealExpression realExpression1(y=THotMax) + annotation (Placement(transformation(extent={{156,138},{182,156}}))); + Modelica.Blocks.Logical.Greater greater1 + annotation (Placement(transformation(extent={{186,-34},{210,-14}}))); + Modelica.Blocks.Sources.RealExpression tHotNom5(y=DeltaTCon) + annotation (Placement(transformation(extent={{-9,-11},{9,11}}, + rotation=0, + origin={163,-51}))); + Modelica.Blocks.Nonlinear.Limiter limiter1(uMax=THotNom - 293.15 - DeltaTCon, + uMin=7) + annotation (Placement(transformation(extent={{200,4},{212,16}}))); + Modelica.Blocks.Logical.Switch switch4 + annotation (Placement(transformation(extent={{10,-10},{-10,10}}, + rotation=0, + origin={-62,114}))); + Modelica.Blocks.Logical.Greater greater2 + annotation (Placement(transformation(extent={{40,120},{20,140}}))); + Modelica.Blocks.Sources.RealExpression tHotNom6(y=THotNom - DeltaTCon) + annotation (Placement(transformation(extent={{10,-12},{-10,12}}, + rotation=0, + origin={64,112}))); + Modelica.Blocks.Math.Product mflowCondenser3 + "Max. massflow of setpoint (PLR)" + annotation (Placement(transformation(extent={{10,-10},{-10,10}}, + rotation=0, + origin={44,14}))); + Modelica.Blocks.Math.Division division1 + annotation (Placement(transformation(extent={{0,40},{-20,60}}))); +protected + replaceable package MediumCon = AixLib.Media.Water constrainedby + Modelica.Media.Interfaces.PartialMedium "Medium heat sink"; + + + + + +equation + connect(tHotNom1.y, PI.u_s) + annotation (Line(points={{65.1,-10},{53.6,-10}}, color={0,0,127})); + connect(or1.y,switch1. u2) annotation (Line(points={{39.2,40},{18,40},{18,-6}, + {-38,-6}}, + color={255,0,255})); + connect(or1.y,switch2. u2) annotation (Line(points={{39.2,40},{18,40},{18,-54}, + {60,-54},{60,-80},{52,-80}}, + color={255,0,255})); + connect(zero.y,switch2. u1) annotation (Line(points={{65.3,-72},{52,-72}}, + color={0,0,127})); + connect(switch2.y,derivative. u) annotation (Line(points={{29,-80},{24,-80}}, + color={0,0,127})); + connect(derivative.y,abs1. u) + annotation (Line(points={{1,-80},{-4.4,-80}}, color={0,0,127})); + connect(switch3.y,switch1. u3) annotation (Line(points={{-27,20},{-32,20},{ + -32,2},{-38,2}}, color={0,0,127})); + connect(abs1.y,switch1. u1) + annotation (Line(points={{-22.8,-80},{-28,-80},{-28,-14},{-38,-14}}, + color={0,0,127})); + connect(mFlowConNominal.y,mflowCondenser1. u1) annotation (Line(points={{-31.7, + 78},{-38,78}}, color={0,0,127})); + connect(limiter.y,mflowCondenser1. u2) annotation (Line(points={{19,90},{12, + 90},{12,66},{-38,66}}, color={0,0,127})); + connect(greater.u2,tHotNom2. y) + annotation (Line(points={{57.6,-46.4},{84,-46.4},{84,-66},{135,-66}}, + color={0,0,127})); + connect(THot, PI.u_m) annotation (Line(points={{120,-40},{94,-40},{94,-22},{ + 44,-22},{44,-19.6}}, color={0,0,127})); + connect(PLR,limiter. u) annotation (Line(points={{120,60},{90,60},{90,90},{42, + 90}}, color={0,0,127})); + connect(PLR,pLRMin. u) + annotation (Line(points={{120,60},{90,60},{90,70},{85.6,70}}, + color={0,0,127})); + connect(THot,greater. u1) annotation (Line(points={{120,-40},{57.6,-40}}, + color={0,0,127})); + connect(mflowCondenser2.y,mFlowCon) + annotation (Line(points={{-97,0},{-112,0}}, color={0,0,127})); + connect(one1.y,switch2. u3) + annotation (Line(points={{63.3,-89},{52,-89},{52,-88}}, color={0,0,127})); + connect(Shutdown,or1. u2) annotation (Line(points={{120,0},{92,0},{92,33.6},{ + 57.6,33.6}}, color={255,0,255})); + connect(pLRMin.y,or1. u1) annotation (Line(points={{67.2,70},{64,70},{64,40}, + {57.6,40}},color={255,0,255})); + connect(greater.y, switch3.u2) annotation (Line(points={{39.2,-40},{24,-40},{ + 24,20},{-4,20}}, color={255,0,255})); + connect(switch1.y, mflowCondenser2.u2) + annotation (Line(points={{-61,-6},{-74,-6}}, color={0,0,127})); + connect(TCold, add.u2) annotation (Line(points={{120,-90},{96,-90},{96,-60},{ + 130,-60},{130,-30},{146,-30}}, color={0,0,127})); + connect(tHotNom4.y, add.u1) annotation (Line(points={{121,-24},{136,-24},{136, + -18},{146,-18}}, color={0,0,127})); + connect(TMin.y, PID3.u_s) annotation (Line(points={{65.6,179},{65.6,162},{76, + 162}}, color={0,0,127})); + connect(THot, PID3.u_m) annotation (Line(points={{120,-40},{98,-40},{98,-36}, + {88,-36},{88,150}}, color={0,0,127})); + connect(realExpression4.y, add2.u1) annotation (Line(points={{94.5,182},{106, + 182},{106,182.8},{116.4,182.8}}, color={0,0,127})); + connect(PID3.y, add2.u2) annotation (Line(points={{99,162},{112,162},{112, + 173.2},{116.4,173.2}}, color={0,0,127})); + connect(add2.y, abs2.u) annotation (Line(points={{134.8,178},{142,178},{142, + 174},{146,174},{146,144},{96,144},{96,128},{108,128}}, color={0,0,127})); + connect(abs2.y, limiter2.u) annotation (Line(points={{131,128},{132.5,128},{ + 132.5,126},{136.8,126}}, color={0,0,127})); + connect(limiter2.y, product2.u1) annotation (Line(points={{150.6,126},{154, + 126},{154,134},{164.8,134},{164.8,129.6}}, color={0,0,127})); + connect(realExpression1.y, PID.u_s) annotation (Line(points={{183.3,147},{190, + 147},{190,146},{196,146}}, color={0,0,127})); + connect(PID.y, product2.u2) annotation (Line(points={{219,146},{226,146},{226, + 144},{236,144},{236,104},{162,104},{162,122.4},{164.8,122.4}}, color= + {0,0,127})); + connect(add.y, greater1.u1) + annotation (Line(points={{169,-24},{183.6,-24}}, color={0,0,127})); + connect(tHotNom5.y, greater1.u2) annotation (Line(points={{172.9,-51},{178, + -51},{178,-32},{183.6,-32}}, color={0,0,127})); + connect(add.y, limiter1.u) annotation (Line(points={{169,-24},{176,-24},{176, + 10},{198.8,10}}, color={0,0,127})); + connect(tHotNom3.y, division.u1) + annotation (Line(points={{191,42},{158,42},{158,44}}, color={0,0,127})); + connect(limiter1.y, division.u2) annotation (Line(points={{212.6,10},{234,10}, + {234,32},{158,32}}, color={0,0,127})); + connect(THot, PID.u_m) annotation (Line(points={{120,-40},{100,-40},{100,-34}, + {208,-34},{208,134}}, color={0,0,127})); + connect(mflowCondenser1.y, switch4.u3) annotation (Line(points={{-61,72},{-68, + 72},{-68,80},{-72,80},{-72,96},{-46,96},{-46,106},{-50,106}}, color={ + 0,0,127})); + connect(TCold, greater2.u1) annotation (Line(points={{120,-90},{82,-90},{82, + 130},{42,130}}, color={0,0,127})); + connect(greater2.y, switch4.u2) annotation (Line(points={{19,130},{-2,130},{ + -2,114},{-50,114}}, color={255,0,255})); + connect(greater2.u2, tHotNom6.y) annotation (Line(points={{42,122},{48,122},{ + 48,112},{53,112}}, color={0,0,127})); + connect(PI.y, mflowCondenser3.u2) annotation (Line(points={{35.2,-10},{30,-10}, + {30,2},{72,2},{72,8},{56,8}}, color={0,0,127})); + connect(PLR, mflowCondenser3.u1) annotation (Line(points={{120,60},{110,60},{ + 110,56},{100,56},{100,20},{56,20}}, color={0,0,127})); + connect(mflowCondenser3.y, switch3.u3) annotation (Line(points={{33,14},{14, + 14},{14,12},{-4,12}}, color={0,0,127})); + connect(one2.y, division1.u1) + annotation (Line(points={{9.3,49},{8,49},{8,56},{2,56}}, color={0,0,127})); + connect(PLR, division1.u2) annotation (Line(points={{120,60},{94,60},{94,44}, + {2,44}}, color={0,0,127})); + connect(division1.y, switch3.u1) annotation (Line(points={{-21,50},{-30,50},{ + -30,36},{8,36},{8,28},{-4,28}}, color={0,0,127})); + connect(mflowCondenser1.y, mflowCondenser2.u1) annotation (Line(points={{-61, + 72},{-62,72},{-62,10},{-74,10},{-74,6}}, color={0,0,127})); + connect(mFlowConNominal.y, switch4.u1) annotation (Line(points={{-31.7,78},{ + -32,78},{-32,92},{-26,92},{-26,122},{-50,122}}, color={0,0,127})); + annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram( + coordinateSystem(preserveAspectRatio=false))); +end ControlMflowManufacturer2; diff --git a/AixLib/Fluid/HeatPumps/BaseClasses/ControlMflowNotManufacturer.mo b/AixLib/Fluid/HeatPumps/BaseClasses/ControlMflowNotManufacturer.mo new file mode 100644 index 0000000000..a8790f5c75 --- /dev/null +++ b/AixLib/Fluid/HeatPumps/BaseClasses/ControlMflowNotManufacturer.mo @@ -0,0 +1,202 @@ +within AixLib.Fluid.HeatPumps.BaseClasses; +model ControlMflowNotManufacturer + + parameter Modelica.SIunits.Temperature THotMax=333.15 "Max. value of THot before shutdown" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + parameter Modelica.SIunits.Temperature THotNom=313.15 "Nominal temperature of THot" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + parameter Modelica.SIunits.Temperature TSourceNom=278.15 "Nominal temperature of TSource" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + parameter Modelica.SIunits.HeatFlowRate QNom=150000 + "Nominal heat flow" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + parameter Real PLRMin=0.4 "Limit of PLR; less =0" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + parameter Boolean HighTemp=false "true: THot > 60°C" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + parameter Modelica.SIunits.TemperatureDifference DeltaTCon=7 "Temperature difference heat sink condenser" + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + + parameter Boolean dTConFix=false + annotation (Dialog(tab="NotManufacturer", group="General machine information")); + + + + + + Modelica.Blocks.Interfaces.RealInput THot annotation (Placement( + transformation( + extent={{-20,-20},{20,20}}, + rotation=180, + origin={120,-40}))); + Modelica.Blocks.Interfaces.RealOutput mFlowCon + annotation (Placement(transformation(extent={{-100,-12},{-124,12}}))); + Modelica.Blocks.Interfaces.RealInput PLR annotation (Placement(transformation( + extent={{-20,-20},{20,20}}, + rotation=180, + origin={120,70}))); + Modelica.Blocks.Logical.Switch switch1 + annotation (Placement(transformation(extent={{-10,-10},{10,10}}, + rotation=180, + origin={-24,-20}))); + Modelica.Blocks.Continuous.LimPID PI( + controllerType=Modelica.Blocks.Types.SimpleController.PI, + k=0.008, + Ti=10, + yMax=1, + yMin=0.1, + initType=Modelica.Blocks.Types.InitPID.InitialOutput, + y_start=0.1) + annotation (Placement(transformation( + extent={{8,-8},{-8,8}}, + rotation=0, + origin={38,16}))); + Modelica.Blocks.Sources.RealExpression tHotNom1(y=THotNom) + annotation (Placement(transformation(extent={{118,16},{100,44}}))); + Modelica.Blocks.Logical.Or or1 + annotation (Placement(transformation(extent={{40,52},{24,68}}))); + Modelica.Blocks.Logical.LessThreshold pLRMin(threshold=PLRMin) + annotation (Placement(transformation(extent={{78,62},{62,78}}))); + Modelica.Blocks.Logical.Switch switch2 + annotation (Placement(transformation(extent={{10,-10},{-10,10}}, + rotation=0, + origin={40,-78}))); + Modelica.Blocks.Sources.RealExpression zero(y=0) + annotation (Placement(transformation(extent={{80,-80},{66,-60}}))); + Modelica.Blocks.Continuous.Derivative derivative(k=15, T=15) + annotation (Placement(transformation(extent={{20,-88},{0,-68}}))); + Modelica.Blocks.Math.Abs abs1 + annotation (Placement(transformation(extent={{-10,-86},{-26,-70}}))); + Modelica.Blocks.Interfaces.BooleanInput Shutdown annotation (Placement( + transformation( + extent={{-20,-20},{20,20}}, + rotation=180, + origin={120,0}))); + Modelica.Blocks.Sources.RealExpression one1(y=1) + annotation (Placement(transformation(extent={{80,-98},{66,-76}}))); + + + Modelica.Blocks.Math.Gain gain(k=-1) + annotation (Placement(transformation(extent={{64,-30},{46,-12}}))); + Modelica.Blocks.Math.Gain gain1(k=-1) + annotation (Placement(transformation(extent={{80,8},{64,24}}))); + Modelica.Blocks.Logical.Switch switch4 + annotation (Placement(transformation(extent={{10,-10},{-10,10}}, + rotation=0, + origin={-82,0}))); + Modelica.Blocks.Sources.BooleanExpression booleanExpression1(y=dTConFix) + annotation (Placement(transformation(extent={{-16,-10},{-34,8}}))); + Modelica.Blocks.Nonlinear.Limiter limiter1(uMax=1, uMin=0.01) + annotation (Placement(transformation(extent={{-10,-10},{10,10}}, + rotation=180, + origin={-44,-78}))); + Modelica.Blocks.Continuous.LimPID PI1( + controllerType=Modelica.Blocks.Types.SimpleController.PI, + k=0.02, + Ti=5, + yMax=1, + yMin=0.1, + initType=Modelica.Blocks.Types.InitPID.InitialOutput, + y_start=0.1) + annotation (Placement(transformation( + extent={{8,-8},{-8,8}}, + rotation=0, + origin={-72,98}))); + Modelica.Blocks.Math.Gain gain2(k=-1) + annotation (Placement(transformation(extent={{-10,74},{-28,92}}))); + Modelica.Blocks.Math.Gain gain3(k=-1) + annotation (Placement(transformation(extent={{-28,90},{-46,108}}))); + Modelica.Blocks.Interfaces.RealInput TCold + annotation (Placement( + transformation( + extent={{-20,-20},{20,20}}, + rotation=180, + origin={120,-90}))); + Modelica.Blocks.Math.Add add + annotation (Placement(transformation(extent={{7,-7},{-7,7}}, + rotation=0, + origin={1,99}))); + Modelica.Blocks.Sources.RealExpression tHotNom3(y=DeltaTCon) + annotation (Placement(transformation(extent={{94,90},{78,116}}))); + Modelica.Blocks.Logical.Switch switch3 + annotation (Placement(transformation(extent={{-10,-10},{10,10}}, + rotation=180, + origin={-108,84}))); +protected + replaceable package MediumCon = AixLib.Media.Water constrainedby + Modelica.Media.Interfaces.PartialMedium "Medium heat sink"; + + +equation + connect(or1.y,switch1. u2) annotation (Line(points={{23.2,60},{18,60},{18,-20}, + {-12,-20}}, + color={255,0,255})); + connect(or1.y,switch2. u2) annotation (Line(points={{23.2,60},{18,60},{18,-52}, + {60,-52},{60,-78},{52,-78}}, + color={255,0,255})); + connect(zero.y,switch2. u1) annotation (Line(points={{65.3,-70},{52,-70}}, + color={0,0,127})); + connect(switch2.y,derivative. u) annotation (Line(points={{29,-78},{22,-78}}, + color={0,0,127})); + connect(derivative.y,abs1. u) + annotation (Line(points={{-1,-78},{-8.4,-78}}, color={0,0,127})); + connect(PLR, pLRMin.u) + annotation (Line(points={{120,70},{79.6,70}}, color={0,0,127})); + connect(one1.y, switch2.u3) + annotation (Line(points={{65.3,-87},{52,-87},{52,-86}}, color={0,0,127})); + connect(Shutdown, or1.u2) annotation (Line(points={{120,-8.88178e-16},{106, + -8.88178e-16},{106,0},{92,0},{92,34},{46,34},{46,53.6},{41.6,53.6}}, + color={255,0,255})); + connect(pLRMin.y, or1.u1) annotation (Line(points={{61.2,70},{54,70},{54,60}, + {41.6,60}},color={255,0,255})); + connect(tHotNom1.y, gain1.u) annotation (Line(points={{99.1,30},{90,30},{90, + 16},{81.6,16}}, color={0,0,127})); + connect(THot, gain.u) annotation (Line(points={{120,-40},{90,-40},{90,-21},{ + 65.8,-21}}, color={0,0,127})); + connect(gain.y, PI.u_m) annotation (Line(points={{45.1,-21},{38,-21},{38,6.4}}, + color={0,0,127})); + connect(gain1.y, PI.u_s) annotation (Line(points={{63.2,16},{47.6,16}}, + color={0,0,127})); + connect(switch4.u2, booleanExpression1.y) annotation (Line(points={{-70,0},{ + -70,-1},{-34.9,-1}}, color={255,0,255})); + connect(PI.y, switch1.u3) annotation (Line(points={{29.2,16},{-2,16},{-2,-12}, + {-12,-12}}, color={0,0,127})); + connect(limiter1.u, abs1.y) + annotation (Line(points={{-32,-78},{-26.8,-78}}, color={0,0,127})); + connect(limiter1.y, switch1.u1) annotation (Line(points={{-55,-78},{-60,-78}, + {-60,-48},{0,-48},{0,-28},{-12,-28}}, color={0,0,127})); + connect(switch1.y, switch4.u3) annotation (Line(points={{-35,-20},{-42,-20},{ + -42,-8},{-70,-8}}, color={0,0,127})); + connect(switch4.y, mFlowCon) + annotation (Line(points={{-93,0},{-112,0}}, color={0,0,127})); + connect(add.y, gain3.u) + annotation (Line(points={{-6.7,99},{-26.2,99}}, color={0,0,127})); + connect(tHotNom3.y, add.u1) annotation (Line(points={{77.2,103},{48,103},{48, + 103.2},{9.4,103.2}}, color={0,0,127})); + connect(TCold, add.u2) annotation (Line(points={{120,-90},{94,-90},{94,94.8}, + {9.4,94.8}}, color={0,0,127})); + connect(THot, gain2.u) annotation (Line(points={{120,-40},{90,-40},{90,83},{ + -8.2,83}}, color={0,0,127})); + connect(gain2.y, PI1.u_m) annotation (Line(points={{-28.9,83},{-72,83},{-72, + 88.4}}, color={0,0,127})); + connect(gain3.y, PI1.u_s) annotation (Line(points={{-46.9,99},{-54,99},{-54, + 98},{-62.4,98}}, color={0,0,127})); + connect(limiter1.y, switch3.u1) annotation (Line(points={{-55,-78},{-60,-78}, + {-60,56},{-82,56},{-82,76},{-96,76}}, color={0,0,127})); + connect(PI1.y, switch3.u3) annotation (Line(points={{-80.8,98},{-88,98},{-88, + 92},{-96,92}}, color={0,0,127})); + connect(switch3.y, switch4.u1) annotation (Line(points={{-119,84},{-122,84},{ + -122,62},{-54,62},{-54,8},{-70,8}}, color={0,0,127})); + connect(or1.y, switch3.u2) annotation (Line(points={{23.2,60},{-40,60},{-40, + 68},{-76,68},{-76,84},{-96,84}}, color={255,0,255})); + annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram( + coordinateSystem(preserveAspectRatio=false)), + Documentation(info=" +Control unit of the relativ condenser water mass flow [0,1] for two different operation methods:
+
A Shutdown is controlled with a degressiv decrease of warter mass flow to avoid non physical behaviour.
This package contains validation models for the classes in @@ -17,5 +18,4 @@ solutions. These model outputs are stored as reference data and used for continuous validation whenever models in the library change.
")); - end Validation; diff --git a/AixLib/Fluid/HeatPumps/Compressors/package.mo b/AixLib/Fluid/HeatPumps/Compressors/package.mo index c324cb39f8..27cd14c2f6 100644 --- a/AixLib/Fluid/HeatPumps/Compressors/package.mo +++ b/AixLib/Fluid/HeatPumps/Compressors/package.mo @@ -2,10 +2,10 @@ within AixLib.Fluid.HeatPumps; package Compressors "Package with compressor models" extends Modelica.Icons.VariantsPackage; + annotation (preferredView="info", Documentation(info="This package contains components models for compressors.
")); - end Compressors; diff --git a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Carrier_50PSW122_38kW_4_29COP_R410A.mo b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Carrier_50PSW122_38kW_4_29COP_R410A.mo index 82cb3c3576..fc2c310b25 100644 --- a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Carrier_50PSW122_38kW_4_29COP_R410A.mo +++ b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Carrier_50PSW122_38kW_4_29COP_R410A.mo @@ -10,7 +10,6 @@ record Carrier_50PSW122_38kW_4_29COP_R410A = UACon = 9021.05488178, UAEva = 7132.41759701) "Calibrated parameters for Carrier 50PSW122" - annotation ( defaultComponentPrefixes = "parameter", defaultComponentName="datHeaPum", diff --git a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Carrier_50PSW180_52kW_4_50COP_R410A.mo b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Carrier_50PSW180_52kW_4_50COP_R410A.mo index 17644cfb81..ec54ad8410 100644 --- a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Carrier_50PSW180_52kW_4_50COP_R410A.mo +++ b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Carrier_50PSW180_52kW_4_50COP_R410A.mo @@ -10,7 +10,6 @@ record Carrier_50PSW180_52kW_4_50COP_R410A = UACon = 8707.82060032, UAEva = 7982.84714185) "Calibrated parameters for Carrier 50PSW180" - annotation ( defaultComponentPrefixes = "parameter", defaultComponentName="datHeaPum", diff --git a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Carrier_50PSW210_70kW_4_40COP_R410A.mo b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Carrier_50PSW210_70kW_4_40COP_R410A.mo index 937296935b..0192d1e632 100644 --- a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Carrier_50PSW210_70kW_4_40COP_R410A.mo +++ b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Carrier_50PSW210_70kW_4_40COP_R410A.mo @@ -10,7 +10,6 @@ record Carrier_50PSW210_70kW_4_40COP_R410A = UACon = 14926.2266407, UAEva = 14718.9494319) "Calibrated parameters for Carrier 50PSW210" - annotation ( defaultComponentPrefixes = "parameter", defaultComponentName="datHeaPum", diff --git a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Carrier_50PSW240_93kW_4_40COP_R410A.mo b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Carrier_50PSW240_93kW_4_40COP_R410A.mo index 41674e685a..f8198f8715 100644 --- a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Carrier_50PSW240_93kW_4_40COP_R410A.mo +++ b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Carrier_50PSW240_93kW_4_40COP_R410A.mo @@ -10,7 +10,6 @@ record Carrier_50PSW240_93kW_4_40COP_R410A = UACon = 15632.3350979, UAEva = 11572.8594812) "Calibrated parameters for Carrier 50PSW240" - annotation ( defaultComponentPrefixes = "parameter", defaultComponentName="datHeaPum", diff --git a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Carrier_50PSW360_105kW_4_50COP_R410A.mo b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Carrier_50PSW360_105kW_4_50COP_R410A.mo index 6e28636b8b..e9503517fc 100644 --- a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Carrier_50PSW360_105kW_4_50COP_R410A.mo +++ b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Carrier_50PSW360_105kW_4_50COP_R410A.mo @@ -10,7 +10,6 @@ record Carrier_50PSW360_105kW_4_50COP_R410A = UACon = 16612.2868599, UAEva = 15988.0119559) "Calibrated parameters for Carrier 50PSW360" - annotation ( defaultComponentPrefixes = "parameter", defaultComponentName="datHeaPum", diff --git a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Carrier_50PSW420_140kW_4_40COP_R410A.mo b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Carrier_50PSW420_140kW_4_40COP_R410A.mo index 0d75a0531f..3f64352064 100644 --- a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Carrier_50PSW420_140kW_4_40COP_R410A.mo +++ b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Carrier_50PSW420_140kW_4_40COP_R410A.mo @@ -10,7 +10,6 @@ record Carrier_50PSW420_140kW_4_40COP_R410A = UACon = 22875.6244158, UAEva = 20395.4876127) "Calibrated parameters for Carrier 50PSW420" - annotation ( defaultComponentPrefixes = "parameter", defaultComponentName="datHeaPum", diff --git a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/ClimateMaster_TMW036_12kW_4_90COP_R410A.mo b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/ClimateMaster_TMW036_12kW_4_90COP_R410A.mo index b95715c1a4..dc06c79867 100644 --- a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/ClimateMaster_TMW036_12kW_4_90COP_R410A.mo +++ b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/ClimateMaster_TMW036_12kW_4_90COP_R410A.mo @@ -10,7 +10,6 @@ record ClimateMaster_TMW036_12kW_4_90COP_R410A = UACon = 2434.90888536, UAEva = 925.546637632) "Calibrated parameters for ClimateMaster TMW036" - annotation ( defaultComponentPrefixes = "parameter", defaultComponentName="datHeaPum", diff --git a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/ClimateMaster_TMW060_21kW_4_60COP_R410A.mo b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/ClimateMaster_TMW060_21kW_4_60COP_R410A.mo index 2aa6719860..a62e49c722 100644 --- a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/ClimateMaster_TMW060_21kW_4_60COP_R410A.mo +++ b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/ClimateMaster_TMW060_21kW_4_60COP_R410A.mo @@ -10,7 +10,6 @@ record ClimateMaster_TMW060_21kW_4_60COP_R410A = UACon = 6976.43602782, UAEva = 1012.57723222) "Calibrated parameters for ClimateMaster TMW060" - annotation ( defaultComponentPrefixes = "parameter", defaultComponentName="datHeaPum", diff --git a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/ClimateMaster_TMW120_42kW_4_50COP_R410A.mo b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/ClimateMaster_TMW120_42kW_4_50COP_R410A.mo index 3c00f5204f..00920ecb19 100644 --- a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/ClimateMaster_TMW120_42kW_4_50COP_R410A.mo +++ b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/ClimateMaster_TMW120_42kW_4_50COP_R410A.mo @@ -10,7 +10,6 @@ record ClimateMaster_TMW120_42kW_4_50COP_R410A = UACon = 11851.7167307, UAEva = 2121.46076035) "Calibrated parameters for ClimateMaster TMW120" - annotation ( defaultComponentPrefixes = "parameter", defaultComponentName="datHeaPum", diff --git a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/ClimateMaster_TMW170_48kW_4_30COP_R410A.mo b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/ClimateMaster_TMW170_48kW_4_30COP_R410A.mo index 12fcbaac6d..69a237c041 100644 --- a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/ClimateMaster_TMW170_48kW_4_30COP_R410A.mo +++ b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/ClimateMaster_TMW170_48kW_4_30COP_R410A.mo @@ -10,7 +10,6 @@ record ClimateMaster_TMW170_48kW_4_30COP_R410A = UACon = 7127.67902377, UAEva = 6702.69056458) "Calibrated parameters for ClimateMaster TMW170" - annotation ( defaultComponentPrefixes = "parameter", defaultComponentName="datHeaPum", diff --git a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/ClimateMaster_TMW340_98kW_4_40COP_R410A.mo b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/ClimateMaster_TMW340_98kW_4_40COP_R410A.mo index f353863c61..4fbf0e41a0 100644 --- a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/ClimateMaster_TMW340_98kW_4_40COP_R410A.mo +++ b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/ClimateMaster_TMW340_98kW_4_40COP_R410A.mo @@ -10,7 +10,6 @@ record ClimateMaster_TMW340_98kW_4_40COP_R410A = UACon = 14154.9112764, UAEva = 13705.1289797) "Calibrated parameters for ClimateMaster TMW340" - annotation ( defaultComponentPrefixes = "parameter", defaultComponentName="datHeaPum", diff --git a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA036_13kW_4_50COP_R410A.mo b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA036_13kW_4_50COP_R410A.mo index 4a835e5415..211fa309d5 100644 --- a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA036_13kW_4_50COP_R410A.mo +++ b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA036_13kW_4_50COP_R410A.mo @@ -10,7 +10,6 @@ record Daikin_WRA036_13kW_4_50COP_R410A = UACon = 2854.56883514, UAEva = 14984.5402787) "Calibrated parameters for Daikin WRA036" - annotation ( defaultComponentPrefixes = "parameter", defaultComponentName="datHeaPum", diff --git a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA048_16kW_4_60COP_R410A.mo b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA048_16kW_4_60COP_R410A.mo index 0e17ffabce..097a7a4e56 100644 --- a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA048_16kW_4_60COP_R410A.mo +++ b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA048_16kW_4_60COP_R410A.mo @@ -10,7 +10,6 @@ record Daikin_WRA048_16kW_4_60COP_R410A = UACon = 2860.44257631, UAEva = 17688.743889) "Calibrated parameters for Daikin WRA048" - annotation ( defaultComponentPrefixes = "parameter", defaultComponentName="datHeaPum", diff --git a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA060_19kW_4_50COP_R410A.mo b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA060_19kW_4_50COP_R410A.mo index c7a28e7ca7..5788f2d8d0 100644 --- a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA060_19kW_4_50COP_R410A.mo +++ b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA060_19kW_4_50COP_R410A.mo @@ -10,7 +10,6 @@ record Daikin_WRA060_19kW_4_50COP_R410A = UACon = 3132.54953048, UAEva = 22163.5117527) "Calibrated parameters for Daikin WRA060" - annotation ( defaultComponentPrefixes = "parameter", defaultComponentName="datHeaPum", diff --git a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA072_24kW_4_30COP_R410A.mo b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA072_24kW_4_30COP_R410A.mo index 366a9d58fe..fd9385ef0d 100644 --- a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA072_24kW_4_30COP_R410A.mo +++ b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA072_24kW_4_30COP_R410A.mo @@ -10,7 +10,6 @@ record Daikin_WRA072_24kW_4_30COP_R410A = UACon = 3112.7917639, UAEva = 29257.8652993) "Calibrated parameters for Daikin WRA072" - annotation ( defaultComponentPrefixes = "parameter", defaultComponentName="datHeaPum", diff --git a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA120_37kW_4_40COP_R410A.mo b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA120_37kW_4_40COP_R410A.mo index 265eb70906..c4ecbe5921 100644 --- a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA120_37kW_4_40COP_R410A.mo +++ b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA120_37kW_4_40COP_R410A.mo @@ -10,7 +10,6 @@ record Daikin_WRA120_37kW_4_40COP_R410A = UACon = 6395.36493022, UAEva = 43952.8437636) "Calibrated parameters for Daikin WRA120" - annotation ( defaultComponentPrefixes = "parameter", defaultComponentName="datHeaPum", diff --git a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA150_49kW_4_70COP_R410A.mo b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA150_49kW_4_70COP_R410A.mo index 6a78bd6ea6..904e956bc0 100644 --- a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA150_49kW_4_70COP_R410A.mo +++ b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA150_49kW_4_70COP_R410A.mo @@ -10,7 +10,6 @@ record Daikin_WRA150_49kW_4_70COP_R410A = UACon = 10364.1606457, UAEva = 52300.8714734) "Calibrated parameters for Daikin WRA150" - annotation ( defaultComponentPrefixes = "parameter", defaultComponentName="datHeaPum", diff --git a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA180_63kW_4_50COP_R410A.mo b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA180_63kW_4_50COP_R410A.mo index 71d0835635..938cc09467 100644 --- a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA180_63kW_4_50COP_R410A.mo +++ b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA180_63kW_4_50COP_R410A.mo @@ -10,7 +10,6 @@ record Daikin_WRA180_63kW_4_50COP_R410A = UACon = 11553.9351864, UAEva = 83881.3683749) "Calibrated parameters for Daikin WRA180" - annotation ( defaultComponentPrefixes = "parameter", defaultComponentName="datHeaPum", diff --git a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA240_79kW_4_40COP_R410A.mo b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA240_79kW_4_40COP_R410A.mo index 94b7d2b3a2..2987ad2581 100644 --- a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA240_79kW_4_40COP_R410A.mo +++ b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA240_79kW_4_40COP_R410A.mo @@ -10,7 +10,6 @@ record Daikin_WRA240_79kW_4_40COP_R410A = UACon = 12615.4293459, UAEva = 94620.7400986) "Calibrated parameters for Daikin WRA240" - annotation ( defaultComponentPrefixes = "parameter", defaultComponentName="datHeaPum", diff --git a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA300_93kW_4_60COP_R410A.mo b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA300_93kW_4_60COP_R410A.mo index 3d2cbe08e0..217a23823a 100644 --- a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA300_93kW_4_60COP_R410A.mo +++ b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA300_93kW_4_60COP_R410A.mo @@ -10,7 +10,6 @@ record Daikin_WRA300_93kW_4_60COP_R410A = UACon = 16784.7393136, UAEva = 114049.474787) "Calibrated parameters for Daikin WRA300" - annotation ( defaultComponentPrefixes = "parameter", defaultComponentName="datHeaPum", diff --git a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA360_116kW_4_60COP_R410A.mo b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA360_116kW_4_60COP_R410A.mo index 7c15b5b077..68ef08ba69 100644 --- a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA360_116kW_4_60COP_R410A.mo +++ b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA360_116kW_4_60COP_R410A.mo @@ -10,7 +10,6 @@ record Daikin_WRA360_116kW_4_60COP_R410A = UACon = 25362.0976534, UAEva = 196974.891726) "Calibrated parameters for Daikin WRA360" - annotation ( defaultComponentPrefixes = "parameter", defaultComponentName="datHeaPum", diff --git a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA420_137kW_4_50COP_R410A.mo b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA420_137kW_4_50COP_R410A.mo index f7aa7772eb..eb23183f6a 100644 --- a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA420_137kW_4_50COP_R410A.mo +++ b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Daikin_WRA420_137kW_4_50COP_R410A.mo @@ -10,7 +10,6 @@ record Daikin_WRA420_137kW_4_50COP_R410A = UACon = 24801.5921552, UAEva = 297902.470363) "Calibrated parameters for Daikin WRA420" - annotation ( defaultComponentPrefixes = "parameter", defaultComponentName="datHeaPum", diff --git a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Trane_EXW060_21kW_4_30COP_R410A.mo b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Trane_EXW060_21kW_4_30COP_R410A.mo index 41737ef039..f6d6e8cd90 100644 --- a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Trane_EXW060_21kW_4_30COP_R410A.mo +++ b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Trane_EXW060_21kW_4_30COP_R410A.mo @@ -10,7 +10,6 @@ record Trane_EXW060_21kW_4_30COP_R410A = UACon = 3260.47025405, UAEva = 41007.3610647) "Calibrated parameters for Trane EXW060" - annotation ( defaultComponentPrefixes = "parameter", defaultComponentName="datHeaPum", diff --git a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Trane_EXW120_40kW_3_90COP_R410A.mo b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Trane_EXW120_40kW_3_90COP_R410A.mo index eb9eddb6fa..1d65100a84 100644 --- a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Trane_EXW120_40kW_3_90COP_R410A.mo +++ b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Trane_EXW120_40kW_3_90COP_R410A.mo @@ -10,7 +10,6 @@ record Trane_EXW120_40kW_3_90COP_R410A = UACon = 4233.2477479, UAEva = 38367.2250194) "Calibrated parameters for Trane EXW120" - annotation ( defaultComponentPrefixes = "parameter", defaultComponentName="datHeaPum", diff --git a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Trane_EXW240_76kW_4_10COP_R410A.mo b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Trane_EXW240_76kW_4_10COP_R410A.mo index e307ffa3ec..6c58aab366 100644 --- a/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Trane_EXW240_76kW_4_10COP_R410A.mo +++ b/AixLib/Fluid/HeatPumps/Data/ScrollWaterToWater/Heating/Trane_EXW240_76kW_4_10COP_R410A.mo @@ -10,7 +10,6 @@ record Trane_EXW240_76kW_4_10COP_R410A = UACon = 14814.6977543, UAEva = 97189.7265209) "Calibrated parameters for Trane EXW240" - annotation ( defaultComponentPrefixes = "parameter", defaultComponentName="datHeaPum", diff --git a/AixLib/Fluid/HeatPumps/Examples/package.mo b/AixLib/Fluid/HeatPumps/Examples/package.mo index 38ac7d52e8..3f1563bb1d 100644 --- a/AixLib/Fluid/HeatPumps/Examples/package.mo +++ b/AixLib/Fluid/HeatPumps/Examples/package.mo @@ -1,6 +1,7 @@ within AixLib.Fluid.HeatPumps; package Examples "Collection of models that illustrate model use and test models" extends Modelica.Icons.ExamplesPackage; + annotation (preferredView="info", Documentation(info="This package contains examples for the use of models that can be found in diff --git a/AixLib/Fluid/HeatPumps/HeatPump.mo b/AixLib/Fluid/HeatPumps/HeatPump.mo index 35fcfb11c9..572edc6f87 100644 --- a/AixLib/Fluid/HeatPumps/HeatPump.mo +++ b/AixLib/Fluid/HeatPumps/HeatPump.mo @@ -5,18 +5,33 @@ model HeatPump use_rev=true, final machineType = true, redeclare AixLib.Fluid.HeatPumps.BaseClasses.InnerCycle_HeatPump innerCycle( - final use_rev=use_rev, + final use_rev=false, final scalingFactor=scalingFactor, - redeclare model PerDataMainHP = PerDataMainHP, + THotMax=THotMax, + THotNom=THotNom, + TSourceNom=TSourceNom, + QNom=QNom, + PLRMin=PLRMin, + HighTemp=HighTemp, + DeltaTCon=DeltaTCon, + DeltaTEvap=DeltaTEvap, + TSource=TSource, + dTConFix=dTConFix, + redeclare model PerDataMainHP = + DataBase.ThermalMachines.HeatPump.PerformanceData.LookUpTableNDNotManudacturer, redeclare model PerDataRevHP = PerDataRevHP)); replaceable model PerDataMainHP = - AixLib.DataBase.ThermalMachines.HeatPump.PerformanceData.BaseClasses.PartialPerformanceData + DataBase.ThermalMachines.Chiller.PerformanceData.LookUpTableND + constrainedby + AixLib.DataBase.ThermalMachines.HeatPump.PerformanceData.BaseClasses.PartialPerformanceData "Performance data of a heat pump in main operation mode" annotation (choicesAllMatching=true); replaceable model PerDataRevHP = - AixLib.DataBase.ThermalMachines.Chiller.PerformanceData.BaseClasses.PartialPerformanceData + DataBase.ThermalMachines.Chiller.PerformanceData.LookUpTableND + constrainedby + AixLib.DataBase.ThermalMachines.Chiller.PerformanceData.BaseClasses.PartialPerformanceData "Performance data of a heat pump in reversible operation mode" annotation (Dialog(enable=use_rev),choicesAllMatching=true); diff --git a/AixLib/Fluid/HeatPumps/ModularHeatPump.mo b/AixLib/Fluid/HeatPumps/ModularHeatPump.mo new file mode 100644 index 0000000000..19099b80bd --- /dev/null +++ b/AixLib/Fluid/HeatPumps/ModularHeatPump.mo @@ -0,0 +1,314 @@ +within AixLib.Fluid.HeatPumps; +model ModularHeatPump + + extends AixLib.Fluid.Interfaces.PartialTwoPortInterface(redeclare package + Medium = Media.Water,final m_flow_nominal=QNom/MediumCon.cp_const/DeltaTCon); + parameter Boolean dTConFix=false "Constant delta T condenser" + annotation (choices(checkBox=true), Dialog(descriptionLabel=true, group="General machine information")); + parameter Boolean HighTemp=false "High temperature HP" + annotation(choices(checkBox=true), Dialog(descriptionLabel=true, group="General machine information")); + + parameter Modelica.SIunits.Temperature THotMax= if HighTemp==false then 273.15+55 else 273.15+90 "Max. value of THot to force shutdown" + annotation (Dialog(tab="Advanced", group="General machine information")); + parameter Modelica.SIunits.Temperature THotNom=313.15 "Nominal temperature of THot" + annotation (Dialog(group="Nominal condition")); + parameter Modelica.SIunits.Temperature TSourceNom=278.15 "Nominal temperature of TSource" + annotation (Dialog(group="Nominal condition")); + parameter Modelica.SIunits.HeatFlowRate QNom=150000 "Nominal heat flow" + annotation (Dialog(group="Nominal condition")); + parameter Real PLRMin=0.4 "Limit of PLR; less =0" + annotation (Dialog(group="General machine information")); + + parameter Modelica.SIunits.TemperatureDifference DeltaTCon=7 "Temperature difference heat sink condenser" + annotation (Dialog(enable=dTConFix,tab="Advanced",group="General machine information")); + + parameter Modelica.SIunits.Temperature T_Start_Condenser=293.15 "Initial temperature condenser" + annotation (Dialog(tab="Advanced")); + + parameter Boolean TSourceInternal=true + "Use internal TSource?" + annotation (choices(checkBox=true), Dialog(descriptionLabel=true, tab="Advanced",group="General machine information")); + + parameter Modelica.SIunits.Temperature TSourceFixed=TSourceNom "Temperature of heat source" + annotation (Dialog(enable=TSourceInternal,tab="Advanced",group="General machine information")); + +parameter Modelica.SIunits.MassFlowRate m_flow_nominal=QNom/MediumCon.cp_const/DeltaTCon; + + replaceable package MediumEvap = Media.Water + constrainedby + Modelica.Media.Interfaces.PartialMedium "Medium heat source" + annotation (choices( + choice(redeclare package Medium = AixLib.Media.Water "Water"), + choice(redeclare package Medium = + AixLib.Media.Antifreeze.PropyleneGlycolWater ( + property_T=293.15, + X_a=0.40) + "Propylene glycol water, 40% mass fraction"))); + + parameter Modelica.SIunits.Pressure dpExternal=0 "Additional system pressure difference"; + HeatPump heatPump( + redeclare package Medium_con = + Modelica.Media.Water.ConstantPropertyLiquidWater, + redeclare package Medium_eva = + Modelica.Media.Water.ConstantPropertyLiquidWater, + use_rev=false, + use_autoCalc=true, + Q_useNominal=QNom, + scalingFactor=1, + use_refIne=true, + refIneFre_constant=5, + nthOrder=3, + useBusConnectorOnly=true, + dpCon_nominal=25000, + use_conCap=false, + dpEva_nominal=25000, + use_evaCap=false, + tauSenT=0, + transferHeat=false, + allowFlowReversalEva=false, + allowFlowReversalCon=false, + initType=Modelica.Blocks.Types.Init.SteadyState, + TCon_start=T_Start_Condenser, + massDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, + energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, + show_TPort=false, + THotMax=THotMax, + THotNom=THotNom, + TSourceNom=TSourceNom, + QNom=QNom, + PLRMin=PLRMin, + HighTemp=HighTemp, + DeltaTCon=DeltaTCon, + DeltaTEvap=DeltaTEvap, + TSource=TSourceFixed, + dTConFix=dTConFix, + redeclare model PerDataMainHP = + DataBase.ThermalMachines.HeatPump.PerformanceData.LookUpTableNDNotManudacturer) + annotation (Placement(transformation(extent={{-10,-18},{10,6}}))); + + Controls.Interfaces.ThermalMachineControlBus sigBus annotation ( + Placement(transformation(extent={{-20,82},{10,116}}), + iconTransformation(extent={{-8,90},{10,116}}))); + inner Modelica.Fluid.System system(p_start=system.p_ambient) + annotation (Placement(transformation(extent={{80,80},{100,100}}))); + Modelica.Blocks.Sources.BooleanExpression mode(y=true) + annotation (Placement(transformation(extent={{44,92},{28,106}}))); + + Sensors.TemperatureTwoPort senTHot( + redeclare final package Medium = Media.Water, + final m_flow_nominal=QNom/(4180*DeltaTCon), + final initType=Modelica.Blocks.Types.Init.InitialState, + final transferHeat=false, + final allowFlowReversal=false, + final m_flow_small=0.001) + "Temperature sensor of hot side of heat generator (supply)" + annotation (Placement(transformation(extent={{-8,-8},{8,8}}, + rotation=0, + origin={58,0}))); + + Modelica.Blocks.Sources.RealExpression mFlowEva(y=MediumEvap.cp_const* + DeltaTEvap) "massflow heat source" + annotation (Placement(transformation(extent={{110,-48},{72,-26}}))); + Modelica.Blocks.Math.Division division1 + annotation (Placement(transformation(extent={{60,-40},{44,-24}}))); + Modelica.Blocks.Sources.RealExpression tSource(y=TSourceFixed) + "TSource" + annotation (Placement(transformation(extent={{-62,-98},{-38,-84}}))); + Sensors.TemperatureTwoPort senTCold( + redeclare final package Medium = Media.Water, + final m_flow_nominal=QNom/(4180*DeltaTCon), + final initType=Modelica.Blocks.Types.Init.InitialState, + final transferHeat=false, + final allowFlowReversal=false, + final m_flow_small=0.001) + "Temperature sensor of hot side of heat generator (supply)" + annotation (Placement(transformation(extent={{-9,-10},{9,10}}, + rotation=0, + origin={-37,0}))); + + Sources.Boundary_pT bouEvap_b(redeclare package Medium = MediumEvap, nPorts=1) + annotation (Placement(transformation(extent={{-68,-50},{-48,-30}}))); + Sources.MassFlowSource_T bouEvap_a( + redeclare package Medium = MediumEvap, + use_m_flow_in=true, + m_flow=1, + use_T_in=true, + T=306.15, + nPorts=1) annotation (Placement(transformation(extent={{60,-82},{40,-62}}))); + Modelica.Blocks.Continuous.Integrator integrator + annotation (Placement(transformation(extent={{52,58},{64,70}}))); + + BaseClasses.ControlMflowNotManufacturer control( + THotMax=THotMax, + THotNom=THotNom, + TSourceNom=TSourceNom, + QNom=QNom, + PLRMin=PLRMin, + HighTemp=HighTemp, + DeltaTCon=DeltaTCon, + dTConFix=dTConFix) + annotation (Placement(transformation(extent={{-66,36},{-46,56}}))); + Modelica.Blocks.Logical.Switch switch1 + annotation (Placement(transformation(extent={{8,-8},{-8,8}}, + rotation=180, + origin={-4,-64}))); + Modelica.Blocks.Sources.BooleanExpression booleanExpression(y=TSourceInternal) + annotation (Placement(transformation(extent={{-80,-84},{-60,-64}}))); + + Modelica.Blocks.Logical.Greater greater + annotation (Placement(transformation(extent={{30,42},{14,58}}))); + Modelica.Blocks.Sources.RealExpression tHotMax(y=THotMax - DeltaTCon) + "Maximal THot" + annotation (Placement(transformation(extent={{62,28},{38,44}}))); + Movers.SpeedControlled_y fan1(redeclare package Medium = Media.Water, + allowFlowReversal=false, + m_flow_small=0.001, + per(pressure(V_flow={0,m_flow_nominal/1000,m_flow_nominal/500}, dp={(25000 + + dpExternal)/0.8,(25000 + dpExternal),0})), + addPowerToMedium=false) + annotation (Placement(transformation(extent={{-74,-10},{-54,10}}))); +protected + replaceable package MediumCon = AixLib.Media.Water constrainedby + Modelica.Media.Interfaces.PartialMedium "Medium heat sink"; + + parameter Modelica.SIunits.TemperatureDifference DeltaTEvap=3 "Temperature difference heat source evaporator" + annotation (Dialog(tab="Advanced",group="General machine information")); + + + +equation + + connect(mode.y, sigBus.mode) annotation (Line(points={{27.2,99},{2,99},{2, + 99.085},{-4.925,99.085}}, + color={255,0,255}), Text( + string="%second", + index=1, + extent={{6,3},{6,3}}, + horizontalAlignment=TextAlignment.Left)); + connect(heatPump.port_b1, senTHot.port_a) + annotation (Line(points={{10,0},{50,0}}, color={0,127,255})); + + connect(mFlowEva.y, division1.u2) annotation (Line(points={{70.1,-37},{64,-37}, + {64,-36},{61.6,-36},{61.6,-36.8}}, + color={0,0,127})); + connect(senTCold.port_b, heatPump.port_a1) annotation (Line(points={{-28,0},{-10, + 0}}, color={0,127,255})); + connect(sigBus, heatPump.sigBus) annotation (Line( + points={{-5,99},{-5,28},{-24,28},{-24,-9.9},{-9.9,-9.9}}, + color={255,204,51}, + thickness=0.5), Text( + string="%first", + index=-1, + extent={{-6,3},{-6,3}}, + horizontalAlignment=TextAlignment.Right)); + connect(sigBus.QEvapNom, division1.u1) annotation (Line( + points={{-4.925,99.085},{-4.925,74},{72,74},{72,-27.2},{61.6,-27.2}}, + color={255,204,51}, + thickness=0.5), Text( + string="%first", + index=-1, + extent={{6,3},{6,3}}, + horizontalAlignment=TextAlignment.Left)); + connect(bouEvap_b.ports[1], heatPump.port_b2) annotation (Line(points={{-48,-40}, + {-10,-40},{-10,-12}}, color={0,127,255})); + connect(bouEvap_a.ports[1], heatPump.port_a2) annotation (Line(points={{40,-72}, + {26,-72},{26,-12},{10,-12}}, color={0,127,255})); + connect(division1.y,bouEvap_a. m_flow_in) annotation (Line(points={{43.2,-32}, + {40,-32},{40,-50},{86,-50},{86,-64},{62,-64}}, color={0,0,127})); + connect(senTHot.port_b, port_b) annotation (Line(points={{66,0},{100,0}}, + color={0,127,255})); + connect(sigBus.Pel, integrator.u) annotation (Line( + points={{-4.925,99.085},{-4.925,64},{50.8,64}}, + color={255,204,51}, + thickness=0.5), Text( + string="%first", + index=-1, + extent={{-6,3},{-6,3}}, + horizontalAlignment=TextAlignment.Right)); + + connect(sigBus.PLR, control.PLR) annotation (Line( + points={{-4.925,99.085},{-4.925,53},{-44,53}}, + color={255,204,51}, + thickness=0.5), Text( + string="%first", + index=-1, + extent={{6,3},{6,3}}, + horizontalAlignment=TextAlignment.Left)); + connect(senTHot.T, control.THot) annotation (Line(points={{58,8.8},{58,28},{4, + 28},{4,42},{-44,42}}, color={0,0,127})); + connect(switch1.y, bouEvap_a.T_in) annotation (Line(points={{4.8,-64},{10,-64}, + {10,-76},{14,-76},{14,-82},{68,-82},{68,-68},{62,-68}}, color={0,0,127})); + connect(tSource.y, switch1.u1) annotation (Line(points={{-36.8,-91},{-13.6, + -91},{-13.6,-70.4}}, + color={0,0,127})); + connect(booleanExpression.y, switch1.u2) annotation (Line(points={{-59,-74},{ + -44,-74},{-44,-64},{-13.6,-64}}, + color={255,0,255})); + connect(tHotMax.y, greater.u2) annotation (Line(points={{36.8,36},{32,36},{32, + 43.6},{31.6,43.6}}, color={0,0,127})); + connect(greater.y, sigBus.Shutdown) annotation (Line(points={{13.2,50},{10,50}, + {10,99.085},{-4.925,99.085}}, color={255,0,255}), Text( + string="%second", + index=1, + extent={{-6,3},{-6,3}}, + horizontalAlignment=TextAlignment.Right)); + connect(greater.y, control.Shutdown) annotation (Line(points={{13.2,50},{10, + 50},{10,46},{-44,46}}, color={255,0,255})); + connect(senTCold.T, greater.u1) annotation (Line(points={{-37,11},{-37,18},{ + 66,18},{66,50},{31.6,50}}, color={0,0,127})); + connect(port_a, fan1.port_a) + annotation (Line(points={{-100,0},{-74,0}}, color={0,127,255})); + connect(senTCold.port_a, fan1.port_b) + annotation (Line(points={{-46,0},{-54,0}}, color={0,127,255})); + connect(control.mFlowCon, fan1.y) annotation (Line(points={{-67.2,46},{-76,46}, + {-76,20},{-64,20},{-64,12}}, color={0,0,127})); + connect(senTCold.T, control.TCold) annotation (Line(points={{-37,11},{-37,36}, + {-42,36},{-42,37},{-44,37}}, color={0,0,127})); + connect(sigBus.TSource, switch1.u3) annotation (Line( + points={{-4.925,99.085},{-4.925,74},{-110,74},{-110,-57.6},{-13.6,-57.6}}, + color={255,204,51}, + thickness=0.5), Text( + string="%first", + index=-1, + extent={{-6,3},{-6,3}}, + horizontalAlignment=TextAlignment.Right)); + + annotation (Icon(coordinateSystem(preserveAspectRatio=false), graphics={ + Rectangle( + extent={{-17,83},{17,-83}}, + fillColor={255,0,128}, + fillPattern=FillPattern.Solid, + lineColor={0,0,0}, + origin={1,61}, + rotation=90), + Rectangle( + extent={{-82,42},{84,-46}}, + lineColor={238,46,47}, + fillColor={0,0,0}, + fillPattern=FillPattern.Solid), + Rectangle( + extent={{-16,83},{16,-83}}, + fillColor={170,213,255}, + fillPattern=FillPattern.Solid, + lineColor={0,0,0}, + origin={1,-64}, + rotation=90)}), Diagram( + coordinateSystem(preserveAspectRatio=false)), + experiment(StopTime=40000), + Documentation(info=" +
Modular heat pump with different options
+
with different operation types:
Concept
The inner cycle of the heat pump is a Black-Box. The Black-Box uses 4-D performance maps, which describe the COP. The maps are based on a given THot, TSource, deltaTCon and PLR (for further informations: AixLib.DataBase.ThermalMachines.HeatPump.PerformanceData.LookUpTableNDNotManudacturer). The parameters QNom, THotNom, TSourceNom describe the nominal behaviour for a full load operation point e.g. W10W55 or B0W45. The nominal full load electircal power is calculated with the nominal COP and is constant for different TSource. The part load beaviour describes the part load of the compressor as a product of PLR and nominal full load electrical power (variable speed control). The thermal power and the thermal demand are calculated for any operation point as a function of COP and electrical power.
This package contains component models for heat pumps.
")); - end HeatPumps; diff --git a/AixLib/Fluid/HeatPumps/package.order b/AixLib/Fluid/HeatPumps/package.order index a374509e64..3955bb7cd8 100644 --- a/AixLib/Fluid/HeatPumps/package.order +++ b/AixLib/Fluid/HeatPumps/package.order @@ -9,3 +9,4 @@ Data Examples Validation BaseClasses +ModularHeatPump diff --git a/AixLib/SDF.Functions.getTableDataSize.exe b/AixLib/SDF.Functions.getTableDataSize.exe new file mode 100644 index 0000000000..c871f1c2a4 Binary files /dev/null and b/AixLib/SDF.Functions.getTableDataSize.exe differ