Buildings.Experimental.DHC.Loads.BaseClasses

Package with base classes

Information

This package contains base classes that are used to construct the classes in Buildings.Experimental.DHC.Loads.

Extends from Modelica.Icons.BasesPackage (Icon for packages containing base classes).

Package Content

Name Description
Buildings.Experimental.DHC.Loads.BaseClasses.ConstraintViolation ConstraintViolation Block that outputs the fraction of time when a constraint is violated
Buildings.Experimental.DHC.Loads.BaseClasses.FlowDistribution FlowDistribution Model of a building hydraulic distribution system
Buildings.Experimental.DHC.Loads.BaseClasses.PartialBuilding PartialBuilding Partial class for building model
Buildings.Experimental.DHC.Loads.BaseClasses.PartialBuildingWithPartialETS PartialBuildingWithPartialETS Partial model of a building with an energy transfer station
Buildings.Experimental.DHC.Loads.BaseClasses.PartialTerminalUnit PartialTerminalUnit Partial model for HVAC terminal unit
Buildings.Experimental.DHC.Loads.BaseClasses.SimpleRoomODE SimpleRoomODE Simplified model for assessing room air temperature variations around a set point
Buildings.Experimental.DHC.Loads.BaseClasses.getPeakLoad getPeakLoad Function that reads the peak load from the load profile
Buildings.Experimental.DHC.Loads.BaseClasses.Controls Controls Package of control sequences for DHC systems
Buildings.Experimental.DHC.Loads.BaseClasses.Types Types Package with type definitions
Buildings.Experimental.DHC.Loads.BaseClasses.Examples Examples Example models integrating multiple components
Buildings.Experimental.DHC.Loads.BaseClasses.Validation Validation Collection of validation models

Buildings.Experimental.DHC.Loads.BaseClasses.ConstraintViolation Buildings.Experimental.DHC.Loads.BaseClasses.ConstraintViolation

Block that outputs the fraction of time when a constraint is violated

Buildings.Experimental.DHC.Loads.BaseClasses.ConstraintViolation

Information

Block that outputs the running fractional time during which any element ui of the input signal is not within umin ≤ ui ≤ umax.

Parameters

TypeNameDefaultDescription
RealuMin Minimum value for input
RealuMax Maximum value for input

Connectors

TypeNameDescription
input RealInputu[nu]Variables of interest
output RealOutputyFraction of time when the constraint is violated [1]

Modelica definition

block ConstraintViolation "Block that outputs the fraction of time when a constraint is violated" parameter Real uMin "Minimum value for input"; parameter Real uMax "Maximum value for input"; parameter Integer nu(min=0) = 0 "Number of input connections"; Buildings.Controls.OBC.CDL.Interfaces.RealInput u[nu] "Variables of interest"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput y( final unit="1", start=0, fixed=true) "Fraction of time when the constraint is violated"; Modelica.Units.SI.Time t(final start=0, final fixed=true) "Integral of violated time"; protected parameter Modelica.Units.SI.Time t0(fixed=false) "First sample time instant"; Boolean vioMin "Flag, true if minimum is violated"; Boolean vioMax "Flag, true if maximum is violated"; initial equation t0 = time - 1E-6; equation vioMin = Modelica.Math.BooleanVectors.anyTrue({u[i] < uMin for i in 1:nu}); vioMax = Modelica.Math.BooleanVectors.anyTrue({u[i] > uMax for i in 1:nu}); if vioMin or vioMax then der(t) = 1; else der(t) = 0; end if; y = t / (time - t0); end ConstraintViolation;

Buildings.Experimental.DHC.Loads.BaseClasses.FlowDistribution Buildings.Experimental.DHC.Loads.BaseClasses.FlowDistribution

Model of a building hydraulic distribution system

Buildings.Experimental.DHC.Loads.BaseClasses.FlowDistribution

Information

This model represents a two-pipe hydraulic distribution system serving multiple terminal units. It is primarily intended to be used in conjunction with models that extend Buildings.Experimental.DHC.Loads.BaseClasses.PartialTerminalUnit. The typical model structure for a whole building connected to an energy transfer station (or a dedicated plant) is illustrated in the schematics in the info section of Buildings.Experimental.DHC.Loads.BaseClasses.PartialBuilding.

The pipe network modeling is decoupled between a main distribution loop and several terminal branch circuits:

Optionally:

Implementation

The modeling approach aims to minimize the number of algebraic equations by avoiding an explicit modeling of the terminal actuators and the whole flow network. In addition, the assumption allowFlowReversal=false is used systematically together with boundary conditions which actually ensure that no reverse flow conditions are encountered in simulation. This allows directly accessing the inlet enthalpy value of a component from the fluid port port_a with the built-in function inStream. This approach is preferred to the use of two-port sensors which introduce a state to ensure a smooth transition at flow reversal. All connected components must meet the same requirements. The impact on the computational performance is illustrated below.

Pump head computation

The pump head is computed as follows (see also Buildings.Experimental.DHC.Loads.BaseClasses.Validation.FlowDistributionPumpControl for a comparison with an explicit modeling of the piping network).

image

Energy and mass dynamics

The energy dynamics and the time constant used in the ideal heater and cooler model are exposed as advanced parameters. They are used to represent the typical dynamics over the whole piping network, from supply to return. The mass dynamics are by default identical to the energy dynamics.

Simplifying assumptions are used otherwise, namely

Computational performance

The figure below compares the computational performance of this model (labelled simple, see model Buildings.Experimental.DHC.Loads.BaseClasses.Validation.BenchmarkFlowDistribution1) with an explicit modeling of the distribution network and the terminal unit actuators (labelled detailed, see model Buildings.Experimental.DHC.Loads.BaseClasses.Validation.BenchmarkFlowDistribution2). The models are simulated with the solver CVODE from Sundials. The impact of a varying number of connected loads, nLoa, is assessed on

  1. the total time for all model evaluations,
  2. the total time spent between model evaluations, and
  3. the number of continuous state variables.

A linear, resp. quadratic, regression line and the corresponding confidence interval are also plotted for the model labelled simple, resp. detailed.

image

Extends from Buildings.Fluid.Interfaces.PartialTwoPortInterface (Partial model transporting fluid between two ports without storing mass or energy).

Parameters

