#*------------------------------------------------------------------- * EMSO Model Library (EML) Copyright (C) 2004 - 2007 ALSOC. * * This LIBRARY is free software; you can distribute it and/or modify * it under the therms of the ALSOC FREE LICENSE as available at * http://www.enq.ufrgs.br/alsoc. * * EMSO Copyright (C) 2004 - 2007 ALSOC, original code * from http://www.rps.eng.br Copyright (C) 2002-2004. * All rights reserved. * * EMSO is distributed under the therms of the ALSOC LICENSE as * available at http://www.enq.ufrgs.br/alsoc. * *-------------------------------------------------------------------- * Sample file for reaction column model *-------------------------------------------------------------------- * * This sample file needs VRTherm (www.vrtech.com.br) to run. * *---------------------------------------------------------------------- * Author: Paula B. Staudt * $Id: sample_columnReact.mso 313 2007-07-14 16:45:55Z arge $ *--------------------------------------------------------------------*# using "controllers/PIDs"; using "stage_separators/column"; FlowSheet Startup_ReactiveDistillation PARAMETERS PP as Plugin(Brief="Physical Properties", Type="PP", Components = [ "acetic acid", "ethanol", "ethyl acetate", "water"], LiquidModel = "UNIFAC", VapourModel = "Ideal" ); NComp as Integer; SET NComp = PP.NumberOfComponents; DEVICES col as ReactiveDistillation; feed as source; zero as stream; PIDLreb as PID; PIDLcond as PID; PIDTreb as PID; PIDTcond as PID; VARIABLES Qc as energy_source(Brief="Condenser Heat supplied"); Qr as energy_source(Brief="Reboiler Heat supplied"); Qcmin as heat_rate (Brief="Condenser Heat supplied"); Qcmax as heat_rate (Brief="Condenser Heat supplied"); Qrmin as heat_rate (Brief="Reboiler Heat supplied"); Qrmax as heat_rate (Brief="Reboiler Heat supplied"); Fmin as flow_mol; Fmax as flow_mol; Frmin as flow_mol; Frmax as flow_mol; Lreb_ad as Real; Lrebmin as length; Lrebmax as length; Lcond_ad as Real; Lcondmin as length; Lcondmax as length; Treb_ad as Real; Trebmin as temperature; Trebmax as temperature; Tcond_ad as Real; Tcondmin as temperature; Tcondmax as temperature; CONNECTIONS feed.Outlet to col.trays(5).Inlet; zero to col.reb.Inlet; zero to col.trays([1:4]).Inlet; zero to col.trays([6:col.NTrays]).Inlet; Qc.OutletQ to col.cond.InletQ; Qr.OutletQ to col.reb.InletQ; EQUATIONS col.sp.frac = 0.09; #verificando a partida do refervedor if time < 400 * 's' then col.reb.startup = 1; else col.reb.startup = 0; end if col.reb.startup then Qc.OutletQ.Q = 0 * PIDTcond.Ports.output * 'kJ/s'; Qr.OutletQ.Q = 0 * PIDTreb.Ports.output * 'kJ/s'; PIDTreb.Ports.input = PIDTreb.Ports.setPoint; else Qc.OutletQ.Q = Qcmin+(Qcmax-Qcmin)*PIDTcond.Ports.output; Qr.OutletQ.Q = Qrmin+(Qrmax-Qrmin)*PIDTreb.Ports.output; PIDTreb.Ports.input=Treb_ad; end SPECIFY feed.Outlet.F = 1.076 * 'mol/s'; feed.Outlet.T = 300 * 'K'; feed.Outlet.P = 1.0 * 'atm'; feed.Outlet.z = [0.4962, 0.4808, 0, 0.0229]; zero.F = 0 * 'kmol/h'; zero.T = 353 * 'K'; zero.P = 1 * 'atm'; zero.z = [0.4962, 0.4808, 0, 0.0229]; zero.v = 0; zero.h = 0 * 'J/mol'; col.p.dP = 0.95 * 'atm' - col.sp.Outlet2.P; col.trays.Emv = 1; # Variáveis dos PID's especificadas PIDLreb.Parameters.tau = 1*'s'; PIDLreb.Parameters.tauSet=1*'s'; PIDLreb.Parameters.bias = 0; PIDLreb.Parameters.alpha=1; PIDLreb.Parameters.gamma=1; PIDLreb.Parameters.beta=1; PIDLreb.Parameters.gain=1; PIDLreb.Parameters.intTime=10*'s'; PIDLreb.Parameters.derivTime=1*'s'; PIDLreb.Options.action=-1; PIDLreb.Options.clip=1; PIDLreb.Options.autoMan=0; PIDLreb.Ports.setPoint=(0.5 * 'm' - Lrebmin)/(Lrebmax-Lrebmin); Lreb_ad*(Lrebmax-Lrebmin)=col.reb.Level-Lrebmin; PIDLreb.Ports.input=Lreb_ad; col.reb.OutletL.F = Frmin + (Frmax-Frmin) * PIDLreb.Ports.output; PIDLcond.Parameters.tau = 1*'s'; PIDLcond.Parameters.tauSet=1*'s'; PIDLcond.Parameters.bias = 0.5; PIDLcond.Parameters.alpha=1; PIDLcond.Parameters.gamma=1; PIDLcond.Parameters.beta=1; PIDLcond.Parameters.gain=1; PIDLcond.Parameters.intTime=10*'s'; PIDLcond.Parameters.derivTime=1*'s'; PIDLcond.Options.action=-1; PIDLcond.Options.clip=1; PIDLcond.Options.autoMan=0; PIDLcond.Ports.setPoint=(0.5 * 'm' - Lcondmin)/(Lcondmax-Lcondmin); Lcond_ad*(Lcondmax-Lcondmin)=col.cond.Level-Lcondmin; PIDLcond.Ports.input=Lcond_ad; col.sp.Outlet1.F = Fmin + (Fmax-Fmin) * PIDLcond.Ports.output; PIDTreb.Parameters.tau = 1*'s'; PIDTreb.Parameters.tauSet=1*'s'; PIDTreb.Parameters.bias = 0.2; PIDTreb.Parameters.alpha=0.2; PIDTreb.Parameters.gamma=1; PIDTreb.Parameters.beta=1; PIDTreb.Parameters.gain=0.9; PIDTreb.Parameters.intTime=100*'s'; PIDTreb.Parameters.derivTime=1*'s'; PIDTreb.Options.action=1; PIDTreb.Options.clip=1; PIDTreb.Options.autoMan=0; PIDTreb.Ports.setPoint= (366 * 'K' - Trebmin)/(Trebmax-Trebmin); Treb_ad*(Trebmax-Trebmin)=col.reb.OutletL.T-Trebmin; PIDTcond.Parameters.tau = 1*'s'; PIDTcond.Parameters.tauSet=1*'s'; PIDTcond.Parameters.bias = 0.5; PIDTcond.Parameters.alpha=0.2; PIDTcond.Parameters.gamma=1; PIDTcond.Parameters.beta=1; PIDTcond.Parameters.gain=1; PIDTcond.Parameters.intTime=10*'s'; PIDTcond.Parameters.derivTime=1*'s'; PIDTcond.Options.action=1; PIDTcond.Options.clip=1; PIDTcond.Options.autoMan=0; PIDTcond.Ports.setPoint= (346 * 'K' - Tcondmin)/(Tcondmax-Tcondmin); Tcond_ad*(Tcondmax-Tcondmin)=col.cond.OutletL.T-Tcondmin; PIDTcond.Ports.input=Tcond_ad; "Valores limites para normalizações" Lrebmax=0.8*'m'; Lrebmin=0.1*'m'; Lcondmax=0.8*'m'; Lcondmin=0.1*'m'; Trebmax=400*'K'; Trebmin=200*'K'; Tcondmax=380*'K'; Tcondmin=250*'K'; Qcmin = -100 * 'kJ/s'; Qcmax = 0 * 'kJ/s'; Qrmin = 0 * 'kJ/s'; Qrmax = 150 * 'kJ/s'; Fmin = 0 * 'kmol/h'; Fmax = 2 * 'kmol/h'; Frmin = 0 * 'kmol/h'; Frmax = 5 * 'kmol/h'; col.cond.OutletV.F = 0 * 'kmol/h'; SET PIDLreb.PID_Select = "Ideal_AW"; PIDLcond.PID_Select = "Ideal_AW"; PIDTreb.PID_Select = "Ideal_AW"; PIDTcond.PID_Select = "Ideal_AW"; col.NTrays = 11; col.trays.stoic = [-1, -1, 1, 1]; col.cond.stoic = [-1, -1, 1, 1]; col.reb.stoic = [-1, -1, 1, 1]; col.cond.V = 6 * 'l'; col.cond.Across = 6 * 'l/m'; col.trays.V = 0.0961 * 'm^3'; col.trays.Ah = 0.04 * 'm^2'; col.trays.lw = 0.457 * 'm'; col.trays.hw = 0.05 * 'm'; col.trays.Q = 0 * 'kW'; col.trays.beta = 0.8; col.trays.alfa = 30; col.alfacond = 100000; col.trays.Ap = 0.07 * 'm^2'; col.trays.Hr = 0 * 'kJ/mol'; col.cond.Hr = 0 * 'kJ/mol'; col.reb.Hr = 0 * 'kJ/mol'; col.reb.V = 20 * 'l'; col.reb.Across = 20 * 'l/m'; col.reb.Pstartup = 1 * 'atm'; col.trays.Pstartup = 1 * 'atm'; col.cond.Pstartup = 1 * 'atm'; INITIAL # condenser col.cond.OutletL.T = 300 *'K'; col.cond.Level = 0.1 * 'm'; col.cond.OutletL.z([1:3]) = [0.4962, 0.4808, 0]; # reboiler col.reb.OutletL.T = 300 * 'K'; col.reb.Level = 0.1 * 'm'; col.reb.OutletL.z([1:3]) = [0.4962, 0.4808, 0]; # column trays col.trays.OutletL.T = 300 * 'K'; col.trays.Level = 0.1 * col.trays.hw; col.trays.OutletL.z([1:3]) = [0.4962, 0.4808, 0]; OPTIONS TimeStep = 100; TimeEnd = 50000; end