⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 libprl.bas

📁 本系统是给大庆油田做的一个示例程序
💻 BAS
字号:
Attribute VB_Name = "LibPrl"
Option Explicit

Rem 当抽油杆在泵处断脱时,仅考虑杆柱静载、惯性载荷与摩擦载荷,悬点载荷计算
Sub PrlBrokenRod_Cal(WellType As String, NcalWell As Integer, XWell() As Single, SetWell() As Single, FaiWell() As Single, _
                 twell As Single, _
                 nrod As Integer, drod() As Single, lrod() As Single, spr As Single, rpm As Single, _
                 dpump As Single, lpump As Single, SCrudeOil As Single, sp As Single, nw As Single, mu As Single, dtubei As Single, _
                 poil As Single, pcase As Single, hmove As Single, tanchor As String, _
                 Ncal As Integer, pr() As Single, vpr() As Single, apr() As Single, prl() As Single, _
                 PrlMax As Single, PrlMin As Single)
    
    
    Dim k As Integer, i As Integer, j As Integer
   
    Dim wr As Single, wrbar As Single, FL As Single
    Dim arod As Single, srod As Single, qrod(5) As Single
    Dim soil As Single, swater As Single, swo As Single, ps As Single, pd As Single
    Dim f_boxing_cal As Single, p_boxing As Single, dprlj As Single
    Dim scale_pump As Integer, gama As Single
    Dim znr As Single
    Dim XPump(2500) As Single, llpump(2500) As Single, fe_s(2500) As Single
    
    soil = SCrudeOil
    swater = 1000
    swo = (1 - nw) * soil + nw * swater
    
    wr = 0
    For i = 1 To nrod
         qrod(i) = pi / 4 * drod(i) ^ 2 * 7850 * 9.8 * 1.05
         wr = wr + qrod(i) * lrod(i)
    Next i
    
    wrbar = wr * (1 - swo / 7850)
    FL = wr * swo / 7850
    
    For j = 0 To Ncal
        pr(j) = Abs(pr(j))
        XPump(j) = pr(j)
        llpump(j) = -FL
    Next j
    
    Call Znr_Cal(spr, rpm, mu, drod(1), znr)
    
    For j = 0 To Ncal
        prl(j) = wrbar + wr * apr(j) / 9.8 * 1.2
        dprlj = 0
        For i = 1 To nrod
            arod = pi / 4 * drod(i) ^ 2
            srod = 7850
            dprlj = dprlj + znr * srod * arod * lrod(i) * vpr(j)
        Next i
        prl(j) = prl(j) + dprlj
    Next j
   
    If Well_Type = "定向井" Then
        Call PRL_Adding_Frt(WellType, NcalWell, XWell, SetWell, FaiWell, nrod, drod, lrod, _
                           Ncal, llpump, pr, vpr, apr, prl)
    End If
    
    Call PdCal(lpump, poil, nw, sp, SCrudeOil, pd)
    ps = pd
    scale_pump = 2
    Call fe_slip(scale_pump, dpump, ps, pd, mu, Ncal, vpr, fe_s)
    
    gama = 0.4
    p_boxing = (1 + gama) * (1 - 2 * gama) / gama * poil * 2#
    Call fe_boxing_cal(p_boxing, f_boxing_cal)
    
    PrlMax = 0
    PrlMin = 100000000
    For j = 0 To Ncal
        If vpr(j) >= 0 Then
            prl(j) = prl(j) + fe_s(j) + f_boxing_cal
        Else
            prl(j) = prl(j) + fe_s(j) - f_boxing_cal
        End If
        If prl(j) > PrlMax Then PrlMax = prl(j)
        If prl(j) < PrlMin Then PrlMin = prl(j)
    Next j
End Sub

Rem 直井多级杆柱顶端下部杆柱在液体中的重量
Sub wrbar_cal(nrod As Integer, drod() As Single, lrod() As Single, nw As Single, SCrudeOil As Single, wrbar() As Single)
     
     Dim i As Integer, j As Integer, qrod(5) As Single, swo As Single
     Dim swater As Single, soil As Single
     Dim pi As Single
    
     pi = 3.14159265
     
     swater = 1000
     soil = SCrudeOil
     swo = nw * swater + (1 - nw) * soil
     For i = 1 To nrod
        qrod(i) = pi / 4 * drod(i) ^ 2 * 7850 * 9.8 * 1.05
     Next i
     
     For i = 1 To nrod
        wrbar(i) = 0
        For j = i To nrod
           wrbar(i) = wrbar(i) + qrod(j) * lrod(j)
        Next j
        wrbar(i) = wrbar(i) * (1 - swo / 7850)
    Next i
