diff --git a/AixLib/Controls/HeatPump/BaseClasses/InverterControlledHP.mo b/AixLib/Controls/HeatPump/BaseClasses/InverterControlledHP.mo
deleted file mode 100644
index ef8f180fcb..0000000000
--- a/AixLib/Controls/HeatPump/BaseClasses/InverterControlledHP.mo
+++ /dev/null
@@ -1,43 +0,0 @@
-within AixLib.Controls.HeatPump.BaseClasses;
-model InverterControlledHP "Converter model for an inverter / speed controlled HP modulating between 0 and 1"
- extends PartialTSetToNSet;
- parameter Real hys "Hysteresis of controller";
- Modelica.Blocks.Logical.OnOffController onOffController(bandwidth=hys,
- pre_y_start=false) "Hysteresis controller for set temperature"
- annotation (Placement(transformation(extent={{-58,-6},{-30,22}})));
- Modelica.Blocks.Continuous.LimPID InverterControl(
- final controllerType=Modelica.Blocks.Types.SimpleController.PI,
- final k=k,
- final Ti=Ti,
- final yMax=1,
- final yMin=0)
- "PI-Control for a inverter controlled HP"
- annotation (Placement(transformation(extent={{14,38},{34,58}})));
- parameter Real k=0.1 "Gain of controller"
- annotation (Dialog(group="PI Values"));
- parameter Modelica.Units.SI.Time Ti=30 "Time constant of Integrator block"
- annotation (Dialog(group="PI Values"));
-equation
- connect(TSet, onOffController.reference) annotation (Line(points={{-116,60},{
- -77.5,60},{-77.5,16.4},{-60.8,16.4}},
- color={0,0,127}));
- connect(InverterControl.y, swiNullHP.u1)
- annotation (Line(points={{35,48},{52,48},{52,8},{64,8}}, color={0,0,127}));
- connect(TSet, InverterControl.u_s) annotation (Line(points={{-116,60},{-43.5,
- 60},{-43.5,48},{12,48}}, color={0,0,127}));
- connect(TAct, onOffController.u) annotation (Line(points={{-116,-80},{-70,-80},
- {-70,-0.4},{-60.8,-0.4}},color={0,0,127}));
- connect(TAct, InverterControl.u_m) annotation (Line(points={{-116,-80},{-70,
- -80},{-70,32},{24,32},{24,36}},
- color={0,0,127}));
- connect(onOffController.y, andHeaLim.u1) annotation (Line(points={{-28.6,8},{
- 24,8},{24,0},{36.8,0}}, color={255,0,255}));
- annotation (Documentation(revisions="
- -
- November 26, 2018 by Fabian Wüllhorst:
- First implementation (see issue #577)
-
-
-"));
-end InverterControlledHP;
diff --git a/AixLib/Controls/HeatPump/BaseClasses/OnOffHP.mo b/AixLib/Controls/HeatPump/BaseClasses/OnOffHP.mo
deleted file mode 100644
index 8724a1352a..0000000000
--- a/AixLib/Controls/HeatPump/BaseClasses/OnOffHP.mo
+++ /dev/null
@@ -1,29 +0,0 @@
-within AixLib.Controls.HeatPump.BaseClasses;
-model OnOffHP "Controller gives full speed or stop signal depending on temperature hysteresis"
- extends AixLib.Controls.HeatPump.BaseClasses.PartialTSetToNSet;
- parameter Real hys "Hysteresis of controller";
- Modelica.Blocks.Logical.OnOffController onOffController(bandwidth=hys, pre_y_start=false) "Hysteresis controller for set temperature"
- annotation (Placement(transformation(extent={{-54,10},{-26,38}})));
- Modelica.Blocks.Sources.Constant conOne(final k=1.0)
- "Constant one for on off heat pump" annotation (Placement(transformation(extent={{38,14},{50,26}})));
-
-equation
- connect(TSet, onOffController.reference) annotation (Line(points={{-116,60},{
- -85.5,60},{-85.5,32.4},{-56.8,32.4}}, color={0,0,127}));
- connect(conOne.y, swiNullHP.u1) annotation (Line(points={{50.6,20},{58,20},{
- 58,8},{64,8}}, color={0,0,127}));
- connect(TAct, onOffController.u) annotation (Line(points={{-116,-80},{-72,-80},
- {-72,15.6},{-56.8,15.6}}, color={0,0,127}));
- connect(onOffController.y, andHeaLim.u1) annotation (Line(points={{-24.6,24},
- {5.7,24},{5.7,0},{36.8,0}}, color={255,0,255}));
- annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram(
- coordinateSystem(preserveAspectRatio=false)),
- Documentation(revisions="
- -
- November 26, 2018 by Fabian Wüllhorst:
- First implementation (see issue #577)
-
-
-"));
-end OnOffHP;
diff --git a/AixLib/Controls/HeatPump/BaseClasses/PartialHPController.mo b/AixLib/Controls/HeatPump/BaseClasses/PartialHPController.mo
index b7b2114afe..116d9fc376 100644
--- a/AixLib/Controls/HeatPump/BaseClasses/PartialHPController.mo
+++ b/AixLib/Controls/HeatPump/BaseClasses/PartialHPController.mo
@@ -1,7 +1,7 @@
within AixLib.Controls.HeatPump.BaseClasses;
partial model PartialHPController
"Base class of a heat pump controller with bus interface"
- AixLib.Controls.Interfaces.VapourCompressionMachineControlBus heatPumpControlBus
+ AixLib.Fluid.HeatPumps.ModularReversible.BaseClasses.RefrigerantMachineControlBus heatPumpControlBus
annotation (Placement(transformation(
extent={{-29.5,-29.5},{29.5,29.5}},
rotation=270,
diff --git a/AixLib/Controls/HeatPump/BaseClasses/PartialTSetToNSet.mo b/AixLib/Controls/HeatPump/BaseClasses/PartialTSetToNSet.mo
index 17265ce842..db9eff7569 100644
--- a/AixLib/Controls/HeatPump/BaseClasses/PartialTSetToNSet.mo
+++ b/AixLib/Controls/HeatPump/BaseClasses/PartialTSetToNSet.mo
@@ -5,18 +5,19 @@ partial model PartialTSetToNSet
"True to choose a bivalent system" annotation(choices(checkBox=true));
// Heating limit temperature
+ parameter Boolean use_heaLim=true "=false to disable moving average heating limit" annotation (Dialog(group="Heating limit temperature"));
parameter Modelica.Units.SI.Temperature T_heaLim=293.15
- "Heating limit temperature. If the filtered outdoor air temperature surpasses this threshold, the device will be shut down"
- annotation (Dialog(group="Heating limit temperature"));
+ "Heating limit temperature. If the filtered outdoor air temperature surpasses this threshold, the device will be shut down" annotation(Dialog(group=
+ "Heating limit temperature", enable=use_heaLim));
parameter Modelica.Units.SI.Time movAveTime=300
- "Time span for building the average of the outdoor air temperature. Used for heating limit temperature"
- annotation (Dialog(group="Heating limit temperature"));
+ "Time span for building the average of the outdoor air temperature. Used for heating limit temperature" annotation (Dialog(group=
+ "Heating limit temperature", enable=use_heaLim));
- AixLib.Utilities.Logical.SmoothSwitch swiNullHP "If HP is off, zero is passed"
- annotation (Placement(transformation(extent={{66,-10},{86,10}})));
+ Modelica.Blocks.Logical.Switch swiNullHP "If HP is off, zero is passed"
+ annotation (Placement(transformation(extent={{60,-20},{80,0}})));
Modelica.Blocks.Sources.Constant conZer(final k=0)
"If an error occurs, the compressor speed is set to zero"
- annotation (Placement(transformation(extent={{38,-24},{50,-12}})));
+ annotation (Placement(transformation(extent={{20,-50},{40,-30}})));
Modelica.Blocks.Interfaces.RealInput TSet(
final quantity="ThermodynamicTemperature",
final unit="K",
@@ -24,15 +25,15 @@ partial model PartialTSetToNSet
annotation (Placement(transformation(extent={{-132,44},{-100,76}})));
Modelica.Blocks.Interfaces.RealOutput nOut "Relative speed of compressor. From 0 to 1"
annotation (Placement(transformation(extent={{100,-10},{120,10}})));
- AixLib.Controls.Interfaces.VapourCompressionMachineControlBus sigBusHP
- annotation (Placement(transformation(extent={{-124,-42},{-90,-12}})));
+ AixLib.Fluid.HeatPumps.ModularReversible.BaseClasses.RefrigerantMachineControlBus sigBusHP
+ annotation (Placement(transformation(extent={{-124,-46},{-90,-16}})));
Modelica.Blocks.Interfaces.RealOutput ySecHeaGen if use_secHeaGen
"Relative power of second heat generator, from 0 to 1"
annotation (Placement(transformation(
extent={{-10,-10},{10,10}},
rotation=-90,
- origin={12,-108})));
- Modelica.Blocks.Interfaces.RealInput TAct(
+ origin={0,-110})));
+ Modelica.Blocks.Interfaces.RealInput TMea(
final quantity="ThermodynamicTemperature",
final unit="K",
final displayUnit="degC") "Actual temperature, control variable"
@@ -40,37 +41,41 @@ partial model PartialTSetToNSet
extent={{16,16},{-16,-16}},
rotation=180,
origin={-116,-80})));
- Utilities.Logical.SmoothSwitch swiNullsecHeaGen if use_secHeaGen
+ AixLib.Utilities.Logical.SmoothSwitch swiNullsecHeaGen if use_secHeaGen
"If second heater is off, zero is passed" annotation (Placement(
transformation(
- extent={{8,-8},{-8,8}},
+ extent={{10,-10},{-10,10}},
rotation=90,
- origin={12,-84})));
- Utilities.Math.MovingAverage movAve(final aveTime=movAveTime)
+ origin={0,-70})));
+ AixLib.Utilities.Math.MovingAverage movAve(final aveTime=movAveTime, final u_start=0)
+ if use_heaLim
"Moving average to account for fluctuations in the outdoor air temperature"
- annotation (Placement(transformation(extent={{-88,-34},{-76,-20}})));
+ annotation (Placement(transformation(extent={{-92,-40},{-72,-20}})));
Modelica.Blocks.Logical.And andHeaLim
"Check if control and heating limit temperature yield true to turn the device on"
- annotation (Placement(transformation(extent={{38,-6},{50,6}})));
+ annotation (Placement(transformation(extent={{20,-20},{40,0}})));
Modelica.Blocks.Logical.LessThreshold lessThreshold(final threshold=
- T_heaLim)
- annotation (Placement(transformation(extent={{-66,-34},{-52,-20}})));
+ T_heaLim) if use_heaLim
+ annotation (Placement(transformation(extent={{-60,-40},{-40,-20}})));
+ Modelica.Blocks.Sources.BooleanConstant booleanConstant(final k=true)
+ if not use_heaLim
+ annotation (Placement(transformation(extent={{-60,-80},{-40,-60}})));
equation
- connect(conZer.y, swiNullHP.u3) annotation (Line(points={{50.6,-18},{58,-18},
- {58,-8},{64,-8}}, color={0,0,127}));
+ connect(conZer.y, swiNullHP.u3) annotation (Line(points={{41,-40},{54,-40},{
+ 54,-18},{58,-18}},color={0,0,127}));
connect(swiNullHP.y, nOut)
- annotation (Line(points={{87,0},{110,0}}, color={0,0,127}));
+ annotation (Line(points={{81,-10},{98,-10},{98,0},{110,0}},
+ color={0,0,127}));
connect(swiNullsecHeaGen.y, ySecHeaGen)
- annotation (Line(points={{12,-92.8},{12,-108}},
- color={0,0,127}));
- connect(conZer.y, swiNullsecHeaGen.u3) annotation (Line(points={{50.6,-18},{
- 70,-18},{70,-74.4},{18.4,-74.4}},
- color={0,0,127}));
+ annotation (Line(points={{-8.88178e-16,-81},{-8.88178e-16,-98},{0,-98},{0,
+ -110}}, color={0,0,127}));
+ connect(conZer.y, swiNullsecHeaGen.u3) annotation (Line(points={{41,-40},{70,
+ -40},{70,-58},{8,-58}}, color={0,0,127}));
connect(sigBusHP.T_oda, movAve.u) annotation (Line(
- points={{-107,-27},{-94,-27},{-94,-27},{-89.2,-27}},
+ points={{-107,-31},{-94,-31},{-94,-30}},
color={255,204,51},
thickness=0.5), Text(
string="%first",
@@ -78,11 +83,14 @@ equation
extent={{-3,-6},{-3,-6}},
horizontalAlignment=TextAlignment.Right));
connect(movAve.y, lessThreshold.u)
- annotation (Line(points={{-75.4,-27},{-67.4,-27}}, color={0,0,127}));
- connect(lessThreshold.y, andHeaLim.u2) annotation (Line(points={{-51.3,-27},{-26,
- -27},{-26,-4.8},{36.8,-4.8}}, color={255,0,255}));
+ annotation (Line(points={{-71,-30},{-62,-30}}, color={0,0,127}));
+ connect(lessThreshold.y, andHeaLim.u2) annotation (Line(points={{-39,-30},{
+ -26,-30},{-26,-18},{18,-18}}, color={255,0,255}));
connect(andHeaLim.y, swiNullHP.u2)
- annotation (Line(points={{50.6,0},{64,0}}, color={255,0,255}));
+ annotation (Line(points={{41,-10},{58,-10}},
+ color={255,0,255}));
+ connect(booleanConstant.y, andHeaLim.u2) annotation (Line(points={{-39,-70},{
+ -26,-70},{-26,-18},{18,-18}}, color={255,0,255}));
annotation (Icon(coordinateSystem(preserveAspectRatio=false), graphics={
Rectangle(
extent={{-100,100},{100,-100}},
diff --git a/AixLib/Controls/HeatPump/BaseClasses/package.order b/AixLib/Controls/HeatPump/BaseClasses/package.order
index 512aff2f8b..2d55484766 100644
--- a/AixLib/Controls/HeatPump/BaseClasses/package.order
+++ b/AixLib/Controls/HeatPump/BaseClasses/package.order
@@ -1,4 +1,2 @@
-InverterControlledHP
-OnOffHP
PartialHPController
PartialTSetToNSet
diff --git a/AixLib/Controls/HeatPump/DefrostControl.mo b/AixLib/Controls/HeatPump/DefrostControl.mo
new file mode 100644
index 0000000000..2153693c1a
--- /dev/null
+++ b/AixLib/Controls/HeatPump/DefrostControl.mo
@@ -0,0 +1,179 @@
+within AixLib.Controls.HeatPump;
+model DefrostControl
+ "Control block to ensure no frost limits heat flow at the evaporator"
+ parameter Real minIceFac "Minimal value above which no defrost is necessary";
+
+ parameter Real deltaIceFac = 0.1 "Bandwitdth for hystereses. If the icing factor is based on the duration of defrost, this value is necessary to avoid state-events.";
+ Modelica.Blocks.Interfaces.BooleanInput hea
+ annotation (Placement(transformation(extent={{-132,-36},{-100,-4}})));
+ Modelica.Blocks.Interfaces.RealInput ySet
+ "Set value relative speed of compressor. Analog from 0 to 1"
+ annotation (Placement(transformation(extent={{-132,4},{-100,36}})));
+ Utilities.Logical.SmoothSwitch swiErr
+ "If an error occurs, the value of the conZero block will be used(0)"
+ annotation (Placement(transformation(extent={{58,2},{78,22}})));
+ Modelica.Blocks.Sources.Constant conOne(final k=1)
+ "If Defrost is enabled, HP runs at full power"
+ annotation (Placement(transformation(extent={{0,-10},{20,10}})));
+ Modelica.Blocks.Interfaces.RealOutput yOut
+ "Relative speed of compressor. From 0 to 1"
+ annotation (Placement(transformation(extent={{100,10},{120,30}})));
+ Modelica.Blocks.Interfaces.BooleanOutput heaOut
+ annotation (Placement(transformation(extent={{100,-30},{120,-10}})));
+ Fluid.HeatPumps.ModularReversible.BaseClasses.RefrigerantMachineControlBus sigBus
+ annotation (Placement(transformation(extent={{-120,-76},{-92,-48}})));
+ Modelica.Blocks.Logical.Hysteresis iceFacGreMinChi(
+ final uLow=minIceFac,
+ final uHigh=minIceFac + deltaIceFac,
+ final pre_y_start=true)
+ "Check if icing factor is greater than a boundary" annotation (Placement(
+ transformation(
+ extent={{-10.5,-10.5},{10.5,10.5}},
+ rotation=0,
+ origin={-49.5,-61.5})));
+ Modelica.Blocks.Logical.LogicalSwitch logicalSwitch
+ "If a chiller is used to defrost, mode will be false"
+ annotation (Placement(transformation(extent={{58,-42},{78,-22}})));
+ Modelica.Blocks.Sources.BooleanConstant conTrueUseChi(final k=false)
+ "Set mode to false to simulate the defrost cycle"
+ annotation (Placement(transformation(extent={{20,-80},{40,-60}})));
+equation
+ connect(conOne.y, swiErr.u3) annotation (Line(points={{21,0},{46,0},{46,4},{
+ 56,4}}, color={0,0,127}));
+ connect(swiErr.y,yOut) annotation (Line(points={{79,12},{96,12},{96,20},{110,
+ 20}}, color={0,0,127}));
+ connect(ySet, swiErr.u1) annotation (Line(points={{-116,20},{56,20}},
+ color={0,0,127}));
+
+ connect(sigBus.iceFacMea, iceFacGreMinChi.u) annotation (Line(
+ points={{-106,-62},{-84.05,-62},{-84.05,-61.5},{-62.1,-61.5}},
+ color={255,204,51},
+ thickness=0.5), Text(
+ string="%first",
+ index=-1,
+ extent={{-6,3},{-6,3}},
+ horizontalAlignment=TextAlignment.Right));
+ connect(iceFacGreMinChi.y, swiErr.u2) annotation (Line(
+ points={{-37.95,-61.5},{8,-61.5},{8,-32},{44,-32},{44,12},{56,12}},
+ color={255,0,255}));
+ connect(logicalSwitch.y, heaOut) annotation (Line(points={{79,-32},{84,-32},{84,
+ -20},{110,-20}}, color={255,0,255}));
+ connect(hea, logicalSwitch.u1) annotation (Line(points={{-116,-20},{-32,-20},{
+ -32,-24},{56,-24}}, color={255,0,255}));
+ connect(iceFacGreMinChi.y, logicalSwitch.u2) annotation (Line(
+ points={{-37.95,-61.5},{8,-61.5},{8,-32},{56,-32}},
+ color={255,0,255}));
+ connect(conTrueUseChi.y, logicalSwitch.u3) annotation (Line(
+ points={{41,-70},{48,-70},{48,-40},{56,-40}},
+ color={255,0,255}));
+ annotation (Icon(coordinateSystem(preserveAspectRatio=false, extent={{-100,
+ -100},{100,80}}), graphics={
+ Rectangle(
+ extent={{-100,100},{100,-100}},
+ lineColor={28,108,200},
+ fillColor={255,255,170},
+ fillPattern=FillPattern.Solid),
+ Line(
+ points={{-36,34},{-36,-6}},
+ color={28,108,200}),
+ Line(
+ points={{0,20},{0,-20}},
+ color={28,108,200},
+ origin={-36,14},
+ rotation=90),
+ Line(
+ points={{-14,14},{14,-14}},
+ color={28,108,200},
+ origin={-36,14},
+ rotation=90),
+ Line(
+ points={{14,14},{-14,-14}},
+ color={28,108,200},
+ origin={-36,14},
+ rotation=90),
+ Line(
+ points={{8,64},{8,24}},
+ color={28,108,200}),
+ Line(
+ points={{0,20},{0,-20}},
+ color={28,108,200},
+ origin={8,44},
+ rotation=90),
+ Line(
+ points={{-14,14},{14,-14}},
+ color={28,108,200},
+ origin={8,44},
+ rotation=90),
+ Line(
+ points={{14,14},{-14,-14}},
+ color={28,108,200},
+ origin={8,44},
+ rotation=90),
+ Line(
+ points={{-34,-22},{-34,-62}},
+ color={28,108,200}),
+ Line(
+ points={{0,20},{0,-20}},
+ color={28,108,200},
+ origin={-34,-42},
+ rotation=90),
+ Line(
+ points={{-14,14},{14,-14}},
+ color={28,108,200},
+ origin={-34,-42},
+ rotation=90),
+ Line(
+ points={{14,14},{-14,-14}},
+ color={28,108,200},
+ origin={-34,-42},
+ rotation=90),
+ Line(
+ points={{14,6},{14,-34}},
+ color={28,108,200}),
+ Line(
+ points={{0,20},{0,-20}},
+ color={28,108,200},
+ origin={14,-14},
+ rotation=90),
+ Line(
+ points={{-14,14},{14,-14}},
+ color={28,108,200},
+ origin={14,-14},
+ rotation=90),
+ Line(
+ points={{14,14},{-14,-14}},
+ color={28,108,200},
+ origin={14,-14},
+ rotation=90),
+ Text(
+ extent={{-104,100},{106,76}},
+ lineColor={28,108,200},
+ lineThickness=0.5,
+ fillColor={255,255,255},
+ fillPattern=FillPattern.None,
+ textString="%name")}), Diagram(
+ coordinateSystem(preserveAspectRatio=false, extent={{-100,-100},{100,
+ 100}})),
+ Documentation(info="
+ Basic model for a defrost control. The icing factor is calculated in
+ the heat pump based on functions or other models.
+
+
+ If a given lower boundary is surpassed, the mode of the heat pump
+ will be set to false(eq. Chilling) and the compressor speed is set to
+ 1 to make the defrost process as fast as possible.
+
+
+ -
+ August 27, 2024 by Fabian Wüllhorst:
+ Adapted to new heat pump approach (see issue #1520)
+
+ -
+ November 26, 2018 by Fabian Wüllhorst:
+ First implementation (see issue #577)
+
+
+"));
+end DefrostControl;
diff --git a/AixLib/Controls/HeatPump/Examples/HeatPumpController.mo b/AixLib/Controls/HeatPump/Examples/HeatPumpController.mo
deleted file mode 100644
index 22ef9f3bbc..0000000000
--- a/AixLib/Controls/HeatPump/Examples/HeatPumpController.mo
+++ /dev/null
@@ -1,148 +0,0 @@
-within AixLib.Controls.HeatPump.Examples;
-model HeatPumpController "Example for usage of heat pump controller"
- extends Modelica.Icons.Example;
-
- HPControllerOnOff hPControllerOnOff(bandwidth=2)
- "Simple on/off controller for a heat pump"
- annotation (Placement(transformation(extent={{-60,-10},{-40,10}})));
- Modelica.Blocks.Interaction.Show.RealValue showN
- "Shows the current value of the revolution speed"
- annotation (Placement(transformation(extent={{60,60},{80,80}})));
- Modelica.Blocks.Interaction.Show.BooleanValue showOnOff
- "Shows the current value of the on/off signal"
- annotation (Placement(transformation(extent={{66,40},{86,60}})));
- AixLib.Controls.Interfaces.VapourCompressionMachineControlBus heatPumpControlBus
- "Required to make the signals on the bus accessible" annotation (Placement(
- transformation(
- extent={{-10,-10},{10,10}},
- rotation=270,
- origin={0,0})));
- Modelica.Blocks.Interaction.Show.BooleanValue showMode
- "Shows the current value of the mode signal"
- annotation (Placement(transformation(extent={{66,18},{86,38}})));
- Modelica.Blocks.Sources.RealExpression temperatureMeasurements[4](y={280,290,
- 300,310}) "Represents temperature measurements in heat pump"
- annotation (Placement(transformation(
- extent={{-30,-10},{30,10}},
- rotation=0,
- origin={-70,-76})));
- Modelica.Blocks.Sources.RealExpression massFlowRateMeasurements[2](y={0.5,1})
- "Represents mass flow rate measurements in heat pump"
- annotation (Placement(transformation(
- extent={{-30,-10},{30,10}},
- rotation=0,
- origin={-70,-96})));
- Modelica.Blocks.Sources.Sine T_meas(
- f=1/3600,
- amplitude=6,
- offset=310) "Generates the measured temperature"
- annotation (Placement(transformation(extent={{-100,20},{-80,40}})));
- Modelica.Blocks.Sources.Constant T_set(k=310)
- "Provides the temperature set point"
- annotation (Placement(transformation(extent={{-100,-40},{-80,-20}})));
- Modelica.Blocks.Interaction.Show.RealValue showT_meas
- "Shows the current value of the measured temperature"
- annotation (Placement(transformation(extent={{-60,70},{-20,90}})));
- Modelica.Blocks.Interfaces.RealOutput output_T_meas(
- final quantity="ThermodynamicTemperature",
- final unit="K",
- displayUnit="degC",
- min=0) "Outputs the temperature measurement"
- annotation (Placement(transformation(extent={{85,-75},{115,-45}})));
- Modelica.Blocks.Interfaces.BooleanOutput output_on
- "Outputs the on/off signal"
- annotation (Placement(transformation(extent={{86,-94},{114,-66}})));
-equation
- connect(hPControllerOnOff.heatPumpControlBus, heatPumpControlBus) annotation (
- Line(
- points={{-40.05,0.05},{-20.025,0.05},{-20.025,0},{0,0}},
- color={255,204,51},
- thickness=0.5), Text(
- string="%second",
- index=1,
- extent={{6,3},{6,3}}));
- connect(heatPumpControlBus.nSet, showN.numberPort) annotation (Line(
- points={{0.05,-0.05},{20,-0.05},{20,70},{58.5,70}},
- color={255,204,51},
- thickness=0.5), Text(
- string="%first",
- index=-1,
- extent={{-6,3},{-6,3}}));
- connect(temperatureMeasurements[1].y, heatPumpControlBus.TEvaInMea)
- annotation (Line(points={{-37,-76},{0.05,-76},{0.05,-0.05}},
- color={0,0,127}), Text(
- index=1,
- extent={{6,3},{6,3}}));
- connect(temperatureMeasurements[2].y, heatPumpControlBus.TConInMea)
- annotation (Line(points={{-37,-76},{0.05,-76},{0.05,-0.05}},
- color={0,0,127}), Text(
- index=1,
- extent={{6,3},{6,3}}));
- connect(temperatureMeasurements[3].y, heatPumpControlBus.TEvaOutMea)
- annotation (Line(points={{-37,-76},{0.05,-76},{0.05,-0.05}},
- color={0,0,127}), Text(
- index=1,
- extent={{6,3},{6,3}}));
- connect(temperatureMeasurements[4].y, heatPumpControlBus.TConOutMea)
- annotation (Line(points={{-37,-76},{0.05,-76},{0.05,-0.05}},
- color={0,0,127}), Text(
- index=1,
- extent={{6,3},{6,3}}));
- connect(massFlowRateMeasurements[1].y, heatPumpControlBus.m_flowEvaMea)
- annotation (Line(points={{-37,-96},{20,-96},{20,-0.05},{0.05,-0.05}},
- color={0,0,127}), Text(
- index=1,
- extent={{6,3},{6,3}}));
- connect(massFlowRateMeasurements[2].y, heatPumpControlBus.m_flowConMea)
- annotation (Line(points={{-37,-96},{0,-96},{0,-0.05},{0.05,-0.05}},
- color={0,0,127}), Text(
- index=1,
- extent={{6,3},{6,3}}));
- connect(T_meas.y,showT_meas. numberPort) annotation (Line(points={{-79,30},{
- -66,30},{-66,80},{-63,80}}, color={0,0,127}));
- connect(T_meas.y, output_T_meas) annotation (Line(points={{-79,30},{-74,30},{
- -74,-60},{100,-60}}, color={0,0,127}));
- connect(heatPumpControlBus.modeSet, showMode.activePort) annotation (Line(
- points={{0.05,-0.05},{10,-0.05},{20,-0.05},{20,28},{64.5,28}},
- color={255,204,51},
- thickness=0.5), Text(
- string="%first",
- index=-1,
- extent={{-6,3},{-6,3}}));
- connect(heatPumpControlBus.onOffMea, showOnOff.activePort) annotation (Line(
- points={{0.05,-0.05},{20,-0.05},{20,50},{64.5,50}},
- color={255,204,51},
- thickness=0.5), Text(
- string="%first",
- index=-1,
- extent={{-6,3},{-6,3}}));
- connect(heatPumpControlBus.onOffMea, output_on) annotation (Line(
- points={{0.05,-0.05},{20,-0.05},{20,-80},{100,-80}},
- color={255,204,51},
- thickness=0.5), Text(
- string="%first",
- index=-1,
- extent={{-6,3},{-6,3}}));
- connect(T_meas.y, hPControllerOnOff.TSet) annotation (Line(points={{-79,30},{
- -68,30},{-68,4},{-60,4}}, color={0,0,127}));
- connect(T_set.y, hPControllerOnOff.TMea) annotation (Line(points={{-79,-30},{
- -68,-30},{-68,-4},{-60,-4}}, color={0,0,127}));
- annotation (experiment(StopTime=10000, Interval=10), Documentation(info="
- This example can be used to test that AixLib.Controls.HeatPump.HPControllerOnOff
- supplies all required signals as specified in AixLib.Controls.ControllerInterfaces.HeatPumpControlBus.
- The generated signals are visualized using the Show package. The
- temperature measurement is supplied by a sine block so that the
- reaction of the controller can be tested.
-
-
- The example also shows how to connect two models, typically a model
- of a physical component and a controller, via the bus connector. The
- temperatureMeasurements and the massFlowRateMeasurements are only
- connected for demonstration purposes and are not required by the
- controller.
-
-"));
-end HeatPumpController;
diff --git a/AixLib/Controls/HeatPump/Examples/InverterControlledHeatPump.mo b/AixLib/Controls/HeatPump/Examples/InverterControlledHeatPump.mo
new file mode 100644
index 0000000000..82fcaaec76
--- /dev/null
+++ b/AixLib/Controls/HeatPump/Examples/InverterControlledHeatPump.mo
@@ -0,0 +1,22 @@
+within AixLib.Controls.HeatPump.Examples;
+model InverterControlledHeatPump
+ extends Modelica.Icons.Example;
+ extends PartialHeatPumpController(redeclare InverterControlledHP hPController(
+ bandwidth=2,
+ k=0.05,
+ Ti=100));
+
+annotation(experiment(Tolerance=1e-6, StartTime=0, StopTime=10000),
+ Documentation(info="
+ Example for an inverter controlled heat pump. Play around with the PI
+ settings to see how they influence nSet depending on TSet and TMea.
+
+", revisions="
+ -
+ July 14, 2022 by Fabian Wüllhorst:
+ First implementation (see issue #1128)
+
+
+"));
+end InverterControlledHeatPump;
diff --git a/AixLib/Controls/HeatPump/Examples/PartialHeatPumpController.mo b/AixLib/Controls/HeatPump/Examples/PartialHeatPumpController.mo
new file mode 100644
index 0000000000..ee8355541f
--- /dev/null
+++ b/AixLib/Controls/HeatPump/Examples/PartialHeatPumpController.mo
@@ -0,0 +1,80 @@
+within AixLib.Controls.HeatPump.Examples;
+partial model PartialHeatPumpController
+ "Example for usage of heat pump controller"
+
+ AixLib.Fluid.HeatPumps.ModularReversible.BaseClasses.RefrigerantMachineControlBus heatPumpControlBus
+ "Required to make the signals on the bus accessible" annotation (Placement(
+ transformation(
+ extent={{-10,-10},{10,10}},
+ rotation=0,
+ origin={-56,-50})));
+ Modelica.Blocks.Sources.Sine T_meas(
+ f=1/3600,
+ amplitude=6,
+ offset=310) "Generates the measured temperature"
+ annotation (Placement(transformation(extent={{-100,20},{-80,40}})));
+ Modelica.Blocks.Sources.Constant T_set(k=310)
+ "Provides the temperature set point"
+ annotation (Placement(transformation(extent={{-100,-40},{-80,-20}})));
+ Modelica.Blocks.Interfaces.RealOutput TMea(
+ final quantity="ThermodynamicTemperature",
+ final unit="K",
+ displayUnit="degC",
+ min=0) "Outputs the temperature measurement"
+ annotation (Placement(transformation(extent={{101,-75},{131,-45}})));
+ replaceable BaseClasses.PartialTSetToNSet hPController constrainedby
+ BaseClasses.PartialTSetToNSet(
+ final use_secHeaGen=false,
+ use_heaLim=false,
+ T_heaLim=293.15,
+ movAveTime=300) annotation (Placement(transformation(extent={{-20,-20},
+ {20,20}})), __Dymola_choicesAllMatching=true);
+ Modelica.Blocks.Interfaces.RealOutput TSet(
+ final quantity="ThermodynamicTemperature",
+ final unit="K",
+ displayUnit="degC",
+ min=0) "Outputs the temperature measurement"
+ annotation (Placement(transformation(extent={{101,-15},{131,15}})));
+ Modelica.Blocks.Interfaces.RealOutput nSet
+ "Outputs the temperature measurement"
+ annotation (Placement(transformation(extent={{101,45},{131,75}})));
+ Modelica.Blocks.Sources.Constant T_oda(k=273.15)
+ "Provides the temperature set point"
+ annotation (Placement(transformation(extent={{-100,-80},{-80,-60}})));
+equation
+ connect(T_meas.y, TMea) annotation (Line(points={{-79,30},{-70,30},{-70,-60},{
+ 116,-60}}, color={0,0,127}));
+ connect(hPController.TSet, T_set.y) annotation (Line(points={{-23.2,12},{-62,12},
+ {-62,-30},{-79,-30}}, color={0,0,127}));
+ connect(hPController.TMea, T_meas.y) annotation (Line(points={{-23.2,-16},{-70,
+ -16},{-70,30},{-79,30}}, color={0,0,127}));
+ connect(nSet, hPController.nOut) annotation (Line(points={{116,60},{102,60},{102,
+ 58},{76,58},{76,0},{22,0}}, color={0,0,127}));
+ connect(T_oda.y, heatPumpControlBus.TOdaMea) annotation (Line(points={{-79,-70},
+ {-56,-70},{-56,-50}}, color={0,0,127}), Text(
+ string="%second",
+ index=1,
+ extent={{6,3},{6,3}},
+ horizontalAlignment=TextAlignment.Left));
+ connect(heatPumpControlBus, hPController.sigBusHP) annotation (Line(
+ points={{-56,-50},{-36,-50},{-36,-6},{-21.4,-6},{-21.4,-6.2}},
+ color={255,204,51},
+ thickness=0.5), Text(
+ string="%first",
+ index=-1,
+ extent={{-3,-6},{-3,-6}},
+ horizontalAlignment=TextAlignment.Right));
+ connect(T_set.y, TSet) annotation (Line(points={{-79,-30},{86,-30},{86,0},{116,
+ 0}}, color={0,0,127}));
+ annotation (experiment(StopTime=10000, Interval=10), Documentation(info="
+ Partial example model for heat pump controls.
+
+", revisions="
+ -
+ July 14, 2022 by Fabian Wüllhorst:
+ First implementation (see issue #1128)
+
+
+"));
+end PartialHeatPumpController;
diff --git a/AixLib/Controls/HeatPump/Examples/TwoPointControlledHeatPump.mo b/AixLib/Controls/HeatPump/Examples/TwoPointControlledHeatPump.mo
new file mode 100644
index 0000000000..3d2dc00e28
--- /dev/null
+++ b/AixLib/Controls/HeatPump/Examples/TwoPointControlledHeatPump.mo
@@ -0,0 +1,21 @@
+within AixLib.Controls.HeatPump.Examples;
+model TwoPointControlledHeatPump
+ extends Modelica.Icons.Example;
+ extends PartialHeatPumpController(redeclare TwoPointControlledHP hPController(
+ bandwidth=2));
+
+annotation(experiment(Tolerance=1e-6, StartTime=0, StopTime=10000),
+ Documentation(info="
+ Example for an two-point hysteresis controlled heat pump. Play around
+ with the bandwith settings to see how it influence nSet depending on
+ TSet and TMea.
+
+", revisions="
+ -
+ July 14, 2022 by Fabian Wüllhorst:
+ First implementation (see issue #1128)
+
+
+"));
+end TwoPointControlledHeatPump;
diff --git a/AixLib/Controls/HeatPump/Examples/package.order b/AixLib/Controls/HeatPump/Examples/package.order
index 9919abdabb..4fc0a9ec45 100644
--- a/AixLib/Controls/HeatPump/Examples/package.order
+++ b/AixLib/Controls/HeatPump/Examples/package.order
@@ -1 +1,3 @@
-HeatPumpController
+InverterControlledHeatPump
+PartialHeatPumpController
+TwoPointControlledHeatPump
diff --git a/AixLib/Controls/HeatPump/HPControl.mo b/AixLib/Controls/HeatPump/HPControl.mo
index 31fb87e379..46bd24c1ec 100644
--- a/AixLib/Controls/HeatPump/HPControl.mo
+++ b/AixLib/Controls/HeatPump/HPControl.mo
@@ -1,9 +1,10 @@
-within AixLib.Controls.HeatPump;
+within AixLib.Controls.HeatPump;
model HPControl
"Control block which makes sure the desired temperature is supplied by the HP"
//General
replaceable model TSetToNSet =
- AixLib.Controls.HeatPump.BaseClasses.PartialTSetToNSet constrainedby AixLib.Controls.HeatPump.BaseClasses.PartialTSetToNSet(
+ AixLib.Controls.HeatPump.BaseClasses.PartialTSetToNSet constrainedby
+ AixLib.Controls.HeatPump.BaseClasses.PartialTSetToNSet(
final use_secHeaGen=use_secHeaGen) annotation(choicesAllMatching=true);
parameter Boolean use_secHeaGen=false "True to choose a bivalent system" annotation(choices(checkBox=true));
@@ -15,8 +16,8 @@ model HPControl
choice=false "Function",
radioButtons=true));
replaceable function HeatingCurveFunction =
- SetPoints.Functions.HeatingCurveFunction constrainedby SetPoints.Functions.PartialBaseFct
- annotation (Dialog(group="Heating Curve - Data", enable = not use_tableData),choicesAllMatching=true);
+ SetPoints.Functions.HeatingCurveFunction constrainedby
+ SetPoints.Functions.PartialBaseFct annotation (Dialog(group="Heating Curve - Data", enable = not use_tableData),choicesAllMatching=true);
parameter
AixLib.DataBase.Boiler.DayNightMode.HeatingCurvesDayNightBaseDataDefinition
heatingCurveRecord=
@@ -60,9 +61,9 @@ model HPControl
final zerTim=zerTim)
if use_antLeg
annotation (Placement(transformation(extent={{-26,-14},{14,26}})));
- Interfaces.VapourCompressionMachineControlBus sigBusHP
+ AixLib.Fluid.HeatPumps.ModularReversible.BaseClasses.RefrigerantMachineControlBus sigBusHP
annotation (Placement(transformation(extent={{-116,-72},{-88,-44}})));
- Modelica.Blocks.Interfaces.RealOutput nOut
+ Modelica.Blocks.Interfaces.RealOutput yOut "Relative compressor speed"
annotation (Placement(transformation(extent={{100,6},{128,34}})));
Modelica.Blocks.Interfaces.RealInput T_oda "Outdoor air temperature"
annotation (Placement(transformation(extent={{-128,-14},{-100,14}}),
@@ -70,24 +71,27 @@ model HPControl
Modelica.Blocks.Interfaces.RealOutput ySecHeaGen if use_secHeaGen
"Relative power of second heat generator, from 0 to 1"
annotation (Placement(transformation(
- extent={{-10,-10},{10,10}},
+ extent={{-17,-17},{17,17}},
rotation=-90,
- origin={-4,-104})));
+ origin={1,-117}), iconTransformation(
+ extent={{-14,-14},{14,14}},
+ rotation=-90,
+ origin={-1.77636e-15,-108})));
Modelica.Blocks.Interfaces.RealOutput y_sou
annotation (Placement(transformation(extent={{14,-14},{-14,14}},
rotation=90,
- origin={-64,-100})));
+ origin={-60,-114})));
Modelica.Blocks.Interfaces.RealOutput y_sin annotation (Placement(transformation(
extent={{14,-14},{-14,14}},
rotation=90,
- origin={56,-100})));
+ origin={60,-114})));
Modelica.Blocks.Sources.Constant constHeating1(final k=1)
"If you want to include chilling, please insert control blocks first"
annotation (Placement(transformation(extent={{10,-10},{-10,10}},
rotation=90,
origin={-12,-72})));
- SetPoints.HeatingCurve heatCurve(
+ AixLib.Controls.SetPoints.HeatingCurve heatCurve(
final TOffset=0,
final use_dynTRoom=false,
final zerTim=zerTim,
@@ -110,7 +114,7 @@ model HPControl
Modelica.Blocks.Sources.BooleanConstant constHeating(final k=true)
"If you want to include chilling, please insert control blocks first"
annotation (Placement(transformation(extent={{82,-26},{94,-14}})));
- Modelica.Blocks.Interfaces.BooleanOutput modeOut
+ Modelica.Blocks.Interfaces.BooleanOutput hea "Heating mode"
annotation (Placement(transformation(extent={{100,-34},{128,-6}})));
Modelica.Blocks.Interfaces.RealInput TSup "Supply temperature" annotation (
Placement(transformation(extent={{-128,46},{-100,74}}),
@@ -118,8 +122,8 @@ model HPControl
equation
- connect(T_oda, sigBusHP.T_oda) annotation (Line(points={{-114,1.77636e-15},{-90,
- 1.77636e-15},{-90,-57.93},{-101.93,-57.93}},
+ connect(T_oda, sigBusHP.T_oda) annotation (Line(points={{-114,1.77636e-15},{
+ -90,1.77636e-15},{-90,-58},{-102,-58}},
color={0,0,127}), Text(
string="%second",
index=1,
@@ -137,11 +141,11 @@ equation
color={0,0,127},
pattern=LinePattern.Dash));
- connect(ConvTSetToNSet.nOut, nOut) annotation (Line(points={{77.6,9},{88.8,9},{88.8,20},
+ connect(ConvTSetToNSet.nOut,yOut) annotation (Line(points={{77.6,9},{88.8,9},{88.8,20},
{114,20}}, color={0,0,127}));
connect(sigBusHP,ConvTSetToNSet. sigBusHP) annotation (Line(
- points={{-102,-58},{24,-58},{24,4.41},{42.88,4.41}},
+ points={{-102,-58},{24,-58},{24,3.73},{42.88,3.73}},
color={255,204,51},
thickness=0.5), Text(
string="%first",
@@ -157,27 +161,27 @@ equation
points={{6.8,46},{26,46},{26,19.2},{41.44,19.2}},
color={0,0,127},
pattern=LinePattern.Dash));
- connect(modeOut, constHeating.y) annotation (Line(points={{114,-20},{94.6,-20}},
- color={255,0,255}));
+ connect(hea, constHeating.y)
+ annotation (Line(points={{114,-20},{94.6,-20}}, color={255,0,255}));
connect(TSup, antiLegionella.TSupAct) annotation (Line(points={{-114,60},{-82,
60},{-82,6},{-30,6}}, color={0,0,127}));
- connect(TSup,ConvTSetToNSet. TAct) annotation (Line(points={{-114,60},{-82,60},{-82,-22},
+ connect(TSup,ConvTSetToNSet.TMea) annotation (Line(points={{-114,60},{-82,60},{-82,-22},
{30,-22},{30,-4.6},{41.44,-4.6}}, color={0,0,127}));
connect(ConvTSetToNSet.ySecHeaGen, ySecHeaGen) annotation (Line(
- points={{61.92,-9.36},{61.92,-14},{46,-14},{46,-44},{22,-44},{22,-90},{-4,
- -90},{-4,-104}},
+ points={{60,-9.7},{60,-12},{36,-12},{36,-88},{1,-88},{1,-117}},
color={0,0,127},
pattern=LinePattern.Dash));
connect(ySecHeaGen, ySecHeaGen)
- annotation (Line(points={{-4,-104},{-4,-104}},
+ annotation (Line(points={{1,-117},{1,-117}},
color={0,0,127}));
connect(constHeating1.y, y_sou)
- annotation (Line(points={{-12,-83},{-12,-84},{-64,-84},{-64,-100}},
+ annotation (Line(points={{-12,-83},{-12,-96},{-60,-96},{-60,-114}},
color={0,0,127}));
- connect(constHeating1.y, y_sin) annotation (Line(points={{-12,-83},{56,-83},{56,
- -100}}, color={0,0,127}));
+ connect(constHeating1.y, y_sin) annotation (Line(points={{-12,-83},{-12,-92},
+ {60,-92},{60,-114}},
+ color={0,0,127}));
annotation (Icon(coordinateSystem(preserveAspectRatio=false, extent={{-100,
-100},{100,80}}), graphics={
Rectangle(
@@ -222,7 +226,7 @@ equation
Looking at the HeatPumpSystem,
+ \"modelica://AixLib.Obsolete.Year2024.Systems.HeatPumpSystems.HeatPumpSystem\">HeatPumpSystem,
the task of the control block is also to control the pumps or fans
and second heat generator if necessary.
diff --git a/AixLib/Controls/HeatPump/HPControllerOnOff.mo b/AixLib/Controls/HeatPump/HPControllerOnOff.mo
deleted file mode 100644
index 0abd6a31c4..0000000000
--- a/AixLib/Controls/HeatPump/HPControllerOnOff.mo
+++ /dev/null
@@ -1,64 +0,0 @@
-within AixLib.Controls.HeatPump;
-model HPControllerOnOff
- "Simple on/off controller for heat pump model"
- extends BaseClasses.PartialHPController;
-
- parameter Real bandwidth(start=0.1) "Bandwidth around reference signal";
- parameter Boolean pre_y_start=false "Value of pre(y) at initial time";
-
- Modelica.Blocks.Sources.BooleanConstant mode "Dummy signal for unit mode, true: heat pump, false: chiller"
- annotation (Placement(transformation(extent={{-12,-50},{8,-30}})));
- Modelica.Blocks.Logical.OnOffController onOffController(bandwidth=bandwidth,
- pre_y_start=pre_y_start) "Generates the on/off signal depending on the temperature inputs"
- annotation (Placement(transformation(extent={{-10,-10},{10,10}})));
- Modelica.Blocks.Interfaces.RealInput TMea(
- final quantity="ThermodynamicTemperature",
- final unit="K",
- displayUnit="degC",
- min=0) "Temperature measurement"
- annotation (Placement(transformation(extent={{-115,-55},{-85,-25}})));
- Modelica.Blocks.Interfaces.RealInput TSet(
- final quantity="ThermodynamicTemperature",
- final unit="K",
- displayUnit="degC",
- min=0) "Temperature set point"
- annotation (Placement(transformation(extent={{-115,25},{-85,55}})));
- Modelica.Blocks.Math.BooleanToReal NOnOff(final realTrue=1, final realFalse=0)
- "Convert boolean to real rotational speed of compressor"
- annotation (Placement(transformation(extent={{22,-10},{42,10}})));
-equation
-
- connect(mode.y, heatPumpControlBus.modeSet) annotation (Line(points={{9,-40},
- {60,-40},{60,0.3525},{99.6475,0.3525}}, color={255,0,255}), Text(
- string="%second",
- index=1,
- extent={{6,3},{6,3}},
- horizontalAlignment=TextAlignment.Left));
- connect(onOffController.y, NOnOff.u)
- annotation (Line(points={{11,0},{20,0}}, color={255,0,255}));
- connect(NOnOff.y, heatPumpControlBus.nSet) annotation (Line(points={{43,0},{
- 72,0},{72,0.3525},{99.6475,0.3525}}, color={0,0,127}), Text(
- string="%second",
- index=1,
- extent={{6,3},{6,3}},
- horizontalAlignment=TextAlignment.Left));
- connect(TMea, onOffController.u) annotation (Line(points={{-100,-40},{-40,-40},
- {-40,-6},{-12,-6}}, color={0,0,127}));
- connect(TSet, onOffController.reference) annotation (Line(points={{-100,40},{
- -40,40},{-40,6},{-12,6}}, color={0,0,127}));
- annotation (Documentation(info="
- This model represents a simple controller for a heat pump. It is
- based on the Modelica.Blocks.Logical.OnOffController
- but includes further constant sources so that the AixLib.Controls.Interfaces.HeatPumpControlBus
- can be used.
-
-
- March 31, 2017, by Marc Baranski:
-
-
- First implementation.
-
-"));
-end HPControllerOnOff;
diff --git a/AixLib/Controls/HeatPump/InverterControlledHP.mo b/AixLib/Controls/HeatPump/InverterControlledHP.mo
new file mode 100644
index 0000000000..55bf6d0a29
--- /dev/null
+++ b/AixLib/Controls/HeatPump/InverterControlledHP.mo
@@ -0,0 +1,49 @@
+within AixLib.Controls.HeatPump;
+model InverterControlledHP
+ "Converter model for an inverter / speed controlled HP modulating between 0 and 1"
+ extends BaseClasses.PartialTSetToNSet;
+ parameter Real bandwidth "Bandwith of hysteresis of controller";
+ parameter Real k "Gain of controller"
+ annotation (Dialog(group="PI Values"));
+ parameter Modelica.Units.SI.Time Ti "Time constant of Integrator block"
+ annotation (Dialog(group="PI Values"));
+ parameter Real yMin=0.2 "Minimal relative compressor speed"
+ annotation (Dialog(group="PI Values"));
+
+ Modelica.Blocks.Logical.OnOffController onOffController(bandwidth=bandwidth,
+ pre_y_start=false) "Hysteresis controller for set temperature"
+ annotation (Placement(transformation(extent={{-60,20},{-40,40}})));
+ Modelica.Blocks.Continuous.LimPID InverterControl(
+ final controllerType=Modelica.Blocks.Types.SimpleController.PI,
+ final k=k,
+ final Ti=Ti,
+ final yMax=1,
+ final yMin=yMin)
+ "PI-Control for a inverter controlled HP"
+ annotation (Placement(transformation(extent={{20,40},{40,60}})));
+
+equation
+ connect(TSet, onOffController.reference) annotation (Line(points={{-116,60},{
+ -77.5,60},{-77.5,36},{-62,36}}, color={0,0,127}));
+ connect(InverterControl.y, swiNullHP.u1)
+ annotation (Line(points={{41,50},{52,50},{52,-2},{58,-2}},
+ color={0,0,127}));
+ connect(TSet, InverterControl.u_s) annotation (Line(points={{-116,60},{-43.5,
+ 60},{-43.5,50},{18,50}}, color={0,0,127}));
+ connect(TMea, onOffController.u) annotation (Line(points={{-116,-80},{-70,-80},
+ {-70,24},{-62,24}}, color={0,0,127}));
+ connect(TMea, InverterControl.u_m) annotation (Line(points={{-116,-80},{-70,
+ -80},{-70,16},{30,16},{30,38}},
+ color={0,0,127}));
+ connect(onOffController.y, andHeaLim.u1) annotation (Line(points={{-39,30},{
+ -18,30},{-18,-10},{18,-10}},
+ color={255,0,255}));
+ annotation (Documentation(revisions="
+ -
+ November 26, 2018 by Fabian Wüllhorst:
+ First implementation (see issue #577)
+
+
+"));
+end InverterControlledHP;
diff --git a/AixLib/Controls/HeatPump/TwoPointControlledHP.mo b/AixLib/Controls/HeatPump/TwoPointControlledHP.mo
new file mode 100644
index 0000000000..00d61a2d9a
--- /dev/null
+++ b/AixLib/Controls/HeatPump/TwoPointControlledHP.mo
@@ -0,0 +1,32 @@
+within AixLib.Controls.HeatPump;
+model TwoPointControlledHP
+ "Controller gives full speed or stop signal depending on temperature hysteresis"
+ extends AixLib.Controls.HeatPump.BaseClasses.PartialTSetToNSet;
+ parameter Real bandwidth "Bandwith of hysteresis of controller";
+ Modelica.Blocks.Logical.OnOffController onOffController(final bandwidth=bandwidth,
+ final pre_y_start=false) "Hysteresis controller for set temperature"
+ annotation (Placement(transformation(extent={{-60,20},{-40,40}})));
+ Modelica.Blocks.Sources.Constant conOne(final k=1)
+ "Constant one for on off heat pump" annotation (Placement(transformation(extent={{20,20},
+ {40,40}})));
+
+equation
+ connect(TSet, onOffController.reference) annotation (Line(points={{-116,60},{
+ -85.5,60},{-85.5,36},{-62,36}}, color={0,0,127}));
+ connect(conOne.y, swiNullHP.u1) annotation (Line(points={{41,30},{58,30},{58,
+ -2}}, color={0,0,127}));
+ connect(TMea, onOffController.u) annotation (Line(points={{-116,-80},{-72,-80},
+ {-72,24},{-62,24}}, color={0,0,127}));
+ connect(onOffController.y, andHeaLim.u1) annotation (Line(points={{-39,30},{
+ 5.7,30},{5.7,-10},{18,-10}},color={255,0,255}));
+ annotation (Icon(coordinateSystem(preserveAspectRatio=false)), Diagram(
+ coordinateSystem(preserveAspectRatio=false)),
+ Documentation(revisions="
+ -
+ November 26, 2018 by Fabian Wüllhorst:
+ First implementation (see issue #577)
+
+
+"));
+end TwoPointControlledHP;
diff --git a/AixLib/Controls/HeatPump/package.order b/AixLib/Controls/HeatPump/package.order
index 0b836450f0..8f14c23cfc 100644
--- a/AixLib/Controls/HeatPump/package.order
+++ b/AixLib/Controls/HeatPump/package.order
@@ -1,7 +1,8 @@
AntiLegionella
+DefrostControl
HPControl
-HPControllerOnOff
+InverterControlledHP
+TwoPointControlledHP
ModularHeatPumps
-SafetyControls
Examples
BaseClasses
diff --git a/AixLib/Controls/Interfaces/package.order b/AixLib/Controls/Interfaces/package.order
index 8ef03cdfe1..b0874ca3c9 100644
--- a/AixLib/Controls/Interfaces/package.order
+++ b/AixLib/Controls/Interfaces/package.order
@@ -5,4 +5,3 @@ ModularCompressorControlBus
ModularExpansionValveControlBus
ModularHeatPumpControlBus
ModularSensorControlBus
-VapourCompressionMachineControlBus
diff --git a/AixLib/DataBase/HeatPump/EN14511/package.mo b/AixLib/DataBase/HeatPump/EN14511/package.mo
deleted file mode 100644
index e023ba6c04..0000000000
--- a/AixLib/DataBase/HeatPump/EN14511/package.mo
+++ /dev/null
@@ -1,10 +0,0 @@
-within AixLib.DataBase.HeatPump;
-package EN14511
-
-
-
-
-
-
-
-end EN14511;
diff --git a/AixLib/DataBase/HeatPump/EN255/package.mo b/AixLib/DataBase/HeatPump/EN255/package.mo
deleted file mode 100644
index 3a608ca0aa..0000000000
--- a/AixLib/DataBase/HeatPump/EN255/package.mo
+++ /dev/null
@@ -1,8 +0,0 @@
-within AixLib.DataBase.HeatPump;
-package EN255
-
-
-
-
-
-end EN255;
diff --git a/AixLib/DataBase/package.order b/AixLib/DataBase/package.order
index 95961bb866..170cef7150 100644
--- a/AixLib/DataBase/package.order
+++ b/AixLib/DataBase/package.order
@@ -1,8 +1,6 @@
ActiveWalls
Boiler
CHP
-Chiller
-HeatPump
Media
Pipes
Pools
diff --git a/AixLib/Electrical/PVSystem/BaseClasses/PartialIVCharacteristics.mo b/AixLib/Electrical/PVSystem/BaseClasses/PartialIVCharacteristics.mo
new file mode 100644
index 0000000000..9957bd46f9
--- /dev/null
+++ b/AixLib/Electrical/PVSystem/BaseClasses/PartialIVCharacteristics.mo
@@ -0,0 +1,136 @@
+within AixLib.Electrical.PVSystem.BaseClasses;
+partial model PartialIVCharacteristics
+"Partial model for IV Characteristic of a PV module"
+
+replaceable parameter AixLib.DataBase.SolarElectric.PVBaseDataDefinition data
+constrainedby AixLib.DataBase.SolarElectric.PVBaseDataDefinition
+"PV Panel data definition"
+ annotation (choicesAllMatching);
+
+// Adjustable input parameters
+
+parameter Real n_mod(final quantity=
+ "NumberOfModules", final unit="1") "Number of connected PV modules"
+ annotation ();
+
+
+// Parameters from module data sheet
+
+final parameter Modelica.Units.SI.Efficiency eta_0=data.eta_0
+"Efficiency under standard conditions";
+
+final parameter Real n_ser=data.n_ser
+ "Number of cells connected in series on the PV panel";
+
+final parameter Modelica.Units.SI.Area A_pan=data.A_pan
+"Area of one Panel, must not be confused with area of the whole module";
+
+final parameter Modelica.Units.SI.Area A_mod=data.A_mod
+"Area of one module (housing)";
+
+final parameter Modelica.Units.SI.Voltage V_oc0=data.V_oc0
+"Open circuit voltage under standard conditions";
+
+final parameter Modelica.Units.SI.ElectricCurrent I_sc0=data.I_sc0
+"Short circuit current under standard conditions";
+
+final parameter Modelica.Units.SI.Voltage V_mp0=data.V_mp0
+"MPP voltage under standard conditions";
+
+final parameter Modelica.Units.SI.ElectricCurrent I_mp0=data.I_mp0
+"MPP current under standard conditions";
+
+final parameter Modelica.Units.SI.Power P_Max=data.P_mp0*1.05
+"Maximal power of one PV module under standard conditions. P_MPP with 5 % tolerance. This is used to limit DCOutputPower.";
+
+final parameter Real TCoeff_Isc(unit = "A/K")=data.TCoeff_Isc
+ "Temperature coefficient for short circuit current, >0";
+
+final parameter Real TCoeff_Voc(unit = "V/K")=data.TCoeff_Voc
+ "Temperature coefficient for open circuit voltage, <0";
+
+final parameter Modelica.Units.SI.LinearTemperatureCoefficient alpha_Isc=data.alpha_Isc
+"Normalized temperature coefficient for short circuit current, >0";
+
+final parameter Modelica.Units.SI.LinearTemperatureCoefficient beta_Voc=data.beta_Voc
+"Normalized temperature coefficient for open circuit voltage, <0";
+
+final parameter Modelica.Units.SI.LinearTemperatureCoefficient gamma_Pmp=data.gamma_Pmp
+"Normalized temperature coefficient for power at MPP";
+
+final parameter Modelica.Units.SI.Temperature T_c0=25 + 273.15
+"Thermodynamic cell temperature under standard conditions";
+
+
+Modelica.Blocks.Interfaces.RealOutput DCOutputPower(
+final quantity="Power",
+final unit="W")
+"DC output power of the PV array"
+annotation(Placement(
+transformation(extent={{100,50},{120,70}}),
+iconTransformation(extent={{100,50},{120,70}})));
+
+
+Modelica.Blocks.Interfaces.RealOutput eta(
+final quantity="Efficiency",
+final unit="1",
+min=0)
+"Efficiency of the PV module under operating conditions"
+annotation(Placement(
+transformation(extent={{100,-70},{120,-50}}),
+iconTransformation(extent={{100,-70},{120,-50}})));
+
+Modelica.Blocks.Interfaces.RealInput T_c(final quantity=
+ "ThermodynamicTemperature", final unit="K")
+ "Cell temperature"
+ annotation (Placement(transformation(extent={{-140,20},{-100,60}}), iconTransformation(extent={{-140,20},{-100,60}})));
+
+Modelica.Blocks.Interfaces.RealInput absRadRat(final unit= "1")
+ "Ratio of absorbed radiation under operating conditions to standard conditions"
+ annotation (Placement(transformation(extent={{-140,-60},{-100,-20}}), iconTransformation(extent={{-140,-60},{-100,-20}})));
+
+Modelica.Blocks.Interfaces.RealInput radTil(final unit="W/m2")
+ "Total solar irradiance on the tilted surface"
+ annotation (Placement(transformation(extent={{-140,-100},{-100,-60}}), iconTransformation(extent={{-140,-100},{-100,
+ -60}})));
+
+
+annotation (Icon(coordinateSystem(preserveAspectRatio=false), graphics={
+ Rectangle(
+ lineColor={0,0,0},
+ fillColor={255,255,255},
+ fillPattern=FillPattern.Solid,
+ extent={{-100,100},{100,-100}}),
+ Line(
+ points={{-66,-64},{-66,88}},
+ color={0,0,0},
+ arrow={Arrow.None,Arrow.Filled},
+ thickness=0.5),
+ Line(
+ points={{-66,-64},{64,-64}},
+ color={0,0,0},
+ arrow={Arrow.None,Arrow.Filled},
+ thickness=0.5),
+ Text(
+ extent={{-72,80},{-102,68}},
+ lineColor={0,0,0},
+ lineThickness=0.5,
+ fillColor={255,255,255},
+ fillPattern=FillPattern.Solid,
+ textString="I"),
+ Text(
+ extent={{80,-80},{50,-92}},
+ lineColor={0,0,0},
+ lineThickness=0.5,
+ fillColor={255,255,255},
+ fillPattern=FillPattern.Solid,
+ textString="U"),
+ Line(
+ points={{-66,54},{-66,54},{-6,54},{12,50},{22,42},{32,28},{38,8},{42,-14},
+ {44,-44},{44,-64}},
+ color={0,0,0},
+ thickness=0.5,
+ smooth=Smooth.Bezier)}),
+ Diagram(coordinateSystem(preserveAspectRatio=false)));
+
+end PartialIVCharacteristics;
diff --git a/AixLib/Electrical/PVSystem/BaseClasses/package.mo b/AixLib/Electrical/PVSystem/BaseClasses/package.mo
index 96769ede3d..8347a1e427 100644
--- a/AixLib/Electrical/PVSystem/BaseClasses/package.mo
+++ b/AixLib/Electrical/PVSystem/BaseClasses/package.mo
@@ -2,141 +2,4 @@ within AixLib.Electrical.PVSystem;
package BaseClasses
extends Modelica.Icons.BasesPackage;
-
- partial model PartialIVCharacteristics
- "Partial model for IV Characteristic of a PV module"
-
- replaceable parameter AixLib.DataBase.SolarElectric.PVBaseDataDefinition data
- constrainedby AixLib.DataBase.SolarElectric.PVBaseDataDefinition
- "PV Panel data definition"
- annotation (choicesAllMatching);
-
- // Adjustable input parameters
-
- parameter Real n_mod(final quantity=
- "NumberOfModules", final unit="1") "Number of connected PV modules"
- annotation ();
-
-
- // Parameters from module data sheet
-
- final parameter Modelica.Units.SI.Efficiency eta_0=data.eta_0
- "Efficiency under standard conditions";
-
- final parameter Real n_ser=data.n_ser
- "Number of cells connected in series on the PV panel";
-
- final parameter Modelica.Units.SI.Area A_pan=data.A_pan
- "Area of one Panel, must not be confused with area of the whole module";
-
- final parameter Modelica.Units.SI.Area A_mod=data.A_mod
- "Area of one module (housing)";
-
- final parameter Modelica.Units.SI.Voltage V_oc0=data.V_oc0
- "Open circuit voltage under standard conditions";
-
- final parameter Modelica.Units.SI.ElectricCurrent I_sc0=data.I_sc0
- "Short circuit current under standard conditions";
-
- final parameter Modelica.Units.SI.Voltage V_mp0=data.V_mp0
- "MPP voltage under standard conditions";
-
- final parameter Modelica.Units.SI.ElectricCurrent I_mp0=data.I_mp0
- "MPP current under standard conditions";
-
- final parameter Modelica.Units.SI.Power P_Max=data.P_mp0*1.05
- "Maximal power of one PV module under standard conditions. P_MPP with 5 % tolerance. This is used to limit DCOutputPower.";
-
- final parameter Real TCoeff_Isc(unit = "A/K")=data.TCoeff_Isc
- "Temperature coefficient for short circuit current, >0";
-
- final parameter Real TCoeff_Voc(unit = "V/K")=data.TCoeff_Voc
- "Temperature coefficient for open circuit voltage, <0";
-
- final parameter Modelica.Units.SI.LinearTemperatureCoefficient alpha_Isc=data.alpha_Isc
- "Normalized temperature coefficient for short circuit current, >0";
-
- final parameter Modelica.Units.SI.LinearTemperatureCoefficient beta_Voc=data.beta_Voc
- "Normalized temperature coefficient for open circuit voltage, <0";
-
- final parameter Modelica.Units.SI.LinearTemperatureCoefficient gamma_Pmp=data.gamma_Pmp
- "Normalized temperature coefficient for power at MPP";
-
- final parameter Modelica.Units.SI.Temperature T_c0=25 + 273.15
- "Thermodynamic cell temperature under standard conditions";
-
-
- Modelica.Blocks.Interfaces.RealOutput DCOutputPower(
- final quantity="Power",
- final unit="W")
- "DC output power of the PV array"
- annotation(Placement(
- transformation(extent={{100,50},{120,70}}),
- iconTransformation(extent={{100,50},{120,70}})));
-
-
- Modelica.Blocks.Interfaces.RealOutput eta(
- final quantity="Efficiency",
- final unit="1",
- min=0)
- "Efficiency of the PV module under operating conditions"
- annotation(Placement(
- transformation(extent={{100,-70},{120,-50}}),
- iconTransformation(extent={{100,-70},{120,-50}})));
-
- Modelica.Blocks.Interfaces.RealInput T_c(final quantity=
- "ThermodynamicTemperature", final unit="K")
- "Cell temperature"
- annotation (Placement(transformation(extent={{-140,20},{-100,60}}), iconTransformation(extent={{-140,20},{-100,60}})));
-
- Modelica.Blocks.Interfaces.RealInput absRadRat(final unit= "1")
- "Ratio of absorbed radiation under operating conditions to standard conditions"
- annotation (Placement(transformation(extent={{-140,-60},{-100,-20}}), iconTransformation(extent={{-140,-60},{-100,-20}})));
-
- Modelica.Blocks.Interfaces.RealInput radTil(final unit="W/m2")
- "Total solar irradiance on the tilted surface"
- annotation (Placement(transformation(extent={{-140,-100},{-100,-60}}), iconTransformation(extent={{-140,-100},{-100,
- -60}})));
-
-
- annotation (Icon(coordinateSystem(preserveAspectRatio=false), graphics={
- Rectangle(
- lineColor={0,0,0},
- fillColor={255,255,255},
- fillPattern=FillPattern.Solid,
- extent={{-100,100},{100,-100}}),
- Line(
- points={{-66,-64},{-66,88}},
- color={0,0,0},
- arrow={Arrow.None,Arrow.Filled},
- thickness=0.5),
- Line(
- points={{-66,-64},{64,-64}},
- color={0,0,0},
- arrow={Arrow.None,Arrow.Filled},
- thickness=0.5),
- Text(
- extent={{-72,80},{-102,68}},
- lineColor={0,0,0},
- lineThickness=0.5,
- fillColor={255,255,255},
- fillPattern=FillPattern.Solid,
- textString="I"),
- Text(
- extent={{80,-80},{50,-92}},
- lineColor={0,0,0},
- lineThickness=0.5,
- fillColor={255,255,255},
- fillPattern=FillPattern.Solid,
- textString="U"),
- Line(
- points={{-66,54},{-66,54},{-6,54},{12,50},{22,42},{32,28},{38,8},{42,-14},
- {44,-44},{44,-64}},
- color={0,0,0},
- thickness=0.5,
- smooth=Smooth.Bezier)}),
- Diagram(coordinateSystem(preserveAspectRatio=false)));
- end PartialIVCharacteristics;
-
-
end BaseClasses;
diff --git a/AixLib/Electrical/PVSystem/BaseClasses/package.order b/AixLib/Electrical/PVSystem/BaseClasses/package.order
index 309d1d5092..2bdef224bc 100644
--- a/AixLib/Electrical/PVSystem/BaseClasses/package.order
+++ b/AixLib/Electrical/PVSystem/BaseClasses/package.order
@@ -4,4 +4,5 @@ CellTemperatureOpenRack
IVCharacteristics5pAnalytical
PVRadiationHorizontal
PartialCellTemperature
+PartialIVCharacteristics
Wsimple
diff --git a/AixLib/Fluid/BaseClasses/package.order b/AixLib/Fluid/BaseClasses/package.order
index 9b1e2b66fd..942b2276fe 100644
--- a/AixLib/Fluid/BaseClasses/package.order
+++ b/AixLib/Fluid/BaseClasses/package.order
@@ -1,9 +1,7 @@
ActuatorFilter
IndexMassFraction
MassFlowRateMultiplier
-PartialInnerCycle
PartialResistance
-PartialReversibleVapourCompressionMachine
PartialThreeWayResistance
FlowModels
Validation
diff --git a/AixLib/Fluid/Chillers/BaseClasses/package.order b/AixLib/Fluid/Chillers/BaseClasses/package.order
index 263edf547e..fd1c3690d2 100644
--- a/AixLib/Fluid/Chillers/BaseClasses/package.order
+++ b/AixLib/Fluid/Chillers/BaseClasses/package.order
@@ -1,4 +1,3 @@
Carnot
-InnerCycle_Chiller
PartialCarnot_T
PartialCarnot_y
diff --git a/AixLib/Fluid/Chillers/Examples/package.order b/AixLib/Fluid/Chillers/Examples/package.order
index 46b4532014..8f1741a553 100644
--- a/AixLib/Fluid/Chillers/Examples/package.order
+++ b/AixLib/Fluid/Chillers/Examples/package.order
@@ -1,3 +1,2 @@
Carnot_TEva
Carnot_y
-Chiller
diff --git a/AixLib/Fluid/Chillers/package.order b/AixLib/Fluid/Chillers/package.order
index 0e5718dd71..8b853202cb 100644
--- a/AixLib/Fluid/Chillers/package.order
+++ b/AixLib/Fluid/Chillers/package.order
@@ -1,6 +1,5 @@
Carnot_TEva
Carnot_y
-Chiller
ModularReversible
Examples
Validation
diff --git a/AixLib/Fluid/Examples/GeothermalHeatPump/BaseClasses/GeothermalHeatPumpBase.mo b/AixLib/Fluid/Examples/GeothermalHeatPump/BaseClasses/GeothermalHeatPumpBase.mo
index f20ec93d99..bee26acfc8 100644
--- a/AixLib/Fluid/Examples/GeothermalHeatPump/BaseClasses/GeothermalHeatPumpBase.mo
+++ b/AixLib/Fluid/Examples/GeothermalHeatPump/BaseClasses/GeothermalHeatPumpBase.mo
@@ -4,7 +4,13 @@ partial model GeothermalHeatPumpBase
replaceable package Medium = AixLib.Media.Water
"Medium model used for hydronic components";
-
+ parameter Modelica.Fluid.Types.Dynamics energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial
+ "Type of energy balance: dynamic (3 initialization options) or steady state"
+ annotation (Dialog(tab="Dynamics"));
+ parameter Modelica.Units.SI.MassFlowRate m_flow_nominal_layer=0.5
+ "Nominal mass flow rate in layers of storages";
+ parameter Modelica.Units.SI.MassFlowRate m_flow_nominal_HE=0.5
+ "Nominal mass flow rate of heat exchanger layers of storages";
parameter Modelica.Units.SI.Temperature T_start_cold=300
"Initial temperature of cold components";
@@ -22,6 +28,7 @@ partial model GeothermalHeatPumpBase
Storage.StorageDetailed
coldStorage(
redeclare package Medium = Medium,
+ energyDynamics=energyDynamics,
redeclare package MediumHC1 = Medium,
redeclare package MediumHC2 = Medium,
m1_flow_nominal=m_flow_nominal_layer,
@@ -90,9 +97,9 @@ partial model GeothermalHeatPumpBase
extent={{-6,-7},{6,7}},
rotation=90,
origin={-60,1})));
- Storage.StorageDetailed
- heatStorage(
+ AixLib.Fluid.Storage.StorageDetailed heatStorage(
redeclare package Medium = Medium,
+ energyDynamics=energyDynamics,
redeclare package MediumHC1 = Medium,
redeclare package MediumHC2 = Medium,
m1_flow_nominal=m_flow_nominal_layer,
@@ -114,7 +121,7 @@ partial model GeothermalHeatPumpBase
hConOut=10,
hConHC1=500) "Storage tank for buffering heat demand"
annotation (Placement(transformation(extent={{24,-96},{52,-62}})));
- FixedResistances.PressureDrop resistanceHeatStorage(
+ AixLib.Fluid.FixedResistances.PressureDrop resistanceHeatStorage(
redeclare package Medium = Medium,
m_flow_nominal=0.5,
dp_nominal=15000) "Resistance in condenser circuit"
@@ -125,7 +132,7 @@ partial model GeothermalHeatPumpBase
AixLib.Fluid.Sources.Boundary_pT geothField_sink1(redeclare package Medium =
Medium, nPorts=2) "One of two sinks representing geothermal field"
annotation (Placement(transformation(extent={{-158,20},{-146,32}})));
- FixedResistances.PressureDrop resistanceHeatConsumerFlow(
+ AixLib.Fluid.FixedResistances.PressureDrop resistanceHeatConsumerFlow(
redeclare package Medium = Medium,
m_flow_nominal=0.2,
dp_nominal=10000) "Resistance in heat consumer flow line"
@@ -133,9 +140,8 @@ partial model GeothermalHeatPumpBase
extent={{-7,-7},{7,7}},
rotation=0,
origin={87,-50})));
- Actuators.Valves.TwoWayQuickOpening
- valveColdStorage(redeclare package Medium =
- Medium,
+ AixLib.Fluid.Actuators.Valves.TwoWayQuickOpening valveColdStorage(
+ redeclare package Medium = Medium,
m_flow_nominal=0.5,
dpValve_nominal=5000)
"Valve connecting cold storage to the evaporator of the heat pump" annotation (Placement(
@@ -143,9 +149,8 @@ partial model GeothermalHeatPumpBase
extent={{-6,7},{6,-7}},
rotation=180,
origin={-52,38})));
- Actuators.Valves.TwoWayQuickOpening
- valveHeatStorage(redeclare package Medium =
- Medium,
+ AixLib.Fluid.Actuators.Valves.TwoWayQuickOpening valveHeatStorage(
+ redeclare package Medium = Medium,
m_flow_nominal=0.5,
dpValve_nominal=5000)
"Valve connecting heat storage to the condenser of the heat pump" annotation (Placement(
@@ -155,6 +160,7 @@ partial model GeothermalHeatPumpBase
origin={-18,-63})));
AixLib.Fluid.Movers.FlowControlled_dp pumpColdConsumer(
+ energyDynamics=energyDynamics,
m_flow_nominal=0.05,
redeclare package Medium = Medium,
addPowerToMedium=false,
@@ -162,13 +168,14 @@ partial model GeothermalHeatPumpBase
"Pump moving fluid from storage tank to cold consumers"
annotation (Placement(transformation(extent={{58,-27},{72,-13}})));
AixLib.Fluid.Movers.FlowControlled_dp pumpHeatConsumer(
+ energyDynamics=energyDynamics,
m_flow_nominal=0.05,
redeclare package Medium = Medium,
addPowerToMedium=false,
T_start=T_start_hot)
"Pump moving fluid from storage tank to heat consumers"
annotation (Placement(transformation(extent={{58,-57},{72,-43}})));
- FixedResistances.PressureDrop resistanceColdConsumerReturn(
+ AixLib.Fluid.FixedResistances.PressureDrop resistanceColdConsumerReturn(
redeclare package Medium = Medium,
m_flow_nominal=0.2,
dp_nominal=10000) "Resistance in cold consumer return line"
@@ -176,7 +183,7 @@ partial model GeothermalHeatPumpBase
extent={{-7,-7},{7,7}},
rotation=180,
origin={87,32})));
- FixedResistances.PressureDrop resistanceHeatConsumerReturn(
+ AixLib.Fluid.FixedResistances.PressureDrop resistanceHeatConsumerReturn(
redeclare package Medium = Medium,
m_flow_nominal=0.2,
dp_nominal=10000) "Resistance in heat consumer return line"
@@ -185,6 +192,7 @@ partial model GeothermalHeatPumpBase
rotation=180,
origin={87,-106})));
AixLib.Fluid.Movers.FlowControlled_dp pumpCondenser(
+ energyDynamics=energyDynamics,
m_flow_nominal=0.05,
redeclare package Medium = Medium,
addPowerToMedium=false,
@@ -195,6 +203,7 @@ partial model GeothermalHeatPumpBase
rotation=180,
origin={-1,-98})));
AixLib.Fluid.Movers.FlowControlled_dp pumpEvaporator(
+ energyDynamics=energyDynamics,
m_flow_nominal=0.05,
redeclare package Medium = Medium,
addPowerToMedium=false,
@@ -205,6 +214,7 @@ partial model GeothermalHeatPumpBase
rotation=180,
origin={7,36})));
AixLib.Fluid.Movers.FlowControlled_dp pumpGeothermalSource(
+ energyDynamics=energyDynamics,
m_flow_nominal=0.05,
redeclare package Medium = Medium,
addPowerToMedium=false,
@@ -214,17 +224,50 @@ partial model GeothermalHeatPumpBase
extent={{-7,-7},{7,7}},
rotation=0,
origin={-89,-54})));
- Controls.Interfaces.VapourCompressionMachineControlBus heatPumpControlBus
+ HeatPumps.ModularReversible.BaseClasses.RefrigerantMachineControlBus
+ heatPumpControlBus
annotation (Placement(transformation(extent={{-21,60},{20,98}})));
- HeatPumps.HeatPump heatPump(useBusConnectorOnly=true) annotation (Placement(
- transformation(
- extent={{-14,17},{14,-17}},
+ AixLib.Fluid.HeatPumps.ModularReversible.Modular heatPump(
+ redeclare package MediumCon = Medium,
+ redeclare package MediumEva = Medium,
+ use_rev=false,
+ tauCon=0.005*heatPump.rhoCon/heatPump.mCon_flow_nominal,
+ dTCon_nominal=0,
+ tauEva=0.005*heatPump.rhoEva/heatPump.mEva_flow_nominal,
+ dpCon_nominal=0,
+ use_conCap=false,
+ CCon=0,
+ GConOut=0,
+ GConIns=0,
+ dTEva_nominal=0,
+ dpEva_nominal=0,
+ use_evaCap=false,
+ CEva=0,
+ GEvaOut=0,
+ GEvaIns=0,
+ use_intSafCtr=false,
+ energyDynamics=energyDynamics,
+ QHea_flow_nominal=12740,
+ redeclare model RefrigerantCycleHeatPumpHeating =
+ AixLib.Fluid.HeatPumps.ModularReversible.RefrigerantCycle.TableData2D (
+ redeclare
+ AixLib.Fluid.HeatPumps.ModularReversible.Data.TableData2D.EN255.Vitocal350BWH110
+ datTab),
+ redeclare model RefrigerantCycleHeatPumpCooling =
+ AixLib.Fluid.Chillers.ModularReversible.RefrigerantCycle.BaseClasses.NoCooling,
+ mCon_flow_nominal=0.5,
+ mEva_flow_nominal=0.5,
+ TConHea_nominal=318.15,
+ TEvaHea_nominal=273.15,
+ TConCoo_nominal=273.15,
+ TEvaCoo_nominal=273.15,
+ use_busConOnl=true) annotation (
+ Placement(transformation(
+ extent={{-10,10},{10,-10}},
rotation=90,
- origin={-25,5.99998})));
- parameter Modelica.Units.SI.MassFlowRate m_flow_nominal_layer=0.5
- "Nominal mass flow rate in layers of storages";
- parameter Modelica.Units.SI.MassFlowRate m_flow_nominal_HE=0.5
- "Nominal mass flow rate of heat exchanger layers of storages";
+ origin={-30,10})));
+
+
equation
connect(resistanceGeothermalSource.port_b, valveHeatSink.port_a) annotation (
@@ -262,21 +305,22 @@ equation
annotation (Line(points={{-96,-54},{-146,-54}}, color={0,127,255}));
connect(resistanceHeatConsumerFlow.port_b, peaLoaDev.port_a) annotation (
Line(points={{94,-50},{102,-50},{108,-50}}, color={0,127,255}));
- connect(heatPump.port_b1, geothField_sink1.ports[1]) annotation (Line(points={{-16.5,
- 20},{-16,20},{-16,28},{-146,28},{-146,27.2}}, color={0,127,255}));
- connect(valveHeatStorage.port_b, heatPump.port_a1) annotation (Line(points={{-18,
- -57},{-18,-8.00001},{-16.5,-8.00001}}, color={0,127,255}));
- connect(heatPump.port_b2, geothField_sink1.ports[2]) annotation (Line(points={
- {-33.5,-8.00001},{-88,-8.00001},{-88,24.8},{-146,24.8}}, color={0,127,
+ connect(heatPump.port_b1, geothField_sink1.ports[1]) annotation (Line(points={{-24,20},
+ {-24,24},{-148,24},{-148,25.4},{-146,25.4}}, color={0,127,255}));
+ connect(valveHeatStorage.port_b, heatPump.port_a1) annotation (Line(points={{-18,-57},
+ {-20,-57},{-20,0},{-24,0}}, color={0,127,255}));
+ connect(heatPump.port_b2, geothField_sink1.ports[2]) annotation (Line(points={{-36,0},
+ {-36,-2},{-50,-2},{-50,26.6},{-146,26.6}}, color={0,127,
255}));
- connect(heatPump.port_a2, valveHeatSource.port_b) annotation (Line(points={{-33.5,
- 20},{-44,20},{-44,7},{-60,7}}, color={0,127,255}));
- connect(heatPump.port_a2, valveColdStorage.port_b) annotation (Line(points={{-33.5,
- 20},{-44,20},{-44,38},{-58,38}}, color={0,127,255}));
- connect(valveHeatSink.port_b, heatPump.port_a1) annotation (Line(points={{-24,
- -54},{-24,-56},{-16.5,-56},{-16.5,-8.00002}}, color={0,127,255}));
+ connect(heatPump.port_a2, valveHeatSource.port_b) annotation (Line(points={{-36,20},
+ {-36,28},{-60,28},{-60,7}}, color={0,127,255}));
+ connect(heatPump.port_a2, valveColdStorage.port_b) annotation (Line(points={{-36,20},
+ {-36,28},{-62,28},{-62,38},{-58,38}},
+ color={0,127,255}));
+ connect(valveHeatSink.port_b, heatPump.port_a1) annotation (Line(points={{-24,-54},
+ {-20,-54},{-20,0},{-24,0}}, color={0,127,255}));
connect(heatPumpControlBus, heatPump.sigBus) annotation (Line(
- points={{-0.5,79},{-0.5,-32},{-30.525,-32},{-30.525,-7.86002}},
+ points={{-0.5,79},{-0.5,48},{-10,48},{-10,0.1},{-33.9,0.1}},
color={255,204,51},
thickness=0.5), Text(
string="%first",
@@ -289,8 +333,8 @@ equation
annotation (Line(points={{33.1,20.17},{33.1,32},{80,32}}, color={0,127,255}));
connect(pumpCondenser.port_a, heatStorage.portHC1Out) annotation (Line(points=
{{6,-98},{16,-98},{16,-74.58},{23.825,-74.58}}, color={0,127,255}));
- connect(heatPump.port_b1, heatStorage.portHC1In) annotation (Line(points={{
- -16.5,20},{8,20},{8,-69.31},{23.65,-69.31}}, color={0,127,255}));
+ connect(heatPump.port_b1, heatStorage.portHC1In) annotation (Line(points={{-24,20},
+ {-24,26},{-6,26},{-6,-69.31},{23.65,-69.31}},color={0,127,255}));
connect(heatStorage.fluidportTop2, pumpHeatConsumer.port_a) annotation (Line(
points={{42.375,-61.83},{42.375,-50},{58,-50}}, color={0,127,255}));
connect(resistanceHeatConsumerReturn.port_b, heatStorage.fluidportBottom2)
@@ -298,8 +342,8 @@ equation
127,255}));
connect(pumpEvaporator.port_a, coldStorage.portHC1Out) annotation (Line(
points={{14,36},{16,36},{16,7.42},{23.825,7.42}}, color={0,127,255}));
- connect(heatPump.port_b2, coldStorage.portHC1In) annotation (Line(points={{
- -33.5,-8.00002},{-33.5,-16},{14,-16},{14,12.69},{23.65,12.69}}, color
+ connect(heatPump.port_b2, coldStorage.portHC1In) annotation (Line(points={{-36,0},
+ {-36,-2},{18,-2},{18,12.69},{23.65,12.69}}, color
={0,127,255}));
annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-160,
-120},{160,80}})), Icon(coordinateSystem(
diff --git a/AixLib/Fluid/Examples/GeothermalHeatPump/BaseClasses/GeothermalHeatPumpControlledBase.mo b/AixLib/Fluid/Examples/GeothermalHeatPump/BaseClasses/GeothermalHeatPumpControlledBase.mo
index 5031d542b6..217992db89 100644
--- a/AixLib/Fluid/Examples/GeothermalHeatPump/BaseClasses/GeothermalHeatPumpControlledBase.mo
+++ b/AixLib/Fluid/Examples/GeothermalHeatPump/BaseClasses/GeothermalHeatPumpControlledBase.mo
@@ -57,13 +57,8 @@ equation
connect(getTStorageUpper.y, heatStorageTemperature) annotation (Line(points={
{-139,68},{-132,68},{-120,68},{-120,-88},{-100,-88},{-100,-120}},
color={0,0,127}));
- connect(heatPumpPower, heatPumpControlBus.PelMea) annotation (Line(points={{-45.5,
- -119.5},{-45.5,-80},{-110,-80},{-110,64},{-94,64},{-94,79.095},{-0.3975,
- 79.095}}, color={0,0,127}), Text(
- string="%second",
- index=1,
- extent={{-3,6},{-3,6}},
- horizontalAlignment=TextAlignment.Right));
+ connect(heatPump.P, heatPumpPower) annotation (Line(points={{-30,21},{-30,30},
+ {-100,30},{-100,-90},{-45.5,-90},{-45.5,-119.5}}, color={0,0,127}));
annotation (experiment(StopTime=86400, Interval=10), Documentation(info="
Base class of an example demonstrating the use of a heat pump
connected to two storages and a geothermal source. A replaceable
diff --git a/AixLib/Fluid/Examples/GeothermalHeatPump/GeothermalHeatPump.mo b/AixLib/Fluid/Examples/GeothermalHeatPump/GeothermalHeatPump.mo
index 94b155f3c3..34e08a98c9 100644
--- a/AixLib/Fluid/Examples/GeothermalHeatPump/GeothermalHeatPump.mo
+++ b/AixLib/Fluid/Examples/GeothermalHeatPump/GeothermalHeatPump.mo
@@ -1,54 +1,14 @@
-within AixLib.Fluid.Examples.GeothermalHeatPump;
+within AixLib.Fluid.Examples.GeothermalHeatPump;
model GeothermalHeatPump "Example of a geothermal heat pump system"
extends Modelica.Icons.Example;
- extends AixLib.Fluid.Examples.GeothermalHeatPump.BaseClasses.GeothermalHeatPumpControlledBase(
- redeclare model PeakLoadDeviceModel=
- AixLib.Fluid.Examples.GeothermalHeatPump.Components.BoilerStandAlone ( redeclare
- package Medium =
- Medium, energyDynamics=energyDynamics),
- heatPump(
- redeclare package Medium_con = Medium,
- redeclare package Medium_eva = Medium,
- use_rev=false,
- use_autoCalc=false,
- Q_useNominal=0,
- use_refIne=false,
- refIneFre_constant=0,
- mFlow_conNominal=0.5,
- VCon=0.005,
- dpCon_nominal=0,
- use_conCap=false,
- CCon=0,
- GConOut=0,
- GConIns=0,
- mFlow_evaNominal=0.5,
- VEva=0.005,
- dpEva_nominal=0,
- use_evaCap=false,
- CEva=0,
- GEvaOut=0,
- GEvaIns=0,
- massDynamics=Modelica.Fluid.Types.Dynamics.DynamicFreeInitial,
- energyDynamics=energyDynamics,
- redeclare model PerDataMainHP =
- DataBase.HeatPump.PerformanceData.LookUpTable2D (dataTable=
- AixLib.DataBase.HeatPump.EN255.Vitocal350BWH110()),
- redeclare model PerDataRevHP =
- DataBase.Chiller.PerformanceData.LookUpTable2D),
- heatPumpControlBus.iceFacMea = 1,
- heatStorage(energyDynamics=energyDynamics),
- coldStorage(energyDynamics=energyDynamics),
- pumpCondenser(energyDynamics=energyDynamics),
- pumpGeothermalSource(energyDynamics=energyDynamics),
- pumpEvaporator(energyDynamics=energyDynamics),
- pumpColdConsumer(energyDynamics=energyDynamics),
- pumpHeatConsumer(energyDynamics=energyDynamics));
+ extends
+ AixLib.Fluid.Examples.GeothermalHeatPump.BaseClasses.GeothermalHeatPumpControlledBase(
+ redeclare model PeakLoadDeviceModel =
+ AixLib.Fluid.Examples.GeothermalHeatPump.Components.BoilerStandAlone (
+ redeclare package Medium = Medium, energyDynamics=energyDynamics));
- parameter Modelica.Fluid.Types.Dynamics energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial
- "Type of energy balance: dynamic (3 initialization options) or steady state"
- annotation (Dialog(tab="Dynamics"));
Sources.Boundary_pT coldConsumerFlow(redeclare package Medium = Medium,
nPorts=1) annotation (Placement(transformation(
extent={{-6,-6},{6,6}},
@@ -80,12 +40,18 @@ model GeothermalHeatPump "Example of a geothermal heat pump system"
extent={{-6,-6},{6,6}},
rotation=180,
origin={154,6})));
- Controls.HeatPump.HPControllerOnOff hPControllerOnOff(bandwidth=5)
+ Controls.HeatPump.TwoPointControlledHP
+ twoPointControlledHP(
+ use_secHeaGen=false,
+ use_heaLim=false,
+ T_heaLim=293.15,
+ movAveTime=300,
+ bandwidth=2)
"Controls the temperature in the heat storage by switching the heat pump on or off"
- annotation (Placement(transformation(extent={{-78,62},{-58,82}})));
+ annotation (Placement(transformation(extent={{-80,60},{-60,80}})));
Modelica.Blocks.Sources.Constant TStorageSet(k=273.15 + 45)
"Set point of upper heat storage temperature"
- annotation (Placement(transformation(extent={{-160,0},{-148,12}})));
+ annotation (Placement(transformation(extent={{-120,70},{-110,80}})));
Control.geothermalFieldController geothermalFieldControllerCold(
temperature_low=273.15 + 8, temperature_high=273.15 + 10)
"Controls the heat exchange with the geothermal field and the heat storage"
@@ -94,6 +60,8 @@ model GeothermalHeatPump "Example of a geothermal heat pump system"
temperature_low=308.15, temperature_high=313.15)
"Controls the heat exchange with the geothermal field and the heat storage"
annotation (Placement(transformation(extent={{-100,-34},{-84,-18}})));
+ Modelica.Blocks.Sources.BooleanConstant mode "Dummy signal for unit mode, true: heat pump, false: chiller"
+ annotation (Placement(transformation(extent={{-56,56},{-44,68}})));
equation
connect(resistanceColdConsumerFlow.port_b,coldConsumerFlow. ports[1])
annotation (Line(points={{94,-20},{94,-20},{148,-20}}, color={0,127,255}));
@@ -117,14 +85,6 @@ equation
0,127}));
connect(peaLoaDev.port_b,heatConsumerFlow. ports[1]) annotation (Line(
points={{120,-50},{120,-50},{148,-50}}, color={0,127,255}));
- connect(hPControllerOnOff.heatPumpControlBus, heatPumpControlBus) annotation (
- Line(
- points={{-58.05,72.05},{-44,72.05},{-44,79},{-0.5,79}},
- color={255,204,51},
- thickness=0.5), Text(
- string="%second",
- index=1,
- extent={{6,3},{6,3}}));
connect(peaLoaDev.chemicalEnergyFlowRate, chemicalEnergyFlowRate)
annotation (Line(points={{112.77,-56.54},{112.77,-118},{-26,-118},{-26,-100},
{-71.5,-100},{-71.5,-119.5}}, color={0,0,127}));
@@ -146,14 +106,42 @@ equation
connect(geothermalFieldControllerHeat.valveOpening2, valveHeatStorage.y)
annotation (Line(points={{-83.04,-30.8},{-56,-30.8},{-56,-63},{-26.4,-63}},
color={0,0,127}));
- connect(valveHeatStorage.port_b, heatPump.port_a1) annotation (Line(points={{
- -18,-57},{-18,-8.00001},{-16.5,-8.00001},{-16.5,-8.00002}}, color={0,
+ connect(valveHeatStorage.port_b, heatPump.port_a1) annotation (Line(points={{-18,-57},
+ {-18,-8.00001},{-24,-8.00001},{-24,0}}, color={0,
127,255}));
- connect(TStorageSet.y, hPControllerOnOff.TSet) annotation (Line(points={{
- -147.4,6},{-130,6},{-130,76},{-78,76}}, color={0,0,127}));
- connect(getTStorageUpper.y, hPControllerOnOff.TMea)
- annotation (Line(points={{-139,68},{-78,68}}, color={0,0,127}));
- annotation (experiment(Tolerance=1e-6, StartTime=0, Interval=500, StopTime=86400, __Dymola_Algorithm="Dassl"), __Dymola_Commands(file="modelica://AixLib/Resources/Scripts/Dymola/Fluid/Examples/GeothermalHeatPump.mos"
+ connect(TStorageSet.y, twoPointControlledHP.TSet) annotation (Line(points={{-109.5,
+ 75},{-98,75},{-98,76},{-81.6,76}}, color={0,0,127}));
+ connect(twoPointControlledHP.sigBusHP, heatPumpControlBus) annotation (Line(
+ points={{-80.7,66.9},{-84,66.9},{-84,86},{0,86},{0,79},{-0.5,79}},
+ color={255,204,51},
+ thickness=0.5), Text(
+ string="%second",
+ index=1,
+ extent={{-6,3},{-6,3}},
+ horizontalAlignment=TextAlignment.Right));
+ connect(getTStorageUpper.y,twoPointControlledHP.TMea) annotation (Line(
+ points={{-139,68},{-138,68},{-138,62},{-81.6,62}}, color={0,0,127}));
+ connect(mode.y, heatPumpControlBus.hea) annotation (Line(points={{-43.4,62},{
+ 0,62},{0,80},{-0.5,80},{-0.5,79}}, color={255,0,255}), Text(
+ string="%second",
+ index=1,
+ extent={{6,3},{6,3}},
+ horizontalAlignment=TextAlignment.Left));
+ connect(heatPump.P, heatPumpPower) annotation (Line(points={{-30,21},{-30,20},
+ {-116,20},{-116,-88},{-45.5,-88},{-45.5,-119.5}}, color={0,0,127}));
+ connect(twoPointControlledHP.nOut, heatPumpControlBus.ySet) annotation (Line(
+ points={{-59,70},{0,70},{0,79},{-0.5,79}}, color={0,0,127}), Text(
+ string="%second",
+ index=1,
+ extent={{6,6},{6,6}},
+ horizontalAlignment=TextAlignment.Left));
+ connect(twoPointControlledHP.nOut, heatPumpControlBus.yMea) annotation (Line(
+ points={{-59,70},{-0.5,70},{-0.5,79}}, color={0,0,127}), Text(
+ string="%second",
+ index=1,
+ extent={{6,3},{6,3}},
+ horizontalAlignment=TextAlignment.Left));
+ annotation (experiment(Tolerance=1e-6, StartTime=0, Interval=500, StopTime=86400, __Dymola_Algorithm="Dassl"), __Dymola_Commands(file="modelica://AixLib/Resources/Scripts/Dymola/Fluid/Examples/GeothermalHeatPump/GeothermalHeatPump.mos"
"Simulate and plot"), Documentation(revisions="
-
May 5, 2021 by Fabian Wüllhorst:
diff --git a/AixLib/Fluid/HeatExchangers/package.order b/AixLib/Fluid/HeatExchangers/package.order
index 63698d2bcc..071c9a9acd 100644
--- a/AixLib/Fluid/HeatExchangers/package.order
+++ b/AixLib/Fluid/HeatExchangers/package.order
@@ -2,7 +2,6 @@ ConstantEffectiveness
DryCoilEffectivenessNTU
DynamicHX
EvaporatorCondenser
-EvaporatorCondenserWithCapacity
HeaterCooler_u
Heater_T
HeatingRod
diff --git a/AixLib/Fluid/HeatPumps/BaseClasses/package.order b/AixLib/Fluid/HeatPumps/BaseClasses/package.order
index 405e644310..407307198e 100644
--- a/AixLib/Fluid/HeatPumps/BaseClasses/package.order
+++ b/AixLib/Fluid/HeatPumps/BaseClasses/package.order
@@ -1,2 +1 @@
-InnerCycle_HeatPump
PartialWaterToWater
diff --git a/AixLib/Fluid/HeatPumps/Examples/package.order b/AixLib/Fluid/HeatPumps/Examples/package.order
index e4216dd7de..cf1464dd7a 100644
--- a/AixLib/Fluid/HeatPumps/Examples/package.order
+++ b/AixLib/Fluid/HeatPumps/Examples/package.order
@@ -1,4 +1,3 @@
Carnot_TCon
Carnot_y
-HeatPump
ScrollWaterToWater_OneRoomRadiator
diff --git a/AixLib/Fluid/HeatPumps/HeatPump.mo b/AixLib/Fluid/HeatPumps/HeatPump.mo
deleted file mode 100644
index 2e8a63325a..0000000000
--- a/AixLib/Fluid/HeatPumps/HeatPump.mo
+++ /dev/null
@@ -1,251 +0,0 @@
-within AixLib.Fluid.HeatPumps;
-model HeatPump
- "Grey-box model for reversible heat pumps using a black-box to simulate the refrigeration cycle"
- extends AixLib.Fluid.BaseClasses.PartialReversibleVapourCompressionMachine(
- use_rev=true,
- final machineType = true,
- redeclare AixLib.Fluid.HeatPumps.BaseClasses.InnerCycle_HeatPump innerCycle(
- final use_rev=use_rev,
- final scalingFactor=scalingFactor,
- redeclare model PerDataMainHP = PerDataMainHP,
- redeclare model PerDataRevHP = PerDataRevHP));
-
-
- replaceable model PerDataMainHP =
- AixLib.DataBase.HeatPump.PerformanceData.BaseClasses.PartialPerformanceData
- "Performance data of a heat pump in main operation mode"
- annotation (choicesAllMatching=true);
- replaceable model PerDataRevHP =
- AixLib.DataBase.Chiller.PerformanceData.BaseClasses.PartialPerformanceData
- "Performance data of a heat pump in reversible operation mode"
- annotation (Dialog(enable=use_rev),choicesAllMatching=true);
-
- annotation (Icon(coordinateSystem(extent={{-100,-120},{100,120}}), graphics={
- Rectangle(
- extent={{-16,83},{16,-83}},
- fillColor={170,213,255},
- fillPattern=FillPattern.Solid,
- lineColor={0,0,0},
- origin={1,-64},
- rotation=90),
- Rectangle(
- extent={{-17,83},{17,-83}},
- fillColor={255,0,128},
- fillPattern=FillPattern.Solid,
- lineColor={0,0,0},
- origin={1,61},
- rotation=90),
- Text(
- extent={{-76,6},{74,-36}},
- lineColor={28,108,200},
- fillColor={215,215,215},
- fillPattern=FillPattern.Solid,
- textString="%name"),
- Line(
- points={{-9,40},{9,40},{-5,-2},{9,-40},{-9,-40}},
- color={0,0,0},
- smooth=Smooth.None,
- origin={-3,-60},
- rotation=-90),
- Line(
- points={{9,40},{-9,40},{5,-2},{-9,-40},{9,-40}},
- color={0,0,0},
- smooth=Smooth.None,
- origin={-5,56},
- rotation=-90),
- Rectangle(
- extent={{-82,42},{84,-46}},
- lineColor={238,46,47},
- fillColor={0,0,0},
- fillPattern=FillPattern.Solid),
- Line(points={{-88,60},{88,60}}, color={28,108,200}),
- Line(points={{-88,-60},{88,-60}}, color={28,108,200}),
- Line(
- origin={-75.5,-80.333},
- points={{43.5,8.3333},{37.5,0.3333},{25.5,-1.667},{33.5,-9.667},{17.5,-11.667},{27.5,-21.667},{13.5,-23.667},
- {11.5,-31.667}},
- smooth=Smooth.Bezier,
- visible=use_evaCap),
- Polygon(
- points={{-70,-122},{-68,-108},{-58,-114},{-70,-122}},
- lineColor={0,0,0},
- fillPattern=FillPattern.Solid,
- fillColor={0,0,0},
- visible=use_evaCap),
- Line( origin={40.5,93.667},
- points={{39.5,6.333},{37.5,0.3333},{25.5,-1.667},{33.5,-9.667},{17.5,
- -11.667},{27.5,-21.667},{13.5,-23.667},{11.5,-27.667}},
- smooth=Smooth.Bezier,
- visible=use_conCap),
- Polygon(
- points={{86,110},{84,96},{74,102},{86,110}},
- lineColor={0,0,0},
- fillPattern=FillPattern.Solid,
- fillColor={0,0,0},
- visible=use_conCap),
- Line(
- points={{-42,72},{34,72}},
- color={0,0,0},
- arrow={Arrow.None,Arrow.Filled},
- thickness=0.5),
- Line(
- points={{-38,0},{38,0}},
- color={0,0,0},
- arrow={Arrow.None,Arrow.Filled},
- thickness=0.5,
- origin={0,-74},
- rotation=180)}), Diagram(coordinateSystem(extent={{-100,
- -120},{100,120}})),
- Documentation(revisions="
- -
- May 22, 2019 by Julian Matthes:
- Rebuild due to the introducion of the thermal machine partial model
- (see issue #715)
-
- -
- November 26, 2018 by Fabian Wüllhorst:
- First implementation (see issue #577)
-
-
-", info="
-
- This generic grey-box heat pump model uses empirical data to model
- the refrigerant cycle. The modelling of system inertias and heat
- losses allow the simulation of transient states.
-
-
- Resulting in the choosen model structure, several configurations are
- possible:
-
-
- - Compressor type: on/off or inverter controlled
-
- - Reversible heat pump / only heating
-
- - Source/Sink: Any combination of mediums is possible
-
- - Generik: Losses and inertias can be switched on or off.
-
-
-
- Concept
-
-
- Using a signal bus as a connector, this heat pump model can be easily
- combined with the new HeatPumpSystem
- or several control or safety blocks from AixLib.Controls.HeatPump.
- The relevant data is aggregated. In order to control both chillers
- and heat pumps, both flow and return temperature are aggregated. The
- mode signal chooses the type of the heat pump operation. As a result,
- this model can also be used as a chiller:
-
-
- - mode = true: Heating
-
- - mode = false: Chilling
-
-
-
- To model both on/off and inverter controlled heat pumps, the
- compressor speed is normalizd to a relative value between 0 and 1.
-
-
- Possible icing of the evaporator is modelled with an input value
- between 0 and 1.
-
-
- The model structure is as follows. To understand each submodel,
- please have a look at the corresponding model information:
-
-
- -
- InnerCycle
- (Black Box): Here, the user can use between several input models or
- just easily create his own, modular black box model. Please look at
- the model description for more info.
-
- - Inertia: A n-order element is used to model system inertias (mass
- and thermal) of components inside the refrigerant cycle (compressor,
- pipes, expansion valve)
-
- -
-
- HeatExchanger: This new model also enable modelling of thermal
- interias and heat losses in a heat exchanger. Please look at the
- model description for more info.
-
-
-
- Parametrization
-
-
- To simplify the parametrization of the evaporator and condenser
- volumes and nominal mass flows there exists an option of automatic
- estimation based on the nominal usable heating power of the HeatPump.
- This function uses a linear correlation of these parameters, which
- was established from the linear regression of more than 20 data sets
- of water-to-water heat pumps from different manufacturers (e.g.
- Carrier, Trane, Lennox) ranging from about 25kW to 1MW nominal power.
- The linear regressions with coefficients of determination above 91%
- give a good approximation of these parameters. Nevertheless,
- estimates for machines outside the given range should be checked for
- plausibility during simulation.
-
-
- Assumptions
-
-
- Several assumptions where made in order to model the heat pump. For a
- detailed description see the corresponding model.
-
-
- -
-
- Performance data 2D: In order to model inverter controlled heat
- pumps, the compressor speed is scaled linearly
-
- -
-
- Performance data 2D: Reduced evaporator power as a result of
- icing. The icing factor is multiplied with the evaporator power.
-
- -
- Inertia: The default value of the n-th order element is set
- to 3. This follows comparisons with experimental data. Previous
- heat pump models are using n = 1 as a default. However, it was
- pointed out that a higher order element fits a real heat pump
- better in.
-
- -
- Scaling factor: A scaling facor is implemented for scaling
- of the heat pump power and capacity. The factor scales the
- parameters V, m_flow_nominal, C, GIns, GOut and dp_nominal. As a
- result, the heat pump can supply more heat with the COP staying
- nearly constant. However, one has to make sure that the supplied
- pressure difference or mass flow is also scaled with this factor,
- as the nominal values do not increase said mass flow.
-
-
-
- Known Limitations
-
-
- - The n-th order element has a big influence on computational time.
- Reducing the order or disabling it completly will decrease
- computational time.
-
- - Reversing the mode: A normal 4-way-exchange valve suffers from
- heat losses and irreversibilities due to switching from one mode to
- another. Theses losses are not taken into account.
-
-
-"));
-end HeatPump;
diff --git a/AixLib/Fluid/HeatPumps/ModularReversible/BaseClasses/PartialReversibleRefrigerantMachine.mo b/AixLib/Fluid/HeatPumps/ModularReversible/BaseClasses/PartialReversibleRefrigerantMachine.mo
index d738ed6edf..e9644b13f9 100644
--- a/AixLib/Fluid/HeatPumps/ModularReversible/BaseClasses/PartialReversibleRefrigerantMachine.mo
+++ b/AixLib/Fluid/HeatPumps/ModularReversible/BaseClasses/PartialReversibleRefrigerantMachine.mo
@@ -383,7 +383,6 @@ partial model PartialReversibleRefrigerantMachine
origin={110,30})));
// To avoid using the bus, set the section below to protected
//
RefrigerantMachineControlBus sigBus
"Bus with model outputs and possibly inputs" annotation (Placement(transformation(
diff --git a/AixLib/Fluid/HeatPumps/ModularReversible/Data/TableData2D/EN14511/AlphaInnotec_LW80MA.mo b/AixLib/Fluid/HeatPumps/ModularReversible/Data/TableData2D/EN14511/AlphaInnotec_LW80MA.mo
new file mode 100644
index 0000000000..f7576cc888
--- /dev/null
+++ b/AixLib/Fluid/HeatPumps/ModularReversible/Data/TableData2D/EN14511/AlphaInnotec_LW80MA.mo
@@ -0,0 +1,40 @@
+within AixLib.Fluid.HeatPumps.ModularReversible.Data.TableData2D.EN14511;
+record AlphaInnotec_LW80MA "Alpha Innotec LW 80 M-A"
+ extends GenericAirToWater(
+ dpEva_nominal=0,
+ dpCon_nominal=0,
+ tabUppBou=[248.15, 338.15; 313.15, 338.15],
+ use_TConOutForOpeEnv=true,
+ use_TEvaOutForOpeEnv=false,
+ tabQCon_flow=[
+ 0, 266.15, 275.15, 280.15, 283.15, 288.15, 293.15;
+ 308.15, 6300, 8000, 9400, 10300, 11850, 13190;
+ 318.15, 6167, 7733, 9000, 9750, 11017, 11730;
+ 323.15, 6100, 7600, 8800, 9475, 10600, 11000],
+ tabPEle=[
+ 0, 266.15, 275.15, 280.15, 283.15, 288.15, 293.15;
+ 308.15, 2625, 2424, 2410, 2395, 2347, 2322;
+ 318.15, 3136, 3053, 3000, 2970, 2912, 2889;
+ 323.15, 3486, 3535, 3451, 3414, 3365, 3385],
+ mEva_flow_nominal=1,
+ mCon_flow_nominal=9400/4180/5,
+ use_TConOutForTab=true,
+ use_TEvaOutForTab=false,
+ devIde="AlphaInnotec_LW80MA");
+ //These boundary-tables are not from the datasheet but default values.
+
+ annotation(preferedView="text", DymolaStoredErrors,
+ Icon,
+ Documentation(revisions="
+ -
+ Oct 14, 2016 by Philipp Mehrfeld:
+ Transferred to AixLib.
+
+
+", info="
+
+ According to manufacturer's data which was inter- and extrapolated
+ linearly; EN14511
+
+"));
+end AlphaInnotec_LW80MA;
diff --git a/AixLib/Fluid/HeatPumps/ModularReversible/Data/TableData2D/EN14511/Dimplex_LA11AS.mo b/AixLib/Fluid/HeatPumps/ModularReversible/Data/TableData2D/EN14511/Dimplex_LA11AS.mo
new file mode 100644
index 0000000000..386bec4aef
--- /dev/null
+++ b/AixLib/Fluid/HeatPumps/ModularReversible/Data/TableData2D/EN14511/Dimplex_LA11AS.mo
@@ -0,0 +1,35 @@
+within AixLib.Fluid.HeatPumps.ModularReversible.Data.TableData2D.EN14511;
+record Dimplex_LA11AS "Dimplex LA 11 AS"
+ extends GenericAirToWater(
+ dpEva_nominal=0,
+ dpCon_nominal=0,
+ tabUppBou=[248.15, 331.15; 308.15, 331.15],
+ use_TConOutForOpeEnv=true,
+ use_TEvaOutForOpeEnv=false,
+ tabQCon_flow=[
+ 0, 266.15, 275.15, 280.15, 283.15;
+ 308.15, 6600, 8800, 11300, 12100;
+ 318.15, 6400, 7898, 9600, 10145],
+ tabPEle=[
+ 0, 266.15, 275.15, 280.15, 283.15;
+ 308.15, 2444, 2839, 3139, 3103;
+ 318.15, 2783, 2974, 3097, 3013],
+ mEva_flow_nominal=1,
+ mCon_flow_nominal=11300/4180/5,
+ use_TConOutForTab=true,
+ use_TEvaOutForTab=false,
+ devIde="Dimplex_LA11AS");
+ annotation(preferedView="text", DymolaStoredErrors,
+ Icon,
+ Documentation(revisions="
+ -
+ Oct 14, 2016 by Philipp Mehrfeld:
+ Transferred to AixLib.
+
+
+", info="
+
+ According to data from Dimplex data sheets; EN14511
+
+"));
+end Dimplex_LA11AS;
diff --git a/AixLib/Fluid/HeatPumps/ModularReversible/Data/TableData2D/EN14511/Ochsner_GMLW_19.mo b/AixLib/Fluid/HeatPumps/ModularReversible/Data/TableData2D/EN14511/Ochsner_GMLW_19.mo
new file mode 100644
index 0000000000..eeec5b7152
--- /dev/null
+++ b/AixLib/Fluid/HeatPumps/ModularReversible/Data/TableData2D/EN14511/Ochsner_GMLW_19.mo
@@ -0,0 +1,36 @@
+within AixLib.Fluid.HeatPumps.ModularReversible.Data.TableData2D.EN14511;
+record Ochsner_GMLW_19 "Ochsner GMLW 19"
+ extends GenericAirToWater(
+ dpEva_nominal=0,
+ dpCon_nominal=0,
+ tabUppBou=[258.15, 328.15; 313.15, 328.15],
+ use_TConOutForOpeEnv=true,
+ use_TEvaOutForOpeEnv=false,
+ tabQCon_flow=[
+ 0, 263.15, 275.15, 280.15;
+ 308.15, 11600, 17000, 20200;
+ 323.15, 10200, 15600, 18800],
+ tabPEle=[
+ 0, 263.15, 275.15, 280.15;
+ 308.15, 4300, 4400, 4600;
+ 323.15, 6300, 6400, 6600],
+ mEva_flow_nominal=1,
+ mCon_flow_nominal=20200/4180/5,
+ use_TConOutForTab=true,
+ use_TEvaOutForTab=false,
+ devIde="Ochsner_GMLW_19");
+
+ annotation(preferedView="text", DymolaStoredErrors,
+ Icon,
+ Documentation(revisions="
+ -
+ Oct 14, 2016 by Philipp Mehrfeld:
+ Transferred to AixLib.
+
+
+", info="
+
+ According to data from Ochsner data sheets; EN14511
+
+"));
+end Ochsner_GMLW_19;
diff --git a/AixLib/Fluid/HeatPumps/ModularReversible/Data/TableData2D/EN14511/Ochsner_GMLW_19plus.mo b/AixLib/Fluid/HeatPumps/ModularReversible/Data/TableData2D/EN14511/Ochsner_GMLW_19plus.mo
new file mode 100644
index 0000000000..dbc7f9d6a1
--- /dev/null
+++ b/AixLib/Fluid/HeatPumps/ModularReversible/Data/TableData2D/EN14511/Ochsner_GMLW_19plus.mo
@@ -0,0 +1,38 @@
+within AixLib.Fluid.HeatPumps.ModularReversible.Data.TableData2D.EN14511;
+record Ochsner_GMLW_19plus "Ochsner GMLW 19 plus"
+ extends GenericAirToWater(
+ dpEva_nominal=0,
+ dpCon_nominal=0,
+ tabUppBou=[249.15, 325.15; 258.15, 328.15; 263.15, 338.15; 313.15, 338.15],
+ use_TConOutForOpeEnv=true,
+ use_TEvaOutForOpeEnv=false,
+ tabQCon_flow=[
+ 0, 263.15, 275.15, 280.15;
+ 308.15, 12600, 16800, 19800;
+ 323.15, 11700, 15900, 18900;
+ 333.15, 11400, 15600, 18600],
+ tabPEle=[
+ 0, 263.15, 275.15, 280.15;
+ 308.15, 4100, 4300, 4400;
+ 323.15, 5500, 5700, 5800;
+ 333.15, 6300, 6500, 6600],
+ mEva_flow_nominal=1,
+ mCon_flow_nominal=19800/4180/5,
+ use_TConOutForTab=true,
+ use_TEvaOutForTab=false,
+ devIde="Ochsner_GMLW_19plus");
+
+ annotation(preferedView="text", DymolaStoredErrors,
+ Icon,
+ Documentation(revisions="
+ -
+ Oct 14, 2016 by Philipp Mehrfeld:
+ Transferred to AixLib.
+
+
+", info="
+
+ According to data from Ochsner data sheets; EN14511
+
+"));
+end Ochsner_GMLW_19plus;
diff --git a/AixLib/Fluid/HeatPumps/ModularReversible/Data/TableData2D/EN14511/Ochsner_GMSW_15plus.mo b/AixLib/Fluid/HeatPumps/ModularReversible/Data/TableData2D/EN14511/Ochsner_GMSW_15plus.mo
new file mode 100644
index 0000000000..6d81863aca
--- /dev/null
+++ b/AixLib/Fluid/HeatPumps/ModularReversible/Data/TableData2D/EN14511/Ochsner_GMSW_15plus.mo
@@ -0,0 +1,38 @@
+within AixLib.Fluid.HeatPumps.ModularReversible.Data.TableData2D.EN14511;
+record Ochsner_GMSW_15plus "Ochsner GMSW 15 plus"
+ extends GenericAirToWater(
+ dpEva_nominal=0,
+ dpCon_nominal=0,
+ tabUppBou=[265.15, 325.15; 273.15, 338.15; 293.15, 338.15],
+ use_TConOutForOpeEnv=true,
+ use_TEvaOutForOpeEnv=false,
+ tabQCon_flow=[
+ 0, 268.15, 273.15, 278.15;
+ 308.15, 12762, 14500, 16100;
+ 318.15, 12100, 13900, 15600;
+ 328.15, 11513, 13200, 14900],
+ tabPEle=[
+ 0, 268.15, 273.15, 278.15;
+ 308.15, 3225, 3300, 3300;
+ 318.15, 4000, 4000, 4000;
+ 328.15, 4825, 4900, 4900],
+ mEva_flow_nominal=(14500 - 3300)/3600/3,
+ mCon_flow_nominal=14500/4180/5,
+ use_TConOutForTab=true,
+ use_TEvaOutForTab=false,
+ devIde="Ochsner_GMSW_15plus");
+
+ annotation(preferedView="text", DymolaStoredErrors,
+ Icon,
+ Documentation(revisions="
+ -
+ Oct 14, 2016 by Philipp Mehrfeld:
+ Transferred to AixLib.
+
+
+", info="
+
+ According to data from WPZ Buchs, Swiss; EN14511
+
+"));
+end Ochsner_GMSW_15plus;
diff --git a/AixLib/Fluid/HeatPumps/ModularReversible/Data/TableData2D/EN14511/SingleSplitRXM20R.mo b/AixLib/Fluid/HeatPumps/ModularReversible/Data/TableData2D/EN14511/SingleSplitRXM20R.mo
index 58a39bcc94..925fdd4a44 100644
--- a/AixLib/Fluid/HeatPumps/ModularReversible/Data/TableData2D/EN14511/SingleSplitRXM20R.mo
+++ b/AixLib/Fluid/HeatPumps/ModularReversible/Data/TableData2D/EN14511/SingleSplitRXM20R.mo
@@ -53,6 +53,6 @@ https://www.heizman24.de/media/pdf/fa/50/2c/Daikin-RXM-R-Produktdatenbuch.pdfAixLib #577)
-"),
+"),
__Dymola_LockedEditing="Model from IBPSA");
end SingleSplitRXM20R;
diff --git a/AixLib/Fluid/HeatPumps/ModularReversible/Data/TableData2D/EN14511/StiebelEltron_WPL18.mo b/AixLib/Fluid/HeatPumps/ModularReversible/Data/TableData2D/EN14511/StiebelEltron_WPL18.mo
new file mode 100644
index 0000000000..7937a7be68
--- /dev/null
+++ b/AixLib/Fluid/HeatPumps/ModularReversible/Data/TableData2D/EN14511/StiebelEltron_WPL18.mo
@@ -0,0 +1,37 @@
+within AixLib.Fluid.HeatPumps.ModularReversible.Data.TableData2D.EN14511;
+record StiebelEltron_WPL18 "Stiebel Eltron WPL 18"
+ extends GenericAirToWater(
+ dpEva_nominal=0,
+ dpCon_nominal=0,
+ tabUppBou=[248.15, 338.15; 313.15, 338.15],
+ use_TConOutForOpeEnv=true,
+ use_TEvaOutForOpeEnv=false,
+ tabQCon_flow=[
+ 0, 266.15, 275.15, 280.15, 283.15, 293.15;
+ 308.15, 9700, 11600, 13000, 14800, 16300;
+ 323.15, 10000, 11200, 12900, 16700, 17500],
+ tabPEle=[
+ 0, 266.15, 275.15, 280.15, 283.15, 293.15;
+ 308.15, 3300, 3400, 3500, 3700, 3800;
+ 323.15, 4500, 4400, 4600, 5000, 5100],
+ mEva_flow_nominal=1,
+ mCon_flow_nominal=13000/4180/5,
+ use_TConOutForTab=true,
+ use_TEvaOutForTab=false,
+ devIde="StiebelEltron_WPL18");
+ //These boundary-tables are not from the datasheet but default values.
+
+ annotation(preferedView="text", DymolaStoredErrors,
+ Icon,
+ Documentation(revisions="
+ -
+ Oct 14, 2016 by Philipp Mehrfeld:
+ Transferred to AixLib.
+
+
+", info="
+
+ According to data from WPZ Buchs, Swiss; EN14511
+
+"));
+end StiebelEltron_WPL18;
diff --git a/AixLib/Fluid/HeatPumps/ModularReversible/Data/TableData2D/EN14511/Vaillant_VWL_101.mo b/AixLib/Fluid/HeatPumps/ModularReversible/Data/TableData2D/EN14511/Vaillant_VWL_101.mo
new file mode 100644
index 0000000000..25f1a82d74
--- /dev/null
+++ b/AixLib/Fluid/HeatPumps/ModularReversible/Data/TableData2D/EN14511/Vaillant_VWL_101.mo
@@ -0,0 +1,39 @@
+within AixLib.Fluid.HeatPumps.ModularReversible.Data.TableData2D.EN14511;
+record Vaillant_VWL_101 "Vaillant VWL10-1"
+ extends GenericAirToWater(
+ dpEva_nominal=0,
+ dpCon_nominal=0,
+ tabUppBou=[248.15, 338.15; 313.15, 338.15],
+ use_TConOutForOpeEnv=true,
+ use_TEvaOutForOpeEnv=false,
+ tabQCon_flow=[
+ 0, 258.15, 266.15, 275.15, 280.15;
+ 308.15, 5842, 7523, 9776, 10807;
+ 318.15, 5842, 7332, 9050, 10387;
+ 328.15, 5728, 7179, 9050, 10043],
+ tabPEle=[
+ 0, 258.15, 266.15, 275.15, 280.15;
+ 308.15, 2138, 2177, 2444, 2444;
+ 318.15, 2558, 2673, 2864, 3055;
+ 328.15, 2902, 3131, 3360, 3513],
+ mEva_flow_nominal=1,
+ mCon_flow_nominal=9776/4180/5,
+ use_TConOutForTab=true,
+ use_TEvaOutForTab=false,
+ devIde="Vaillant_VWL_101");
+ //These boundary-tables are not from the datasheet but default values.
+
+ annotation(preferedView="text", DymolaStoredErrors,
+ Icon,
+ Documentation(revisions="
+ -
+ Oct 14, 2016 by Philipp Mehrfeld:
+ Transferred to AixLib.
+
+
+",
+ info="
+ According to data from Vaillant data sheets; EN14511
+
+"));
+end Vaillant_VWL_101;
diff --git a/AixLib/Fluid/HeatPumps/ModularReversible/Data/TableData2D/EN14511/Vitocal251A08.mo b/AixLib/Fluid/HeatPumps/ModularReversible/Data/TableData2D/EN14511/Vitocal251A08.mo
index 62d9e8f475..fc37166532 100644
--- a/AixLib/Fluid/HeatPumps/ModularReversible/Data/TableData2D/EN14511/Vitocal251A08.mo
+++ b/AixLib/Fluid/HeatPumps/ModularReversible/Data/TableData2D/EN14511/Vitocal251A08.mo
@@ -48,6 +48,6 @@ Viessmann, Planungshandbuch.
https://www.haustechnik-handrich.de/media/pdf/54/c4/14/vie-pa-z022164.pdf.
-