Buildings.Fluid.Movers.Examples

Collection of models that illustrate model use and test models

Information

This package contains examples for the use of models that can be found in Buildings.Fluid.Movers.

Extends from Modelica.Icons.ExamplesPackage (Icon for packages containing runnable examples).

Package Content

Name Description
Buildings.Fluid.Movers.Examples.ClosedLoop_y ClosedLoop_y Flow machine with feedback control
Buildings.Fluid.Movers.Examples.MoverContinuous MoverContinuous Example model of movers using a real input for setting the stage
Buildings.Fluid.Movers.Examples.MoverParameter MoverParameter Example model of movers using a parameter for setting the stage
Buildings.Fluid.Movers.Examples.MoverStages MoverStages Example model of movers using an integer input for setting the stage
Buildings.Fluid.Movers.Examples.PumpsParallel PumpsParallel Two flow machines in parallel
Buildings.Fluid.Movers.Examples.PumpsSeries PumpsSeries Two flow machines in series
Buildings.Fluid.Movers.Examples.SpeedControlled_y_pumpCurves SpeedControlled_y_pumpCurves Pumps that illustrates the use of the pump curves
Buildings.Fluid.Movers.Examples.StaticReset StaticReset Comparing different computation paths with a static pressure reset
Buildings.Fluid.Movers.Examples.Data Data Package containing data for examples

Buildings.Fluid.Movers.Examples.ClosedLoop_y Buildings.Fluid.Movers.Examples.ClosedLoop_y

Flow machine with feedback control

Buildings.Fluid.Movers.Examples.ClosedLoop_y

Information

This example demonstrates the use of a fan with closed loop control. The fan is controlled to track a required mass flow rate.

Extends from Modelica.Icons.Example (Icon for runnable examples).

Parameters

TypeNameDefaultDescription
MassFlowRatem_flow_nominal0.1Nominal mass flow rate [kg/s]
PressureDifferencedp_nominal500Nominal pressure difference [Pa]

Modelica definition

model ClosedLoop_y "Flow machine with feedback control" extends Modelica.Icons.Example; package Medium = Buildings.Media.Air; parameter Modelica.Units.SI.MassFlowRate m_flow_nominal=0.1 "Nominal mass flow rate"; parameter Modelica.Units.SI.PressureDifference dp_nominal=500 "Nominal pressure difference"; Modelica.Blocks.Sources.Pulse y( offset=0.25, startTime=0, amplitude=0.5, period=15*60) "Input signal"; Buildings.Fluid.Sources.Boundary_pT sou( redeclare package Medium = Medium, use_p_in=false, p=101325, T=293.15, nPorts=2); Buildings.Fluid.FixedResistances.PressureDrop dp1( redeclare package Medium = Medium, m_flow_nominal=m_flow_nominal, dp_nominal=dp_nominal/2) "Pressure drop"; Buildings.Fluid.FixedResistances.PressureDrop dp2( redeclare package Medium = Medium, m_flow_nominal=m_flow_nominal, dp_nominal=dp_nominal/2) "Pressure drop"; Buildings.Fluid.Movers.SpeedControlled_y fan( redeclare package Medium = Medium, per(pressure(V_flow={0,m_flow_nominal,2*m_flow_nominal}/1.2, dp={2*dp_nominal,dp_nominal,0})), energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial) "Fan"; Buildings.Fluid.Sensors.MassFlowRate senMasFlo(redeclare package Medium = Medium); Buildings.Controls.Continuous.LimPID conPID( Td=1, k=0.5, Ti=15); Modelica.Blocks.Math.Gain gain1(k=1/m_flow_nominal); equation connect(sou.ports[1], senMasFlo.port_a); connect(senMasFlo.port_b, dp1.port_a); connect(dp1.port_b, fan.port_a); connect(fan.port_b, dp2.port_a); connect(dp2.port_b, sou.ports[2]); connect(senMasFlo.m_flow, gain1.u); connect(gain1.y, conPID.u_m); connect(y.y, conPID.u_s); connect(conPID.y, fan.y); end ClosedLoop_y;

Buildings.Fluid.Movers.Examples.MoverContinuous Buildings.Fluid.Movers.Examples.MoverContinuous

