Rankine ciclo
Configuración del ciclo
Modelaremos el ciclo, incluido el agua de enfriamiento del condensador. Para esto
empezar con el Network
Configurar que ya sabemos.
>>from tespy.networks import Network
>># create a network object with R134a as fluid
>>my_plant = Network()
>>my_plant.set_attr(T_unit='C', p_unit='bar', h_unit='kJ / kg')
A continuación, creamos los componentes y los conectamos. El Condenser
tiene
Una entrada y salida laterales calientes, así como una entrada y salida lateral fría. El caliente
El lado se indica utilizando el índice 1 para la entrada y la salida in1
y
out1
, el lado frío usa el índice 2 ( in2
y out2
).
Nuevamente, para el ciclo termodinámico cerrado tenemos que insertar un ciclo más cercano. El
La entrada de agua de enfriamiento y la salida de agua de enfriamiento del condensador son directamente
conectado a un Source
y un Sink
respectivamente.
>>from tespy.components import ( CycleCloser, Pump, Condenser, Turbine, SimpleHeatExchanger, Source, Sink ) >>cc = CycleCloser('cycle closer') >>sg = SimpleHeatExchanger('steam generator') >>mc = Condenser('main condenser') >>tu = Turbine('steam turbine') >>fp = Pump('feed pump') >>cwso = Source('cooling water source') >>cwsi = Sink('cooling water sink') >>from tespy.connections import Connection >>c1 = Connection(cc, 'out1', tu, 'in1', label='1') >>c2 = Connection(tu, 'out1', mc, 'in1', label='2') >>c3 = Connection(mc, 'out1', fp, 'in1', label='3') >>c4 = Connection(fp, 'out1', sg, 'in1', label='4') >>c0 = Connection(sg, 'out1', cc, 'in1', label='0') >>my_plant.add_conns(c1, c2, c3, c4, c0) >>c11 = Connection(cwso, 'out1', mc, 'in2', label='11') >>c12 = Connection(mc, 'out2', cwsi, 'in1', label='12') >>my_plant.add_conns(c11, c12)
Para los parámetros, predefinimos las pérdidas de presión en los intercambiadores de calor.
Para el condensador, se descuidan las pérdidas de presión lateral caliente pr1=1
,
Para el lado del agua de enfriamiento asumimos una pérdida de presión del 2 % pr2=0.98
. El
El generador de vapor inflige una pérdida de presión del 10 %.
La turbina y la bomba de alimentación tendrán la eficiencia isentrópica especificada. Para Los parámetros de conexión, el fluido debe definirse tanto en el ciclo principal y el sistema de agua de enfriamiento. Además, la temperatura del vapor vivo, la presión y se establecen flujo de masa. Por último, establecemos el nivel de presión de condensación y el La temperatura de flujo de alimentación y retorno del agua de enfriamiento, así como su alimento presión.
>>mc.set_attr(pr1=1, pr2=0.98) >>sg.set_attr(pr=0.9) >>tu.set_attr(eta_s=0.9) >>fp.set_attr(eta_s=0.75) >>c11.set_attr(T=20, p=1.2, fluid={'water': 1}) >>c12.set_attr(T=30) >>c1.set_attr(T=600, p=150, m=10, fluid={'water': 1}) >>c2.set_attr(p=0.1) >>my_plant.solve(mode='design') >>my_plant.print_results()
Después de ejecutar la simulación, por ejemplo, podemos observar la temperatura
Diferencias en el condensador. En lugar de establecer directamente un valor de presión para
condensación, también podríamos establecer la diferencia de temperatura terminal superior
ttd_u
en cambio. Se define como la temperatura de condensación para enfriar
Temperatura de flujo de retorno de agua.
Consejo
Encontrará la documentación de cada ecuación de los componentes en el
respectivo Seccion de la documentación de la API. Por ejemplo, el condensador
tespy.components.heat_exchangers.condenser.Condenser
.
>>mc.set_attr(ttd_u=4)
>>c2.set_attr(p=None)
>>my_plant.solve(mode='design')
>>my_plant.print_results()
Después de volver a sincero, veremos que la temperatura y la presión de la condensación ambos se calculan automáticamente por el valor de temperatura terminal especificado.
Generación del diagrama TS
Para visualizar el ciclo Rankine, generamos una temperatura (t) versus entropía (s) Diagrama utilizando el paquete FluProdia (Diagrama de propiedad de fluido).
>># Adding feature to plot the T-s Diagram using fluprodia library >># Importing necessary library >>import matplotlib.pyplot as plt >>import numpy as np >>from fluprodia import FluidPropertyDiagram >># Initial Setup >>diagram = FluidPropertyDiagram('water') >>diagram.set_unit_system(T='°C', p='bar', h='kJ/kg') >># Storing the model result in the dictionary >>result_dict = {} >>result_dict.update( {cp.label: cp.get_plotting_data()[1] for cp in my_plant.comps['object'] if cp.get_plotting_data() is not None}) >># Iterate over the results obtained from TESPy simulation >>for key, data in result_dict.items(): >> # Calculate individual isolines for T-s diagram >> result_dict[key]['datapoints'] = diagram.calc_individual_isoline(**data) >># Create a figure and axis for plotting T-s diagram >>fig, ax = plt.subplots(1, figsize=(20, 10)) >>isolines = { 'Q': np.linspace(0, 1, 2), 'p': np.array([1, 2, 5, 10, 20, 50, 100, 300]), 'v': np.array([]), 'h': np.arange(500, 3501, 500) } >># Set isolines for T-s diagram >>diagram.set_isolines(**isolines) >>diagram.calc_isolines() >># Draw isolines on the T-s diagram >>diagram.draw_isolines(fig, ax, 'Ts', x_min=0, x_max=7500, y_min=0, y_max=650) >># Adjust the font size of the isoline labels >>for text in ax.texts: >> text.set_fontsize(10) >># Plot T-s curves for each component >>for key in result_dict.keys(): >> datapoints = result_dict[key]['datapoints'] >> _ = ax.plot(datapoints['s'], datapoints['T'], color='#ff0000', linewidth=2) >> _ = ax.scatter(datapoints['s'][0], datapoints['T'][0], color='#ff0000') >># Set labels and title for the T-s diagram >>ax.set_xlabel('Entropy, s in J/kgK', fontsize=16) >>ax.set_ylabel('Temperature, T in °C', fontsize=16) >>ax.set_title('T-s Diagram of Rankine Cycle', fontsize=20) >># Set font size for the x-axis and y-axis ticks >>ax.tick_params(axis='x', labelsize=12) >>ax.tick_params(axis='y', labelsize=12) >>plt.tight_layout() >># Save the T-s diagram plot as an SVG file >>fig.savefig('rankine_ts_diagram.svg')
Los pasos involucrados en la generación del diagrama TS son los siguientes:
Importar el paquete: importar fluProdia y crear un objeto pasando el Alias del fluido.
Especifique el sistema de la unidad: configure el sistema unitario para todas las propiedades de fluido.
Especifique los aislados personalizados: defina los aislines personalizados para el diagrama.
Calcule y dibuje los isolinas: calcule y dibuje las isolinas de fondo.
Calcular y dibujar puntos de proceso y cambio de estado
Guarde y exporte el diagrama: guarde y exporte el diagrama TS completo.
Además de la visualización, esta característica también es útil para fines de análisis. Por ejemplo, si el diagrama TS forma un circuito cerrado, validando la precisión de El modelo y que el fluido operativo completa un ciclo exitoso de Rankine. Por Aplicando FluProdia, podemos crear y personalizar diferentes tipos de diagramas para Todos los fluidos puros y pseudo pure disponibles en Coolprop. Para más información sobre fluProdia, remitimos a los usuarios al Documentación de Fluprodia .
Evaluar la energía eléctrica
Para evaluar la potencia de salida eléctrica, queremos considerar la potencia generada
por la turbina, así como la potencia requerida para conducir la bomba de alimentación. Es
posible incluir ambos valores de potencia del componente en un solo electricidad
Bus
. Podemos hacer esto importando el
tespy.connections.bus.Bus
clase, crear una instancia y agregar
Ambos componentes del bus.
>>from tespy.connections import Bus >>powergen = Bus("electrical power output") >>powergen.add_comps( {"comp": tu, "char": 0.97, "base": "component"}, {"comp": fp, "char": 0.97, "base": "bus"}, ) >>my_plant.add_busses(powergen) >>my_plant.solve(mode='design') >>my_plant.print_results()
Nota
El Bus
pueden tomar componentes que producen o consumen energía.
Especificación 'base': 'bus'
significa que el valor de eficiencia es
referenciado a la energía eléctrica
`W =`Welec * n
Mientras especifica 'base': 'component'
(predeterminado) toma el componente
potencia como valor base.
`Welec = `W * n
Los resultados para el bus se imprimen por separado. Observe que el vapor
Producción de energía eléctrica de la turbina ( bus value
) es más bajo que el
component value
mientras está invertido para la bomba de alimentación.
También puede establecer la producción total deseada de energía del sistema, por ejemplo Reemplazo de la especificación de flujo de masa en la conexión 1:
>>powergen.set_attr(P=-10e6) >>c1.set_attr(m=None) >>my_plant.solve(mode='design') >>my_plant.print_results()
Analizar la eficiencia y la generación de energía
En esta sección, analizaremos la producción de energía y la eficiencia del ciclo, dado el flujo de masa de vapor constante y con valores variables para el
presión de vapor viva,
temperatura de vapor vivo y
Nivel de temperatura del agua de enfriamiento.
Para hacer eso, estamos utilizando una configuración muy similar como se ha utilizado en el
Tutorial de la bomba de calor . Para el agua de alimentación
Nivel de temperatura queremos establecer el cambio de temperatura en el condensador
a un valor constante. Además, tenemos que desastar la especificación de generación de energía
de nuevo y use un flujo de masa constante en su lugar. Con iterinfo=False
nosotros
puede deshabilitar la impresión de la historia de convergencia.
>>my_plant.set_attr(iterinfo=False) >>c1.set_attr(m=20) >>powergen.set_attr(P=None) >># make text reasonably sized >>plt.rc('font', **{'size': 18}) >>data = { 'T_livesteam': np.linspace(450, 750, 7), 'T_cooling': np.linspace(15, 45, 7), 'p_livesteam': np.linspace(75, 225, 7) } >>eta = { 'T_livesteam': [], 'T_cooling': [], 'p_livesteam': [] } >>power = { 'T_livesteam': [], 'T_cooling': [], 'p_livesteam': [] } >>for T in data['T_livesteam']: >> c1.set_attr(T=T) >> my_plant.solve('design') >> eta['T_livesteam'] += [abs(powergen.P.val) / sg.Q.val * 100] >> power['T_livesteam'] += [abs(powergen.P.val) / 1e6] >># reset to base temperature >>c1.set_attr(T=600) >>for T in data['T_cooling']: >> c12.set_attr(T=T) >> c11.set_attr(T=T - 10) >> my_plant.solve('design') >> eta['T_cooling'] += [abs(powergen.P.val) / sg.Q.val * 100] >> power['T_cooling'] += [abs(powergen.P.val) / 1e6] >># reset to base temperature >>c12.set_attr(T=30) c11.set_attr(T=20) >>for p in data['p_livesteam']: >> c1.set_attr(p=p) >> my_plant.solve('design') >> eta['p_livesteam'] += [abs(powergen.P.val) / sg.Q.val * 100] >> power['p_livesteam'] += [abs(powergen.P.val) / 1e6] >># reset to base pressure >>c1.set_attr(p=150) >>fig, ax = plt.subplots(2, 3, figsize=(16, 8), sharex='col', sharey='row') >>ax = ax.flatten() >>[a.grid() for a in ax] >>i = 0 >>for key in data: >> ax[i].scatter(data[key], eta[key], s=100, color="#1f567d") >> ax[i + 3].scatter(data[key], power[key], s=100, color="#18a999") >> i += 1 >>ax[0].set_ylabel('Efficiency in %') >>ax[3].set_ylabel('Power in MW') >>ax[3].set_xlabel('Live steam temperature in °C') >>ax[4].set_xlabel('Feed water temperature in °C') >>ax[5].set_xlabel('Live steam pressure in bar') >>plt.tight_layout() >>fig.savefig('rankine_parametric-darkmode.svg') >>plt.close()
Figura: Análisis paramétrico de la eficiencia y potencia de salida
Simulación de carga de pieza
En la parte de simulación de carga de pieza, estamos comenzando con un diseño específico de la plante y calcule el rendimiento de la carga de piezas con algunos supuestos sobre el comportamiento individual del componente. La siguiente tabla resume los supuestos, que mantendremos lo más simple posible en este momento. Para más ideas Eche un vistazo al paso a paso Tutorial de la bomba de calor o en el Documentación de red .
Componente |
Suposiciones |
Ajustes |
---|---|---|
Turbina |
Se aplica la ley de cono |
presión de entrada no Aplicar la ley de cono |
Condensador |
transferencia de calor constante coeficiente |
temperatura terminal no diferencia y calentar el calor coeficiente de transferencia |
Enfriamiento agua |
flujo volumétrico constante |
Temperatura de retorno no establecida valor y establecer flujo volumétrico |
Con estas especificaciones, la siguiente física se aplica al modelo:
Debido al flujo volumétrico constante de agua, la temperatura del enfriamiento El agua que regresa del condensador reaccionará al calor total transferido En la condensación: el aumento de la transferencia de calor significa aumentar la temperatura, La disminución de la transferencia de calor significa disminución de la temperatura.
El coeficiente de transferencia de calor constante del condensador calculará el temperatura de condensación (y por lo tanto presión) basada en la temperatura régimen en el lado del agua de enfriamiento:
El aumento de la temperatura para el agua de enfriamiento conduce al aumento de Temperatura de condensación (a transferencia de calor constante).
Aumento de la transferencia de calor significa aumentar la temperatura necesaria diferencia en el condensador (a temperatura de entrada de agua de enfriamiento constante).
La ley del cono es un modelo matemático para predecir la presión en la turbina Entrada basada en la desviación de las condiciones de diseño. Generalmente, El aumento del flujo de masa conduce a una mayor presión de entrada (en la entrada constante temperatura y presión de salida constante). Sin embargo, esta ecuación es más complejo, ya que hay muchos más parámetros involucrados en comparación con el otro Ecuaciones aplicadas.
Para aplicar estas especificaciones, podemos usar el design
y
offdesign
Palabras clave. La palabra clave design
desastres el especificado
Datos en la lista en un cálculo de diseño fuera de lugar. La palabra clave offdesign
Establece automáticamente el parámetro respectivo para el cálculo de designación. En
Caso La especificación se refiere a un valor, el valor se toma del diseño
Cálculo de modo. En el ejemplo, se calcula el valor KA del condensador principal
en la simulación de diseño y su valor se mantendrá constante a través del
Simulaciones de designación.
>>mc.set_attr(design=["ttd_u"], offdesign=["kA"])
>>c11.set_attr(offdesign=["v"])
>>c12.set_attr(design=["T"])
>>c1.set_attr(design=["p"])
>>tu.set_attr(offdesign=["cone"])
Tenemos que guardar el estado de diseño de la red y ejecutar el solve
método con el design_path
especificado.
>>my_plant.solve("design")
>>my_plant.save("rankine_design.json")
Finalmente, podemos alterar el flujo de masa desde su valor de diseño de 20 kg/s hasta solo 50 % de su valor. En este ejemplo, calculamos la eficiencia y la presentamos.
>>partload_efficiency = []
>>partload_m_range = np.linspace(20, 10, 11)
>>for m in partload_m_range:
>> c1.set_attr(m=m)
>> my_plant.solve("offdesign", design_path="rankine_design.json")
>> partload_efficiency += [abs(powergen.P.val) / sg.Q.val * 100]
>>fig, ax = plt.subplots(1, figsize=(16, 8))
>>ax.grid()
>>ax.scatter(partload_m_range, partload_efficiency, s=100, color="#1f567d")
>>ax.set_xlabel("Mass flow in kg/s")
>>ax.set_ylabel("Plant electrical efficiency in %")
>>plt.tight_layout()
>>fig.savefig('rankine_partload.svg')
>>plt.close()
Figura: carga de carga eficiencia eléctrica del ciclo Rankine
No hay comentarios.:
Publicar un comentario