Determining Tray Efficiencies from Total Reflux Distillation Experiments

Harry Kooijman and Ross Taylor

Yanagi and Sakata published results of distillation experiments with a 1.2m sieve tray at Fractionation Research Institute (FRI). They gave detailed informaton on the tray layout data and included measured temperature and compositions for two runs. Here we show these experiments can be simulated with ChemSep-LITE which is called directly from a Microsoft Excel spreadsheet. The tray efficiencies obtained are in agreement with those of Yanagi and Sakata. As ChemSep-LITE is free it can serve as an standard tool for determining tray efficiencies.

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.

McCabe-Thiele diagram for total reflux Experimental and simulated tray temperatures Experimental and simulated tray liquid compositions

Conclusions

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.

References

Appendix 1. Visual Basic Macro's

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