Example model of movers using a real input for setting the stage

Buildings.Fluid.Movers.Examples.MoverContinuous

Information

This example demonstrates the use of a RealInput connector for a mover model.

Extends from MoverParameter (Example model of movers using a parameter for setting the stage).

Parameters

TypeNameDefaultDescription
MassFlowRatem_flow_nominal2Nominal mass flow rate [kg/s]
PressureDifferencedp_nominal10000Nominal pressure raise [Pa]

Modelica definition

model MoverContinuous "Example model of movers using a real input for setting the stage" extends MoverParameter( pump_m_flow(inputType=Buildings.Fluid.Types.InputType.Continuous), pump_y(inputType=Buildings.Fluid.Types.InputType.Continuous), pump_dp(inputType=Buildings.Fluid.Types.InputType.Continuous)); Modelica.Blocks.Sources.Ramp ramp(duration=1) "Ramp input for all movers"; Modelica.Blocks.Math.Gain gai_m_flow(k=m_flow_nominal) "Nominal mass flow rate"; Modelica.Blocks.Math.Gain gai_dp(k=dp_nominal) "Nominal pressure drop"; equation connect(gai_dp.y, pump_dp.dp_in); connect(gai_m_flow.y, pump_m_flow.m_flow_in); connect(gai_m_flow.u, ramp.y); connect(gai_dp.u, ramp.y); connect(pump_y.y, ramp.y); end MoverContinuous;

Buildings.Fluid.Movers.Examples.MoverParameter Buildings.Fluid.Movers.Examples.MoverParameter

Example model of movers using a parameter for setting the stage

Buildings.Fluid.Movers.Examples.MoverParameter

Information

This example demonstrates the use of a Parameter set point for a mover model.

Extends from Modelica.Icons.Example (Icon for runnable examples).

Parameters

TypeNameDefaultDescription
MassFlowRatem_flow_nominal2Nominal mass flow rate [kg/s]
PressureDifferencedp_nominal10000Nominal pressure raise [Pa]

Modelica definition

model MoverParameter "Example model of movers using a parameter for setting the stage" extends Modelica.Icons.Example; package Medium = Buildings.Media.Water; parameter Modelica.Units.SI.MassFlowRate m_flow_nominal=2 "Nominal mass flow rate"; Buildings.Fluid.Movers.FlowControlled_m_flow pump_m_flow( redeclare package Medium = Medium, m_flow_nominal=m_flow_nominal, use_inputFilter=false, massFlowRates={0,0.5,1}*m_flow_nominal, inputType=Buildings.Fluid.Types.InputType.Constant, energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState) "Pump with m_flow input"; Buildings.Fluid.Sources.Boundary_pT sou( redeclare package Medium = Medium, nPorts=3) "Fluid source"; Buildings.Fluid.Sources.Boundary_pT sin(redeclare package Medium = Medium, nPorts=3) "Fluid sink"; Buildings.Fluid.Movers.SpeedControlled_y pump_y( redeclare package Medium = Medium, redeclare Buildings.Fluid.Movers.Data.Pumps.Wilo.Stratos25slash1to4 per( speeds={0,0.5,1}, constantSpeed=1), use_inputFilter=false, inputType=Buildings.Fluid.Types.InputType.Constant, energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState) "Pump with normalised speed input"; Buildings.Fluid.Movers.FlowControlled_dp pump_dp( redeclare package Medium = Medium, m_flow_nominal=m_flow_nominal, redeclare Buildings.Fluid.Movers.Data.Pumps.Wilo.Stratos25slash1to4 per, use_inputFilter=false, heads={0,0.5,1}*dp_nominal, inputType=Buildings.Fluid.Types.InputType.Constant, dp_nominal=dp_nominal, energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState) "Pump with pressure head input"; Buildings.Fluid.FixedResistances.PressureDrop res( redeclare package Medium = Medium, m_flow_nominal=m_flow_nominal, dp_nominal=dp_nominal) "Pressure drop component for avoiding singular system"; parameter Modelica.Units.SI.PressureDifference dp_nominal=10000 "Nominal pressure raise"; equation connect(sou.ports[1], pump_m_flow.port_a); connect(pump_m_flow.port_b, sin.ports[1]); connect(res.port_a, pump_dp.port_b); connect(pump_y.port_b, sin.ports[2]); connect(res.port_b, sin.ports[3]); connect(pump_dp.port_a, sou.ports[2]); connect(pump_y.port_a, sou.ports[3]); end MoverParameter;

