Buildings.Experimental.DHC.Plants.Steam

Package with models for steam plants

Information

This package contains models for plants producing steam.

Extends from Modelica.Icons.VariantsPackage (Icon for package containing variants).

Package Content

Name Description
Buildings.Experimental.DHC.Plants.Steam.SingleBoiler SingleBoiler A generic steam plant with a single boiler that discharges saturated steam
Buildings.Experimental.DHC.Plants.Steam.Examples Examples Example models for steam plants
Buildings.Experimental.DHC.Plants.Steam.BaseClasses BaseClasses Package with base classes for Buildings.Experimental.DHC.Plants.Steam

Buildings.Experimental.DHC.Plants.Steam.SingleBoiler Buildings.Experimental.DHC.Plants.Steam.SingleBoiler

A generic steam plant with a single boiler that discharges saturated steam

Buildings.Experimental.DHC.Plants.Steam.SingleBoiler

Information

This is a generic steam plant model that can be used in district heating system simulations. The model contains a feedwater tank, feedwater pump, check valve, and a boiler. The boiler is designed to discharge saturated steam vapor. For controls, the feedwater pump maintains the water volume setpoint in the drum boiler, while the boiler control maintains the discharge pressure setpoint.

References

Kathryn Hinkelman, Saranya Anbarasu, Michael Wetter, Antoine Gautier, Wangda Zuo. 2022. “A Fast and Accurate Modeling Approach for Water and Steam Thermodynamics with Practical Applications in District Heating System Simulation,” Energy, 254(A), pp. 124227. 10.1016/j.energy.2022.124227

Kathryn Hinkelman, Saranya Anbarasu, Michael Wetter, Antoine Gautier, Baptiste Ravache, Wangda Zuo 2022. “Towards Open-Source Modelica Models For Steam-Based District Heating Systems.” Proc. of the 1st International Workshop On Open Source Modelling And Simulation Of Energy Systems (OSMSES 2022), Aachen, German, April 4-5, 2022. 10.1109/OSMSES54027.2022.9769121

Extends from Buildings.Experimental.DHC.Plants.BaseClasses.PartialPlant (Partial class for modeling a plant).

Parameters