TypeNameDefaultDescription
replaceable package MediumPartialMediumMedium in the component
Genericperper(pressure(V_flow=m_flow_n...Record with performance data
Booleanhave_pumfalseSet to true if the system has a pump
Booleanhave_valfalseSet to true if the system has a mixing valve
DistributionTypetypDisType_dis.HeatingWaterType of distribution system
PumpControlTypetypCtrType_ctr.ConstantHeadType of distribution pump control
PressureDifferencedpMindp_nominal/2Pressure difference set point for ConstantDp or at zero flow for LinearHead [Pa]
Nominal condition
MassFlowRatem_flow_nominal Nominal mass flow rate [kg/s]
RealspePum_nominal1Pump speed at nominal conditions [1]
PressureDifferencedp_nominal Pressure drop at nominal conditions [Pa]
PressureDifferencedpDis_nominal[:]if nUni == 1 then {1/2*(dp_n...Pressure drop between each connected unit at nominal conditions (supply line): use zero for each connection downstream the differential pressure sensor [Pa]
MassFlowRatemUni_flow_nominal[:]fill(m_flow_nominal/nUni, nU...Mass flow rate of each connected unit at nominal conditions [kg/s]
Assumptions
BooleanallowFlowReversalfalse= false to simplify equations, assuming, but not enforcing, no flow reversal
Advanced
MassFlowRatem_flow_small1E-4*abs(m_flow_nominal)Small mass flow rate for regularization of zero flow [kg/s]
Diagnostics
Booleanshow_Tfalse= true, if actual temperature at port is computed
Dynamics
Conservation equations
DynamicsenergyDynamicsModelica.Fluid.Types.Dynamic...Type of energy balance (except for the pump always modeled in steady state)
Nominal condition
Timetau120Time constant of fluid temperature variation at nominal flow rate [s]

Connectors

TypeNameDescription
replaceable package MediumMedium in the component
FluidPort_aport_aFluid connector a (positive design flow direction is from port_a to port_b)
FluidPort_bport_bFluid connector b (positive design flow direction is from port_a to port_b)
FluidPorts_aports_a1[nPorts_a1]Terminal units return ports
FluidPorts_bports_b1[nPorts_b1]Terminal units supply ports
input RealInputmReq_flow[nUni]Heating or chilled water flow rate required to meet the load
input IntegerInputmodChaOveOperating mode in change-over (1 for heating, 2 for cooling)
input RealInputTSupSetSupply temperature set point [K]
output RealOutputmReqTot_flowTotal heating or chilled water flow rate required to meet the loads [kg/s]
output RealOutputQActTot_flowTotal heat flow rate transferred to the loads (>=0 for heating) [W]
output RealOutputPPumPower drawn by pump motor [W]

Modelica definition

model FlowDistribution "Model of a building hydraulic distribution system" extends Buildings.Fluid.Interfaces.PartialTwoPortInterface( redeclare replaceable package Medium=Buildings.Media.Water, allowFlowReversal=false); import Type_dis=Buildings.Experimental.DHC.Loads.BaseClasses.Types.DistributionType "Types of distribution system"; import Type_ctr=Buildings.Experimental.DHC.Loads.BaseClasses.Types.PumpControlType "Types of distribution pump control"; replaceable parameter Buildings.Fluid.Movers.Data.Generic per( pressure( V_flow=m_flow_nominal/rho_default .* {0,1,2}, dp=dp_nominal .* {1.5,1,0.5}), motorCooledByFluid=false) constrainedby Buildings.Fluid.Movers.Data.Generic "Record with performance data"; parameter Integer nPorts_a1=0 "Number of terminal units return ports"; parameter Integer nPorts_b1=0 "Number of terminal units supply ports"; final parameter Integer nUni=nPorts_a1 "Number of served units"; parameter Boolean have_pum=false "Set to true if the system has a pump"; parameter Boolean have_val=false "Set to true if the system has a mixing valve"; parameter Type_dis typDis=Type_dis.HeatingWater "Type of distribution system"; parameter Type_ctr typCtr=Type_ctr.ConstantHead "Type of distribution pump control"; parameter Real spePum_nominal( final unit="1", final min=0, final max=1)=1 "Pump speed at nominal conditions"; parameter Modelica.Units.SI.PressureDifference dp_nominal(final min=0, displayUnit="Pa") "Pressure drop at nominal conditions"; final parameter Modelica.Units.SI.PressureDifference dpVal_nominal( final min=0, displayUnit="Pa") = if have_val then 0.1*dp_nominal else 0 "Mixing valve pressure drop at nominal conditions"; parameter Modelica.Units.SI.PressureDifference dpDis_nominal[:]( each final min=0, each displayUnit="Pa") = if nUni == 1 then {1/2*(dp_nominal - dpVal_nominal - dpMin)} else 1/2 .* cat( 1, {(dp_nominal - dpVal_nominal - dpMin)*0.2}, fill((dp_nominal - dpVal_nominal - dpMin)*0.8/(nUni - 1), nUni - 1)) "Pressure drop between each connected unit at nominal conditions (supply line): use zero for each connection downstream the differential pressure sensor"; parameter Modelica.Units.SI.PressureDifference dpMin( final min=0, displayUnit="Pa") = dp_nominal/2 "Pressure difference set point for ConstantDp or at zero flow for LinearHead"; parameter Modelica.Units.SI.MassFlowRate mUni_flow_nominal[:](each final min= 0) = fill(m_flow_nominal/nUni, nUni) "Mass flow rate of each connected unit at nominal conditions"; parameter Modelica.Fluid.Types.Dynamics energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial "Type of energy balance (except for the pump always modeled in steady state)"; final parameter Modelica.Fluid.Types.Dynamics massDynamics=energyDynamics "Type of mass balance (except for the pump always modeled in steady state)"; parameter Modelica.Units.SI.Time tau=120 "Time constant of fluid temperature variation at nominal flow rate"; // IO CONNECTORS Modelica.Fluid.Interfaces.FluidPorts_a ports_a1[nPorts_a1]( redeclare each final package Medium=Medium, each m_flow( min= if allowFlowReversal then -Modelica.Constants.inf else 0), each h_outflow( start=Medium.h_default, nominal=Medium.h_default)) "Terminal units return ports"; Modelica.Fluid.Interfaces.FluidPorts_b ports_b1[nPorts_b1]( redeclare each final package Medium=Medium, each m_flow( max= if allowFlowReversal then +Modelica.Constants.inf else 0), each h_outflow( start=Medium.h_default, nominal=Medium.h_default)) "Terminal units supply ports"; Modelica.Blocks.Interfaces.RealInput mReq_flow[nUni]( each final quantity="MassFlowRate") "Heating or chilled water flow rate required to meet the load"; Modelica.Blocks.Interfaces.IntegerInput modChaOve if have_val and typDis == Type_dis.ChangeOver "Operating mode in change-over (1 for heating, 2 for cooling)"; Modelica.Blocks.Interfaces.RealInput TSupSet( final quantity="ThermodynamicTemperature", final unit="K", displayUnit="degC") if have_val "Supply temperature set point"; Modelica.Blocks.Interfaces.RealOutput mReqTot_flow( final quantity="MassFlowRate", final unit="kg/s") "Total heating or chilled water flow rate required to meet the loads"; Modelica.Blocks.Interfaces.RealOutput QActTot_flow( final quantity="HeatFlowRate", final unit="W") "Total heat flow rate transferred to the loads (>=0 for heating)"; Modelica.Blocks.Interfaces.RealOutput PPum( final quantity="Power", final unit="W") if have_pum "Power drawn by pump motor"; // COMPONENTS Buildings.Controls.OBC.CDL.Continuous.MultiSum sumMasFloReq( final k=fill( 1, nUni), final nin=nUni) "Total required mass flow rate"; Buildings.Fluid.Sources.MassFlowSource_T sou_m_flow[nUni]( redeclare each final package Medium=Medium, each final use_m_flow_in=true, each final use_T_in=true, each final nPorts=1) "Source for terminal units supplied flow rate"; Buildings.Fluid.Sources.Boundary_pT sin( redeclare final package Medium=Medium, final nPorts=nUni) "Sink for terminal units return flow rate"; Buildings.Controls.OBC.CDL.Continuous.MultiSum Q_flowSum( final nin=nUni) "Total heat flow rate"; Modelica.Blocks.Sources.RealExpression mAct_flow[nUni]( final y( each final unit="kg/s")= if have_pum then mReq_flow else mReq_flow .* senMasFlo.m_flow/Buildings.Utilities.Math.Functions.smoothLimit( x=mReqTot_flow, l=m_flow_small, u=senMasFlo.m_flow, deltaX=m_flow_small)) "Actual supplied mass flow rate"; Modelica.Blocks.Sources.RealExpression QAct_flow[nUni]( final y( each final unit="W")=mAct_flow.y .*(ports_b1.h_outflow-inStream( ports_a1.h_outflow))) "Actual heat flow rate transferred to each load"; Buildings.Fluid.Actuators.Valves.ThreeWayEqualPercentageLinear val( redeclare final package Medium=Medium, final portFlowDirection_1= if allowFlowReversal then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Entering, final portFlowDirection_2= if allowFlowReversal then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Leaving, final portFlowDirection_3= if allowFlowReversal then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Entering, final dpValve_nominal=dpVal_nominal, final use_inputFilter=false, final m_flow_nominal=m_flow_nominal, final linearized={true,true}, energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial) if have_val "Mixing valve"; Buildings.Fluid.Movers.BaseClasses.IdealSource pipPre( redeclare final package Medium=Medium, final dp_start=dp_nominal-dpVal_nominal, final m_flow_start=m_flow_nominal, final show_T=false, final show_V_flow=false, final control_m_flow=typCtr == Type_ctr.ConstantSpeed, final control_dp=typCtr <> Type_ctr.ConstantSpeed, final allowFlowReversal=allowFlowReversal, final m_flow_small=m_flow_small) "Fictitious pipe used to prescribe pump head or flow rate"; Buildings.Fluid.HeatExchangers.HeaterCooler_u heaCoo( redeclare final package Medium=Medium, final dp_nominal=0, final m_flow_nominal=m_flow_nominal, final Q_flow_nominal=-1, final allowFlowReversal=allowFlowReversal, final energyDynamics=energyDynamics, final tau=tau) "Heat transfer from the terminal units to the distribution system"; Buildings.Fluid.FixedResistances.Junction spl( redeclare final package Medium=Medium, final portFlowDirection_1= if allowFlowReversal then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Entering, final portFlowDirection_2= if allowFlowReversal then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Leaving, final portFlowDirection_3= if allowFlowReversal then Modelica.Fluid.Types.PortFlowDirection.Bidirectional else Modelica.Fluid.Types.PortFlowDirection.Leaving, final m_flow_nominal=m_flow_nominal*{1,1,1}, final dp_nominal=0*{1,1,1}, energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial) if have_val "Flow splitter"; Buildings.Fluid.Sensors.MassFlowRate senMasFlo( redeclare final package Medium=Medium, final allowFlowReversal=allowFlowReversal) "Supply mass flow rate sensor"; Buildings.Controls.OBC.CDL.Routing.RealScalarReplicator reaRep( final nout=nUni) "Repeat input to output an array"; Buildings.Experimental.DHC.Loads.BaseClasses.Controls.MixingValveControl conVal( final typDis=typDis) if have_val "Mixing valve controller"; Modelica.Blocks.Sources.RealExpression dpNetVal( final y( final unit="Pa")=dpPum-dpVal_nominal) "Pressure drop over the distribution network (excluding mixing valve)"; Modelica.Blocks.Sources.RealExpression masFloPum( final y( final unit="kg/s")=mPum_flow) "Pump mass flow rate value"; Modelica.Blocks.Sources.RealExpression spePum( final y( final unit="1")=spePum_nominal) "Pump speed (fractional)"; Buildings.Fluid.Movers.FlowControlled_m_flow pumFlo( redeclare final package Medium=Medium, per( pressure( final V_flow = per.pressure.V_flow, final dp = per.pressure.dp), final hydraulicEfficiency=per.hydraulicEfficiency, final motorEfficiency=per.motorEfficiency, final motorCooledByFluid=per.motorCooledByFluid, final speed_nominal=per.speed_nominal, final constantSpeed=per.constantSpeed, final speeds=per.speeds, final power=per.power), final allowFlowReversal=allowFlowReversal, final m_flow_nominal=m_flow_nominal, final dp_nominal=dp_nominal, addPowerToMedium=false, nominalValuesDefineDefaultPressureCurve=true, use_inputFilter=false, energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState) if have_pum and typCtr <> Type_ctr.ConstantSpeed "Distribution pump with prescribed mass flow rate"; Buildings.Fluid.Movers.SpeedControlled_y pumSpe( redeclare final package Medium=Medium, per( pressure( final V_flow=per.pressure.V_flow, final dp=per.pressure.dp), final hydraulicEfficiency=per.hydraulicEfficiency, final motorEfficiency=per.motorEfficiency, final motorCooledByFluid=per.motorCooledByFluid, final speed_nominal=per.speed_nominal, final constantSpeed=per.constantSpeed, final speeds=per.speeds, final power=per.power), final allowFlowReversal=allowFlowReversal, addPowerToMedium=false, use_inputFilter=false, energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState) if have_pum and typCtr == Type_ctr.ConstantSpeed "Distribution pump with prescribed speed (fractional)"; Fluid.Sensors.TemperatureTwoPort senTSup( redeclare final package Medium=Medium, final allowFlowReversal=allowFlowReversal, final m_flow_nominal=m_flow_nominal, initType=Modelica.Blocks.Types.Init.InitialState) "Supply temperature"; protected final parameter Modelica.Units.SI.MassFlowRate mDis_flow_nominal[nUni]={sum( mUni_flow_nominal[i:nUni]) for i in 1:nUni} "Distribution flow rate between each connected unit at nominal conditions"; final parameter Real kDis[nUni]={ if dpDis_nominal[i] > Modelica.Constants.eps then mDis_flow_nominal[i]/sqrt(dpDis_nominal[i]) else Modelica.Constants.inf for i in 1:nUni} "Flow coefficient between each connected unit at nominal conditions"; Modelica.Units.SI.MassFlowRate mDis_flow[nUni]={sum(mReq_flow[i:nUni]) for i in 1:nUni} "Distribution flow rate between each connected unit"; Modelica.Units.SI.PressureDifference dpDis[nUni]=(mDis_flow ./ kDis) .^ 2 "Pressure drop between each connected unit (supply line)"; Modelica.Units.SI.PressureDifference dpPum(displayUnit="Pa") = if typCtr == Type_ctr.LinearHead then dpMin + mPum_flow/m_flow_nominal*dp_nominal elseif typCtr == Type_ctr.ConstantDp then 2*sum(dpDis) + dpMin + dpVal_nominal else dp_nominal "Pump head"; Modelica.Units.SI.MassFlowRate mPum_flow=if typCtr == Type_ctr.ConstantFlow then m_flow_nominal else sum(mReq_flow) "Pump mass flow rate"; parameter Medium.ThermodynamicState sta_default=Medium.setState_pTX( T=Medium.T_default, p=Medium.p_default, X=Medium.X_default); parameter Modelica.Units.SI.Density rho_default=Medium.density(sta_default) "Density, used to compute fluid volume"; initial equation assert( nPorts_a1 == nPorts_b1, "In "+getInstanceName()+": The numbers of terminal units return ports ("+String( nPorts_a1)+") and supply ports ("+String( nPorts_b1)+") must be equal."); assert( if have_val then have_pum else true, "In "+getInstanceName()+": The configuration where have_val is true and have_pum is false is not allowed."); equation // Connect statements involving conditionally removed components are // removed at translation time by Modelica specification. // Only obsolete statements corresponding to the default model structure need // to be programmatically removed. if not have_val then connect(heaCoo.port_b,port_b); connect(port_a,pumFlo.port_a); connect(port_a,pumSpe.port_a); end if; if not have_pum then connect(port_a,senTSup.port_a); end if; connect(sumMasFloReq.y,mReqTot_flow); connect(mReq_flow,sumMasFloReq.u); connect(mAct_flow.y,sou_m_flow.m_flow_in); connect(ports_a1,sin.ports); connect(sou_m_flow.ports[1],ports_b1); connect(senMasFlo.port_b,heaCoo.port_a); connect(Q_flowSum.y,QActTot_flow); connect(QAct_flow.y,Q_flowSum.u); connect(Q_flowSum.y,heaCoo.u); connect(reaRep.y,sou_m_flow.T_in); connect(port_a,val.port_1); connect(heaCoo.port_b,spl.port_1); connect(spl.port_2,port_b); connect(spl.port_3,val.port_3); connect(TSupSet,conVal.TSupSet); connect(conVal.yVal,val.y); connect(modChaOve,conVal.modChaOve); connect(val.port_2,pumFlo.port_a); connect(val.port_2,pumSpe.port_a); connect(pumFlo.P,PPum); connect(pumSpe.P,PPum); connect(dpNetVal.y,pipPre.dp_in); connect(masFloPum.y,pipPre.m_flow_in); connect(masFloPum.y,pumFlo.m_flow_in); connect(spePum.y,pumSpe.y); connect(pipPre.port_a,senTSup.port_b); connect(pumSpe.port_b,senTSup.port_a); connect(pumFlo.port_b,senTSup.port_a); connect(senTSup.T,reaRep.u); connect(senTSup.T,conVal.TSupMes); connect(pipPre.port_b,senMasFlo.port_a); end FlowDistribution;

Buildings.Experimental.DHC.Loads.BaseClasses.PartialBuilding Buildings.Experimental.DHC.Loads.BaseClasses.PartialBuilding

Partial class for building model

Buildings.Experimental.DHC.Loads.BaseClasses.PartialBuilding

Information

Partial model to be used for modeling the thermal loads on an energy transfer station or a dedicated plant. Models extending this class are typically used in conjunction with Buildings.Experimental.DHC.Loads.BaseClasses.FlowDistribution and models extending Buildings.Experimental.DHC.Loads.BaseClasses.PartialTerminalUnit as described in the schematics here under. The fluid ports represent the connection between the production system and the building distribution system.

Scaling

Scaling is implemented by means of a multiplier factor facMul. Each extensive quantity (mass and heat flow rate, electric power) flowing out through fluid ports, or connected to an output connector is multiplied by facMul. Each extensive quantity (mass and heat flow rate, electric power) flowing in through fluid ports, or connected to an input connector is multiplied by 1/facMul. This allows modeling, with a single instance, multiple identical buildings served by the same energy transfer station.

Examples

See various use cases in Buildings.Experimental.DHC.Loads.BaseClasses.Examples.


image

Parameters

TypeNameDefaultDescription
replaceable package MediumBuildings.Media.WaterMedium in the building distribution system
Configuration
Booleanhave_heaWatfalseSet to true if the building has heating water system
Booleanhave_chiWatfalseSet to true if the building has chilled water system
Booleanhave_eleHeafalseSet to true if the building has decentralized electric heating system
Booleanhave_eleCoofalseSet to true if the building has decentralized electric cooling system
Booleanhave_fanfalseSet to true if fan power is computed
Booleanhave_pumfalseSet to true if pump power is computed
Booleanhave_weaBusfalseSet to true to use a weather bus
Scaling
RealfacMul1Multiplier factor
Assumptions
BooleanallowFlowReversalfalse= true to allow flow reversal, false restricts to design direction (port_a -> port_b)

Connectors

TypeNameDescription
replaceable package MediumMedium in the building distribution system
BusweaBusWeather data bus
FluidPorts_aports_aHeaWat[nPorts_aHeaWat]Heating water inlet ports
FluidPorts_bports_bHeaWat[nPorts_bHeaWat]Heating water outlet ports
FluidPorts_aports_aChiWat[nPorts_aChiWat]Chilled water inlet ports
FluidPorts_bports_bChiWat[nPorts_bChiWat]Chilled water outlet ports
output RealOutputQHea_flowTotal heating heat flow rate transferred to the loads (>=0) [W]
output RealOutputQCoo_flowTotal cooling heat flow rate transferred to the loads (<=0) [W]
output RealOutputPHeaPower drawn by decentralized heating system [W]
output RealOutputPCooPower drawn by decentralized cooling system [W]
output RealOutputPFanPower drawn by fan motors [W]
output RealOutputPPumPower drawn by pump motors [W]

Modelica definition

partial model PartialBuilding "Partial class for building model" replaceable package Medium=Buildings.Media.Water constrainedby Modelica.Media.Interfaces.PartialMedium "Medium in the building distribution system"; parameter Integer nPorts_aHeaWat=0 "Number of heating water inlet ports"; parameter Integer nPorts_bHeaWat=0 "Number of heating water outlet ports"; parameter Integer nPorts_aChiWat=0 "Number of chilled water inlet ports"; parameter Integer nPorts_bChiWat=0 "Number of chilled water outlet ports"; parameter Boolean have_heaWat=false "Set to true if the building has heating water system"; parameter Boolean have_chiWat=false "Set to true if the building has chilled water system"; parameter Boolean have_eleHea=false "Set to true if the building has decentralized electric heating system"; parameter Boolean have_eleCoo=false "Set to true if the building has decentralized electric cooling system"; parameter Boolean have_fan=false "Set to true if fan power is computed"; parameter Boolean have_pum=false "Set to true if pump power is computed"; parameter Boolean have_weaBus=false "Set to true to use a weather bus"; parameter Real facMul(min=Modelica.Constants.eps)=1 "Multiplier factor"; parameter Boolean allowFlowReversal=false "= true to allow flow reversal, false restricts to design direction (port_a -> port_b)"; final parameter Boolean have_heaLoa=have_heaWat or have_eleHea "Set to true if the building has heating loads"; final parameter Boolean have_cooLoa=have_chiWat or have_eleCoo "Set to true if the building has cooling loads"; // IO CONNECTORS Buildings.BoundaryConditions.WeatherData.Bus weaBus if have_weaBus "Weather data bus"; Modelica.Fluid.Interfaces.FluidPorts_a ports_aHeaWat[nPorts_aHeaWat]( redeclare each package Medium=Medium, each m_flow( min= if allowFlowReversal then -Modelica.Constants.inf else 0), each h_outflow( start=Medium.h_default, nominal=Medium.h_default)) if have_heaWat "Heating water inlet ports"; Modelica.Fluid.Interfaces.FluidPorts_b ports_bHeaWat[nPorts_bHeaWat]( redeclare each package Medium=Medium, each m_flow( max= if allowFlowReversal then +Modelica.Constants.inf else 0), each h_outflow( start=Medium.h_default, nominal=Medium.h_default)) if have_heaWat "Heating water outlet ports"; Modelica.Fluid.Interfaces.FluidPorts_a ports_aChiWat[nPorts_aChiWat]( redeclare each package Medium=Medium, each m_flow( min= if allowFlowReversal then -Modelica.Constants.inf else 0), each h_outflow( start=Medium.h_default, nominal=Medium.h_default)) if have_chiWat "Chilled water inlet ports"; Modelica.Fluid.Interfaces.FluidPorts_b ports_bChiWat[nPorts_bChiWat]( redeclare each package Medium=Medium, each m_flow( max= if allowFlowReversal then +Modelica.Constants.inf else 0), each h_outflow( start=Medium.h_default, nominal=Medium.h_default)) if have_chiWat "Chilled water outlet ports"; Modelica.Blocks.Interfaces.RealOutput QHea_flow( final unit="W") if have_heaLoa "Total heating heat flow rate transferred to the loads (>=0)"; Modelica.Blocks.Interfaces.RealOutput QCoo_flow( final unit="W") if have_cooLoa "Total cooling heat flow rate transferred to the loads (<=0)"; Modelica.Blocks.Interfaces.RealOutput PHea( final unit="W") if have_eleHea "Power drawn by decentralized heating system"; Modelica.Blocks.Interfaces.RealOutput PCoo( final unit="W") if have_eleCoo "Power drawn by decentralized cooling system"; Modelica.Blocks.Interfaces.RealOutput PFan( final quantity="Power", final unit="W") if have_fan "Power drawn by fan motors"; Modelica.Blocks.Interfaces.RealOutput PPum( final quantity="Power", final unit="W") if have_pum "Power drawn by pump motors"; Fluid.BaseClasses.MassFlowRateMultiplier mulHeaWatInl[nPorts_aHeaWat]( redeclare each final package Medium = Medium, each final k=1/facMul, each final allowFlowReversal=allowFlowReversal) if have_heaWat "Mass flow rate multiplier"; Fluid.BaseClasses.MassFlowRateMultiplier mulChiWatInl[nPorts_aChiWat]( redeclare each final package Medium = Medium, each final k=1/facMul, each final allowFlowReversal=allowFlowReversal) if have_chiWat "Mass flow rate multiplier"; Fluid.BaseClasses.MassFlowRateMultiplier mulHeaWatOut[nPorts_bHeaWat]( redeclare each final package Medium = Medium, each final k=facMul, each final allowFlowReversal=allowFlowReversal) if have_heaWat "Mass flow rate multiplier"; Fluid.BaseClasses.MassFlowRateMultiplier mulChiWatOut[nPorts_bChiWat]( redeclare each final package Medium = Medium, each final k=facMul, each final allowFlowReversal=allowFlowReversal) if have_chiWat "Mass flow rate multiplier"; Buildings.Controls.OBC.CDL.Continuous.MultiplyByParameter mulQHea_flow(u( final unit="W"), final k=facMul) if have_heaLoa "Scaling"; Buildings.Controls.OBC.CDL.Continuous.MultiplyByParameter mulQCoo_flow(u( final unit="W"), final k=facMul) if have_cooLoa "Scaling"; Buildings.Controls.OBC.CDL.Continuous.MultiplyByParameter mulPHea(u(final unit="W"), final k=facMul) if have_eleHea "Scaling"; Buildings.Controls.OBC.CDL.Continuous.MultiplyByParameter mulPCoo(u(final unit="W"), final k=facMul) if have_eleCoo "Scaling"; Buildings.Controls.OBC.CDL.Continuous.MultiplyByParameter mulPFan(u(final unit="W"), final k=facMul) if have_fan "Scaling"; Buildings.Controls.OBC.CDL.Continuous.MultiplyByParameter mulPPum(u(final unit="W"), final k=facMul) if have_pum "Scaling"; protected final parameter Modelica.Units.SI.SpecificHeatCapacity cp_default= Medium.specificHeatCapacityCp(Medium.setState_pTX( p=Medium.p_default, T=Medium.T_default, X=Medium.X_default)) "Specific heat capacity of medium at default medium state"; initial equation assert( nPorts_aHeaWat == nPorts_bHeaWat, "In "+getInstanceName()+": The numbers of heating water inlet ports ("+String( nPorts_aHeaWat)+") and outlet ports ("+String( nPorts_bHeaWat)+") must be equal."); assert( nPorts_aChiWat == nPorts_bChiWat, "In "+getInstanceName()+": The numbers of chilled water inlet ports ("+String( nPorts_aChiWat)+") and outlet ports ("+String( nPorts_bChiWat)+") must be equal."); equation connect(mulQHea_flow.y, QHea_flow); connect(mulQCoo_flow.y, QCoo_flow); connect(mulPHea.y, PHea); connect(mulPCoo.y, PCoo); connect(mulPFan.y, PFan); connect(mulPPum.y, PPum); connect(ports_aChiWat,mulChiWatInl. port_a); connect(ports_aHeaWat,mulHeaWatInl. port_a); connect(mulHeaWatOut.port_b, ports_bHeaWat); connect(mulChiWatOut.port_b, ports_bChiWat); end PartialBuilding;

Buildings.Experimental.DHC.Loads.BaseClasses.PartialBuildingWithPartialETS Buildings.Experimental.DHC.Loads.BaseClasses.PartialBuildingWithPartialETS

Partial model of a building with an energy transfer station

Buildings.Experimental.DHC.Loads.BaseClasses.PartialBuildingWithPartialETS

Information

Partial model to be used for modeling

See the schematics below for a description of the physical boundaries of the composing systems.

The parameters defining the set of outside connectors of this class are propagated up from the ETS and building components. The connect clauses between the ETS and the building connectors are automatically generated based on the previous parameters and the additional parameters nPorts_heaWat and nPorts_chiWat that need to be specified. In case of a heating service line, the model allows for using two different media at the inlet port_aSerHea and at the oulet port_bSerHea to represent a steam supply and condensate return.

Scaling

Scaling is implemented by means of a multiplier factor facMul. Each extensive quantity (mass and heat flow rate, electric power) flowing out through fluid ports, or connected to an output connector is multiplied by facMul. Each extensive quantity (mass and heat flow rate, electric power) flowing in through fluid ports, or connected to an input connector is multiplied by 1/facMul. This allows modeling, with a single instance, multiple identical buildings with identical energy transfer stations, served by the same service line.


image

Parameters

TypeNameDefaultDescription
replaceable package MediumSerBuildings.Media.WaterService side medium
replaceable package MediumSerHea_aBuildings.Media.WaterService side medium at heating inlet
replaceable package MediumBuiBuildings.Media.WaterBuilding side medium
PartialBuildingbuibui(redeclare final package ...Building model
PartialETSetsets(redeclare final package ...Energy transfer station model
Configuration
IntegernPorts_heaWat0Number of heating water fluid ports
IntegernPorts_chiWat0Number of chilled water fluid ports
Scaling
RealfacMul1Multiplier factor
Assumptions
BooleanallowFlowReversalSerfalseSet to true to allow flow reversal on service side
BooleanallowFlowReversalBuifalseSet to true to allow flow reversal on building side

Connectors

TypeNameDescription
replaceable package MediumSerService side medium
replaceable package MediumSerHea_aService side medium at heating inlet
replaceable package MediumBuiBuilding side medium
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 RealOutputQHea_flowTotal heating heat flow rate transferred to the loads (>=0) [W]
output RealOutputQCoo_flowTotal cooling heat flow rate transferred to the loads (<=0) [W]
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_flow[nFue]Fuel energy input rate [W]

Modelica definition

partial model PartialBuildingWithPartialETS "Partial model of a building with an energy transfer station" import TypDisSys=Buildings.Experimental.DHC.Types.DistrictSystemType "District system type enumeration"; replaceable package MediumSer=Buildings.Media.Water constrainedby Modelica.Media.Interfaces.PartialMedium "Service side medium"; replaceable package MediumSerHea_a=Buildings.Media.Water constrainedby Modelica.Media.Interfaces.PartialMedium "Service side medium at heating inlet"; replaceable package MediumBui=Buildings.Media.Water constrainedby Modelica.Media.Interfaces.PartialMedium "Building side medium"; parameter Integer nPorts_heaWat=0 "Number of heating water fluid ports"; parameter Integer nPorts_chiWat=0 "Number of chilled water fluid ports"; parameter Real facMul = 1 "Multiplier factor"; parameter Boolean allowFlowReversalSer=false "Set to true to allow flow reversal on service side"; parameter Boolean allowFlowReversalBui=false "Set to true to allow flow reversal on building side"; // The following parameters are propagated up from building and ETS components. final parameter TypDisSys typ=ets.typ "Type of district system"; final parameter Boolean have_heaWat=ets.have_heaWat "Set to true if the ETS supplies heating water"; final parameter Boolean have_hotWat=ets.have_hotWat "Set to true if the ETS supplies domestic hot water"; final parameter Boolean have_chiWat=ets.have_chiWat "Set to true if the ETS supplies chilled water"; final parameter Boolean have_eleHea=bui.have_eleHea or ets.have_eleHea "Set to true if the building or ETS has electric heating system"; final parameter Integer nFue=ets.nFue "Number of fuel types (0 means no combustion system)"; final parameter Boolean have_eleCoo=bui.have_eleCoo or ets.have_eleCoo "Set to true if the building or ETS has electric cooling system"; final parameter Boolean have_fan=bui.have_fan or ets.have_fan "Set to true if fan power is computed"; final parameter Boolean have_pum=bui.have_pum or ets.have_pum "Set to true if pump power is computed"; final parameter Boolean have_weaBus=bui.have_weaBus or ets.have_weaBus "Set to true to use a weather bus"; final parameter Modelica.Units.SI.HeatFlowRate QHeaWat_flow_nominal(min=0)= ets.QHeaWat_flow_nominal "Nominal capacity of heating system (>=0)"; final parameter Modelica.Units.SI.HeatFlowRate QHotWat_flow_nominal(min=0)= ets.QHotWat_flow_nominal "Nominal capacity of hot water production system (>=0)"; final parameter Modelica.Units.SI.HeatFlowRate QChiWat_flow_nominal(max=0)= ets.QChiWat_flow_nominal "Nominal capacity of cooling system (<=0)"; // Parameters for connect clauses. final parameter Integer idxPHeaETS=max( Modelica.Math.BooleanVectors.countTrue( {bui.have_eleHea,ets.have_eleHea}), 1) "Index for connecting the ETS output connector"; final parameter Integer idxPCooETS=max( Modelica.Math.BooleanVectors.countTrue( {bui.have_eleCoo,ets.have_eleCoo}), 1) "Index for connecting the ETS output connector"; final parameter Integer idxPFanETS=max( Modelica.Math.BooleanVectors.countTrue( {bui.have_fan,ets.have_fan}), 1) "Index for connecting the ETS output connector"; final parameter Integer idxPPumETS=max( Modelica.Math.BooleanVectors.countTrue( {bui.have_pum,ets.have_pum}), 1) "Index for connecting the ETS output connector"; // IO CONNECTORS Modelica.Fluid.Interfaces.FluidPort_a port_aSerAmb( redeclare package Medium = MediumSer, m_flow(min=if allowFlowReversalSer then -Modelica.Constants.inf else 0), h_outflow(start=MediumSer.h_default, nominal=MediumSer.h_default)) if typ == TypDisSys.CombinedGeneration5 "Fluid connector for ambient water service supply line"; Modelica.Fluid.Interfaces.FluidPort_b port_bSerAmb( redeclare package Medium = MediumSer, m_flow(max=if allowFlowReversalSer then +Modelica.Constants.inf else 0), h_outflow(start=MediumSer.h_default, nominal=MediumSer.h_default)) if typ == TypDisSys.CombinedGeneration5 "Fluid connector for ambient water service return line"; Modelica.Fluid.Interfaces.FluidPort_a port_aSerHea( redeclare package Medium = MediumSerHea_a, m_flow(min=if allowFlowReversalSer then -Modelica.Constants.inf else 0), h_outflow(start=MediumSerHea_a.h_default, nominal=MediumSerHea_a.h_default)) if typ <> TypDisSys.Cooling and typ <> TypDisSys.CombinedGeneration5 "Fluid connector for heating service supply line"; Modelica.Fluid.Interfaces.FluidPort_b port_bSerHea( redeclare package Medium = MediumSer, m_flow(max=if allowFlowReversalSer then +Modelica.Constants.inf else 0), h_outflow(start=MediumSer.h_default, nominal=MediumSer.h_default)) if typ <> TypDisSys.Cooling and typ <> TypDisSys.CombinedGeneration5 "Fluid connector for heating service return line"; Modelica.Fluid.Interfaces.FluidPort_a port_aSerCoo( redeclare package Medium = MediumSer, m_flow(min=if allowFlowReversalSer then -Modelica.Constants.inf else 0), h_outflow(start=MediumSer.h_default, nominal=MediumSer.h_default)) if typ == TypDisSys.CombinedGeneration1 or typ == TypDisSys.CombinedGeneration2to4 or typ == TypDisSys.Cooling "Fluid connector for cooling service supply line"; Modelica.Fluid.Interfaces.FluidPort_b port_bSerCoo( redeclare package Medium = MediumSer, m_flow(max=if allowFlowReversalSer then +Modelica.Constants.inf else 0), h_outflow(start=MediumSer.h_default, nominal=MediumSer.h_default)) if typ == TypDisSys.CombinedGeneration1 or typ == TypDisSys.CombinedGeneration2to4 or typ == TypDisSys.Cooling "Fluid connector for cooling service return line"; BoundaryConditions.WeatherData.Bus weaBus if have_weaBus "Weather data bus"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput QHea_flow( final unit="W") if bui.have_heaLoa "Total heating heat flow rate transferred to the loads (>=0)"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput QCoo_flow( final unit="W") if bui.have_cooLoa "Total cooling heat flow rate transferred to the loads (<=0)"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput PHea( final unit="W") if have_eleHea "Power drawn by heating system"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput PCoo( final unit="W") if have_eleCoo "Power drawn by cooling system"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput PFan( final unit="W") if have_fan "Power drawn by fan motors"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput PPum( final unit="W") if have_pum "Power drawn by pump motors"; Buildings.Controls.OBC.CDL.Interfaces.RealOutput QFue_flow[nFue]( each final unit="W") if nFue>0 "Fuel energy input rate"; // COMPONENTS replaceable Buildings.Experimental.DHC.Loads.BaseClasses.PartialBuilding bui( redeclare final package Medium=MediumBui, final nPorts_aHeaWat=nPorts_heaWat, final nPorts_bHeaWat=nPorts_heaWat, final nPorts_aChiWat=nPorts_chiWat, final nPorts_bChiWat=nPorts_chiWat, final allowFlowReversal=allowFlowReversalBui) "Building model "; replaceable Buildings.Experimental.DHC.EnergyTransferStations.BaseClasses.PartialETS ets( redeclare final package MediumBui=MediumBui, redeclare final package MediumSer=MediumSer, redeclare final package MediumSerHea_a=MediumSerHea_a, final nPorts_aHeaWat=nPorts_heaWat, final nPorts_bHeaWat=nPorts_heaWat, final nPorts_aChiWat=nPorts_chiWat, final nPorts_bChiWat=nPorts_chiWat, final allowFlowReversalSer=allowFlowReversalSer, final allowFlowReversalBui=allowFlowReversalBui) "Energy transfer station model"; Buildings.Controls.OBC.CDL.Continuous.MultiSum totPHea( final nin=Modelica.Math.BooleanVectors.countTrue( {bui.have_eleHea,ets.have_eleHea})) "Total power drawn by heating system"; Buildings.Controls.OBC.CDL.Continuous.MultiSum totPCoo( final nin=Modelica.Math.BooleanVectors.countTrue( {bui.have_eleCoo,ets.have_eleCoo})) "Total power drawn by cooling system"; Buildings.Controls.OBC.CDL.Continuous.MultiSum totPFan( final nin=Modelica.Math.BooleanVectors.countTrue( {bui.have_fan,ets.have_fan})) "Total power drawn by fan motors"; Buildings.Controls.OBC.CDL.Continuous.MultiSum totPPum( final nin=Modelica.Math.BooleanVectors.countTrue( {bui.have_pum,ets.have_pum})) "Total power drawn by pump motors"; Buildings.Controls.OBC.CDL.Continuous.MultiplyByParameter mulQHea_flow(u( final unit="W"), final k=facMul) if bui.have_heaLoa "Scaling"; Buildings.Controls.OBC.CDL.Continuous.MultiplyByParameter mulQCoo_flow(u( final unit="W"), final k=facMul) if bui.have_cooLoa "Scaling"; Buildings.Controls.OBC.CDL.Continuous.MultiplyByParameter mulPHea(u(final unit="W"), final k=facMul) if have_eleHea "Scaling"; Buildings.Controls.OBC.CDL.Continuous.MultiplyByParameter mulPCoo(u(final unit="W"), final k=facMul) if have_eleCoo "Scaling"; Buildings.Controls.OBC.CDL.Continuous.MultiplyByParameter mulPFan(u(final unit="W"), final k=facMul) if have_fan "Scaling"; Buildings.Controls.OBC.CDL.Continuous.MultiplyByParameter mulPPum(u(final unit="W"), final k=facMul) if have_pum "Scaling"; Fluid.BaseClasses.MassFlowRateMultiplier mulSerAmbInl( redeclare final package Medium = MediumSer, final k=1/facMul, final allowFlowReversal=allowFlowReversalSer) if typ == TypDisSys.CombinedGeneration5 "Mass flow rate multiplier"; Fluid.BaseClasses.MassFlowRateMultiplier mulSerAmbOut( redeclare final package Medium = MediumSer, final k=facMul, final allowFlowReversal=allowFlowReversalSer) if typ == TypDisSys.CombinedGeneration5 "Mass flow rate multiplier"; Fluid.BaseClasses.MassFlowRateMultiplier mulSerHeaInl( redeclare final package Medium = MediumSerHea_a, final k=1/facMul, final allowFlowReversal=allowFlowReversalSer) if typ <> TypDisSys.Cooling and typ <> TypDisSys.CombinedGeneration5 "Mass flow rate multiplier"; Fluid.BaseClasses.MassFlowRateMultiplier mulSerHeaOut( redeclare final package Medium = MediumSer, final k=facMul, final allowFlowReversal=allowFlowReversalSer) if typ <> TypDisSys.Cooling and typ <> TypDisSys.CombinedGeneration5 "Mass flow rate multiplier"; Fluid.BaseClasses.MassFlowRateMultiplier mulSerCooInl( redeclare final package Medium = MediumSer, final k=1/facMul, final allowFlowReversal=allowFlowReversalSer) if typ == TypDisSys.CombinedGeneration1 or typ == TypDisSys.CombinedGeneration2to4 or typ == TypDisSys.Cooling "Mass flow rate multiplier"; Fluid.BaseClasses.MassFlowRateMultiplier mulSerCooOut( redeclare final package Medium = MediumSer, final k=facMul, final allowFlowReversal=allowFlowReversalSer) if typ == TypDisSys.CombinedGeneration1 or typ == TypDisSys.CombinedGeneration2to4 or typ == TypDisSys.Cooling "Mass flow rate multiplier"; Buildings.Controls.OBC.CDL.Continuous.MultiplyByParameter mulQFue_flow[nFue]( u(each final unit="W"), each final k=facMul) if nFue > 0 "Scaling"; initial equation assert(ets.have_heaWat == bui.have_heaWat, "In "+getInstanceName()+": The ETS component is configured with have_heaWat="+ String(ets.have_heaWat)+" whereas the building is configured with have_heaWat="+ String(bui.have_heaWat)); assert(ets.have_chiWat == bui.have_chiWat, "In "+getInstanceName()+": The ETS component is configured with have_chiWat="+ String(ets.have_chiWat)+" whereas the building is configured with have_chiWat="+ String(bui.have_chiWat)); if have_heaWat then assert(nPorts_heaWat > 0, "In "+getInstanceName()+": The ETS component is configured with have_heaWat="+ String(ets.have_heaWat)+" but the number of fluid ports for chilled water (nPorts_heaWat) is zero."); end if; if have_chiWat then assert(nPorts_chiWat > 0, "In "+getInstanceName()+": The ETS component is configured with have_chiWat="+ String(ets.have_chiWat)+" but the number of fluid ports for chilled water (nPorts_chiWat) is zero."); end if; equation connect(bui.ports_bHeaWat,ets.ports_aHeaWat); connect(ets.ports_bHeaWat,bui.ports_aHeaWat); connect(bui.ports_bChiWat,ets.ports_aChiWat); connect(ets.ports_bChiWat,bui.ports_aChiWat); connect(weaBus,bui.weaBus); connect(weaBus,ets.weaBus); connect(bui.PHea,totPHea.u[1]); connect(ets.PHea,totPHea.u[idxPHeaETS]); connect(bui.PCoo,totPCoo.u[1]); connect(ets.PCoo,totPCoo.u[idxPCooETS]); connect(bui.PFan,totPFan.u[1]); connect(ets.PFan,totPFan.u[idxPFanETS]); connect(bui.PPum,totPPum.u[1]); connect(ets.PPum,totPPum.u[idxPPumETS]); connect(bui.QHea_flow, mulQHea_flow.u); connect(mulQHea_flow.y, QHea_flow); connect(bui.QCoo_flow, mulQCoo_flow.u); connect(mulQCoo_flow.y, QCoo_flow); connect(totPHea.y, mulPHea.u); connect(mulPHea.y, PHea); connect(totPCoo.y, mulPCoo.u); connect(mulPCoo.y, PCoo); connect(totPFan.y, mulPFan.u); connect(mulPFan.y, PFan); connect(totPPum.y, mulPPum.u); connect(mulPPum.y, PPum); connect(port_aSerCoo,mulSerCooInl. port_a); connect(mulSerCooInl.port_b, ets.port_aSerCoo); connect(mulSerCooOut.port_b, port_bSerCoo); connect(ets.port_bSerCoo,mulSerCooOut. port_a); connect(port_aSerHea,mulSerHeaInl. port_a); connect(mulSerHeaInl.port_b, ets.port_aSerHea); connect(port_aSerAmb,mulSerAmbInl. port_a); connect(mulSerAmbInl.port_b, ets.port_aSerAmb); connect(ets.port_bSerHea,mulSerHeaOut. port_a); connect(mulSerHeaOut.port_b, port_bSerHea); connect(ets.port_bSerAmb,mulSerAmbOut. port_a); connect(mulSerAmbOut.port_b, port_bSerAmb); connect(mulQFue_flow.y, QFue_flow); connect(ets.QFue_flow, mulQFue_flow.u); end PartialBuildingWithPartialETS;

Buildings.Experimental.DHC.Loads.BaseClasses.PartialTerminalUnit Buildings.Experimental.DHC.Loads.BaseClasses.PartialTerminalUnit

Partial model for HVAC terminal unit

Buildings.Experimental.DHC.Loads.BaseClasses.PartialTerminalUnit

Information

Partial model to be used for modeling an HVAC terminal unit.

The models inheriting from this class are typically used in conjunction with Buildings.Experimental.DHC.Loads.BaseClasses.FlowDistribution. They must compute a so-called required mass flow rate defined as the heating or chilled water mass flow rate needed to meet the load. It can be approximated using a control loop to avoid inverting a heat exchanger model as illustrated in Buildings.Experimental.DHC.Loads.BaseClasses.Examples.

The model connectivity can be modified to address various use cases:

The heating or cooling nominal capacity is provided for the water based heat exchangers only. Electric heating or cooling systems are supposed to have an infinite capacity.

Connection with the flow distribution model

When connecting the model to Buildings.Experimental.DHC.Loads.BaseClasses.FlowDistribution:

Scaling

Scaling is implemented by means of two multiplier factors.

Both multiplier factors are of type real (as opposed to integer) to allow for instance modeling a set of terminal units based on manufacturer data, while still being able to size the full set based on a peak load. See Buildings.Experimental.DHC.Loads.BaseClasses.Validation.TerminalUnitScaling for an illustration of the use case when heating and cooling loads are provided as time series.

Change-over mode

When modeling a change-over system:

Base class parameters

All the parameters of this base class that pertain to the nominal conditions shall not be exposed in the derived class, as this would lead to an overdetermined model. For instance, the nominal mass flow rate may not be exposed but rather computed from the nominal heat flow rate, entering and leaving fluid temperature. However, those parameters are included in the base class because other components are likely to reference them. For instance the distribution system model may use the nominal mass flow rate of each terminal unit to compute the nominal mass flow rate of the circulation pump.

Parameters

TypeNameDefaultDescription
replaceable package Medium1Buildings.Media.WaterMedium in the building distribution system
replaceable package Medium2Buildings.Media.AirLoad side medium
Scaling
RealfacMul1Multiplier factor
RealfacMulZon1Zone multiplier factor
Configuration
Booleanhave_heaWatfalseSet to true if the system uses heating water
Booleanhave_chiWatfalseSet to true if the system uses chilled water
Booleanhave_chaOvefalseSet to true if the chilled water based heat exchanger operates in change-over
Booleanhave_eleHeafalseSet to true if the system has electric heating system
Booleanhave_eleCoofalseSet to true if the system has electric cooling system
Booleanhave_heaPorfalseSet to true for heat ports on the load side
Booleanhave_fluPorfalseSet to true for fluid ports on the load side
Booleanhave_TSenfalseSet to true for measured temperature as an input
Booleanhave_QReq_flowfalseSet to true for required heat flow rate as an input
Booleanhave_weaBusfalseSet to true to use a weather bus
Booleanhave_fanfalseSet to true if fan power is computed
Booleanhave_pumfalseSet to true if pump power is computed
Nominal condition
HeatFlowRateQHea_flow_nominal0Nominal heating capacity (>=0) [W]
HeatFlowRateQCoo_flow_nominal0Nominal cooling capacity (<=0) [W]
MassFlowRatemHeaWat_flow_nominal0Heating water mass flow rate at nominal conditions [kg/s]
MassFlowRatemChiWat_flow_nominal0Chilled water mass flow rate at nominal conditions [kg/s]
MassFlowRatemLoaHea_flow_nominal0Load side mass flow rate at nominal conditions in heating mode [kg/s]
MassFlowRatemLoaCoo_flow_nominal0Load side mass flow rate at nominal conditions in cooling mode [kg/s]
TemperatureT_aHeaWat_nominal273.15 + 60Heating water inlet temperature at nominal conditions [K]
TemperatureT_bHeaWat_nominalT_aHeaWat_nominal - 22.2Heating water outlet temperature at nominal conditions [K]
TemperatureT_aChiWat_nominal273.15 + 7.2Chilled water inlet temperature at nominal conditions [K]
TemperatureT_bChiWat_nominalT_aChiWat_nominal + 5.6Chilled water outlet temperature at nominal conditions [K]
TemperatureT_aLoaHea_nominal273.15 + 21.1Load side inlet temperature at nominal conditions in heating mode [K]
TemperatureT_aLoaCoo_nominal273.15 + 26.7Load side inlet temperature at nominal conditions in cooling mode [K]
MassFractionw_aLoaCoo_nominal0.011Load side inlet humidity ratio at nominal conditions in cooling mode [1]
Assumptions
BooleanallowFlowReversalfalseSet to true to allow flow reversal in building distribution system
BooleanallowFlowReversalLoatrueSet to true to allow flow reversal on the load side

Connectors

TypeNameDescription
replaceable package Medium1Medium in the building distribution system
replaceable package Medium2Load side medium
input RealInputTSenTemperature (measured) [K]
input RealInputTSetHeaHeating set point [K]
input RealInputTSetCooCooling set point [K]
input RealInputQReqHea_flowRequired heat flow rate to meet heating set point (>=0) [W]
input RealInputQReqCoo_flowRequired heat flow rate to meet cooling set point (<=0) [W]
output RealOutputQActHea_flowHeating heat flow rate transferred to the load (>=0) [W]
output RealOutputQActCoo_flowCooling heat flow rate transferred to the load (<=0) [W]
output RealOutputPHeaPower drawn by heating system [W]
output RealOutputPCooPower drawn by cooling system [W]
output RealOutputPFanPower drawn by fans motors [W]
output RealOutputPPumPower drawn by pumps motors [W]
output RealOutputmReqHeaWat_flowRequired heating water flow rate to meet heating set point [kg/s]
output RealOutputmReqChiWat_flowRequired chilled water flow rate to meet cooling set point [kg/s]
FluidPort_aport_aLoaFluid stream inlet port on the load side
FluidPort_bport_bLoaFluid stream outlet port on the load side
HeatPort_bheaPorConHeat port transferring convective heat to the load
HeatPort_bheaPorRadHeat port transferring radiative heat to the load
BusweaBusWeather data bus
FluidPort_aport_aHeaWatHeating water inlet port
FluidPort_aport_aChiWatChilled water inlet port
FluidPort_bport_bHeaWatHeating water outlet port
FluidPort_bport_bChiWatChilled water outlet port

Modelica definition

partial model PartialTerminalUnit "Partial model for HVAC terminal unit" replaceable package Medium1=Buildings.Media.Water constrainedby Modelica.Media.Interfaces.PartialMedium "Medium in the building distribution system"; replaceable package Medium2=Buildings.Media.Air constrainedby Modelica.Media.Interfaces.PartialMedium "Load side medium"; parameter Boolean allowFlowReversal=false "Set to true to allow flow reversal in building distribution system"; parameter Boolean allowFlowReversalLoa=true "Set to true to allow flow reversal on the load side"; parameter Real facMul(min=Modelica.Constants.eps)=1 "Multiplier factor"; parameter Real facMulZon(min=Modelica.Constants.eps)=1 "Zone multiplier factor"; parameter Boolean have_heaWat=false "Set to true if the system uses heating water"; parameter Boolean have_chiWat=false "Set to true if the system uses chilled water"; parameter Boolean have_chaOve=false "Set to true if the chilled water based heat exchanger operates in change-over"; parameter Boolean have_eleHea=false "Set to true if the system has electric heating system"; parameter Boolean have_eleCoo=false "Set to true if the system has electric cooling system"; parameter Boolean have_heaPor=false "Set to true for heat ports on the load side"; parameter Boolean have_fluPor=false "Set to true for fluid ports on the load side"; parameter Boolean have_TSen=false "Set to true for measured temperature as an input"; parameter Boolean have_QReq_flow=false "Set to true for required heat flow rate as an input"; parameter Boolean have_weaBus=false "Set to true to use a weather bus"; parameter Boolean have_fan=false "Set to true if fan power is computed"; parameter Boolean have_pum=false "Set to true if pump power is computed"; parameter Modelica.Units.SI.HeatFlowRate QHea_flow_nominal(min=0) = 0 "Nominal heating capacity (>=0)"; parameter Modelica.Units.SI.HeatFlowRate QCoo_flow_nominal(max=0) = 0 "Nominal cooling capacity (<=0)"; parameter Modelica.Units.SI.MassFlowRate mHeaWat_flow_nominal(min=0) = 0 "Heating water mass flow rate at nominal conditions"; parameter Modelica.Units.SI.MassFlowRate mChiWat_flow_nominal(min=0) = 0 "Chilled water mass flow rate at nominal conditions"; parameter Modelica.Units.SI.MassFlowRate mLoaHea_flow_nominal(min=0) = 0 "Load side mass flow rate at nominal conditions in heating mode"; parameter Modelica.Units.SI.MassFlowRate mLoaCoo_flow_nominal(min=0) = 0 "Load side mass flow rate at nominal conditions in cooling mode"; // AHRI 440 Standard Heating parameter Modelica.Units.SI.Temperature T_aHeaWat_nominal=273.15 + 60 "Heating water inlet temperature at nominal conditions"; parameter Modelica.Units.SI.Temperature T_bHeaWat_nominal( min=273.15, displayUnit="degC") = T_aHeaWat_nominal - 22.2 "Heating water outlet temperature at nominal conditions"; // AHRI 440 Standard Cooling parameter Modelica.Units.SI.Temperature T_aChiWat_nominal=273.15 + 7.2 "Chilled water inlet temperature at nominal conditions "; parameter Modelica.Units.SI.Temperature T_bChiWat_nominal( min=273.15, displayUnit="degC") = T_aChiWat_nominal + 5.6 "Chilled water outlet temperature at nominal conditions"; parameter Modelica.Units.SI.Temperature T_aLoaHea_nominal=273.15 + 21.1 "Load side inlet temperature at nominal conditions in heating mode"; parameter Modelica.Units.SI.Temperature T_aLoaCoo_nominal=273.15 + 26.7 "Load side inlet temperature at nominal conditions in cooling mode"; parameter Modelica.Units.SI.MassFraction w_aLoaCoo_nominal=0.011 "Load side inlet humidity ratio at nominal conditions in cooling mode"; // IO connectors Modelica.Blocks.Interfaces.RealInput TSen( final quantity="ThermodynamicTemperature", final unit="K", displayUnit="degC") if have_TSen "Temperature (measured)"; Modelica.Blocks.Interfaces.RealInput TSetHea( quantity="ThermodynamicTemperature", final unit="K", displayUnit="degC") if have_heaWat or have_chaOve or have_eleHea "Heating set point"; Modelica.Blocks.Interfaces.RealInput TSetCoo( final quantity="ThermodynamicTemperature", final unit="K", displayUnit="degC") if have_chiWat or have_eleCoo "Cooling set point"; Modelica.Blocks.Interfaces.RealInput QReqHea_flow( final quantity="HeatFlowRate", final unit="W") if have_QReq_flow and (have_heaWat or have_chaOve or have_eleHea) "Required heat flow rate to meet heating set point (>=0)"; Modelica.Blocks.Interfaces.RealInput QReqCoo_flow( final quantity="HeatFlowRate", final unit="W") if have_QReq_flow and (have_chiWat or have_eleCoo) "Required heat flow rate to meet cooling set point (<=0)"; Modelica.Blocks.Interfaces.RealOutput QActHea_flow( final quantity="HeatFlowRate", final unit="W") if have_heaWat or have_chaOve or have_eleHea "Heating heat flow rate transferred to the load (>=0)"; Modelica.Blocks.Interfaces.RealOutput QActCoo_flow( final quantity="HeatFlowRate", final unit="W") if have_chiWat or have_eleCoo "Cooling heat flow rate transferred to the load (<=0)"; Modelica.Blocks.Interfaces.RealOutput PHea( final quantity="Power", final unit="W") if have_eleHea "Power drawn by heating system"; Modelica.Blocks.Interfaces.RealOutput PCoo( final quantity="Power", final unit="W") if have_eleCoo "Power drawn by cooling system"; Modelica.Blocks.Interfaces.RealOutput PFan( final quantity="Power", final unit="W") if have_fan "Power drawn by fans motors"; Modelica.Blocks.Interfaces.RealOutput PPum( final quantity="Power", final unit="W") if have_pum "Power drawn by pumps motors"; Modelica.Blocks.Interfaces.RealOutput mReqHeaWat_flow( final quantity="MassFlowRate", final unit="kg/s") if have_heaWat "Required heating water flow rate to meet heating set point"; Modelica.Blocks.Interfaces.RealOutput mReqChiWat_flow( final quantity="MassFlowRate", final unit="kg/s") if have_chiWat "Required chilled water flow rate to meet cooling set point"; Modelica.Fluid.Interfaces.FluidPort_a port_aLoa( redeclare final package Medium=Medium2, p(start=Medium2.p_default), m_flow( min= if allowFlowReversalLoa then -Modelica.Constants.inf else 0), h_outflow( start=Medium2.h_default, nominal=Medium2.h_default)) if have_fluPor "Fluid stream inlet port on the load side"; Modelica.Fluid.Interfaces.FluidPort_b port_bLoa( redeclare final package Medium=Medium2, p(start=Medium2.p_default), m_flow( max= if allowFlowReversalLoa then +Modelica.Constants.inf else 0), h_outflow( start=Medium2.h_default, nominal=Medium2.h_default)) if have_fluPor "Fluid stream outlet port on the load side"; Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_b heaPorCon if have_heaPor "Heat port transferring convective heat to the load"; Modelica.Thermal.HeatTransfer.Interfaces.HeatPort_b heaPorRad if have_heaPor "Heat port transferring radiative heat to the load"; BoundaryConditions.WeatherData.Bus weaBus if have_weaBus "Weather data bus"; Modelica.Fluid.Interfaces.FluidPort_a port_aHeaWat( p(start=Medium1.p_default), redeclare final package Medium=Medium1, m_flow( min= if allowFlowReversal then -Modelica.Constants.inf else 0), h_outflow( start=Medium1.h_default, nominal=Medium1.h_default)) if have_heaWat "Heating water inlet port"; Modelica.Fluid.Interfaces.FluidPort_a port_aChiWat( p(start=Medium1.p_default), redeclare final package Medium=Medium1, m_flow( min= if allowFlowReversal then -Modelica.Constants.inf else 0), h_outflow( start=Medium1.h_default, nominal=Medium1.h_default)) if have_chiWat "Chilled water inlet port"; Modelica.Fluid.Interfaces.FluidPort_b port_bHeaWat( p(start=Medium1.p_default), redeclare final package Medium=Medium1, m_flow( max= if allowFlowReversal then +Modelica.Constants.inf else 0), h_outflow( start=Medium1.h_default, nominal=Medium1.h_default)) if have_heaWat "Heating water outlet port"; Modelica.Fluid.Interfaces.FluidPort_b port_bChiWat( p(start=Medium1.p_default), redeclare final package Medium=Medium1, m_flow( max= if allowFlowReversal then +Modelica.Constants.inf else 0), h_outflow( start=Medium1.h_default, nominal=Medium1.h_default)) if have_chiWat "Chilled water outlet port"; // COMPONENTS Buildings.Controls.OBC.CDL.Continuous.MultiplyByParameter mulQReqHea_flow(u( final unit="W"), final k=1/facMul) if have_QReq_flow and (have_heaWat or have_chaOve or have_eleHea) "Scaling"; Buildings.Controls.OBC.CDL.Continuous.MultiplyByParameter mulQReqCoo_flow(u( final unit="W"), final k=1/facMul) if have_QReq_flow and (have_chiWat or have_eleCoo) "Scaling"; Buildings.Controls.OBC.CDL.Continuous.MultiplyByParameter mulQActHea_flow(u( final unit="W"), final k=facMul*facMulZon) if have_heaWat or have_chaOve or have_eleHea "Scaling"; Buildings.Controls.OBC.CDL.Continuous.MultiplyByParameter mulQActCoo_flow(u( final unit="W"), final k=facMul*facMulZon) if have_chiWat or have_eleCoo "Scaling"; Buildings.Controls.OBC.CDL.Continuous.MultiplyByParameter mulPHea(u(final unit="W"), final k=facMul*facMulZon) if have_eleHea "Scaling"; Buildings.Controls.OBC.CDL.Continuous.MultiplyByParameter mulPCoo(u(final unit="W"), final k=facMul*facMulZon) if have_eleCoo "Scaling"; Buildings.Controls.OBC.CDL.Continuous.MultiplyByParameter mulPFan(u(final unit="W"), final k=facMul*facMulZon) if have_fan "Scaling"; Buildings.Controls.OBC.CDL.Continuous.MultiplyByParameter mulPPum(u(final unit="W"), final k=facMul*facMulZon) if have_pum "Scaling"; Buildings.Controls.OBC.CDL.Continuous.MultiplyByParameter mulMasFloReqHeaWat( u(final unit="kg/s"), final k=facMul*facMulZon) if have_heaWat "Scaling"; Buildings.Controls.OBC.CDL.Continuous.MultiplyByParameter mulMasFloReqChiWat( u(final unit="kg/s"), final k=facMul*facMulZon) if have_chiWat "Scaling"; Fluid.BaseClasses.MassFlowRateMultiplier mulHeaWatFloInl( redeclare final package Medium=Medium1, final k=1/facMul/facMulZon, final allowFlowReversal=allowFlowReversal) if have_heaWat "Mass flow rate multiplier"; Fluid.BaseClasses.MassFlowRateMultiplier mulHeaWatFloOut( redeclare final package Medium=Medium1, final k=facMul*facMulZon, final allowFlowReversal=allowFlowReversal) if have_heaWat "Mass flow rate multiplier"; Fluid.BaseClasses.MassFlowRateMultiplier mulChiWatFloInl( redeclare final package Medium=Medium1, final k=1/facMul/facMulZon, final allowFlowReversal=allowFlowReversal) if have_chiWat "Mass flow rate multiplier"; Fluid.BaseClasses.MassFlowRateMultiplier mulChiWatFloOut( redeclare final package Medium=Medium1, final k=facMul*facMulZon, final allowFlowReversal=allowFlowReversal) if have_chiWat "Mass flow rate multiplier"; Fluid.BaseClasses.MassFlowRateMultiplier mulLoaMasFloOut( redeclare final package Medium=Medium2, final k=facMul, final allowFlowReversal=allowFlowReversalLoa) if have_fluPor "Load side mass flow rate multiplier"; Fluid.BaseClasses.MassFlowRateMultiplier mulLoaMasFloInl( redeclare final package Medium=Medium2, final k=1/facMul, final allowFlowReversal=allowFlowReversalLoa) if have_fluPor "Load side mass flow rate multiplier"; Fluid.HeatExchangers.RadiantSlabs.BaseClasses.HeatFlowRateMultiplier mulHeaFloCon(final k= facMul) if have_heaPor "Convective heat flow rate multiplier"; Fluid.HeatExchangers.RadiantSlabs.BaseClasses.HeatFlowRateMultiplier mulHeaFloRad(final k= facMul) if have_heaPor "Radiative heat flow rate multiplier"; protected parameter Modelica.Units.SI.SpecificHeatCapacity cpHeaWat_nominal= Medium1.specificHeatCapacityCp(Medium1.setState_pTX(Medium1.p_default, T_aHeaWat_nominal)) "Heating water specific heat capacity at nominal conditions"; parameter Modelica.Units.SI.SpecificHeatCapacity cpChiWat_nominal= Medium1.specificHeatCapacityCp(Medium1.setState_pTX(Medium1.p_default, T_aChiWat_nominal)) "Chilled water specific heat capacity at nominal conditions"; parameter Modelica.Units.SI.SpecificHeatCapacity cpLoaHea_nominal= Medium2.specificHeatCapacityCp(Medium2.setState_pTX(Medium2.p_default, T_aLoaHea_nominal)) "Load side fluid specific heat capacity at nominal conditions in heating mode"; parameter Modelica.Units.SI.SpecificHeatCapacity cpLoaCoo_nominal= Medium2.specificHeatCapacityCp(Medium2.setState_pTX(Medium2.p_default, T_aLoaCoo_nominal)) "Load side fluid specific heat capacity at nominal conditions in cooling mode"; equation connect(QReqHea_flow,mulQReqHea_flow.u); connect(QReqCoo_flow,mulQReqCoo_flow.u); connect(mulQActHea_flow.y,QActHea_flow); connect(mulQActCoo_flow.y,QActCoo_flow); connect(mulPHea.y,PHea); connect(mulPCoo.y,PCoo); connect(mulPFan.y,PFan); connect(mulPPum.y,PPum); connect(mulMasFloReqHeaWat.y,mReqHeaWat_flow); connect(mulMasFloReqChiWat.y,mReqChiWat_flow); connect(port_aHeaWat,mulHeaWatFloInl.port_a); connect(mulHeaWatFloOut.port_b,port_bHeaWat); connect(port_aChiWat,mulChiWatFloInl.port_a); connect(mulChiWatFloOut.port_b,port_bChiWat); connect(mulLoaMasFloOut.port_b,port_bLoa); connect(port_aLoa,mulLoaMasFloInl.port_a); connect(mulHeaFloCon.port_b,heaPorCon); connect(mulHeaFloRad.port_b,heaPorRad); end PartialTerminalUnit;

Buildings.Experimental.DHC.Loads.BaseClasses.SimpleRoomODE Buildings.Experimental.DHC.Loads.BaseClasses.SimpleRoomODE

Simplified model for assessing room air temperature variations around a set point

Buildings.Experimental.DHC.Loads.BaseClasses.SimpleRoomODE

Information

This is a first order ODE model assessing the indoor air temperature variations around a set point, based on the difference between the required and actual heating or cooling heat flow rate and a minimum set of parameters at nominal conditions.

The lumped thermal conductance G representing all heat transfer mechanisms that depend on the temperature difference with the outside (transmission, infiltration and ventilation) is assessed from the steady-state energy balance at heating nominal conditions as

0 = Q̇heating, nom + G (Tout, heating, nom - Tind, heating, nom).

Note that it is important for the model representativeness that Q̇heating, nom be evaluated in close to steady-state conditions with no internal heat gains and no solar heat gains.

The lumped thermal conductance G is then considered constant for all operating conditions.

The required heating or cooling heat flow rate (i.e. the space load) heat_cool, req corresponds to a steady-state control error equal to zero,

0 = Q̇heat_cool, req + G (Tout - Tind, set) + Q̇various,

where various represent the miscellaneous heat gains. The indoor temperature variation rate due to an unmet load is given by

C ∂Tind / ∂t = Q̇heat_cool, act + G (Tout - Tind) + Q̇various,

where heat_cool, act is the actual heating or cooling heat flow rate and C is the thermal capacitance of the indoor volume. The two previous equations yield

τ ∂Tind / ∂t = (Q̇heat_cool, act - Q̇heat_cool, req) / G - Tind + Tind, set,

where τ = C / G is the time constant of the indoor temperature.

Extends from Modelica.Blocks.Icons.Block (Basic graphical layout of input/output block).

Parameters

TypeNameDefaultDescription
Timetau1800Time constant of the indoor temperature [s]
Nominal condition
TemperatureTOutHea_nominal Outdoor air temperature at heating nominal conditions [K]
TemperatureTIndHea_nominal Indoor air temperature at heating nominal conditions [K]
HeatFlowRateQHea_flow_nominal Heating heat flow rate (for TInd=TIndHea_nominal, TOut=TOutHea_nominal, with no internal gains, no solar radiation) [W]
Initialization
BooleansteadyStateInitialfalsetrue initializes T with dT(0)/dt=0, false initializes T with T(0)=TIndHea_nominal

Connectors

TypeNameDescription
input RealInputTSetTemperature set point for heating or cooling [K]
input RealInputQReq_flowRequired heat flow rate to meet temperature set point (>=0 for heating) [W]
input RealInputQAct_flowActual heating or cooling heat flow rate (>=0 for heating) [W]
output RealOutputTAirRoom air temperature [K]

Modelica definition

model SimpleRoomODE "Simplified model for assessing room air temperature variations around a set point" extends Modelica.Blocks.Icons.Block; parameter Modelica.Units.SI.Temperature TOutHea_nominal(displayUnit="degC") "Outdoor air temperature at heating nominal conditions"; parameter Modelica.Units.SI.Temperature TIndHea_nominal(displayUnit="degC") "Indoor air temperature at heating nominal conditions"; parameter Modelica.Units.SI.HeatFlowRate QHea_flow_nominal(min=0) "Heating heat flow rate (for TInd=TIndHea_nominal, TOut=TOutHea_nominal, with no internal gains, no solar radiation)"; parameter Boolean steadyStateInitial=false "true initializes T with dT(0)/dt=0, false initializes T with T(0)=TIndHea_nominal"; parameter Modelica.Units.SI.Time tau=1800 "Time constant of the indoor temperature"; Modelica.Blocks.Interfaces.RealInput TSet( final quantity="ThermodynamicTemperature", final unit="K", displayUnit="degC") "Temperature set point for heating or cooling"; Modelica.Blocks.Interfaces.RealInput QReq_flow( final quantity="HeatFlowRate", final unit="W") "Required heat flow rate to meet temperature set point (>=0 for heating)"; Modelica.Blocks.Interfaces.RealInput QAct_flow( final quantity="HeatFlowRate", final unit="W") "Actual heating or cooling heat flow rate (>=0 for heating)"; Modelica.Blocks.Interfaces.RealOutput TAir( final quantity="ThermodynamicTemperature", final unit="K", displayUnit="degC") "Room air temperature"; protected parameter Modelica.Units.SI.ThermalConductance G=-QHea_flow_nominal/( TOutHea_nominal - TIndHea_nominal) "Lumped thermal conductance representing all temperature dependent heat transfer mechanisms"; initial equation if steadyStateInitial then der( TAir)=0; else TAir=TIndHea_nominal; end if; equation der( TAir)*tau=(QAct_flow-QReq_flow)/G+TSet-TAir; assert( TAir >= 273.15, "In "+getInstanceName()+": The computed indoor temperature is below 0°C."); end SimpleRoomODE;

Buildings.Experimental.DHC.Loads.BaseClasses.getPeakLoad Buildings.Experimental.DHC.Loads.BaseClasses.getPeakLoad

Function that reads the peak load from the load profile

Information

Function that reads a double value from a text file.

This function scans a file that has a format such as

#1
#Some other text
#Peak space cooling load = -383165.6989 Watts
#Peak space heating load = 893931.4335 Watts
double tab1(8760,4)
0,0,5972.314925,16
3600,0,4925.839944,1750.915684
...

The parameter string is a string that the function searches for, starting at the first line. If it finds the string, it expects an equality sign, and returns the double value after this equality sign. If the function encounters the end of the file, it terminates the simulation with an assertion.

See Buildings.Experimental.DHC.Loads.BaseClasses.Validation.GetPeakLoad for how to invoke this function.

Extends from Modelica.Icons.Function (Icon for functions).

Inputs

TypeNameDefaultDescription
Stringstring String that is written before the '=' sign
StringfilNam Name of data file with heating and cooling load

Outputs

TypeNameDescription
RealnumberNumber that is read from the file

Modelica definition

pure function getPeakLoad "Function that reads the peak load from the load profile" extends Modelica.Icons.Function; input String string "String that is written before the '=' sign"; input String filNam "Name of data file with heating and cooling load"; output Real number "Number that is read from the file"; protected String lin "Line that is used in parser"; Integer iLin "Line number"; Integer index=0 "Index of string 'string'"; Integer staInd "Start index used when parsing a real number"; Integer nexInd "Next index used when parsing a real number"; Boolean found "Flag, true if 'string' has been found"; Boolean EOF "Flag, true if EOF has been reached"; String del "Found delimiter"; pure function pureReadLine "Read a line of text from a file and return it in a string" extends Modelica.Icons.Function; input String fileName "Name of the file that shall be read"; input Integer lineNumber(min=1) "Number of line to read"; output String string "Line of text"; output Boolean endOfFile "If true, end-of-file was reached when trying to read line"; external"C" string = ModelicaInternal_readLine( fileName, lineNumber, endOfFile); end pureReadLine; algorithm // Get line that contains 'string' iLin := 0; EOF := false; while (not EOF) and (index == 0) loop iLin := iLin+1; (lin,EOF) := pureReadLine( fileName=filNam, lineNumber=iLin); index := Modelica.Utilities.Strings.find( string=lin, searchString=string, startIndex=1, caseSensitive=true); end while; assert( not EOF, "Error: Did not find '"+string+"' when scanning '"+filNam+"'."+"\n Check for correct file syntax."); // Search for the equality sign (del,nexInd) := Modelica.Utilities.Strings.scanDelimiter( string=lin, startIndex=Modelica.Utilities.Strings.length(string)+1, requiredDelimiters={"="}, message="Failed to find '=' when reading peak load in '"+filNam+"'."); // Read the value behind it. number := Modelica.Utilities.Strings.scanReal( string=lin, startIndex=nexInd, message="Failed to read double value when reading peak load in '"+filNam+"'."); end getPeakLoad;