Buildings.Fluid.Movers.Examples.MoverStages Buildings.Fluid.Movers.Examples.MoverStages

Example model of movers using an integer input for setting the stage

Buildings.Fluid.Movers.Examples.MoverStages

Information

This example demonstrates the use of the Integer stage connector for a mover model. Note that integer input 1 refers to the first stage, whereas input 0 switches the mover off.

Extends from Buildings.Fluid.Movers.Examples.MoverParameter (Example model of movers using a parameter for setting the stage).

Parameters

TypeNameDefaultDescription
MassFlowRatem_flow_nominal2Nominal mass flow rate [kg/s]
PressureDifferencedp_nominal10000Nominal pressure raise [Pa]

Modelica definition

model MoverStages "Example model of movers using an integer input for setting the stage" extends Buildings.Fluid.Movers.Examples.MoverParameter( pump_m_flow(inputType=Buildings.Fluid.Types.InputType.Stages), pump_y(inputType=Buildings.Fluid.Types.InputType.Stages), pump_dp(inputType=Buildings.Fluid.Types.InputType.Stages)); package Medium = Buildings.Media.Water; parameter Modelica.Units.SI.MassFlowRate m_flow_nominal=2 "Nominal mass flow rate"; Modelica.Blocks.Sources.IntegerTable integerTable(table=[0,1; 0.3,2; 0.6,3]) "Integer step input, 1 is off, 2 is on"; parameter Modelica.Units.SI.PressureDifference dp_nominal=10000 "Nominal pressure raise"; equation connect(integerTable.y, pump_m_flow.stage); connect(integerTable.y, pump_y.stage); connect(integerTable.y, pump_dp.stage); end MoverStages;

Buildings.Fluid.Movers.Examples.PumpsParallel Buildings.Fluid.Movers.Examples.PumpsParallel

Two flow machines in parallel

Buildings.Fluid.Movers.Examples.PumpsParallel

Information

This example tests the configuration of two flow machines that are installed in parallel. Both flow machines start with full speed. At t=150 second, the speed of the flow machine on the top is reduced to zero. As its speed is reduced, the mass flow rate changes its direction in such a way that the flow machine at the top has reverse flow.

Extends from Modelica.Icons.Example (Icon for runnable examples).

Parameters

TypeNameDefaultDescription
MassFlowRatem_flow_nominal1Nominal mass flow rate [kg/s]
Densityrho_nominal1000Density, used to compute fluid mass [kg/m3]

Modelica definition

