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

📄 flowcompute.bas

📁 PQ分解法
💻 BAS
📖 第 1 页 / 共 2 页
字号:
    Do Until rstjdxx_flow_code.EOF
        Select Case Trim(rstjdxx_flow_code.Fields("flag"))
               Case "0" 'pq节点
                    E(CInt(rstjdxx_flow_code.Fields("jdbh"))) = 1
                    F(CInt(rstjdxx_flow_code.Fields("jdbh"))) = 0
                    Ps(CInt(rstjdxx_flow_code.Fields("jdbh"))) = CSng(rstjdxx_flow_code.Fields("p")) ' / Sb_jzgl
                    Qs(CInt(rstjdxx_flow_code.Fields("jdbh"))) = CSng(rstjdxx_flow_code.Fields("qv")) ' / Sb_jzgl
                    ES(CInt(rstjdxx_flow_code.Fields("jdbh"))) = "0"
               Case "1" 'pv节点
                    E(CInt(rstjdxx_flow_code.Fields("jdbh"))) = CSng(rstjdxx_flow_code.Fields("qv")) ' / CSng(rstjdxx_flow_code.Fields("jzdy"))  '实际电压的标幺值(由于输入界面的问题,暂定为1。05)
                    F(CInt(rstjdxx_flow_code.Fields("jdbh"))) = 0
                    Ps(CInt(rstjdxx_flow_code.Fields("jdbh"))) = CSng(rstjdxx_flow_code.Fields("p")) '/ Sb_jzgl
                    Qs(CInt(rstjdxx_flow_code.Fields("jdbh"))) = (CSng(rstjdxx_flow_code.Fields("qv"))) ^ 2  ' / CSng(rstjdxx_flow_code.Fields("jzdy"))) ^ 2
                    ES(CInt(rstjdxx_flow_code.Fields("jdbh"))) = "1"
               Case "2" '平衡节点
                    E(CInt(rstjdxx_flow_code.Fields("jdbh"))) = CSng(rstjdxx_flow_code.Fields("qv")) ' / CSng(rstjdxx_flow_code.Fields("jzdy")) '(暂定为1。1)
                    F(CInt(rstjdxx_flow_code.Fields("jdbh"))) = 0
                    ES(CInt(rstjdxx_flow_code.Fields("jdbh"))) = "2"
        End Select
        rstjdxx_flow_code.MoveNext
    Loop
    rstjdxx_flow_code.Close
End Sub
Public Sub pq()
'    Node_Number = 4
'    ReDim bb(1 To Node_Number, 1 To Node_Number) As Single
'    ReDim gg(1 To Node_Number, 1 To Node_Number) As Single
'    bb(1, 1) = -8.242877
'    bb(1, 2) = 2.352941
'    bb(1, 3) = 3.666667
'    bb(1, 4) = 1.891074
'    bb(2, 1) = 2.352941
'    bb(2, 2) = -4.727377
'    bb(2, 3) = 0
'    bb(2, 4) = 2.403846
'    bb(3, 1) = 3.666667
'    bb(3, 2) = 0
'    bb(3, 3) = -3.333333
'    bb(3, 4) = 0
'    bb(4, 1) = 1.891074
'    bb(4, 2) = 2.403846
'    bb(4, 3) = 0
'    bb(4, 4) = -4.26159
'
'    gg(1, 1) = 1.042093
'    gg(1, 2) = -0.588235
'    gg(1, 3) = 0
'    gg(1, 4) = -0.453858
'    gg(2, 1) = -0.588235
'    gg(2, 2) = 1.069005
'    gg(2, 3) = 0
'    gg(2, 4) = -0.480769
'    gg(3, 1) = 0
'    gg(3, 2) = 0
'    gg(3, 3) = 0
'    gg(3, 4) = 0
'    gg(4, 1) = -0.453858
'    gg(4, 2) = -0.480769
'    gg(4, 3) = 0
'    gg(4, 4) = 0.934627
    
'    Call AD
'    Call NodeAndTree
'    ReDim NAT(1 To Node_Number, 1 To Node_Number) As Integer
'    NAT(1, 3) = 1
'    NAT(1, 2) = 1
'    NAT(1, 4) = 1
'    NAT(2, 4) = 1
'    NAT(3, 1) = 1
'    NAT(2, 1) = 1
'    NAT(4, 1) = 1
'    NAT(4, 2) = 1
'    NAT(1, 1) = 1
'    NAT(2, 2) = 1
'    NAT(3, 3) = 1
'    NAT(4, 4) = 1


