Ignore:
Timestamp:
Jan 13, 2007, 1:28:33 AM (15 years ago)
Author:
Argimiro Resende Secchi
Message:

Added new example of column using PID controllers.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • mso/sample/stage_separators/sample_column.mso

    r88 r111  
    2727
    2828using "stage_separators/column";
     29using "controllers/PIDIncr";
    2930
    3031# column section with 2 trays
     
    102103        NLASolver = "sundials";
    103104        time = [0:10:1000];
     105       
     106# After running few seconds of transient the steady-state
     107# can be obtained by using the results from that transient:
     108
     109        #guessFile="SectionColumn_Test_with2tray.rlt";
     110        #mode = "steady";
    104111end
    105112
     
    181188        relativeAccuracy = 1e-5;
    182189        time = [0:1:100];
     190        #guessFile="SectionColumn_Test_with8tray.rlt";
     191        #mode = "steady";
    183192end
    184193
     
    270279        relativeAccuracy = 1e-3;
    271280        time = [0:0.01:1, 2:50];
     281        #guessFile="Distillation_kettle_cond_Test.rlt";
     282        #mode = "steady";       
    272283end
     284
     285FlowSheet Column_ctrl
     286        PARAMETERS
     287        PP      as CalcObject(Brief="Physical Properties",File="vrpp");
     288        NComp   as Integer;
     289       
     290        Qcmin as heat_rate (Brief="Minimum Condenser Heat supplied");
     291        Qcmax as heat_rate (Brief="Maximum Condenser Heat supplied");
     292        Qrmin as heat_rate (Brief="Minimum Reboiler Heat supplied");
     293        Qrmax as heat_rate (Brief="Maximum Reboiler Heat supplied");
     294        Frmin as flow_mol (Brief="Minimum bottom flow rate");
     295        Frmax as flow_mol (Brief="Maximum bottom flow rate");
     296        Fcmin as flow_mol (Brief="Minimum reflux flow rate");
     297        Fcmax as flow_mol (Brief="Maximum reflux flow rate");
     298        Hmint as length (Brief="Minimum liquid level in top tank");
     299        Hmaxt as length (Brief="Maximum liquid level in top tank");
     300    Hminb as length (Brief="Minimum liquid level in reboiler");
     301        Hmaxb as length (Brief="Maximum liquid level in reboiler");
     302        Pmax as pressure (Brief="Maximum column pressure");
     303        Pmin as pressure (Brief="Minimum column pressure");
     304        Tmax as temperature (Brief="Maximum column temperature");
     305        Tmin as temperature (Brief="Minimum column temperature");
     306
     307        VARIABLES
     308        Qc as heat_rate (Brief="Heat rate removed from condenser");
     309        Qr as heat_rate (Brief="Heat rate supplied to reboiler");
     310        Had_top as Real (Brief="Dimensionless condenser level");
     311        Had_bot as Real (Brief="Dimensionless reboiler level");
     312        Pad as Real (Brief="Dimensionless pressure");
     313        Tad as Real (Brief="Dimensionless temperature");
     314       
     315        SET
     316        PP.Components = [ "isobutane", "n-pentane", "propylene",
     317                "benzene", "isobutene" ];
     318        PP.LiquidModel = "PR";
     319        PP.VapourModel = "PR";
     320        PP.Derivatives = 1;
     321        NComp = PP.NumberOfComponents;
     322
     323        DEVICES
     324        col as Distillation_kettle_cond;
     325        feed as streamTP;
     326        zero as stream;
     327        TCcond as PIDIncr_Ideal_AW;
     328        LCtop as PIDIncr_Ideal_AW;
     329        LCbot as PIDIncr_Ideal_AW;
     330        PC as PIDIncr_Ideal_AW;
     331
     332        CONNECTIONS
     333        feed to col.trays(5).Inlet;
     334        zero to col.reb.Inlet;
     335        zero to col.trays([1:4]).Inlet;
     336        zero to col.trays([6:col.NTrays]).Inlet;
     337        Qc to col.cond.Q;
     338        Qr to col.reb.Q;
     339
     340        EQUATIONS
     341   "Temperature Controller"
     342        TCcond.Parameters.tau = 0*"s"; 
     343        TCcond.Parameters.tauSet = 0*"s";       
     344        TCcond.Parameters.alpha = 0.3;
     345        TCcond.Parameters.bias = 0.5;   
     346        TCcond.Parameters.gamma = 1;
     347        TCcond.Parameters.beta = 1;
     348        TCcond.Options.action = 1;
     349        TCcond.Options.clip = 1;
     350        TCcond.Options.autoMan = 0;
     351        TCcond.Parameters.intTime = 60*"s";
     352        TCcond.Parameters.gain = 0.6;
     353        TCcond.Parameters.derivTime = 1*"s";
     354        TCcond.Ports.setPoint = ((15+273.15) * "K" - Tmin)/(Tmax-Tmin);
     355        TCcond.Ports.input = Tad;
     356        Tad = (col.cond.OutletL.T-Tmin)/(Tmax-Tmin);
     357        Qc = Qcmin+(Qcmax-Qcmin)*TCcond.Ports.output;   
     358
     359        "Pressure Controller"
     360        PC.Parameters.tau = 0*"s";     
     361        PC.Parameters.tauSet = 0*"s";   
     362        PC.Parameters.alpha = 0.3;
     363        PC.Parameters.bias = 0;
     364        PC.Parameters.gamma = 1;
     365        PC.Parameters.beta = 1;
     366        PC.Options.action = -1;
     367        PC.Options.clip = 1;
     368        PC.Options.autoMan = 0;
     369        PC.Parameters.intTime = 6*"s";
     370        PC.Parameters.gain = 0.5;
     371        PC.Parameters.derivTime = 1*"s";
     372        PC.Ports.setPoint = (2.0*"bar"-Pmin)/(Pmax-Pmin);
     373        PC.Ports.input = Pad;
     374        Pad = (col.cond.OutletV.P-Pmin)/(Pmax-Pmin);
     375        col.cond.OutletV.F = (Fcmin+(Fcmax-Fcmin)*PC.Ports.output);     
     376       
     377        "Ttop Level Controller"
     378        LCtop.Parameters.tau = 0*"s";   
     379        LCtop.Parameters.tauSet = 0*"s";       
     380        LCtop.Parameters.alpha = 0.3;
     381        LCtop.Parameters.bias = 0.5;   
     382        LCtop.Parameters.gamma = 1;
     383        LCtop.Parameters.beta = 1;
     384        LCtop.Options.action = -1;
     385        LCtop.Options.clip = 1;
     386        LCtop.Options.autoMan = 0;
     387        LCtop.Parameters.intTime = 10*"s";
     388        LCtop.Parameters.gain = 1;
     389        LCtop.Parameters.derivTime = 1*"s";
     390        LCtop.Ports.setPoint = (1.0 * "m" - Hmint)/(Hmaxt-Hmint);
     391        LCtop.Ports.input = Had_top;
     392        Had_top = (col.cond.Level-Hmint)/(Hmaxt-Hmint);
     393        col.sptop.Outlet1.F = Fcmin + (Fcmax-Fcmin) * LCtop.Ports.output;
     394
     395        "Tbottom Level Controller"
     396        LCbot.Parameters.tau = 0*"s";   
     397        LCbot.Parameters.tauSet = 0*"s";       
     398        LCbot.Parameters.alpha = 0.3;
     399        LCbot.Parameters.bias = 0.5;   
     400        LCbot.Parameters.gamma = 1;
     401        LCbot.Parameters.beta = 1;
     402        LCbot.Options.action = -1;
     403        LCbot.Options.clip = 1;
     404        LCbot.Options.autoMan = 0;
     405        LCbot.Parameters.intTime = 100*"s";
     406        LCbot.Parameters.gain = 1;
     407        LCbot.Parameters.derivTime = 1*"s";
     408        LCbot.Ports.setPoint = (1.0 * "m" - Hminb)/(Hmaxb-Hminb);
     409        LCbot.Ports.input = Had_bot;
     410        Had_bot = (col.reb.Level-Hminb)/(Hmaxb-Hminb);
     411        col.reb.OutletL.F = Frmin + (Frmax-Frmin) * LCbot.Ports.output;
     412
     413        SPECIFY
     414        feed.F = 113.4 * "kmol/h";
     415        feed.T = 291 * "K";
     416        feed.P = 168.3 * "kPa";
     417        feed.z = 1/NComp;
     418       
     419        zero.F = 0 * "kmol/h";
     420        zero.T = 300 * "K";
     421        zero.P = 1 * "atm";
     422        zero.z = 1/NComp;
     423        zero.v = 0;
     424        zero.h = 0 * "J/mol";
     425       
     426        col.sptop.Outlet2.F = 85 * "kmol/h"; # reflux
     427        Qr = 3e6 * "kJ/h";
     428        col.pump1.dP = 16 * "kPa";
     429        col.trays.Emv = 1;
     430
     431        SET
     432        col.NTrays = 8;
     433        col.cond.V = 2 * "m^3";
     434        col.cond.Across = 1 * "m^2";
     435        col.trays.V = 4 * "ft^3";
     436        col.trays.Ah = 0.394 * "ft^2";
     437        col.trays.lw = 20.94 * "in";
     438        col.trays.hw = 0.125 * "ft";
     439        col.trays.Q = 0 * "kW";
     440        col.trays.beta = 0.6;
     441        col.trays.alfa = 4;
     442        col.trays.Ap = 3.94 * "ft^2";
     443        col.reb.V = 2 * "m^3";
     444        col.reb.Across = 1 * "m^2";
     445
     446        Qrmax = 5e6 * "kJ/h";
     447        Qrmin = 1e6 * "kJ/h";
     448        Frmin = 0 * "kmol/h";
     449        Frmax = 60 * "kmol/h";
     450        Fcmin = 0 * "kmol/h";
     451        Fcmax = 120 * "kmol/h";
     452        Hmint = 0 * "m";
     453        Hmaxt = 2 * "m";
     454        Hminb = 0 * "m";
     455        Hmaxb = 2 * "m";
     456        Pmin = 0.5 * "bar";
     457        Pmax = 4 * "bar";
     458        Qcmax = -5e5 * "kJ/h";
     459        Qcmin = -5e6 * "kJ/h";
     460        Tmax = (30+273.15) * "K";
     461        Tmin = (-20+273.15) * "K";
     462       
     463        INITIAL
     464        # condenser
     465        col.cond.OutletL.T = 260 *"K";
     466        col.cond.Level = 1 * "m";
     467        col.cond.OutletL.z([1:4]) = [0.2, 0.2, 0.4, 0.05];
     468
     469        # reboiler
     470        col.reb.OutletL.T = 350 *"K";
     471        col.reb.Level = 1 * "m";
     472        col.reb.OutletL.z([1:4]) = [0.1, 0.4, 0.1, 0.3];
     473       
     474        # column trays
     475        col.trays.OutletL.T = [290:(330-290)/(col.NTrays-1):330] * "K";
     476        col.trays.Level = 1.2 * col.trays.hw;
     477        col.trays.OutletL.z([1:4]) = [0.15, 0.3, 0.25, 0.2];
     478
     479        OPTIONS
     480        relativeAccuracy = 1e-3;
     481        time = [0:0.01:0.1, 0.11:0.01:2]*"h";
     482        #initialFile = "Column_ctrl.rlt";
     483        #guessFile = "Column_ctrl.rlt";
     484        #mode = "steady";
     485end
     486
Note: See TracChangeset for help on using the changeset viewer.