model PumpsParallel "Two flow machines in parallel" extends Modelica.Icons.Example; package Medium = Buildings.Media.Water "Medium model"; parameter Modelica.Units.SI.MassFlowRate m_flow_nominal=1 "Nominal mass flow rate"; parameter Modelica.Units.SI.Density rho_nominal=1000 "Density, used to compute fluid mass"; Buildings.Fluid.FixedResistances.PressureDrop dpIn1( redeclare package Medium = Medium, dp_nominal=1000, m_flow_nominal=0.5*m_flow_nominal) "Pressure drop"; Buildings.Fluid.Movers.SpeedControlled_y floMac1( redeclare package Medium = Medium, per(pressure(V_flow={0, m_flow_nominal/rho_nominal}, dp={2*4*1000, 0})), energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial) "Model of a flow machine"; Buildings.Fluid.FixedResistances.PressureDrop dpOut1( redeclare package Medium = Medium, dp_nominal=1000, m_flow_nominal=0.5*m_flow_nominal) "Pressure drop"; Buildings.Fluid.Sources.Boundary_pT sou( redeclare package Medium = Medium, use_p_in=false, nPorts=2, T=293.15); Buildings.Fluid.FixedResistances.PressureDrop dpIn( redeclare package Medium = Medium, m_flow_nominal=m_flow_nominal, dp_nominal=1000) "Pressure drop"; Buildings.Fluid.FixedResistances.PressureDrop dpOut3( redeclare package Medium = Medium, m_flow_nominal=m_flow_nominal, dp_nominal=1000) "Pressure drop"; Buildings.Fluid.FixedResistances.PressureDrop dpIn2( redeclare package Medium = Medium, dp_nominal=1000, m_flow_nominal=0.5*m_flow_nominal) "Pressure drop"; Buildings.Fluid.Movers.SpeedControlled_y floMac2( redeclare package Medium = Medium, per(pressure(V_flow={0, m_flow_nominal/rho_nominal}, dp={2*4*1000, 0})), energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, inputType=Buildings.Fluid.Types.InputType.Constant) "Model of a flow machine"; Buildings.Fluid.FixedResistances.PressureDrop dpOut2( redeclare package Medium = Medium, dp_nominal=1000, m_flow_nominal=0.5*m_flow_nominal) "Pressure drop"; Modelica.Blocks.Sources.Step const1( height=-1, offset=1, startTime=150); equation connect(dpIn1.port_b, floMac1.port_a); connect(floMac1.port_b, dpOut1.port_a); connect(sou.ports[1], dpIn.port_a); connect(dpIn.port_b, dpIn1.port_a); connect(dpOut1.port_b, dpOut3.port_a); connect(dpOut3.port_b, sou.ports[2]); connect(dpIn2.port_b,floMac2. port_a); connect(floMac2.port_b,dpOut2. port_a); connect(dpIn.port_b, dpIn2.port_a); connect(dpOut2.port_b, dpOut3.port_a); connect(const1.y, floMac1.y); end PumpsParallel;

Buildings.Fluid.Movers.Examples.PumpsSeries Buildings.Fluid.Movers.Examples.PumpsSeries

Two flow machines in series

Buildings.Fluid.Movers.Examples.PumpsSeries

Information

This example tests the configuration of two flow machines that are installed in series. Both flow machines start with full speed. At t=150 seconds, the speed of the flow machine on the left is reduced to zero. As its speed is reduced, the mass flow rate is reduced. Note that even at zero input, the mass flow rate is non-zero, but the pressure drop of the pump floMac1.dp is positive, which means that this pump has a flow resistance. However, flowMac2.dp is always negative, as this pump has a constant control input of 1.

Extends from Modelica.Icons.Example (Icon for runnable examples).

Parameters