'    Node_Number = 4
'    ReDim vv(1 To Node_Number) As Double
'    ReDim qq(1 To Node_Number) As Double
'    ReDim ES(1 To Node_Number) As String
'    vv(1) = 1
'    vv(2) = 1
'    qq(1) = 0
'    qq(2) = 0
'    vv(3) = 1.1
'    qq(3) = 0
'    vv(4) = 1.05
'    qq(4) = 0
'    ES(1) = "0"
'    ES(2) = "0"
'    ES(3) = "1"
'    ES(4) = "2"
'    ReDim Ps(1 To Node_Number - 1) As Double
'    ReDim Qs(1 To Node_Number - 1) As Double
'    Ps(1) = -0.3
'    Ps(2) = -0.55
'    Ps(3) = 0.5
'    Qs(1) = -0.18
'    Qs(2) = -0.13
'    Exit Sub
    










    Node_Number = 155
    Operate_Code = "00"
    Call AD
    Call NodeAndTree
    Call prepq '赋予初值
    pqjd = 0.00001
start:
    kp = 1
    kq = 1
    Call psub '有功不平衡量
    If kp = 1 Then
        Call linefp
        kq = 1
addrr:
        Call qsub
        If kq = 1 Then
            Call linefq
            kp = 1
            GoTo start '转移开始
        Else
            If kp = 1 Then
                GoTo start '转移到开始
            Else
                '计算完毕
            End If
        End If
    Else
        If kq = 1 Then
            GoTo addrr: '转移到无功不平衡量
        Else
            '计算完毕
        End If
    End If
End Sub

Public Sub qsub()
    ReDim subqi(1 To Node_Number - 1) As Double
    subqiflag = False
    Dim i As Integer
    For i = 1 To Node_Number - 1
        If ES(i) = "0" Then
            For j = 1 To Node_Number
                If NAT(i, j) = 1 Then
                    subqi(i) = subqi(i) + vv(i) * vv(j) * (gg(i, j) * Sin(qq(i) - qq(j)) - bb(i, j) * Cos(qq(i) - qq(j)))
                End If
            Next j
            subqi(i) = Qs(i) - subqi(i)
            If Abs(subqi(i)) > pqjd Then
                subqiflag = True
            End If
            subqi(i) = subqi(i) / vv(i)
        End If
    Next i
    If subqiflag = False Then
        kq = 0
    End If
End Sub
Public Sub linefq()
    Dim i As Integer
    Dim j  As Integer
    Dim fnoi As Integer
    Dim fnoj As Integer
    ReDim bbqq(1 To Node_Number - 1, 1 To Node_Number - 1) As Double
    ReDim qqvv(1 To Node_Number - 1) As Double
    ReDim subvv(1 To Node_Number - 1) As Double
    fnoi = 0
    For i = 1 To Node_Number - 1
        If ES(i) = "0" Then
            fnoi = fnoi + 1
            fnoj = 0
            For j = 1 To Node_Number - 1
                If ES(j) = "0" Then
                    fnoj = fnoj + 1
                    bbqq(fnoi, fnoj) = -bb(i, j)
                End If
            Next j
        End If
    Next i
    Call Line_F(fnoj, bbqq, subqi, subvv)
    fnoi = 0
    For i = 1 To Node_Number - 1
        If ES(i) = "0" Then
            fnoi = fnoi + 1
            vv(i) = vv(i) + subvv(fnoi)
        End If
    Next i
End Sub

Public Sub linefp()
    Dim i As Integer
    Dim j  As Integer
    ReDim bbpp(1 To Node_Number - 1, 1 To Node_Number - 1) As Double
    ReDim vvqq(1 To Node_Number - 1) As Double
    ReDim subqq(1 To Node_Number - 1) As Double
    For i = 1 To Node_Number - 1
        For j = 1 To Node_Number - 1
            bbpp(i, j) = -bb(i, j)
        Next j
    Next i
    Call Line_F(Node_Number - 1, bbpp, subpi, vvqq)
    For i = 1 To Node_Number - 1
        subqq(i) = vvqq(i) / vv(i)
        qq(i) = qq(i) + subqq(i)
    Next i
End Sub


Public Sub psub()
    ReDim subpi(1 To Node_Number - 1) As Double
    subpiflag = False
    Dim i As Integer
    For i = 1 To Node_Number - 1
        For j = 1 To Node_Number
            If NAT(i, j) = 1 Then
                subpi(i) = subpi(i) + vv(i) * vv(j) * (gg(i, j) * Cos(qq(i) - qq(j)) + bb(i, j) * Sin(qq(i) - qq(j)))
            End If
        Next j
        subpi(i) = Ps(i) - subpi(i)
        If Abs(subpi(i)) > pqjd Then
            subpiflag = True
        End If
        subpi(i) = subpi(i) / vv(i)
    Next i
    If subpiflag = False Then
        kp = 0
    End If