End Sub

Rem 柱塞与泵筒之间摩擦力
Sub fe_slip(scale_pump As Integer, dpump As Single, ps As Single, pd As Single, mu As Single, _
           jcal As Integer, vpr() As Single, fe_s() As Single)
         
    Dim deltr0 As Single, dpump0 As Single
    Dim va As Single, deltr As Single, lp As Single, efcl As Single, delt_p As Single
    Dim j As Integer, ndp As Integer
    Dim pi As Single
    
    pi = 3.14159265
      
    deltr0 = 0.075 * 0.001
    If scale_pump = 1 Then
        deltr0 = 0.0225 * 0.001
    ElseIf scale_pump = 2 Then
        deltr0 = 0.0475 * 0.001
    Else
        deltr0 = 0.075 * 0.001
    End If

    deltr = deltr0
    lp = 0.8
    efcl = 0.1
    delt_p = pd - ps
    
    For j = 0 To jcal
        va = vpr(j)
        fe_s(j) = pi * lp * dpump * (delt_p * deltr / 2 / lp + mu * va / deltr / Sqr(1 - efcl ^ 2))
        fe_s(j) = Abs(fe_s(j))
    Next j
End Sub

Rem 游动阀液体阻力
Sub fe_valve(dpump As Single, nw As Single, mu As Single, SCrudeOil As Single, _
             jcal As Integer, vpr() As Single, fe_v() As Single)
         
    Dim j As Integer
    Dim dpump1 As Single, d0 As Single
    Dim swo As Single, va As Single, fp As Single, f0 As Single
    Dim re As Single, cdis As Single
    Dim gama As Single, vliquid As Single, nv As Single, ndp As Single
    Dim soil As Single, swater As Single
    Dim pi As Single
    
    pi = 3.14159265
   
    dpump1 = dpump * 1000
    
    If dpump1 <= 44 Then d0 = 23
    If dpump1 >= 70 Then d0 = 41
    If dpump1 >= 44 And dpump1 <= 70 Then
        d0 = 23 + (41 - 23) / (70 - 44) * (dpump1 - 44)
    End If
    d0 = d0 * 0.001
    
    swater = 1000
    soil = SCrudeOil
    swo = nw * swater + (1 - nw) * soil
    fp = pi / 4 * dpump ^ 2
    f0 = pi / 4 * d0 ^ 2
    
    For j = 0 To jcal
        va = vpr(j)
        gama = mu / swo
        vliquid = va * (dpump / d0) ^ 2
        re = d0 * Abs(vliquid) / gama
        
        If re <= 3 * 1000# Then
           cdis = 0.1
        Else
           cdis = 0.1 + 0.3 / (24 * 1000# - 3000#) * (re - 3000#)
           If cdis >= 0.5 Then cdis = 0.5
        End If
        
        nv = 2
        fe_v(j) = nv / cdis ^ 2 * (fp / f0) ^ 2 * va ^ 2 / 2 * swo * fp
        
        If vpr(j) >= 0 Then
            fe_v(j) = 0
        Else
            fe_v(j) = Abs(fe_v(j))
        End If
    Next j
End Sub

Sub fe_boxing_cal(p_boxing As Single, f_boxing As Single)
    
    Dim h_boxing As Single
    Dim d_prl As Single, gama As Single, p As Single
    Dim pi As Single
    
    pi = 3.14159265
    
    gama = 0.4
    h_boxing = 100 * 0.001
    d_prl = 28 * 0.001
    p = gama / (1 + gama) / (1 - 2 * gama) * p_boxing
    p = pi * d_prl * h_boxing * p
    f_boxing = p * 0.07 '摩擦系数0.07
End Sub

Rem 计算阻尼系数
Sub Znr_Cal(spr As Single, rpm As Single, mu As Single, drod_cal As Single, znr As Single)
    
    If Well_Type = "定向井" Then
        znr = 0.6
    Else
        znr = 0.4
    End If
    
    If mu * 1000# <= 100 Then
        znr = znr + 0.5 * mu / 0.1
    Else
        znr = znr + 0.5 + 0.5 * (mu - 0.1) / (2 - 0.1)
    End If
    
    If Well_Type = "定向井" Then
        If znr >= 2# Then znr = 2#
    Else
        If znr >= 1.5 Then znr = 1.5
    End If
    
    znr = znr + 0.8 * (rpm / 12) ^ 2
End Sub


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -