Buildings.Fluid.CHPs.OrganicRankine.Examples
Package containing example models
Information
This package contains examples.
Extends from Modelica.Icons.ExamplesPackage (Icon for packages containing runnable examples).
Package Content
Name | Description |
---|---|
![]() |
ORC that outputs hot water at a fixed temperature |
Buildings.Fluid.CHPs.OrganicRankine.Examples.ORCHotWater
ORC that outputs hot water at a fixed temperature
Information
This example model demonstrates how Buildings.Fluid.CHPs.OrganicRankine.ConstantEvaporation can be integrated in a system. The three-way valve is controlled to track the hot water output temperature, which is the cold fluid of the ORC, at a set point of 55°C. In addition, a safety control sequence prevents the ORC from turning on until a minimum flow rate is established in the condenser water loop.
Extends from Modelica.Icons.Example (Icon for runnable examples).
Parameters
Type | Name | Default | Description |
---|---|---|---|
MassFlowRate | mHot_flow_nominal | 1 | Nominal mass flow rate of evaporator hot fluid [kg/s] |
MassFlowRate | mCol_flow_nominal | 1.35 | Nominal mass flow rate of condenser cold fluid [kg/s] |
PressureDifference | dpCon_nominal | 10000 | Nominal pressure drop across the ORC condenser [Pa] |
PressureDifference | dpValCol_nominal | 10000 | Nominal pressure difference used for valves in the cold fluid loop [Pa] |
ThermodynamicTemperature | TCol_start | 35 + 273.15 | Start value for cold fluid temperature [K] |
Modelica definition
model ORCHotWater "ORC that outputs hot water at a fixed temperature"
extends Modelica.Icons.Example;
package MediumHot = Buildings.Media.Air "Evaporator hot fluid";
package MediumCol = Buildings.Media.Water "Condenser cold fluid";
parameter Modelica.Units.SI.MassFlowRate mHot_flow_nominal = 1
"Nominal mass flow rate of evaporator hot fluid";
parameter Modelica.Units.SI.MassFlowRate mCol_flow_nominal = 1.35
"Nominal mass flow rate of condenser cold fluid";
parameter Modelica.Units.SI.PressureDifference dpCon_nominal(
displayUnit = "Pa") = 10000
"Nominal pressure drop across the ORC condenser";
parameter Modelica.Units.SI.PressureDifference dpValCol_nominal(
displayUnit = "Pa") = 10000
"Nominal pressure difference used for valves in the cold fluid loop";
parameter Modelica.Units.SI.ThermodynamicTemperature TCol_start = 35 + 273.15
"Start value for cold fluid temperature";
Buildings.Fluid.CHPs.OrganicRankine.ConstantEvaporation orc(
redeclare final package Medium1 = MediumHot,
redeclare final package Medium2 = MediumCol,
T2_start=TCol_start,
redeclare Buildings.Fluid.CHPs.OrganicRankine.Data.WorkingFluids.R123 pro,
final mHot_flow_nominal=mHot_flow_nominal,
dTPinEva_set=5,
TWorEva=373.15,
pWorEva(displayUnit="bar"),
final mCol_flow_nominal=mCol_flow_nominal,
dpHot_nominal=0,
dpCol_nominal=0,
dTPinCon=5,
mWor_flow_max=0.5,
mWor_flow_min=0.1,
mWor_flow_hysteresis=0.05,
etaExp=0.8,
etaPum=0.6) "Organic Rankine cycle";
Buildings.Fluid.Sources.MassFlowSource_T souHot(
redeclare final package Medium = MediumHot,
m_flow=mHot_flow_nominal,
T=423.15,
nPorts=1) "Evaporator hot fluid source";
Buildings.Fluid.Sources.Boundary_pT sinHot(
redeclare final package Medium = MediumHot,
nPorts=1) "Evaporator hot fluid sink";
Buildings.Controls.Continuous.LimPID conPI(
controllerType=Modelica.Blocks.Types.SimpleController.PI,
k=0.25,
Ti=30,
Ni=0.2,
initType=Modelica.Blocks.Types.Init.InitialOutput,
y_start=0,
reverseActing=false) "PI controller";
Modelica.Blocks.Sources.Constant TWatOut_set(k=55 + 273.15)
"Set point of hot water output";
Buildings.Fluid.Sources.Boundary_pT colBou(
redeclare final package Medium = MediumCol,
use_T_in=true,
nPorts=2) "Cold fluid boundary conditions";
Buildings.Fluid.Sensors.TemperatureTwoPort senTWatSup(
redeclare final package Medium = MediumCol,
m_flow_nominal=mCol_flow_nominal,
T_start=TCol_start)
"Water supply temperature";
Buildings.Fluid.Sensors.TemperatureTwoPort senTWatRet(
redeclare final package Medium = MediumCol,
m_flow_nominal=mCol_flow_nominal,
T_start=TCol_start)
"Water return temperature";
Modelica.Blocks.Sources.TimeTable TWatRet(
y(final unit="K", displayUnit="degC"),
table=[0,35; 3,35; 6,45; 9,45],
timeScale=100,
offset=273.15) "Water return temperature values";
Buildings.Fluid.Actuators.Valves.ThreeWayEqualPercentageLinear val(
redeclare final package Medium = MediumCol,
energyDynamics=Modelica.Fluid.Types.Dynamics.FixedInitial,
T_start=TCol_start,
from_dp=false,
use_strokeTime=false,
final m_flow_nominal=mCol_flow_nominal,
final dpValve_nominal=dpValCol_nominal,
final dpFixed_nominal=fill(dpCon_nominal, 2)) "Control valve";
Buildings.Fluid.Movers.Preconfigured.FlowControlled_m_flow pum(
redeclare final package Medium = MediumCol,
energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState,
T_start=TCol_start,
addPowerToMedium=false,
m_flow_nominal=mCol_flow_nominal,
dp_nominal=dpCon_nominal + dpValCol_nominal,
m_flow_start=0) "Cooling water pump";
Buildings.Fluid.FixedResistances.Junction spl(
redeclare final package Medium = MediumCol,
energyDynamics=Modelica.Fluid.Types.Dynamics.SteadyState,
final dp_nominal=fill(0,3),
final m_flow_nominal=mCol_flow_nominal .* {1,-1,-1},
final from_dp=false,
T_start=TCol_start) "Flow splitter";
Modelica.Blocks.Math.BooleanToReal booToRea(
realTrue = mCol_flow_nominal)
"Constant speed primary pump control signal";
Modelica.Blocks.Logical.Hysteresis hys(
uLow=mCol_flow_nominal/3,
uHigh=mCol_flow_nominal/2) "Hysteresis";
Modelica.Blocks.Logical.And and1;
Buildings.Fluid.Sensors.TemperatureTwoPort senTColOut(
redeclare final package Medium = MediumCol,
m_flow_nominal=mCol_flow_nominal,
T_start=TCol_start);
Buildings.Fluid.Sensors.MassFlowRate senMasFlo(
redeclare final package Medium = MediumCol)
"Mass flow rate sensor for the ORC condenser cold fluid";
Modelica.Blocks.Sources.BooleanTable booTab(table={100}, startValue=false)
"Boolean table with initial false";
equation
connect(orc.port_b1, sinHot.ports[1]);
connect(souHot.ports[1], orc.port_a1);
connect(TWatOut_set.y, conPI.u_s);
connect(colBou.ports[1], senTWatSup.port_b);
connect(senTWatRet.port_a, colBou.ports[2]);
connect(TWatRet.y, colBou.T_in);
connect(senTWatRet.port_b, val.port_1);
connect(spl.port_3, val.port_3);
connect(spl.port_2, senTWatSup.port_a);
connect(conPI.y, val.y);
connect(and1.y, orc.ena);
connect(orc.port_b2,senTColOut. port_a);
connect(senTColOut.port_b, pum.port_a);
connect(senTColOut.T, conPI.u_m);
connect(val.port_2, orc.port_a2);
connect(pum.m_flow_in, booToRea.y);
connect(spl.port_1, senMasFlo.port_b);
connect(senMasFlo.port_a, pum.port_b);
connect(booTab.y, booToRea.u);
connect(booTab.y, and1.u2);
connect(hys.y, and1.u1);
connect(senMasFlo.m_flow, hys.u);
end ORCHotWater;