TypeNameDefaultDescription
replaceable package MediumWaterService side medium
replaceable package MediumHea_bWaterService side medium at heating supply
Genericfue[nFue]{fueBoi}Fuel type
GenericfueBoiBuildings.Fluid.Data.Fuels.N...Boiler fuel type
MassFlowRatem_flow_nominal1Nominal mass flow rate [kg/s]
PowerQ_flow_nominalm_flow_nominal*(MediumHea_b....Nominal heating power [W]
AbsolutePressurepSteSet300000Steam pressure setpoint [Pa]
AbsolutePressurepTanFW101325Pressure of feedwater tank [Pa]
VolumeVBoiWatSetVBoi/2Setpoint for liquid water volume in the boiler [m3]
VolumeVBoi3Total drum volume of steam boiler [m3]
RealboiSca1.25Boiler heat capacity scaling factor
Genericperper(pressure(V_flow=(m_flow_...Performance data for the feedwater pump
Configuration
DistrictSystemTypetypBuildings.Experimental.DHC.T...Type of district system
Booleanhave_fanfalseSet to true if fan power is computed
Booleanhave_pumtrueSet to true if pump power is computed
Booleanhave_eleHeafalseSet to true if the plant has electric heating system
IntegernFue1Number of fuel types (0 means no combustion system)
Booleanhave_eleCoofalseSet to true if the plant has electric cooling system
Booleanhave_weaBusfalseSet to true to use a weather bus
Assumptions
BooleanallowFlowReversalfalseSet to true to allow flow reversal in service lines
Dynamics
MassmDry1.5E-3*Q_flow_nominalMass of boiler that will be lumped to water heat capacity [kg]
Equations
DynamicsenergyDynamicsModelica.Fluid.Types.Dynamic...Type of energy balance: dynamic (3 initialization options) or steady state
DynamicsmassDynamicsenergyDynamicsType of mass balance: dynamic (3 initialization options) or steady state
Initialization
VolumeVTanFW_start1Setpoint for liquid water volume in the boiler [m3]
AbsolutePressurepBoi_startpTanFWStart value of boiler pressure [Pa]
RealyPum_start0.7Initial value of pump speed
Control
Boiler
SimpleControllercontrollerTypeBoiModelica.Blocks.Types.Simple...Type of controller
RealkBoi10Gain of controller
TimeTiBoi120Time constant of Integrator block [s]
TimeTdBoi10Time constant of Derivative block [s]
RealwpBoi1Set-point weight for Proportional block (0..1)
RealwdBoi0Set-point weight for Derivative block (0..1)
RealNiBoi0.9Ni*Ti is time constant of anti-windup compensation
RealNdBoi10The higher Nd, the more ideal the derivative block
Pump
SimpleControllercontrollerTypePumModelica.Blocks.Types.Simple...Type of controller
RealkPum5Gain of controller
TimeTiPum120Time constant of Integrator block [s]
TimeTdPum0.1Time constant of Derivative block [s]
RealwpPum1Set-point weight for Proportional block (0..1)
RealwdPum0Set-point weight for Derivative block (0..1)
RealNiPum0.9Ni*Ti is time constant of anti-windup compensation
RealNdPum10The higher Nd, the more ideal the derivative block

Connectors

TypeNameDescription
replaceable package MediumHea_bService side medium at heating supply
FluidPort_aport_aSerAmbFluid connector for ambient water service supply line
FluidPort_bport_bSerAmbFluid connector for ambient water service return line
FluidPort_aport_aSerHeaFluid connector for heating service supply line
FluidPort_bport_bSerHeaFluid connector for heating service return line
FluidPort_aport_aSerCooFluid connector for cooling service supply line
FluidPort_bport_bSerCooFluid connector for cooling service return line
BusweaBusWeather data bus
output RealOutputPHeaPower drawn by heating system [W]
output RealOutputPCooPower drawn by cooling system [W]
output RealOutputPFanPower drawn by fan motors [W]
output RealOutputPPumPower drawn by pump motors [W]
output RealOutputQFue_flowFuel energy input rate [W]

Modelica definition

model SingleBoiler "A generic steam plant with a single boiler that discharges saturated steam" extends Buildings.Experimental.DHC.Plants.BaseClasses.PartialPlant( final typ=Buildings.Experimental.DHC.Types.DistrictSystemType.HeatingGeneration1, redeclare replaceable package MediumHea_b=Buildings.Media.Steam, final have_fan=false, final have_pum=true, final nFue=1, final fue={fueBoi}, final have_eleHea=false, final have_eleCoo=false, final have_weaBus=false); parameter Buildings.Fluid.Data.Fuels.Generic fueBoi= Buildings.Fluid.Data.Fuels.NaturalGasLowerHeatingValue() "Boiler fuel type"; // Nominal values parameter Modelica.Units.SI.MassFlowRate m_flow_nominal=1 "Nominal mass flow rate"; parameter Modelica.Units.SI.Power Q_flow_nominal=m_flow_nominal*( MediumHea_b.specificEnthalpy(MediumHea_b.setState_pTX( p=pSteSet, T=TSat, X=MediumHea_b.X_default)) - Medium.specificEnthalpy(Medium.setState_pTX( p=pSteSet, T=TSat, X=Medium.X_default))) "Nominal heating power"; // Setpoints parameter Modelica.Units.SI.AbsolutePressure pSteSet=300000 "Steam pressure setpoint"; final parameter Modelica.Units.SI.Temperature TSat= MediumHea_b.saturationTemperature(pSteSet) "Saturation temperature at pressure setpoint"; parameter Modelica.Units.SI.AbsolutePressure pTanFW=101325 "Pressure of feedwater tank"; parameter Modelica.Units.SI.Volume VBoiWatSet=VBoi/2 "Setpoint for liquid water volume in the boiler"; // System sizing parameter Modelica.Units.SI.Volume VBoi=3 "Total drum volume of steam boiler"; parameter Real boiSca = 1.25 "Boiler heat capacity scaling factor"; parameter Modelica.Units.SI.Mass mDry = 1.5E-3*Q_flow_nominal "Mass of boiler that will be lumped to water heat capacity"; parameter Buildings.Fluid.Movers.Data.Generic per( pressure( V_flow=(m_flow_nominal/1000)*{0.4,0.6,0.8,1.0}, dp=(pSteSet-pTanFW)*{1.34,1.27,1.17,1.0})) "Performance data for the feedwater pump"; // Initial conditions parameter Modelica.Units.SI.Volume VTanFW_start=1 "Setpoint for liquid water volume in the boiler"; parameter Modelica.Media.Interfaces.Types.AbsolutePressure pBoi_start=pTanFW "Start value of boiler pressure"; parameter Real yPum_start=0.7 "Initial value of pump speed"; // Dynamics parameter Modelica.Fluid.Types.Dynamics energyDynamics= Modelica.Fluid.Types.Dynamics.DynamicFreeInitial "Type of energy balance: dynamic (3 initialization options) or steady state"; parameter Modelica.Fluid.Types.Dynamics massDynamics=energyDynamics "Type of mass balance: dynamic (3 initialization options) or steady state"; // Boiler controller parameter Modelica.Blocks.Types.SimpleController controllerTypeBoi= Modelica.Blocks.Types.SimpleController.PI "Type of controller"; parameter Real kBoi(min=0) = 10 "Gain of controller"; parameter Modelica.Units.SI.Time TiBoi(min=Modelica.Constants.small)=120 "Time constant of Integrator block"; parameter Modelica.Units.SI.Time TdBoi(min=0)=10 "Time constant of Derivative block"; parameter Real wpBoi(min=0) = 1 "Set-point weight for Proportional block (0..1)"; parameter Real wdBoi(min=0) = 0 "Set-point weight for Derivative block (0..1)"; parameter Real NiBoi(min=100*Modelica.Constants.eps) = 0.9 "Ni*Ti is time constant of anti-windup compensation"; parameter Real NdBoi(min=100*Modelica.Constants.eps) = 10 "The higher Nd, the more ideal the derivative block"; // Feedwater pump controller parameter Modelica.Blocks.Types.SimpleController controllerTypePum= Modelica.Blocks.Types.SimpleController.PI "Type of controller"; parameter Real kPum(min=0) = 5 "Gain of controller"; parameter Modelica.Units.SI.Time TiPum(min=Modelica.Constants.small)=120 "Time constant of Integrator block"; parameter Modelica.Units.SI.Time TdPum(min=0)=0.1 "Time constant of Derivative block"; parameter Real wpPum(min=0) = 1 "Set-point weight for Proportional block (0..1)"; parameter Real wdPum(min=0) = 0 "Set-point weight for Derivative block (0..1)"; parameter Real NiPum(min=100*Modelica.Constants.eps) = 0.9 "Ni*Ti is time constant of anti-windup compensation"; parameter Real NdPum(min=100*Modelica.Constants.eps) = 10 "The higher Nd, the more ideal the derivative block"; // Pump can have reverse flow at start up Buildings.Fluid.Movers.SpeedControlled_y pumFW( redeclare final package Medium = Medium, final energyDynamics=energyDynamics, p_start=pTanFW, final allowFlowReversal=allowFlowReversal, final per=per, final y_start=yPum_start) "Feedwater pump"; // At start up, water leaves port_a, see Buildings.Experimental.DHC.Examples.Steam.SingleBoiler Buildings.Experimental.DHC.Plants.Steam.BaseClasses.BoilerPolynomial boi( redeclare final package MediumSte = MediumHea_b, redeclare final package MediumWat = Medium, final energyDynamics=energyDynamics, final massDynamics=massDynamics, final allowFlowReversal=allowFlowReversal, final p_start=pTanFW, fixed_p_start=true, final fue=fueBoi, final m_flow_nominal=m_flow_nominal, final dp_nominal=3000, final Q_flow_nominal=Q_flow_nominal*boiSca, final V=VBoi, final mDry=mDry) "Steam boiler"; Buildings.Controls.Continuous.LimPID conPum( final controllerType=controllerTypePum, final k=kPum, final Ti=TiPum, final Td=TdPum, final wp=wpPum, final wd=wdPum, final Ni=NiPum, final Nd=NdPum, initType=Modelica.Blocks.Types.Init.InitialOutput, y_start=yPum_start) "Pump control"; Modelica.Blocks.Math.Gain VNor(final k=1/VBoiWatSet) "Normalized volume setpoint"; Buildings.Controls.Continuous.LimPID conBoi( final controllerType=controllerTypeBoi, final k=kBoi, final Ti=TiBoi, final Td=TdBoi, final wp=wpBoi, final wd=wdBoi, final Ni=NiBoi, final Nd=NdBoi) "Boiler control"; Modelica.Blocks.Math.Gain PNor(final k=1/pSteSet) "Normalized pressure setpoint"; Buildings.Fluid.Sensors.Pressure senPreSte( redeclare final package Medium = MediumHea_b) "Steam pressure sensor"; Modelica.Blocks.Sources.Constant uni(final k=1) "Unitary"; Buildings.Fluid.Storage.ExpansionVessel tanFW( redeclare final package Medium = Medium, final V_start=VTanFW_start, final p_start=pTanFW) "Feedwater tank"; Buildings.Fluid.FixedResistances.CheckValve cheVal( redeclare final package Medium = Medium, final allowFlowReversal=allowFlowReversal, final m_flow_nominal=m_flow_nominal, dpValve_nominal=6000, rhoStd=Medium.density_pTX( pSteSet, MediumHea_b.saturationTemperature(pSteSet), Medium.X_default)) "Check valve"; equation connect(port_aSerHea, pumFW.port_a); connect(boi.port_b, port_bSerHea); connect(conPum.y, pumFW.y); connect(uni.y, conPum.u_s); connect(VNor.y, conPum.u_m); connect(boi.VLiq, VNor.u); connect(senPreSte.port, boi.port_b); connect(senPreSte.p, PNor.u); connect(PNor.y, conBoi.u_m); connect(conBoi.y, boi.y); connect(uni.y, conBoi.u_s); connect(QFue_flow, boi.QFueFlo); connect(PPum, pumFW.P); connect(tanFW.port_a, pumFW.port_a); connect(pumFW.port_b, cheVal.port_a); connect(cheVal.port_b, boi.port_a); end SingleBoiler;