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

📄 libpumpcard.bas

📁 本系统是给大庆油田做的一个示例程序
💻 BAS
字号:
Attribute VB_Name = "LibPumpCard"
Option Explicit
Sub PumpDynyCards_Cal(Ncal As Integer, _
                       nrod As Integer, drod() As Single, lrod() As Single, srod() As Single, ERod() As Single, _
                       nw As Single, SCrudeOil As Single, vset0 As Single, t_time() As Single, _
                       pr() As Single, prl() As Single, XPump() As Single, PPump() As Single)
    
    Dim apr(0 To 50) As Single, Bpr(0 To 50) As Single, Aprl(0 To 50) As Single, Bprl(0 To 50) As Single
    Dim F(0 To 1500) As Single
    Dim X_Pump(0 To 1500) As Single, P_Pump(0 To 1500) As Single
    Dim Onx(50) As Single, Pnx(50) As Single, Onx1(50) As Single, Pnx1(50) As Single
     
    Dim N_FSh As Integer
    Dim i As Integer, j As Integer
    Dim prMax As Single, prMin As Single, spr As Single, Xpump_Max As Single, Xpump_Min As Single
    Dim S_Pump As Single
    Dim wrbar As Single, wr As Single

    prMax = 0
    prMin = 10
    For j = 1 To Ncal
        If pr(j) > prMax Then prMax = pr(j)
        If pr(j) < prMin Then prMin = pr(j)
    Next j
    spr = prMax - prMin

    For j = 1 To Ncal
        F(j) = spr - pr(j)
    Next j
    
    N_FSh = 11
    Call An_Bn_Cal(Ncal, F, N_FSh, apr, Bpr)
    
    Call WRbarSum_Cal(nrod, drod, lrod, srod, nw, SCrudeOil, wrbar, wr)
    
    For j = 1 To Ncal
        F(j) = prl(j - 1) - wrbar
    Next j
    Call An_Bn_Cal(Ncal, F, N_FSh, Aprl, Bprl)
    
    For i = 1 To nrod
        Call Coef_Cal(drod(i), lrod(i), srod(i), ERod(i), N_FSh, vset0, lrod(i), apr, Bpr, Aprl, Bprl, Onx, Pnx, Onx1, Pnx1)
        Call Card_Pump_Cal(drod(i), ERod(i), N_FSh, Ncal, vset0, apr(0), Aprl(0), lrod(i), Onx, Pnx, Onx1, Pnx1, t_time, X_Pump, P_Pump)
        
        For j = 1 To Ncal
            F(j) = X_Pump(j)
        Next j
        Call An_Bn_Cal(Ncal, F(), N_FSh, apr(), Bpr())
        
        For j = 1 To Ncal
            F(j) = P_Pump(j)
        Next j
        Call An_Bn_Cal(Ncal, F(), N_FSh, Aprl(), Bprl())
    Next i

    Xpump_Max = -10
    Xpump_Min = 10
    For j = 1 To Ncal
        If X_Pump(j) > Xpump_Max Then Xpump_Max = X_Pump(j)
        If X_Pump(j) < Xpump_Min Then Xpump_Min = X_Pump(j)
    Next j
    S_Pump = Xpump_Max - Xpump_Min
    For j = 1 To Ncal
        X_Pump(j) = S_Pump - X_Pump(j) + Xpump_Min
    Next j
    
    For j = 1 To Ncal
        XPump(j) = X_Pump(j)
        PPump(j) = P_Pump(j)
    Next j
End Sub
Sub c_zn_cal(c_zn As Single)
    c_zn = 0.5
End Sub
Sub An_Bn_Cal(Ncal As Integer, F() As Single, N_FSh As Integer, An() As Single, Bn() As Single)
    Dim j As Integer, kk As Integer
    
    For kk = 0 To N_FSh
        An(kk) = 0
        Bn(kk) = 0
        For j = 1 To Ncal
            An(kk) = An(kk) + F(j) * Cos(2 * kk * pi * j / Ncal)
            Bn(kk) = Bn(kk) + F(j) * Sin(2 * kk * pi * j / Ncal)
        Next j
        An(kk) = 2 * An(kk) / Ncal
        Bn(kk) = 2 * Bn(kk) / Ncal
    Next kk
End Sub