TypeNameDefaultDescription
MassFlowRatem_flow_nominal1Nominal mass flow rate [kg/s]
ThermodynamicStatestate_startMedium.setState_pTX(T=Medium...Start state
Densityrho_nominalMedium.density(state_start)Density, used to compute fluid mass [kg/m3]

Modelica definition

model PumpsSeries "Two flow machines in series" extends Modelica.Icons.Example; package Medium = Buildings.Media.Water; parameter Modelica.Units.SI.MassFlowRate m_flow_nominal=1 "Nominal mass flow rate"; Buildings.Fluid.Movers.SpeedControlled_y floMac1( redeclare package Medium = Medium, per(pressure(V_flow={0, m_flow_nominal/1000}, dp={2*4*1000, 0})), energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState) "Model of a flow machine"; Buildings.Fluid.Sources.Boundary_pT sou( redeclare package Medium = Medium, use_p_in=false, p(displayUnit="Pa") = 300000, T=293.15, nPorts=1); parameter Medium.ThermodynamicState state_start = Medium.setState_pTX( T=Medium.T_default, p=Medium.p_default, X=Medium.X_default) "Start state"; parameter Modelica.Units.SI.Density rho_nominal=Medium.density(state_start) "Density, used to compute fluid mass"; Buildings.Fluid.Movers.SpeedControlled_y floMac2( redeclare package Medium = Medium, per(pressure(V_flow={0, m_flow_nominal/1000}, dp={2*4*1000, 0})), inputType=Buildings.Fluid.Types.InputType.Constant, energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState) "Model of a flow machine"; Modelica.Blocks.Sources.Step const1( height=-1, offset=1, startTime=150); Buildings.Fluid.Sources.Boundary_pT sou1( redeclare package Medium = Medium, use_p_in=false, p(displayUnit="Pa") = 300000 + 4000, T=293.15, nPorts=1); equation connect(const1.y, floMac1.y); connect(floMac1.port_b, floMac2.port_a); connect(sou.ports[1], floMac1.port_a); connect(floMac2.port_b, sou1.ports[1]); end PumpsSeries;

Buildings.Fluid.Movers.Examples.SpeedControlled_y_pumpCurves Buildings.Fluid.Movers.Examples.SpeedControlled_y_pumpCurves

Pumps that illustrates the use of the pump curves

Buildings.Fluid.Movers.Examples.SpeedControlled_y_pumpCurves

Information

This example demonstrates how the pump curves changes for different (constant) input signal y. If y ≥ delta = 0.05, the pump curves are polynomials. For y < delta = 0.05, the pump curves convert to linear functions to avoid a singularity at the origin.

Extends from Modelica.Icons.Example (Icon for runnable examples).

Modelica definition

model SpeedControlled_y_pumpCurves "Pumps that illustrates the use of the pump curves" extends Modelica.Icons.Example; package Medium = Buildings.Media.Water "Medium model"; // For OpenModelica, changed m_flow_nominal to a constant. Otherwise // the translation fails with "Error: Cyclically dependent parameters found" constant Modelica.Units.SI.MassFlowRate m_flow_nominal=0.5 "Nominal mass flow rate"; // For OpenModelica, changed dp_nominal to a constant. Otherwise // the compilation fails. constant Modelica.Units.SI.PressureDifference dp_nominal=10000 "Nominal pressure"; model pumpModel = Buildings.Fluid.Movers.SpeedControlled_y ( redeclare package Medium = Medium, use_inputFilter= false, energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, per( pressure(V_flow=2/1000*m_flow_nominal*{0.2, 0.4, 0.6, 0.8}, dp=dp_nominal*{0.9, 0.85, 0.6, 0.2}))) "Declaration of pump model"; pumpModel pum( inputType=Buildings.Fluid.Types.InputType.Constant, per(constantSpeed=1)) "Pump"; pumpModel pum1( inputType=Buildings.Fluid.Types.InputType.Constant, per(constantSpeed=0.5)) "Pump"; pumpModel pum2( inputType=Buildings.Fluid.Types.InputType.Constant, per(constantSpeed=0.05)) "Pump"; pumpModel pum3( inputType=Buildings.Fluid.Types.InputType.Constant, per(constantSpeed=0.01)) "Pump"; Modelica.Blocks.Sources.Ramp y( offset=1, duration=0.5, startTime=0.25, height=-0.999) "Input signal"; Buildings.Fluid.Sources.Boundary_pT sou( redeclare package Medium = Medium, use_p_in=false, p=300000, T=293.15, nPorts=4); Buildings.Fluid.Sources.Boundary_pT sou1( redeclare package Medium = Medium, use_p_in=false, nPorts=4, p(displayUnit="Pa") = 300000, T=293.15); Buildings.Fluid.Actuators.Valves.TwoWayLinear dp1( redeclare package Medium = Medium, m_flow_nominal=m_flow_nominal, dpValve_nominal=0.01*dp_nominal, use_inputFilter=false) "Pressure drop"; Buildings.Fluid.Actuators.Valves.TwoWayLinear dp2( redeclare package Medium = Medium, m_flow_nominal=m_flow_nominal, dpValve_nominal=0.01*dp_nominal, use_inputFilter=false) "Pressure drop"; Buildings.Fluid.Actuators.Valves.TwoWayLinear dp3( redeclare package Medium = Medium, m_flow_nominal=m_flow_nominal, dpValve_nominal=0.01*dp_nominal, use_inputFilter=false) "Pressure drop"; Buildings.Fluid.Actuators.Valves.TwoWayLinear dp4( redeclare package Medium = Medium, m_flow_nominal=m_flow_nominal, dpValve_nominal=0.01*dp_nominal, use_inputFilter=false) "Pressure drop"; equation connect(dp1.port_b, pum.port_a); connect(dp1.port_a, sou.ports[1]); connect(y.y, dp1.y); connect(dp2.port_b, pum1.port_a); connect(y.y,dp2. y); connect(sou.ports[2], dp2.port_a); connect(dp3.port_b, pum2.port_a); connect(y.y,dp3. y); connect(dp3.port_a, sou.ports[3]); connect(dp4.port_b, pum3.port_a); connect(y.y,dp4. y); connect(dp4.port_a, sou.ports[4]); connect(pum3.port_b, sou1.ports[1]); connect(pum2.port_b, sou1.ports[2]); connect(pum1.port_b, sou1.ports[3]); connect(pum.port_b, sou1.ports[4]); end SpeedControlled_y_pumpCurves;

Buildings.Fluid.Movers.Examples.StaticReset Buildings.Fluid.Movers.Examples.StaticReset

Comparing different computation paths with a static pressure reset

Buildings.Fluid.Movers.Examples.StaticReset

Information

This example model compares the three power computation methods in a scenario where the fan performance (P vs. ) is examined to verify savings of a static pressure reset. The fan speed is controlled to track the duct static pressure at a point downstream while the damper (representing a VAV box) moves from fully closed to fully open. The system was described in Englander and Norford (1992). The fan data are implemented in Buildings.Fluid.Movers.Examples.Data.EnglanderNorford1992.

In the results, P computed from the Euler number and from the power curve agree on the trend of P vs. . Both of them are also able to prevent P from incorrectly going to zero as approaches zero, which the method with constant efficiency failed.

References

Englander, S. L., and L. K. Norford. "Saving fan energy in VAV systems- part 1: analysis of a variable-speed-drive retrofit." ASHRAE Winter Meeting, Anaheim, CA, USA, 01/25-29/92. 1992.

Extends from Modelica.Icons.Example (Icon for runnable examples).

Parameters

TypeNameDefaultDescription
VolumeFlowRateV_flow_nominal21.8Nominal volumetric flow rate of the system [m3/s]
MassFlowRatem_flow_nominalV_flow_nominal/1.2Nominal mass flow rate of the system [kg/s]
PressureDifferencedp_nominal1244.2Nominal pressure rise of the system [Pa]

Modelica definition

model StaticReset "Comparing different computation paths with a static pressure reset" extends Modelica.Icons.Example; package Medium = Buildings.Media.Air; // Fans and their performance records Buildings.Fluid.Movers.SpeedControlled_y fan1( redeclare package Medium = Medium, energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, redeclare Buildings.Fluid.Movers.Examples.Data.EnglanderNorford1992 per( etaHydMet=Buildings.Fluid.Movers.BaseClasses.Types.HydraulicEfficiencyMethod.Power_VolumeFlowRate, etaMotMet=Buildings.Fluid.Movers.BaseClasses.Types.MotorEfficiencyMethod.NotProvided)) "Fan using power curves"; Buildings.Fluid.Movers.SpeedControlled_y fan2( redeclare package Medium = Medium, energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, per( powerOrEfficiencyIsHydraulic=fan1.per.powerOrEfficiencyIsHydraulic, pressure=fan1.per.pressure, etaHydMet=Buildings.Fluid.Movers.BaseClasses.Types.HydraulicEfficiencyMethod.EulerNumber, etaMotMet=Buildings.Fluid.Movers.BaseClasses.Types.MotorEfficiencyMethod.NotProvided, peak( V_flow=23.022856, dp=1211.1604, eta=0.74030644))) "Fan using the Euler number"; Buildings.Fluid.Movers.SpeedControlled_y fan3( redeclare package Medium = Medium, energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial, per( powerOrEfficiencyIsHydraulic=fan1.per.powerOrEfficiencyIsHydraulic, pressure=fan1.per.pressure, etaHydMet=Buildings.Fluid.Movers.BaseClasses.Types.HydraulicEfficiencyMethod.Efficiency_VolumeFlowRate, etaMotMet=Buildings.Fluid.Movers.BaseClasses.Types.MotorEfficiencyMethod.NotProvided, efficiency(eta={0.7}))) "Fan using constant efficiency"; // Define the system curve parameter Modelica.Units.SI.VolumeFlowRate V_flow_nominal=21.8 "Nominal volumetric flow rate of the system"; parameter Modelica.Units.SI.MassFlowRate m_flow_nominal=V_flow_nominal/1.2 "Nominal mass flow rate of the system"; parameter Modelica.Units.SI.PressureDifference dp_nominal=1244.2 "Nominal pressure rise of the system"; // Boundaries Buildings.Fluid.Sources.Boundary_pT sou( redeclare package Medium = Medium, use_p_in=false, p=101325, T=293.15, nPorts=6) "Boundary"; Buildings.Fluid.Sources.Boundary_pT sin( redeclare package Medium = Medium, use_p_in=false, p=101325, T=293.15, nPorts=3) "Boundary"; // Duct pressure drops Buildings.Fluid.FixedResistances.PressureDrop dp11( redeclare package Medium = Medium, m_flow_nominal=m_flow_nominal, dp_nominal=dp_nominal/3) "Duct pressure drop before the static pressure measurement point"; Buildings.Fluid.FixedResistances.PressureDrop dp12( redeclare package Medium = Medium, m_flow_nominal=m_flow_nominal, dp_nominal=dp_nominal/3) "Duct pressure drop after the static pressure measurement point"; Buildings.Fluid.FixedResistances.PressureDrop dp21( redeclare package Medium = Medium, m_flow_nominal=m_flow_nominal, dp_nominal=dp_nominal/3) "Duct pressure drop before the static pressure measurement point"; Buildings.Fluid.FixedResistances.PressureDrop dp22( redeclare package Medium = Medium, m_flow_nominal=m_flow_nominal, dp_nominal=dp_nominal/3) "Duct pressure drop after the static pressure measurement point"; Buildings.Fluid.FixedResistances.PressureDrop dp31( redeclare package Medium = Medium, m_flow_nominal=m_flow_nominal, dp_nominal=dp_nominal/3) "Duct pressure drop before the static pressure measurement point"; Buildings.Fluid.FixedResistances.PressureDrop dp32( redeclare package Medium = Medium, m_flow_nominal=m_flow_nominal, dp_nominal=dp_nominal/3) "Duct pressure drop after the static pressure measurement point"; // PI controllers and components Buildings.Fluid.Sensors.RelativePressure pDucSta1( redeclare package Medium = Medium) "Duct static pressure"; Buildings.Fluid.Sensors.RelativePressure pDucSta2( redeclare package Medium = Medium) "Duct static pressure"; Buildings.Fluid.Sensors.RelativePressure pDucSta3( redeclare package Medium = Medium) "Duct static pressure"; Buildings.Controls.Continuous.LimPID conPID1( Td=1, k=0.5, Ti=15) "PI controller"; Buildings.Controls.Continuous.LimPID conPID2( Td=1, k=0.5, Ti=15) "PI controller"; Buildings.Controls.Continuous.LimPID conPID3( Td=1, k=0.5, Ti=15) "PI controller"; Modelica.Blocks.Math.Gain gai1(k=2/dp_nominal) "Gain"; Modelica.Blocks.Math.Gain gai2(k=2/dp_nominal) "Gain"; Modelica.Blocks.Math.Gain gai3(k=2/dp_nominal) "Gain"; Modelica.Blocks.Sources.Constant y(k=1) "Duct static pressure setpoint (normalised)"; // VAV boxes Actuators.Dampers.Exponential damExp1( redeclare final package Medium = Medium, m_flow_nominal=m_flow_nominal, dpDamper_nominal=dp_nominal/3, y_start=0) "Damper representing a VAV box"; Actuators.Dampers.Exponential damExp2( redeclare final package Medium = Medium, m_flow_nominal=m_flow_nominal, dpDamper_nominal=dp_nominal/3, y_start=0) "Damper representing a VAV box"; Actuators.Dampers.Exponential damExp3( redeclare final package Medium = Medium, m_flow_nominal=m_flow_nominal, dpDamper_nominal=dp_nominal/3, y_start=0) "Damper representing a VAV box"; Modelica.Blocks.Sources.Ramp yDam( height=1, duration=3600, offset=0) "Ramp input for damper position"; equation connect(y.y, conPID3.u_s); connect(pDucSta3.p_rel, gai3.u); connect(gai3.y, conPID3.u_m); connect(conPID3.y, fan3.y); connect(fan3.port_b, dp31.port_a); connect(dp31.port_b, dp32.port_a); connect(fan2.port_b, dp21.port_a); connect(dp21.port_b, dp22.port_a); connect(pDucSta2.p_rel, gai2.u); connect(gai2.y, conPID2.u_m); connect(pDucSta2.port_a, dp22.port_a); connect(y.y, conPID2.u_s); connect(conPID2.y, fan2.y); connect(fan1.port_b, dp11.port_a); connect(dp11.port_b, dp12.port_a); connect(pDucSta1.p_rel,gai1. u); connect(gai1.y,conPID1. u_m); connect(y.y, conPID1.u_s); connect(pDucSta1.port_a, dp12.port_a); connect(conPID1.y, fan1.y); connect(pDucSta3.port_a, dp32.port_a); connect(fan3.port_a, sou.ports[1]); connect(fan2.port_a, sou.ports[2]); connect(fan1.port_a, sou.ports[3]); connect(pDucSta3.port_b, sou.ports[4]); connect(pDucSta2.port_b, sou.ports[5]); connect(pDucSta1.port_b, sou.ports[6]); connect(dp12.port_b, damExp1.port_a); connect(damExp1.port_b, sin.ports[1]); connect(yDam.y, damExp1.y); connect(dp22.port_b,damExp2. port_a); connect(damExp2.port_b, sin.ports[2]); connect(dp32.port_b,damExp3. port_a); connect(damExp3.port_b, sin.ports[3]); connect(yDam.y, damExp2.y); connect(yDam.y, damExp3.y); end StaticReset;

Buildings.Fluid.Movers.Examples.SpeedControlled_y_pumpCurves.pumpModel Buildings.Fluid.Movers.Examples.SpeedControlled_y_pumpCurves.pumpModel

Declaration of pump model

Buildings.Fluid.Movers.Examples.SpeedControlled_y_pumpCurves.pumpModel

Parameters

TypeNameDefaultDescription
replaceable package MediumPartialMediumMedium in the component
BooleanaddPowerToMediumtrueSet to false to avoid any power (=heat and flow work) being added to medium (may give simpler equations)
Control
InputTypeinputTypeBuildings.Fluid.Types.InputT...Control input type
Dynamics
Conservation equations
DynamicsenergyDynamicsModelica.Fluid.Types.Dynamic...Type of energy balance: dynamic (3 initialization options) or steady state
Nominal condition
Timetau1Time constant of fluid volume for nominal flow, used if energy or mass balance is dynamic [s]
Filtered speed
Booleanuse_inputFilterfalse= true, if speed is filtered with a 2nd order CriticalDamping filter
TimeriseTime30Rise time of the filter (time to reach 99.6 % of the speed) [s]
InitinitModelica.Blocks.Types.Init.I...Type of initialization (no init/steady state/initial state/initial output)
Realy_start0Initial value of speed [1]
Initialization
AbsolutePressurep_startMedium.p_defaultStart value of pressure [Pa]
TemperatureT_startMedium.T_defaultStart value of temperature [K]
MassFractionX_start[Medium.nX]Medium.X_defaultStart value of mass fractions m_i/m [kg/kg]
ExtraPropertyC_start[Medium.nC]fill(0, Medium.nC)Start value of trace substances
ExtraPropertyC_nominal[Medium.nC]fill(1E-2, Medium.nC)Nominal value of trace substances. (Set to typical order of magnitude.)
Assumptions
BooleanallowFlowReversaltrue= 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

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)
input IntegerInputstageStage input signal for the pressure head
output RealOutputy_actualActual normalised fan or pump speed that is used for computations [1]
output RealOutputPElectrical power consumed [W]
HeatPort_aheatPortHeat dissipation to environment
input RealInputyConstant normalized rotational speed [1]

Modelica definition

model pumpModel = Buildings.Fluid.Movers.SpeedControlled_y ( redeclare package Medium = Medium, use_inputFilter= false, energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState, per( pressure(V_flow=2/1000*m_flow_nominal*{0.2, 0.4, 0.6, 0.8}, dp=dp_nominal*{0.9, 0.85, 0.6, 0.2}))) "Declaration of pump model";