To start setting up the spreadsheet, we first simulated the experiment by entering the data in the ChemSep GUI. To do so we specified a column with 12 stages as there are 10 trays plus the condenser and reboiler. By selecting the total reflux operation we tell the simulator there are no product streams nor any feeds. The column has a subcooled condenser and a total reboiler. As components we select cyclo-hexane and normal-heptane. We use the Gamma-Phi K-value model using UNIFAC to compute liquid activity coefficients, the SRK equation of state to compute vapor fugacity coefficients, and the Antoine model for the vapor pressures. We specified the excess enthalpy model to allow for the subcooling of the reflux liquid to be properly accounted for (FRI tests are typically run with subcooled reflux). The top pressure of the column is 34 kPa and we specify the liquid compositions for the reboiler, stage 12, as 0.222 and 0.778. The reflux subcooling is set to 10 K. The column is saved under the name "cC6nC7.sep" and we can see the results. We can see from the McCabe-Thiele diagram that the operating line lies on the x=y line, as it should for total reflux.
Now we have a working column we import the "cC6nC7.sep" file as text into a spreadsheet (under sheet "cC6nC7"). When you look at this sheet you will notice the ChemSep files are text files that are straight forward to read. This also fascilitates rerunning the simulation from Excel. You will notice that the file consists of an input section started by "[ChemSep]" and ended by "[End of Input]", and an output section, started by "[Results]" and ended by "[End of Results]". A description of the problem is also appended in a section that starts with "[Column Specs]" and ends with "[End Column Specs]". When you run this file from the GUI another section gets appended: the "[ChemSep Output]" section which shows the output of the simulator. Now, for our purpose, we only need the input section of the sep-file. Therefore, we copy the sheet and ommit the rows after "[End of Input]". We need input for each run of the FRI column. As the paper discusses results for FRI runs 625 and 628, we made copies as sheet "625" and "628". All we have to do is change the lines with specifications to the measured experimental values and rerun the simulator. All the experimental conditions were entered in a separate sheet, "FRI 82 paper", columns B through E, to make a comparison between the measured and simulated values.
To determine the average tray efficiency of each run, we need to decide on what we specify. In this case we tell ChemSep how many stages there are, the top pressure in the column, the degree of subcooling of the reflux, the tray pressure drop and efficiency, the filename to write to, and the composition in the reboiler. By specifying the reboiler composition we simulate the column temperature and compositions profiles as a function of the tray efficiency. We then try to match the temperature profile and composition on a specific tray. The sepecifications are written directly from the summary sheet by cell references into the sheets for the individual runs. To call the ChemSep-LITE simulator from Excel, Visual Basic macro's are used (see Appendix 1). The calculation is activated by the "do_sim" function call, and the results for the temperatures and liquid compositions are obtained via "T__" and "x__" function calls. In this manner any change made on the summary sheet (of the blue cells) results in an update of the simulation and the results immediately show in the diagrams, where we plot the experimental points and the simulated profiles.
The first thing we noticed is that the temperatures were off by several degrees. This is most likely due to the fact that the pressure was incorrectly reported or measured by FRI. Therefore, we had to lower the top pressure to 31 kPa to get an excellent match for the temperature (see below). Next we varied the tray efficiency to match the measured liquid composition on the third tray from the top. Again an excellent match could be obtained for both runs (see below). Note that the two runs were operating at different tray loadings: run 625 is probably flooding because the efficiency is rather low, Yanagi and Sakata reported 41.1%. With ChemSep we fit the tray efficiency to be 44%. Run 628 has a lower tray pressure drop and much higher tray efficiency, Yanagi and Sakata reported 70.8% whereas we find here 71.5%. The differences are probably due to the fact that Yanagi and Sakata used a) different thermodynamic models and top pressure and/or b) a different tray to match the composition for. For example if we match the liquid compositions of the second tray from the top, we find tray efficiencies of 42 and 73%. However, these results are good enough.
ChemSep-LITE provides an excellent means to fit tray efficiency data published in the literature. Calling the ChemSep simulator from Microsoft Excel sheets makes for easy comparison and fitting of distillation tests in general. ChemSep-LITE has a component library that includes all typical components used for distillation tests and has a large selection of thermodynamic models. As ChemSep-LITE is also freely available anybody can use it to determine tray efficiencies or packing HETP's. Therefore, ChemSep-LITE can serve as a standard tool in literature and industry for distillation efficiencies.
The "do_sim" macro's copies the contents of the specified cells into a file that will be read by the simulator, calls the simulator, and reads the results into global variables that can be evaluated by means of functions. Such a function is for example "T__(stage,dep)" which returns the temperature on "stage". The "dep" variable is there to create a dependency, so that all the function gets called when Excel updates the cell the "dep" variable refers to. By setting this dependence equal to the cell containing the "do_sim" function call, all the results will be automatically refreshed as well when the simulation has rerun. Of course, to call the simulator we must also pass the directory where ChemSep-LITE was installed under, normally "C:\Program Files\ChemSepL".
Const nsx = 100 Const ncx = 2 Public T_(nsx) As Double Public p_(nsx) As Double Public V_(nsx) As Double Public L_(nsx) As Double Public x_(nsx, ncx) As Double Public y_(nsx, ncx) As Double ' Function ShellWait - As retrieved from a german web site. Private Declare Function CreateProcess Lib "Kernel32" Alias _ "CreateProcessA" ( _ ByVal lpAppName As Long, _ ByVal lpCmdLine As String, _ ByVal lpProcAttr As Long, _ ByVal lpThreadAttr As Long, _ ByVal lpInheritedHandle As Long, _ ByVal lpCreationFlags As Long, _ ByVal lpEnv As Long, _ ByVal lpCurDir As Long, _ lpStartupInfo As STARTUPINFO, _ lpProcessInfo As PROCESS_INFORMATION _ ) As Long Private Declare Function WaitForSingleObject Lib "Kernel32" ( _ ByVal hHandle As Long, _ ByVal dwMilliseconds As Long _ ) As Long Private Declare Function CloseHandle Lib "Kernel32" ( _ ByVal hObject As Long _ ) As Long Private Const NORMAL_PRIORITY_CLASS = &H20& Private Const INFINITE = -1& Private Type STARTUPINFO cb As Long lpReserved As String lpDesktop As String lpTitle As String dwX As Long dwY As Long dwXSize As Long dwYSize As Long dwXCountChars As Long dwYCountChars As Long dwFillAttribute As Long dwFlags As Long wShowWindow As Integer cbReserved2 As Integer lpReserved2 As Integer hStdInput As Long hStdOutput As Long hStdError As Long End Type Private Type PROCESS_INFORMATION hProcess As Long hThread As Long dwProcessID As Long dwThreadID As Long End Type Public Function ShellWait(cmdline As String, Optional ByVal _ bShowApp As Boolean = False) As Boolean Dim uProc As PROCESS_INFORMATION Dim uStart As STARTUPINFO Dim lRetVal As Long uStart.cb = Len(uStart) uStart.wShowWindow = Abs(bShowApp) uStart.dwFlags = 1 lRetVal = CreateProcess(0&, cmdline, 0&, 0&, 1&, _ NORMAL_PRIORITY_CLASS, 0&, 0&, _ uStart, uProc) lRetVal = WaitForSingleObject(uProc.hProcess, INFINITE) lRetVal = CloseHandle(uProc.hProcess) lRetVal = CloseHandle(uProc.hThread) ShellWait = (lRetVal <> 0) End Function Function do_sim(sep_input As Variant, path, sepfile, stages, nc As String) As Integer Dim Tekst As Variant Dim Run As String Dim kstage As Integer '=== Write the Sep file === j = FreeFile Open path + sepfile For Output As #j For Each Tekst In sep_input ' Make some replacements in case the path of ChemSep LITE is different If (Left(Tekst, 20) = "Component data path=") Then ' set the component data path Print #j, "Component data path=" + path + "pcd\" ElseIf (Left(Tekst, 19) = "Property data path=") Then ' set the property data path Print #j, "Property data path=" + path + "ipd\" ElseIf (Left(Tekst, 4) = "Lib=") Then ' set the component library path k = Len(Tekst) Do While Not (Mid(Tekst, k, 1) = "\") And (k > 4) k = k - 1 Loop Print #j, "Lib="; path; "pcd\"; Right(Tekst, Len(Tekst) - k) Else Print #j, Tekst End If Next Close #j '=== Run the column simulator === Run = path + "bin\go-col2.exe" '--- when running on an "unprotected" computer you can run go-col2 directly 'Run = Run + " " + path + newfile '--- else make batch file that sets the temporary directory environment variable ' and then call the batch file to run go-col2 j = FreeFile Open path + "run-cs.bat" For Output As #j Print #j, "set TMPDIR="; path Print #j, Run + " " + path + sepfile Close #j Run = path + "run-cs.bat " i = ShellWait(Run, 1) Kill (Run) '=== Read results === Open path + sepfile For Input As #j Do While Not EOF(j) Line Input #j, Run If (Run = "[Profiles]") Then Line Input #j, Run Line Input #j, Run Line Input #j, Run For i = 1 To stages Input #j, kstage Input #j, T_(i) Input #j, p_(i) Input #j, V_(i) Input #j, L_(i) Line Input #j, Run Next ElseIf (Run = "[Vapour phase compositions]") Then i = 1 Do While (i < stages) Line Input #j, Run Line Input #j, Run Line Input #j, Run For k = 1 To nc Input #j, kstage Input #j, y_(i, k) If (i + 1 <= stages) Then Input #j, y_(i + 1, k) If (i + 2 <= stages) Then Input #j, y_(i + 2, k) If (i + 3 <= stages) Then Input #j, y_(i + 3, k) If (i + 4 <= stages) Then Input #j, y_(i + 4, k) Next i = i + 5 Loop ElseIf (Run = "[Liquid phase compositions]") Then i = 1 Do While (i < stages) Line Input #j, Run Line Input #j, Run Line Input #j, Run For k = 1 To nc Input #j, kstage Input #j, x_(i, k) If (i + 1 <= stages) Then Input #j, x_(i + 1, k) If (i + 2 <= stages) Then Input #j, x_(i + 2, k) If (i + 3 <= stages) Then Input #j, x_(i + 3, k) If (i + 4 <= stages) Then Input #j, x_(i + 4, k) Next i = i + 5 Loop End If Loop Close #j '=== Delete sep file after done === 'Kill (path + sepfile) do_sim = stages End Function Function T__(stage, dep) As Double If dep Then T__ = 1 T__ = T_(stage) End Function Function p__(stage, dep) As Double If dep Then p__ = 1 p__ = p_(stage, comp) End Function Function x__(stage, comp, dep) As Double If dep Then x__ = 1 x__ = x_(stage, comp) End Function Function y__(stage, comp, dep) As Double If dep Then y__ = 1 y__ = y_(stage, comp) End Function
9 January 2005