Rem 计算任意深度处的系数
Sub Coef_Cal(DRodX As Single, LRodX As Single, SRodX As Single, ERodX As Single, N_FSh As Integer, _
             vset0 As Single, X_Depth As Single, geman() As Single, deltn() As Single, _
             sigeman() As Single, taon() As Single, Onx() As Single, Pnx() As Single, Onx1() As Single, _
             Pnx1() As Single)
             
    Dim alfan(50) As Single, betan(50) As Single
    Dim kn(50) As Single, mun(50) As Single
    Dim c_zn As Single, c_sound As Single, arodx As Single, ea As Single, XX As Single, fz As Single
    Dim fm As Single, betanx As Single, alfanx As Single, shbetanx As Single, chbetanx  As Single
    Dim sinalfanx As Single, cosalfanx As Single, onx01 As Single, onx02 As Single, pnx01 As Single
    Dim pnx02 As Single, coef1 As Single, coef2 As Single, onx11 As Single, onx12 As Single
    Dim pnx11 As Single, pnx12 As Single
    Dim kk As Integer
    
    Call c_zn_cal(c_zn)
    c_sound = Sqr(ERodX / SRodX)
    arodx = pi / 4 * DRodX ^ 2
    ea = ERodX * arodx

    For kk = 1 To N_FSh
        XX = (c_zn / kk / vset0) ^ 2
        XX = Sqr(1 + XX)
        XX = Sqr(1 + XX)
        alfan(kk) = kk * vset0 / c_sound / Sqr(2) * XX

        XX = (c_zn / kk / vset0) ^ 2
        XX = Sqr(1 + XX)
        XX = Sqr(-1 + XX)
        betan(kk) = kk * vset0 / c_sound / Sqr(2) * XX
    Next kk

    For kk = 1 To N_FSh
        fz = sigeman(kk) * alfan(kk) + taon(kk) * betan(kk)
        fm = ea * (alfan(kk) ^ 2 + betan(kk) ^ 2)
        kn(kk) = fz / fm
        fz = sigeman(kk) * betan(kk) - taon(kk) * alfan(kk)
        mun(kk) = fz / fm
    Next kk
    For kk = 1 To N_FSh
        betanx = betan(kk) * X_Depth
        alfanx = alfan(kk) * X_Depth
        shbetanx = (Exp(betanx) - Exp(-betanx)) / 2
        chbetanx = (Exp(betanx) + Exp(-betanx)) / 2
        sinalfanx = Sin(alfanx)
        cosalfanx = Cos(alfanx)
        onx01 = (kn(kk) * chbetanx + deltn(kk) * shbetanx) * sinalfanx
        onx02 = (mun(kk) * shbetanx + geman(kk) * chbetanx) * cosalfanx
        Onx(kk) = onx01 + onx02
        pnx01 = (kn(kk) * shbetanx + deltn(kk) * chbetanx) * cosalfanx
        pnx02 = (mun(kk) * chbetanx + geman(kk) * shbetanx) * sinalfanx
        Pnx(kk) = pnx01 - pnx02

        coef1 = deltn(kk) * betan(kk) - geman(kk) * alfan(kk)
        coef2 = geman(kk) * betan(kk) + deltn(kk) * alfan(kk)
        onx11 = (taon(kk) / ea * shbetanx + coef1 * chbetanx) * sinalfanx
        onx12 = (sigeman(kk) / ea * chbetanx + coef2 * shbetanx) * cosalfanx
        Onx1(kk) = onx11 + onx12

        pnx11 = (taon(kk) / ea * chbetanx + coef1 * shbetanx) * cosalfanx
        pnx12 = (sigeman(kk) / ea * shbetanx + coef2 * chbetanx) * sinalfanx
        Pnx1(kk) = pnx11 - pnx12
    Next kk
End Sub
Rem 计算任意深度处的泵载荷和位移
Sub Card_Pump_Cal(DRodX As Single, ERodX As Single, N_FSh As Integer, Ncal As Integer, vset0 As Single, _
                   gema0 As Single, sigema0 As Single, X_Depth As Single, Onx() As Single, _
                   Pnx() As Single, Onx1() As Single, Pnx1() As Single, t_time() As Single, _
                   X_Pump() As Single, P_Pump() As Single)
                   
    Dim arodx As Single, ea As Single
    Dim j As Integer, kk As Integer
                   
    arodx = pi / 4 * DRodX ^ 2
    ea = ERodX * arodx
    For j = 1 To Ncal
        X_Pump(j) = gema0 / 2 + sigema0 / 2 / ea * X_Depth
        P_Pump(j) = sigema0 / 2 / ea
        For kk = 1 To N_FSh
            X_Pump(j) = X_Pump(j) + Onx(kk) * Cos(kk * vset0 * t_time(j)) + Pnx(kk) * Sin(kk * vset0 * t_time(j))
            P_Pump(j) = P_Pump(j) + Onx1(kk) * Cos(kk * vset0 * t_time(j)) + Pnx1(kk) * Sin(kk * vset0 * t_time(j))
        Next kk
        P_Pump(j) = ea * P_Pump(j)
    Next j
