diff --git a/.travis.yml b/.travis.yml index b049722bd2..a1b89ee8ab 100644 --- a/.travis.yml +++ b/.travis.yml @@ -28,8 +28,8 @@ env: # Test matrix for regression tests. # The documentation is tested using github actions. - TEST_ARG="make test-bestest" - - TEST_ARG="make test-dymola PACKAGE=\"IBPSA.Experimental\"" - - TEST_ARG="make test-openmodelica PACKAGE=\"IBPSA.Experimental\"" + - TEST_ARG="make test-dymola PACKAGE=\"IBPSA.{Examples,Experimental}\"" + - TEST_ARG="make test-openmodelica PACKAGE=\"IBPSA.{Examples,Experimental}\"" - TEST_ARG="make test-dymola PACKAGE=\"IBPSA.Fluid.{Actuators,BaseClasses,Chillers,Delays,Geothermal,Examples,FMI,FixedResistances}\"" - TEST_ARG="make test-openmodelica PACKAGE=\"IBPSA.Fluid.{Actuators,BaseClasses,Chillers,Delays,Geothermal,Examples,FMI,FixedResistances}\"" - TEST_ARG="make test-dymola PACKAGE=\"IBPSA.Fluid.{HeatExchangers,HeatPumps,Humidifiers,Interfaces,MassExchangers,MixingVolumes,Movers,Sensors,Sources,Storage}\"" diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo new file mode 100644 index 0000000000..28c3662126 --- /dev/null +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse0.mo @@ -0,0 +1,102 @@ +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse0 + "Start file for simple house example" + extends Modelica.Icons.Example; + package MediumAir = IBPSA.Media.Air "Medium model for air"; + package MediumWater = IBPSA.Media.Water "Medium model for water"; + parameter Modelica.Units.SI.Area AWall = 100 "Wall area"; + parameter Modelica.Units.SI.Length dWall = 0.25 "Wall thickness"; + parameter Modelica.Units.SI.ThermalConductivity kWall = 0.04 "Wall thermal conductivity"; + parameter Modelica.Units.SI.Density rhoWall = 2000 "Wall density"; + parameter Modelica.Units.SI.SpecificHeatCapacity cpWall = 1000 "Wall specific heat capacity"; + IBPSA.BoundaryConditions.WeatherData.ReaderTMY3 weaDat(filNam= + ModelicaServices.ExternalReferences.loadResource( + "modelica://IBPSA/Resources/weatherdata/USA_IL_Chicago-OHare.Intl.AP.725300_TMY3.mos")) + "Weather data reader" + annotation (Placement(transformation(extent={{-180,-10},{-160,10}}))); + IBPSA.BoundaryConditions.WeatherData.Bus weaBus "Weather data bus" + annotation (Placement(transformation(extent={{-140,-10},{-120,10}}), + iconTransformation(extent={{-152,-10},{-132,10}}))); + Modelica.Thermal.HeatTransfer.Sources.PrescribedTemperature TOut + "Exterior temperature boundary condition" + annotation (Placement(transformation(extent={{-80,-10},{-60,10}}))); +equation + connect(weaDat.weaBus, weaBus) annotation (Line( + points={{-160,0},{-130,0}}, + color={255,204,51}, + thickness=0.5)); + connect(TOut.T, weaBus.TDryBul) + annotation (Line(points={{-82,0},{-130,0}}, color={0,0,127})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-220, + -220},{220,220}}), graphics={ + Rectangle( + extent={{-200,60},{-20,-60}}, + fillColor={238,238,238}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Rectangle( + extent={{-200,-80},{200,-200}}, + fillColor={238,238,238}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Rectangle( + extent={{-200,200},{200,80}}, + fillColor={238,238,238}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Rectangle( + extent={{0,60},{200,-60}}, + fillColor={238,238,238}, + fillPattern=FillPattern.Solid, + pattern=LinePattern.None), + Text( + extent={{57.25,40.25},{2.75,59.75}}, + textColor={0,0,127}, + fillColor={255,213,170}, + fillPattern=FillPattern.Solid, + textString="Building"), + Text( + extent={{-137,-99},{-203,-81}}, + textColor={0,0,127}, + fillColor={255,213,170}, + fillPattern=FillPattern.Solid, + textString="Heating"), + Text( + extent={{-102,39},{-198,61}}, + textColor={0,0,127}, + fillColor={255,213,170}, + fillPattern=FillPattern.Solid, + textString="Weather inputs"), + Text( + extent={{-61,179},{-199,201}}, + textColor={0,0,127}, + fillColor={255,213,170}, + fillPattern=FillPattern.Solid, + textString="Cooling and ventilation")}), + experiment(Tolerance=1E-6, StopTime=1e+06), + Documentation(revisions=" +
+This model is used as the starting point for the
+IBPSA.Examples.Tutorial.SimpleHouse
+tutorial.
+It contains a weather data reader and a PrescribedTemperature
component
+that allows the user to connect thermal components to the dry bulb temperature.
+It was based on from the Modelica crash course organised by KU Leuven
+(https://github.com/open-ideas/__CrashCourse__).
+
+A very simple building envelope model will be constructed manually using thermal resistors and heat capacitors. +The house consists of a wall represented by a single heat capacitor and a thermal resistor. +The boundary temperature are already included in + +IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse0. +The wall has a surface area of Awall=100 m2, +a thickness of dwall=25 cm, +a thermal conductivity of kwall=0.04 W/(m K), +a density of ρwall=2000 kg/m3, +and a specific heat capacity of cp,wall= 1000 J/(kg K) +
++These parameters are already declared in the equation section of + +IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse0. +You can use this way of declaring parameters in the remainder of this exercise, but this is not required. +
++The conductive thermal resistance value of a wall may be computed as R=d/(A*k). +The heat capacity value of a wall may be computed as C=A*d*cp*ρ +
+
+Connect one side of the thermal resistor to the output of PrescribedTemperature
+and the other side of the thermal resistor to the heat capacitor.
+
+If you correctly added the model of the heat capacitor, +connected it to the resistor and added the parameter values for C, +then you should be able to simulate the model. +To do this, press the Simulation Setup and set the model Stop time to 1e6 seconds. +You can now simulate the model by pressing the Simulate button. +
++You can plot individual variables values by clicking on their name in the variable browser on the left. +Now plot the wall capacitor temperature value T. +It should look like the figure below (1 Ms is around 12 days). +
++ +
+"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse1.mos" + "Simulate and plot")); +end SimpleHouse1; diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo new file mode 100644 index 0000000000..a35f20d80e --- /dev/null +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse2.mo @@ -0,0 +1,79 @@ +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse2 "Building window model" + extends SimpleHouse1; + + parameter Modelica.Units.SI.Area AWin=2 "Window area"; + + Modelica.Blocks.Math.Gain gaiWin(k=AWin) + "Gain for solar irradiance through the window" + annotation (Placement(transformation(extent={{20,-50},{40,-30}}))); + Modelica.Thermal.HeatTransfer.Sources.PrescribedHeatFlow win + "Very simple window model" + annotation (Placement(transformation(extent={{60,-50},{80,-30}}))); +equation + connect(gaiWin.y, win.Q_flow) + annotation (Line(points={{41,-40},{60,-40}}, color={0,0,127})); + connect(gaiWin.u, weaBus.HDirNor) annotation (Line(points={{18,-40},{-130,-40}, + {-130,0}}, color={0,0,127}), Text( + string="%second", + index=1, + extent={{-6,3},{-6,3}}, + horizontalAlignment=TextAlignment.Right)); + connect(win.port, walCap.port) annotation (Line(points={{80,-40},{110,-40},{110, + 1.77636e-15},{160,1.77636e-15}}, color={191,0,0})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-220, + -220},{220,220}})), + experiment(Tolerance=1e-6, StopTime=1e+06), + Documentation(revisions=" ++The window has a surface area of 2 m2. +In this simple model we will therefore assume that +two times the outdoor solar irradiance is injected as heat onto the inside of the wall. +
+
+To be able to use the value of the outdoor solar irradiance
+you will need to access the weather data reader.
+To do this, make a connection to the weaBus
.
+In the dialog box select <New Variable> and here type HDirNor
,
+which is the direct solar irradiance on a surface of 1 m2,
+perpendicular to the sun rays.
+Set the gain factor k
to 2,
+in order to get the solar irradiance through the window of 2 m2.
+
+Make a connection with the PrescribedHeatFlow
as well.
+This block makes the connection between the heat flow from the gain, represented as a real value,
+and a heat port that is compatible with the connectors of the thermal capacitance and resistance.
+
+The result with and without the window model is plotted in the figure below. +
++ +
+"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse2.mos" + "Simulate and plot")); +end SimpleHouse2; diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo new file mode 100644 index 0000000000..59325b856b --- /dev/null +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse3.mo @@ -0,0 +1,87 @@ +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse3 "Air model" + extends SimpleHouse2; + + parameter Modelica.Units.SI.Volume VZone=8*8*3 "Zone volume"; + parameter Modelica.Units.SI.MassFlowRate mAir_flow_nominal=1 + "Nominal mass flow rate for air loop"; + parameter Modelica.Units.SI.CoefficientOfHeatTransfer hWall=2 + "Convective heat transfer coefficient at the wall"; + + Modelica.Thermal.HeatTransfer.Components.ThermalResistor conRes(R=1/hWall/ + AWall) "Thermal resistance for convective heat transfer" annotation ( + Placement(transformation( + extent={{-10,-10},{10,10}}, + rotation=270, + origin={110,20}))); + IBPSA.Fluid.MixingVolumes.MixingVolume zon( + redeclare package Medium = MediumAir, + V=VZone, + energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, + m_flow_nominal=mAir_flow_nominal) "Very simple zone air model" + annotation (Placement(transformation(extent={{160,50},{180,30}}))); +equation + connect(zon.heatPort, conRes.port_a) + annotation (Line(points={{160,40},{110,40},{110,30}}, color={191,0,0})); + connect(conRes.port_b, walCap.port) annotation (Line(points={{110,10},{110,1.77636e-15}, + {160,1.77636e-15}}, color={191,0,0})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-220, + -220},{220,220}})), + experiment(Tolerance=1e-6, StopTime=1e+06), + Documentation(revisions=" ++To increase the model detail we now add an air model assuming the zone is 8m x 8m x 3m in size. +The air will exchange heat with the wall. +This may be modelled using a thermal resistance representing +the convective heat resistance which is equal to Rconv=1/(h*A), +where A is the heat exchange surface area and h=2 W/(m2*K) is the convective heat transfer coefficient. +
+
+The MixingVolume
Medium
parameter contains information about
+the type of fluid and its properties that should be modelled by the MixingVolume
.
+Set its value to MediumAir
, which is declared in the template,
+by typing redeclare package Medium = MediumAir
.
+For the nominal mass flow rate you may assume a value of 1 kg/m3 for now.
+You will have to change this value once you add a ventilation system to the model (see
+
+IBPSA.Examples.Tutorial.SimpleHouse.SimpleHouse6).
+Finally, set the energyDynamics
of the MixingVolume
,
+which can be found in the Dynamics
tab of the model parameter window, to FixedInitial
.
+
+Make a connection with the PrescribedHeatFlow
as well.
+This block makes the connection between the heat flow from the gain, represented as a real value,
+and a heat port that is compatible with the connectors of the thermal capacitance and resistance.
+
+The result with and without the air model is plotted in the figure below. +
++ +
+"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse3.mos" + "Simulate and plot")); +end SimpleHouse3; diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo new file mode 100644 index 0000000000..335d544c15 --- /dev/null +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse4.mo @@ -0,0 +1,152 @@ +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse4 "Heating model" + extends SimpleHouse3; + + constant Boolean use_constantHeater=true + "To enable/disable the connection between the constant source and heater and circulation pump"; + + parameter Modelica.Units.SI.HeatFlowRate QHea_flow_nominal=3000 + "Nominal capacity of heating system"; + parameter Modelica.Units.SI.MassFlowRate mWat_flow_nominal=0.1 + "Nominal mass flow rate for water loop"; + + + IBPSA.Fluid.HeatExchangers.Radiators.RadiatorEN442_2 rad( + redeclare package Medium = MediumWater, + T_a_nominal=333.15, + T_b_nominal=313.15, + energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, + allowFlowReversal=false, + Q_flow_nominal=QHea_flow_nominal) "Radiator" + annotation (Placement(transformation(extent={{140,-140},{160,-120}}))); + + IBPSA.Fluid.HeatExchangers.HeaterCooler_u heaWat( + redeclare package Medium = MediumWater, + m_flow_nominal=mWat_flow_nominal, + energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, + allowFlowReversal=false, + dp_nominal=5000, + Q_flow_nominal=QHea_flow_nominal) "Heater for water circuit" + annotation (Placement(transformation(extent={{60,-140},{80,-120}}))); + + Fluid.Movers.Preconfigured.FlowControlled_m_flow pum( + redeclare package Medium = MediumWater, + use_inputFilter=false, + m_flow_nominal=mWat_flow_nominal, + energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, + allowFlowReversal=false) "Pump" + annotation (Placement(transformation(extent={{110,-190},{90,-170}}))); + + IBPSA.Fluid.Sources.Boundary_pT bouWat( + redeclare package Medium = MediumWater, + nPorts=1) + "Pressure bound for water circuit" + annotation (Placement(transformation( + extent={{-10,-10},{10,10}}, + origin={20,-180}))); + Modelica.Blocks.Sources.Constant conHea(k=1) + if use_constantHeater "Gain for heater" + annotation (Placement(transformation(extent={{80,-110},{60,-90}}))); + Modelica.Blocks.Sources.Constant conPum(k=mWat_flow_nominal) + if use_constantHeater "Gain for pump" + annotation (Placement(transformation(extent={{130,-160},{110,-140}}))); +equation + connect(heaWat.port_b,rad. port_a) annotation (Line(points={{80,-130},{140,-130}}, + color={0,127,255})); + connect(rad.port_b, pum.port_a) annotation (Line(points={{160,-130},{175,-130}, + {175,-180},{110,-180}}, color={0,127,255})); + connect(heaWat.port_a, pum.port_b) annotation (Line(points={{60,-130},{39.75,-130}, + {39.75,-180},{90,-180}}, color={0,127,255})); + connect(rad.heatPortCon, zon.heatPort) annotation (Line(points={{148,-122.8},{ + 148,40},{160,40}}, color={191,0,0})); + connect(rad.heatPortRad, walCap.port) annotation (Line(points={{152,-122.8},{152, + 1.77636e-15},{160,1.77636e-15}}, color={191,0,0})); + connect(conPum.y, pum.m_flow_in) annotation (Line(points={{109,-150},{100,-150}, + {100,-168}}, color={0,0,127})); + connect(conHea.y, heaWat.u) annotation (Line(points={{59,-100},{40,-100},{40,-124}, + {58,-124}}, color={0,0,127})); + connect(bouWat.ports[1], pum.port_b) + annotation (Line(points={{30,-180},{90,-180}}, color={0,127,255})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-220, + -220},{220,220}})), + experiment(Tolerance=1e-6, StopTime=1e+06), + Documentation(revisions=" ++The wall temperature (and therefore the room temperature) is quite low. +In this step a heating system is added to resolve this. It consists of a radiator, a pump and a heater. +The radiator has a nominal power of 3 kW for an inlet and outlet temperature of the radiator of 60°C +and 40°C, and a room air and radiative temperature of 20°C. +The pump has a (nominal) mass flow rate of 0.1 kg/s. +Since the heating system uses water as a heat carrier fluid, +the media for the models in the heating circuit should be set to MediumWater. +
+
+The radiator contains one port for convective heat transfer and one for radiative heat transfer.
+Connect both in a reasonable way. Since the heating system uses water as a heat carrier fluid,
+the media for the models should be set to MediumWater
.
+
+The Boundary_pT
model needs to be used to set an absolute pressure somewhere in the system.
+Otherwise the absolute pressure in the system is undefined.
+Pressure difference modelling may be disregarded in the heating circuit
+since the chosen pump sets a fixed mass flow rate regardless of the pressure drop.
+
+Set the heater input to 1, meaning that it will produce 1 times its nominal power. +
+
+The pump and the heater need a control input, which we set here to a constant
+of 1.
+However, in the next version of this model, we want to connect an actual controller to these models.
+We can therefore introduce a Boolean constant
(or a Boolean parameter
+would also work), and use this to conditionally remove the Modelica block
+that outputs the control signal. When Modelica removes such a block, then all
+connections to it will also be removed.
+
+The result of the air temperature is plotted in the figure below. +The temperature rises very steeply since the wall is relatively well insulated (k=0.04 W/(m*K)) +and the heater is not disabled when it becomes too warm. +
++ +
+"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse4.mos" + "Simulate and plot")); +end SimpleHouse4; diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo new file mode 100644 index 0000000000..108e59050b --- /dev/null +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse5.mo @@ -0,0 +1,86 @@ +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse5 "Heating controller model" + extends SimpleHouse4(final use_constantHeater=false); + + Modelica.Blocks.Math.BooleanToReal booRea1(realTrue=mWat_flow_nominal) + "Boolean to integer" + annotation (Placement(transformation(extent={{0,-160},{20,-140}}))); + Modelica.Blocks.Math.BooleanToReal booRea "Boolean to real" + annotation (Placement(transformation(extent={{0,-120},{20,-100}}))); + Modelica.Blocks.Logical.Hysteresis hysRad(uLow=273.15 + 21, uHigh=273.15 + 23) + "Hysteresis controller for radiator" + annotation (Placement(transformation(extent={{-80,-120},{-60,-100}}))); + Modelica.Blocks.Logical.Not not1 + "Negation for enabling heating when temperature is low" + annotation (Placement(transformation(extent={{-40,-120},{-20,-100}}))); + Modelica.Thermal.HeatTransfer.Sensors.TemperatureSensor senTemZonAir + "Zone air temperature sensor" + annotation (Placement(transformation(extent={{90,160},{70,180}}))); +equation + connect(booRea1.u, not1.y) annotation (Line(points={{-2,-150},{-11.5,-150},{-11.5, + -110},{-19,-110}}, color={255,0,255})); + connect(not1.u,hysRad. y) annotation (Line(points={{-42,-110},{-59,-110}}, + color={255,0,255})); + connect(senTemZonAir.T,hysRad. u) annotation (Line(points={{69,170},{-210,170}, + {-210,-110},{-82,-110}}, color={0,0,127})); + connect(senTemZonAir.port, zon.heatPort) + annotation (Line(points={{90,170},{160,170},{160,40}}, color={191,0,0})); + connect(not1.y, booRea.u) + annotation (Line(points={{-19,-110},{-2,-110}}, color={255,0,255})); + connect(booRea.y, heaWat.u) annotation (Line(points={{21,-110},{40,-110},{40,-124}, + {58,-124}}, color={0,0,127})); + connect(booRea1.y, pum.m_flow_in) annotation (Line(points={{21,-150},{100,-150}, + {100,-168}}, color={0,0,127})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-220, + -220},{220,220}})), + experiment(Tolerance=1e-6, StopTime=1e+06), + Documentation(revisions=" ++Since the zone becomes too warm, a controller is required that disables the heater when a setpoint is reached. +We will implement a hysteresis controller with a setpoint of 295.15 +/- 1K (21-23°C). +A temperature sensor will measure the zone air temperature. +
++The heater modulation level should be set to 1 when the heater is on and to 0 otherwise. +Furthermore, the pump should only circulate water when the heater is on. +
++The figure below shows the air temperature after the controller is added. +
++ +
+"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse5.mos" + "Simulate and plot")); +end SimpleHouse5; diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo new file mode 100644 index 0000000000..aee5eb15c2 --- /dev/null +++ b/IBPSA/Examples/Tutorial/SimpleHouse/SimpleHouse6.mo @@ -0,0 +1,161 @@ +within IBPSA.Examples.Tutorial.SimpleHouse; +model SimpleHouse6 "Free cooling model" + extends SimpleHouse5( + zon(nPorts=2), + mAir_flow_nominal=0.1, + AWin=6); + + parameter Modelica.Units.SI.PressureDifference dpAir_nominal=200 + "Pressure drop at nominal mass flow rate for air loop"; + + IBPSA.Fluid.Actuators.Dampers.Exponential vavDam( + redeclare package Medium = MediumAir, + from_dp=true, + m_flow_nominal=mAir_flow_nominal, + dpDamper_nominal=dpAir_nominal) + "Damper" annotation (Placement(transformation(extent={{-10,10},{10, + -10}}, origin={110,130}))); + Fluid.Movers.Preconfigured.FlowControlled_dp fan( + redeclare package Medium = MediumAir, + show_T=true, + dp_nominal=dpAir_nominal, + use_inputFilter=false, + energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, + m_flow_nominal=mAir_flow_nominal) + "Constant head fan" annotation (Placement(transformation( + extent={{-10,10},{10,-10}}, + origin={0,130}))); + + IBPSA.Fluid.HeatExchangers.ConstantEffectiveness hexRec( + redeclare package Medium1 = MediumAir, + redeclare package Medium2 = MediumAir, + dp1_nominal=10, + dp2_nominal=10, + m1_flow_nominal=mAir_flow_nominal, + m2_flow_nominal=mAir_flow_nominal, + eps=0.85) "Heat exchanger for heat recuperation" + annotation (Placement(transformation(extent={{-55,124},{-85,156}}))); + IBPSA.Fluid.Sources.Boundary_pT bouAir( + redeclare package Medium = MediumAir, + use_T_in=true, + nPorts=2) "Air boundary with constant temperature" + annotation (Placement(transformation( + extent={{-10,-10},{10,10}}, + origin={-110,140}))); + Modelica.Blocks.Logical.Hysteresis hysAir(uLow=273.15 + 23, uHigh=273.15 + 25) + "Hysteresis controller for damper" + annotation (Placement(transformation(extent={{-10,-10},{10,10}}, + rotation=270, + origin={50,110}))); + Modelica.Blocks.Math.BooleanToReal booRea2 "Boolean to real" + annotation (Placement(transformation(extent={{80,80},{100,100}}))); + Modelica.Blocks.Math.BooleanToReal booRea3(realTrue=dpAir_nominal) + "Boolean to real" + annotation (Placement(transformation(extent={{30,80},{10,100}}))); +equation + connect(hexRec.port_a1, zon.ports[1]) annotation (Line(points={{-55,149.6},{169, + 149.6},{169,50},{170,50}}, color={0,127,255})); + connect(bouAir.T_in, weaBus.TDryBul) annotation (Line(points={{-122,144},{-130, + 144},{-130,0}}, color={0,0,127})); + connect(vavDam.port_b, zon.ports[2]) annotation (Line(points={{120,130},{142,130}, + {142,50},{170,50}}, + color={0,127,255})); + connect(booRea2.y, vavDam.y) + annotation (Line(points={{101,90},{110,90},{110,118}}, color={0,0,127})); + connect(hysAir.y, booRea2.u) + annotation (Line(points={{50,99},{50,90},{78,90}}, color={255,0,255})); + connect(vavDam.port_a, fan.port_b) + annotation (Line(points={{100,130},{10,130}}, color={0,127,255})); + connect(bouAir.ports[1], hexRec.port_a2) annotation (Line(points={{-100,139},{ + -100,130.4},{-85,130.4}}, color={0,127,255})); + connect(fan.port_a, hexRec.port_b2) annotation (Line(points={{-10,130},{-32,130}, + {-32,130.4},{-55,130.4}}, color={0,127,255})); + connect(hexRec.port_b1, bouAir.ports[2]) annotation (Line(points={{-85,149.6}, + {-100,149.6},{-100,141}}, color={0,127,255})); + connect(booRea1.y, pum.m_flow_in) annotation (Line(points={{21,-150},{100, + -150},{100,-168}}, color={0,0,127})); + connect(hysAir.u, hysRad.u) annotation (Line(points={{50,122},{50,170},{-210, + 170},{-210,-110},{-82,-110}}, color={0,0,127})); + connect(booRea3.y, fan.dp_in) + annotation (Line(points={{9,90},{0,90},{0,118}}, color={0,0,127})); + connect(booRea3.u, hysAir.y) + annotation (Line(points={{32,90},{50,90},{50,99}}, color={255,0,255})); + annotation (Diagram(coordinateSystem(preserveAspectRatio=false, extent={{-220, + -220},{220,220}})), + experiment(Tolerance=1e-6, StopTime=1e+06), + Documentation(revisions=" ++For this last exercise, we first increase the window size +from 2 m2 to 6 m2. +
++We will add a ventilation model that allows to perform free cooling +using outside air when solar irradiation heats up the room too much. +The system consists of a fan, a damper, a controller with an air temperature setpoint +between 23°C and 25°C, +and a heat recovery unit with a constant effectiveness of 85%. +The damper and fan have a nominal pressure drop/raise of 200 Pa. +The heat recovery unit has a nominal pressure drop of 10 Pa at both sides. +The nominal mass flow rate of the ventilation system is 0.1 kg/s. +
+
+Connect the components such that they exchange mass (and therefore also energy)
+with the MixingVolume
representing the zone air.
+Add a boundary_pT
to draw air from the environment.
+Enable its temperature input and connect it to the TDryBul
variable in the weather data reader.
+Also reconsider the nominal mass flow rate parameter value in the MixingVolume
+given the flow rate information of the ventilation system.
+Finally, make sure that the fan is only active when the damper is open.
+
+The figures below show the results. +
++ +
++ +
+"), + __Dymola_Commands(file= + "modelica://IBPSA/Resources/Scripts/Dymola/Examples/Tutorial/SimpleHouse/SimpleHouse6.mos" + "Simulate and plot")); +end SimpleHouse6; diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/package.mo b/IBPSA/Examples/Tutorial/SimpleHouse/package.mo new file mode 100644 index 0000000000..fbc13637ba --- /dev/null +++ b/IBPSA/Examples/Tutorial/SimpleHouse/package.mo @@ -0,0 +1,88 @@ +within IBPSA.Examples.Tutorial; +package SimpleHouse "Package with example for how to build a simple building envelope with a radiator heating system and ventilation system" +extends Modelica.Icons.ExamplesPackage; + + annotation (Documentation(info=" +
+This package contains examples with step-by-step instructions for how to build a system model
+for a simple house with a heating system, ventilation, and weather boundary conditions.
+It serves as a demonstration case of how the IBPSA
library can be used.
+
+The goal of this exercise is to become familiar with Modelica and the IBPSA library. +Since the IBPSA library components are typically used by combining several components graphically, +the use of equations falls outside of the scope of this exercise. +
++For this exercise you will create a model of a simple house, +consisting of a heating system, one building zone, and a ventilation model. +The exercise starts from a template file that should not produce any errors. +This file will be extended in several steps, adding complexity. +In between each step the user should be able to simulate the model, +i.e., no errors should be produced and simulation results may be compared. +
++The model has been created in the following stages: +
+PrescribedTemperature
component
+and serves as a starting model to implement the entire SimpleHouse
model.
++For each stage, firstly the model part is qualitatively explained. +Next, the names of the required Modelica models (from the Modelica Standard Library and/or IBPSA library) are listed. +Finally, we provide high-level instructions of how to set up the model. +If these instructions are not clear immediately, have a look at the model documentation and at the type of connectors the model has, +try out some things, make an educated guess, etc. +Finally, we provide reference results that allow you to check if your implementation is correct. +Depending on the parameter values that you choose, results may differ. +
++The graphical representation of the final model is given below. +
++ +
+")); +end SimpleHouse; diff --git a/IBPSA/Examples/Tutorial/SimpleHouse/package.order b/IBPSA/Examples/Tutorial/SimpleHouse/package.order new file mode 100644 index 0000000000..e975e02c46 --- /dev/null +++ b/IBPSA/Examples/Tutorial/SimpleHouse/package.order @@ -0,0 +1,7 @@ +SimpleHouse0 +SimpleHouse1 +SimpleHouse2 +SimpleHouse3 +SimpleHouse4 +SimpleHouse5 +SimpleHouse6 diff --git a/IBPSA/Examples/Tutorial/package.mo b/IBPSA/Examples/Tutorial/package.mo new file mode 100644 index 0000000000..c949a59d8e --- /dev/null +++ b/IBPSA/Examples/Tutorial/package.mo @@ -0,0 +1,13 @@ +within IBPSA.Examples; +package Tutorial "Tutorial with step by step instructions for how to build system models" + extends Modelica.Icons.Information; + +annotation (preferredView="info", Documentation(info=" ++This package contains examples of system models with step by step +instructions for how to build such models. +The examples are meant to instruct new users on how to build +large system models. +
+")); +end Tutorial; diff --git a/IBPSA/Examples/Tutorial/package.order b/IBPSA/Examples/Tutorial/package.order new file mode 100644 index 0000000000..6e0ff92568 --- /dev/null +++ b/IBPSA/Examples/Tutorial/package.order @@ -0,0 +1 @@ +SimpleHouse diff --git a/IBPSA/Examples/package.mo b/IBPSA/Examples/package.mo new file mode 100644 index 0000000000..e6c1857adb --- /dev/null +++ b/IBPSA/Examples/package.mo @@ -0,0 +1,11 @@ +within IBPSA; +package Examples "Collection of models that illustrate model use and test models" + extends Modelica.Icons.ExamplesPackage; +annotation (preferredView="info", Documentation(info=" ++This package contains examples for the use of models that can be found in + +IBPSA. +
+")); +end Examples; diff --git a/IBPSA/Examples/package.order b/IBPSA/Examples/package.order new file mode 100644 index 0000000000..cb1be3b6b6 --- /dev/null +++ b/IBPSA/Examples/package.order @@ -0,0 +1 @@ +Tutorial diff --git a/IBPSA/Fluid/Examples/SimpleHouse.mo b/IBPSA/Fluid/Examples/SimpleHouse.mo index 13c57eb561..b4d8fd3ce0 100644 --- a/IBPSA/Fluid/Examples/SimpleHouse.mo +++ b/IBPSA/Fluid/Examples/SimpleHouse.mo @@ -340,7 +340,7 @@ First implementation.
This model contains a simple model of a house
with a heating system, ventilation and weather boundary conditions.
-It servers as a demonstration case of how the IBPSA
library can be used.
+It serves as a demonstration case of how the IBPSA
library can be used.