This part of the system model adds the boiler loop with open loop control to the model that is implemented in Buildings.Examples.Tutorial.Boiler.System2.


This model was built as follows:

  1. First, we copied the model Buildings.Examples.Tutorial.Boiler.System2 and called it Buildings.Examples.Tutorial.Boiler.System3.

  2. Next, we deleted the sink and source models sin and sou, as these will be replaced by the boiler loop.

  3. We made various instances of Buildings.Fluid.FixedResistances.Junction to model flow splitter and mixers. We also made an instance of Buildings.Fluid.Actuators.Valves.ThreeWayEqualPercentageLinear to model the three-way valves, and an instance of Buildings.Fluid.Boilers.BoilerPolynomial to model the boiler.

    Note that we also made an instance of Buildings.Fluid.Sources.Boundary_pT, which we called preSou. This is required to set a pressure reference in the water loop, which is a closed system. For medium models that expand with increasing temperature, this is also required to accumulate, and to feed back into the system, the difference in mass due to the thermal expansion of water.

  4. Next, we parameterized the medium of all these components by setting it to MediumW.

    Since the nominal mass flow rate for the boiler loop is required by several models, we introduced the following system-level parameters, where TBoiRet_min will be used to avoid condensation in the boiler:

      parameter Modelica.Units.SI.Temperature TBoiSup_nominal = 273.15+80
        "Boiler nominal supply water temperature";
      parameter Modelica.Units.SI.Temperature TBoiRet_min = 273.15+60
        "Boiler minimum return water temperature";
      parameter Modelica.Units.SI.MassFlowRate mBoi_flow_nominal=
        "Boiler nominal mass flow rate";

Next, we set the parameters of the individual component models.

  1. We lumped the pressure drop of the boiler loop into the boiler model and hence set

      Buildings.Fluid.Boilers.BoilerPolynomial boi(
        redeclare package Medium = MediumW,
        fue=Buildings.Fluid.Data.Fuels.HeatingOilLowerHeatingValue()) "Boiler";
  2. For the three-way valve in the radiator loop, we used the default pressure drop of 6000 Pa. For its mass flow rate, we introduced the parameter

      parameter Modelica.Units.SI.MassFlowRate mRadVal_flow_nominal=
        "Radiator nominal mass flow rate";

    This allowed us to configure the valve as

      Buildings.Fluid.Actuators.Valves.ThreeWayEqualPercentageLinear valRad(
        redeclare package Medium = MediumW,
        dpValve_nominal=6000) "Three-way valve for radiator loop"

    where l={0.01,0.01} is a valve leakage of 1% and dpValve_nominal=6000 is the pressure drop of the valve if it is fully open and if the mass flow rate is equal to m_flow_nominal. It is recommended to set the valve leakage to a non-zero value to avoid numerical problems. A non-zero value also represent a more realistic situation, as most valves have some leakage.

  3. For the bypass between the valve and the radiator, we note that the mass flow rate is equal to mRad_flow_nominal - mRadVal_flow_nominal. This is a fixed bypass that is used to allow the valve to work across its full range. We decided to lump the pressure drop of this bypass, and the pressure drop of the radiator loop, into the instance mix. Hence, its parameters are

      Buildings.Fluid.FixedResistances.Junction mix(
        redeclare package Medium =MediumW,
        dp_nominal={100,-8000,6750}) "Mixer between valve and radiators";

    Note the negative values, which are used for the ports where the medium is outflowing at nominal conditions. See also the documentation of the model Buildings.Fluid.FixedResistances.Junction.

    We also set the pressure drop of port 3 of mix to the same value as the pressure drop of the valve in order to balance the flows. In practice, this can be done by using a balance valve, whose pressure drop we lumped into the component mix.

  4. Next, we set the pressure drops and flow rates of all flow splitters and mixers. For the flow splitters and mixers that are connected to another flow splitter or mixer which already computes the pressure drop of the connecting flow leg, we set the nominal pressure drop to zero. This will remove the equation for the pressure drop calculation. However, we chose to still use the mixer and splitters to make sure that we properly defined the mixing points in the system.

  5. Next, we connected all fluid ports, and we set open-loop control signals for the valves, pumps and boilers. This is implemented using the block Buildings.Controls.OBC.CDL.Reals.Sources.Constant. Using open-loop signals allows testing the model prior to adding the complexity of closed loop control. To avoid that the boiler overheats, we set its control input to 0.5. Otherwise, the boiler temperature would raise quickly when the radiator pump is off, and the simulation would stop with an error message that says that its medium temperature is outside the allowed range.

This completes the initial version of the model. When simulating the model for 2 days, or 172800 seconds, the response shown below should be seen.


The figure shows that the room temperature is around 5°C when the internal heat gain is zero, i.e., it is at the average of the outside temperature and the room design temperature. Since the boiler control signal is 0.5, this indicates that the model is correct.


MediumWMedium model


Generated at 2024-07-21T18:15:58Z by OpenModelicaOpenModelica 1.23.1 using GenerateDoc.mos