End Sub

Public Sub prepq()
    Dim rstjdxx_flow_code As ADODB.Recordset
    ReDim E(1 To Node_Number) As Double
    ReDim F(1 To Node_Number) As Double
    ReDim Ps(1 To Node_Number) As Double
    ReDim Qs(1 To Node_Number) As Double
    ReDim QsPv(1 To Node_Number) As Double
    ReDim ES(1 To Node_Number) As String
    ReDim vv(1 To Node_Number) As Double
    ReDim qq(1 To Node_Number) As Double
    
    Set rstjdxx_flow_code = New ADODB.Recordset '赋予初值
    rstjdxx_flow_code.Open "select * from jdxx_flow_code  where  code ='" & Operate_Code & "'", cnn
    rstjdxx_flow_code.MoveFirst
    Do Until rstjdxx_flow_code.EOF
        Select Case Trim(rstjdxx_flow_code.Fields("flag"))
               Case "0" 'pq节点
                    E(CInt(rstjdxx_flow_code.Fields("jdbh"))) = 1
                    F(CInt(rstjdxx_flow_code.Fields("jdbh"))) = 0
                    Ps(CInt(rstjdxx_flow_code.Fields("jdbh"))) = CSng(rstjdxx_flow_code.Fields("p")) ' / Sb_jzgl
                    Qs(CInt(rstjdxx_flow_code.Fields("jdbh"))) = CSng(rstjdxx_flow_code.Fields("qv")) ' / Sb_jzgl
                    ES(CInt(rstjdxx_flow_code.Fields("jdbh"))) = "0"
                    
                    vv(CInt(rstjdxx_flow_code.Fields("jdbh"))) = 1
                    qq(CInt(rstjdxx_flow_code.Fields("jdbh"))) = 0
                    
               Case "1" 'pv节点
                    E(CInt(rstjdxx_flow_code.Fields("jdbh"))) = CSng(rstjdxx_flow_code.Fields("qv")) ' / CSng(rstjdxx_flow_code.Fields("jzdy"))  '实际电压的标幺值(由于输入界面的问题,暂定为1。05)
                    F(CInt(rstjdxx_flow_code.Fields("jdbh"))) = 0
                    Ps(CInt(rstjdxx_flow_code.Fields("jdbh"))) = CSng(rstjdxx_flow_code.Fields("p")) '/ Sb_jzgl
                    Qs(CInt(rstjdxx_flow_code.Fields("jdbh"))) = (CSng(rstjdxx_flow_code.Fields("qv"))) ^ 2  ' / CSng(rstjdxx_flow_code.Fields("jzdy"))) ^ 2
                    ES(CInt(rstjdxx_flow_code.Fields("jdbh"))) = "1"
                    
                    vv(CInt(rstjdxx_flow_code.Fields("jdbh"))) = CSng(rstjdxx_flow_code.Fields("qv"))
                    qq(CInt(rstjdxx_flow_code.Fields("jdbh"))) = 0
                    
               Case "2" '平衡节点
                    E(CInt(rstjdxx_flow_code.Fields("jdbh"))) = CSng(rstjdxx_flow_code.Fields("qv")) ' / CSng(rstjdxx_flow_code.Fields("jzdy")) '(暂定为1。1)
                    F(CInt(rstjdxx_flow_code.Fields("jdbh"))) = 0
                    ES(CInt(rstjdxx_flow_code.Fields("jdbh"))) = "2"
                    
                    vv(CInt(rstjdxx_flow_code.Fields("jdbh"))) = CSng(rstjdxx_flow_code.Fields("qv"))
                    qq(CInt(rstjdxx_flow_code.Fields("jdbh"))) = 0
                    
        End Select
        rstjdxx_flow_code.MoveNext
    Loop
    rstjdxx_flow_code.Close
    
'    Dim i As Integer '简单的写法,前提是读了数据库
'    For i = 1 To Node_Number
'        If ES(i) = "0" Then
'            vv(i) = 1
'            qq(i) = 0
'        End If
'        If ES(i) = "1" Then
'            vv(i) = E(i)
'            qq(i) = 0
'        End If
'        If ES(i) = "2" Then
'            vv(i) = E(i)
'            qq(i) = 0
'        End If
'    Next i
    
End Sub


⌨️ 快捷键说明

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