End Sub
Rem 抽油杆柱在油液中的重量
Sub WRbarSum_Cal(nrod As Integer, drod() As Single, lrod() As Single, srod() As Single, nw As Single, SCrudeOil As Single, _
                 wrbar As Single, wr As Single)
    
    Dim swo As Single, FL As Single
    Dim qrod(5) As Single, lpump As Single
    Dim i As Integer
    
    lpump = 0
    For i = 1 To nrod
       qrod(i) = 3.14159268 / 4 * drod(i) ^ 2 * srod(i) * 9.8 * 1.05
       lpump = lpump + lrod(i)
    Next i
    
    wr = 0
    For i = 1 To nrod
        wr = wr + qrod(i) * lrod(i)
    Next i

    swo = 1000 * nw + (1 - nw) * SCrudeOil
    wrbar = (1 - swo / 7850) * wr
End Sub
Rem 计算杆管静变形
Sub Lamdat_Cal(nrod As Integer, drod() As Single, lrod() As Single, ERod() As Single, dtubei As Single, _
               tanchor As String, lpmax As Single, lamdar As Single, lamdat As Single)
    Dim arod(5) As Single, i As Integer
    Dim DTubeO As Single, elsm As Single, ATube As Single, lpump As Single
    
    lpump = 0
    For i = 1 To nrod
        arod(i) = pi / 4 * drod(i) ^ 2
        lpump = lpump + lrod(i)
    Next i

    If dtubei * 1000 <= 64 Then
       DTubeO = 73# * 0.001
    Else
       dtubei = 73 * 0.001
       DTubeO = 88.9 * 0.001
    End If
    elsm = 2.1 * 100000000000#
    ATube = pi / 4 * (DTubeO ^ 2 - dtubei ^ 2)

    If tanchor = "Y" Or tanchor = "y" Then
       lamdat = 0.001
    Else
       lamdat = lpump * lpmax / elsm / ATube
    End If

    lamdar = 0
    For i = 1 To nrod
        lamdar = lamdar + lpmax * lrod(i) / ERod(i) / arod(i)
    Next i
    lamdat = Abs(lamdat)
    lamdar = Abs(lamdar)
    If lamdar < 0.01 Then lamdar = 0.01
    If lamdat < 0.001 Then lamdat = 0.001
End Sub

Rem 柱塞冲程长度、柱塞液体载荷、排出吸入压力差、泵有效功率、泵泵功率计算的产液量
Sub PumpCard_Analysis(Ncal As Integer, rpm_card As Single, fpump As Single, XPump() As Single, PPump() As Single, _
                      SPump As Single, LPMaxDiagnose As Single, DeltPdPs As Single, NPumpOut As Single, QFromNPumpOut As Single)
   
    Dim j As Integer
    Dim XPumpMin As Single, XPumpMax As Single
    Dim PPumpMin As Single, PPumpMax As Single
    Dim sum As Single
    
    XPumpMin = XPump(1)
    XPumpMax = XPump(1)
    PPumpMin = XPump(1)
    PPumpMax = XPump(1)
    
    For j = 1 To Ncal
        If XPump(j) < XPumpMin Then
            XPumpMin = XPump(j)
        End If
        
        If XPump(j) > XPumpMax Then
            XPumpMax = XPump(j)
        End If
        
        If PPump(j) < PPumpMin Then
            PPumpMin = PPump(j)
        End If
        
        If PPump(j) > PPumpMax Then
            PPumpMax = PPump(j)
        End If
    Next j
    SPump = XPumpMax - XPumpMin
    LPMaxDiagnose = PPumpMax - PPumpMin
    
    DeltPdPs = LPMaxDiagnose / fpump
    
    sum = 0
    For j = 1 To Ncal - 1
        sum = sum + (XPump(j + 1) - XPump(j)) * (PPump(j) + PPump(j + 1)) / 2
    Next j
    
    NPumpOut = sum * rpm_card / 60 / 1000 'kW
    QFromNPumpOut = NPumpOut / DeltPdPs * 24 * 60 * 60
End Sub


⌨️ 快捷键说明

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