📄 libpumpcard.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 + -