Name | Description |
---|---|
batchReacLiqAtoP | Batch reactor model |
batchReacLiqAtoPControlled | Open loop system + PID controller (the liquid level inside the reactor is controlled by manipulating the liquid input flow) |
![]() | Open loop system. Input: set-point of the pump liquid flow. Output: volume of the liquid inside the reactor |
Type | Name | Default | Description |
---|---|---|---|
Integer | nComp | 3 | Component number of the liquid mixture |
Integer | numChR | 1 | Number of irreversible chemical reactions |
Boolean | Ejs | false | |
Boolean | Sysquake | true | |
Real | molecWeightInitial[nComp] | {0.1,0.018,0.1} | Molecular weight [Kg/mol] |
Real | densityInitial[nComp] | {1E3,1E3,1E3} | Components density [Kg/m3] |
Real | stoichCoefInitial[numChR, nComp] | [-1, 0, 1] | Stoich coeffs. |
Real | kCoefInitial[2] | {4E6,-7.9E3} | Reaction velocity coeffs. [{s-1,K}] |
Real | vesselVinitial | 5 | Initial reactor volume [m3] |
Real | vesselSinitial | 3 | Initial reactor section [m2] |
Real | heatExchAreaInitial | 3.3 | Exchanger area [m2] |
Real | hTSteamInitial | 1360 | Heat-transfer coeff. of the vapor [W/(m2.K)] |
Real | hTWaterInitial | 1180 | Heat-transfer coeff. of the water [W/(m2.K)] |
Real | massLinitial[:] | {0,1,0} | Initial condition [M] |
Real | tempLinitial | 300 | Initial condition [T] |
Real | tempHeat | 400 | |
Real | tempCool | 273 | |
Real | tempSP | 273 | |
Real | fractVSP[nComp] | {0.5,0.5,0} |
partial model batchReacLiqAtoP "Batch reactor model" // [1]: A, [2]: agua, [3]: P parameter Integer nComp = 3 "Component number of the liquid mixture"; parameter Integer numChR = 1 "Number of irreversible chemical reactions"; // Type of Interactivity inner parameter Boolean Ejs = false; inner parameter Boolean Sysquake = true; // ---------------- // Output variables // ---------------- Real massL[nComp]; Real liqHeight; Real fluidV; Real sourceTemp; Real consumHeater; Real consumChiller; Real massLF[nComp]; Real totalMassF; Real tempF; Real massLFChR[nComp]; Real conversion; Real reactionRate[numChR]; // ---------------------- // Interactive parameters // ---------------------- parameter Real molecWeightInitial[ nComp]( unit="Kg/mol") = {0.1, 0.018, 0.1} "Molecular weight"; parameter Real densityInitial[ nComp]( unit="Kg/m3") = {1E3, 1E3, 1E3} "Components density"; parameter Real stoichCoefInitial[ numChR,nComp] = [-1, 0, 1] "Stoich coeffs."; parameter Real kCoefInitial[ 2]( unit="{s-1,K}") = { 4E6, -7.9E3} "Reaction velocity coeffs."; parameter Real vesselVinitial( unit="m3") = 5 "Initial reactor volume"; parameter Real vesselSinitial( unit="m2") = 3 "Initial reactor section"; parameter Real heatExchAreaInitial( unit="m2") = 3.3 "Exchanger area"; parameter Real hTSteamInitial( unit="W/(m2.K)") = 1360 "Heat-transfer coeff. of the vapor"; parameter Real hTWaterInitial( unit="W/(m2.K)") = 1180 "Heat-transfer coeff. of the water"; parameter Real massLinitial[ :]( unit="M") = { 0, 1, 0} "Initial condition"; parameter Real tempLinitial( unit="T") = 300 "Initial condition"; //----------------------------- // Parameters associated to the input variables //----------------------------- parameter Real tempHeat = 400; // sourceOfTemp parameter Real tempCool = 273; // sourceOfTemp parameter Real tempSP= 273; // sourceLiqCntrl parameter Real fractVSP[nComp] = {0.5, 0.5, 0}; // sourceLiqCntrl Real tempL; // --------------- // Input variables // --------------- Real isHeater(start = 1, fixed = true); // thermalResist, sourceOfTemp Real isChiller(start = 0); // thermalResist, sourceOfTemp Real tempHeatv; // sourceOfTemp Real tempCoolv; // sourceOfTemp Real flowVSP; // sourceLiqCntrl. Positivo: llena el deposito Real tempSPv; // sourceLiqCntrl Real fractVSPv[nComp]; // sourceLiqCntrl Real calcConversion; //chRAtoP CCC protected parameter Real CpCoefMInitial[ nComp,7]( unit="J/(Kg*K)") = [ 4.5E3, 0, 0, 0, 0, 0, 0; 4.2E3, 0, 0, 0, 0, 0, 0; 4.5E3, 0, 0, 0, 0, 0, 0]; parameter Real massEnthalpyRefInitial[nComp]( unit="J/Kg") = {167E4, 0, 0} "Specific (per mass) enthalpy at reference temperature"; parameter Real tempRefInitial( unit="K") = 300 "Reference temperature"; parameter Real pmax = 1.05*3*vesselVinitial*liq.liquid.g* max(densityInitial[1],max(densityInitial[2],densityInitial[3])) / (0.5*vesselSinitial); parameter Real pcodo = pmax / 1.05 "Source parameter"; parameter Real pmin = 1 "Source parameter"; parameter Real peps = 0.2 "Source parameter"; protected JARA2i.liq.liquidCp6PrefVB liq( nComp=nComp,CpCoefMInitial=CpCoefMInitial, vesselVolumeInitial=vesselVinitial, densityInitial = densityInitial, sectionInitial=vesselSinitial, massEnthalpyRefInitial = massEnthalpyRefInitial, tempRefInitial=tempRefInitial, massLinitial=massLinitial,tempLinitial=tempLinitial); protected PhysicalModel.chReacAtoP chRAtoP( nComp=nComp,numChR=numChR,stoichCoefInitial=stoichCoefInitial, kCoefInitial = kCoefInitial, molecWeightInitial=molecWeightInitial, densityInitial = densityInitial); protected JARA2i.liq.sourceVolLiqFB liqSource( nComp=nComp,densityInitial=densityInitial, CpCoefMInitial = CpCoefMInitial, pmax=pmax,pcodo=pcodo,pmin=pmin,peps=peps, massEnthalpyRefInitial=massEnthalpyRefInitial, tempRefInitial = tempRefInitial); protected PhysicalModel.thermalResist resistTherm( nCompI=nComp,heatExchAreaInitial=heatExchAreaInitial, hTSteamInitial=hTSteamInitial, hTWaterInitial=hTWaterInitial); protected PhysicalModel.sourceOfTemp fluidTemp; protected PhysicalModel.sourceLiqCntrl sourceLiqCtrl( nComp=nComp); equation // --------------- // Input variables // --------------- resistTherm.isHeater = isHeater; fluidTemp.isHeater = isHeater; fluidTemp.isChiller = isChiller; resistTherm.isChiller = isChiller; tempHeatv = fluidTemp.tempHeat; tempCoolv = fluidTemp.tempCool; flowVSP = sourceLiqCtrl.flowVSP; tempSPv = sourceLiqCtrl.tempSP; fractVSPv = sourceLiqCtrl.fractVSP; chRAtoP.calcConversion = pre(calcConversion); // ---------------------------------------- //Input variables // ---------------------------------------- tempHeatv = tempHeat; tempCoolv = tempCool; tempSPv = tempSP; fractVSPv = fractVSP; // ---------------- // Output variables // ---------------- massL = liq.liquid.massL; tempL = liq.liquid.tempL; liqHeight = liq.liquid.liqHeight; fluidV = liq.liquid.fluidV; sourceTemp = fluidTemp.sourceTemp; consumHeater = fluidTemp.consumHeater; consumChiller = fluidTemp.consumChiller; massLF = -liqSource.inMass.massLF; totalMassF = -liqSource.totalMassF; tempF = liqSource.tempF; massLFChR = -chRAtoP.inMass.massLF; conversion = chRAtoP.conversion; reactionRate = chRAtoP.reactionRate; // Liquid flow connect( liqSource.inMass, liq.inMassBot); connect( liq.inMassBot, chRAtoP.inMass); connect( liq.inHeat, resistTherm.inHeat); connect( fluidTemp.inHeat, resistTherm.outHeat); connect( liqSource.setPointSignal, sourceLiqCtrl.setPointSignal); // Chemical reaction // Heat flow // Control signal end batchReacLiqAtoP;
Type | Name | Default | Description |
---|---|---|---|
Real | TheaterOFF | 328 | |
Real | TChillerON | 368 | |
Real | TChillerOFF | 320 | |
Real | ConversionSP | 0.9 | |
Real | flowVSP | 0.2 | |
Real | flowVSPOffset | 0 | |
Real | flowVSPStartTime | 0 |
model batchReacLiqAtoPControlled "Open loop system + PID controller (the liquid level inside the reactor is controlled by manipulating the liquid input flow)" parameter Real TheaterOFF = 328; parameter Real TChillerON = 368; parameter Real TChillerOFF = 320; parameter Real ConversionSP = 0.9; parameter Real flowVSP = 0.2; parameter Real flowVSPOffset = 0; parameter Real flowVSPStartTime = 0; batchReacLiqAtoPOpen Planta; Modelica.Blocks.Continuous.LimPID LimPID( yMax=0.01, k=1, Ti=9, Td=0.1); Modelica.Blocks.Sources.Step Step( height=flowVSP, offset=flowVSPOffset, startTime=flowVSPStartTime); Boolean EndSimul( start= false) "True: the cooling process has finished"; equation connect(Step.y,LimPID.u_s); connect(LimPID.y, Planta.flowVSPC); connect(Planta.fluidVolume, LimPID.u_m); when abs(flowVSP+flowVSPOffset-Planta.open.fluidV)<0.01*abs(flowVSP+flowVSPOffset) and not (EndSimul) then //Liquid level in the tank hasn't reached the SP yet Planta.open.calcConversion= 1.0; end when; when (Planta.open.tempL>TheaterOFF) and (Planta.open.isHeater>0.5) and not (EndSimul) then Planta.open.isHeater = 0; end when; when ((Planta.open.tempL>TChillerON) or (Planta.open.conversion>ConversionSP)) and ((Planta.open.isChiller<0.5)) or (Planta.open.tempL < TChillerOFF) and (Planta.open.isChiller>0.5) then Planta.open.isChiller = 1.0- pre(Planta.open.isChiller); end when; when pre(Planta.open.isChiller)>0.5 then EndSimul = true; end when; end batchReacLiqAtoPControlled;
Type | Name | Description |
---|---|---|
output RealOutput | fluidVolume | |
input RealInput | flowVSPC |
model batchReacLiqAtoPOpen "Open loop system. Input: set-point of the pump liquid flow. Output: volume of the liquid inside the reactor" batchReacLiqAtoP open; Modelica.Blocks.Interfaces.RealOutput fluidVolume; Modelica.Blocks.Interfaces.RealInput flowVSPC; equation -open.flowVSP =flowVSPC; open.fluidV =fluidVolume; end batchReacLiqAtoPOpen;