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

📄 comtrade.bas

📁 对于符合国际标准COMTRADE格式的数据进行转换处理
💻 BAS
📖 第 1 页 / 共 5 页
字号:
        End If
    Next iAnalogChns
    Print #outfilehandle, "" ' 换行
    
    '-------------
    ' 输出采样数据
    '-------------
    Dim iSwitchByteCount As Integer ' 开关量数据的字数
    iSwitchByteCount = rComtradeFileHeadInfor.lTotalSwitchChs \ 16 + IIf(rComtradeFileHeadInfor.lTotalSwitchChs Mod 16 = 0, 0, 1)
    
    lLineCount = 0  ' 行计数
    For lPoints = 1 To lEndPoints
        lLineCount = lLineCount + 1 ' 行计数
    
        ' 读取采样序号
        Get #infilehandle, , lTemp
        Print #outfilehandle, FormatWithLeftSpace(lTemp, "0", 10) + Space(2);
            
        ' 读取采样点的时间偏移
        Get #infilehandle, , lTemp
        Print #outfilehandle, FormatWithLeftSpace(lTemp, "0.0", 14) + Space(2);
            
        ' 读取模拟量信息
        For iAnalogChns = 1 To rComtradeFileHeadInfor.lTotalAnalogChs
            Get #infilehandle, , iTemp
            If rComtradeAnalogInfor(iAnalogChns).blSelected Then ' 是否被选择输出:True-是
                Print #outfilehandle, FormatWithLeftSpace(rComtradeAnalogInfor(iAnalogChns).fOffset + rComtradeAnalogInfor(iAnalogChns).fCoefficient * iTemp, "0.000", 12) + Space(2);
            End If
        Next iAnalogChns ' 读取模拟量信息
        
        ' 忽略开关量信息
        For iSwitchWord = 1 To iSwitchByteCount ' 开关量数据的字数
            Get #infilehandle, , iTemp
        Next iSwitchWord
                
        Print #outfilehandle, "" ' 换行
    Next lPoints

    Close #infilehandle
    OutputAnalogFromBinaryDataFile = True ' 成功
    Exit Function

lbBinaryAnalogFileError:
    Close #infilehandle
    MsgBox "文件" + Trim$(rComtradeFileHeadInfor.sDatFileName) + "访问失败;出错位置:第" + Trim$(Str(lLineCount)) + "行,原因:" + Err.Description + "。", vbCritical + vbOKOnly, "错误"
    OutputAnalogFromBinaryDataFile = False ' 失败
    Exit Function
End Function

' 输出模拟量数据:文本格式;True-成功;False-失败
Function blOutputAnalogDataTxtFile(sOutFileName As String) As Boolean
    On Error GoTo lbFileAccessErrorOutAna
    
    Dim outfilehandle As Integer
    outfilehandle = FreeFile
    
    Open sOutFileName For Output As #outfilehandle
    
    Print #outfilehandle, "=============================="
    Print #outfilehandle, "  COMTRADE 数据处理工具 V1.0"
    Print #outfilehandle, "=============================="
    Print #outfilehandle, ""
    Print #outfilehandle, "--------------"
    Print #outfilehandle, " 数据文件信息 "
    Print #outfilehandle, "--------------"
    Print #outfilehandle, "配置文件: " + Trim$(rComtradeFileHeadInfor.sCfgFileName) ' 当前配置文件名称
    Print #outfilehandle, "数据文件: " + Trim$(rComtradeFileHeadInfor.sDatFileName) ' 当前数据文件名称
    Print #outfilehandle, "采集装置: " + Trim$(rComtradeFileHeadInfor.sEquipName) ' 采集数据的设备唯一名称
    Print #outfilehandle, "装置标识: " + Trim$(Str$(rComtradeFileHeadInfor.lEquipId)) ' 采集数据的设备唯一ID
    ' 是否输出配置文件信息:0-否,1-是
    If frmOutputAnalog.chkOutputCfgInfor = 1 Then
        Print #outfilehandle, "电网频率: " + Format(rComtradeFileHeadInfor.fFrequency, "0") + "Hz" ' 电网额定频率: 50 或 60
        Print #outfilehandle, "首点时刻: " + Format(rComtradeFileHeadInfor.dFirstPntTime, "YYYY-MM-DD HH:MM:SS") + "." + Format(rComtradeFileHeadInfor.lFirstPntUsec, "000000") ' 第一个采样点对应的绝对时刻
        Print #outfilehandle, "触发时刻: " + Format(rComtradeFileHeadInfor.dAcqZeroTime, "YYYY-MM-DD HH:MM:SS") + "." + Format(rComtradeFileHeadInfor.lAcqZeroUsec, "000000") ' 触发记录对应的绝对时刻(年/月/日 时:分:秒)
        Print #outfilehandle, "文件格式: " + Trim$(rComtradeFileHeadInfor.sFileFormat) ' 文件格式:BINARY-二进制,ASCII-文本
    
        If frmOutputAnalog.chkOutputAcqSegInfor = 1 Then ' 是否输出不同采样频率的数据段信息:0-否,1-是
            Print #outfilehandle, "数据段数: " + Trim$(Str$(rComtradeFileHeadInfor.iNumberOfAcqSeg)) ' 不同采样频率的数据段数
        
            Dim i As Integer
            Print #outfilehandle, Space(8) + "采样频率(Hz)" + Space(2) + "采样结束点" + Space(2) + "输出否"
            Print #outfilehandle, Space(8) + "------------  ----------   ------"
            For i = 1 To rComtradeFileHeadInfor.iNumberOfAcqSeg
                Print #outfilehandle, Space(8) + FormatWithLeftSpace(rComtradeAcqSegInfor(i).fPointsPerSec, "0.000", 11) + Space(3); ' 采样频率
                Print #outfilehandle, FormatWithLeftSpace(rComtradeAcqSegInfor(i).lEndPointOffset, "0", 9) + Space(3); ' 结束采样点记录偏移(本频率段最后一个采样点对应的记录数)
                Print #outfilehandle, Space(2) + IIf(rComtradeAcqSegInfor(i).blSelected, "是", "") ' 是否被选择输出:True-是
            Next i
        End If ' 是否输出不同采样频率的数据段信息
        
        If frmOutputAnalog.chkOutputAnalogDefInfor = 1 Then ' 是否输出模拟量通道定义信息:0-否,1-是
            If rComtradeFileHeadInfor.lTotalAnalogChs > 0 Then
                Print #outfilehandle, "模拟量通道: " + Trim$(Str$(rComtradeFileHeadInfor.lTotalAnalogChs)) + "个"
                Print #outfilehandle, "-----------------"
                '                                 6                     30                         4                   4                  10                       10                       10                        10                        10                            20
                Print #outfilehandle, Space(8) + "通道号" + Space(2) + "通道名称" + Space(22 + 2) + "相序" + Space(2) + "单位" + Space(2) + "系数" + Space(6 + 2) + "偏移量" + Space(4 + 2) + "最小值" + Space(4 + 2) + "最大值" + Space(4 + 2) + "选择否" + Space(2) + "时间偏移" + Space(2 + 2) + "被测对象名称"
                Print #outfilehandle, Space(8) + "------  ------------------------------  ----  ----  ----------  ----------  ----------  ----------  ----------  --------------------"
                For i = 1 To rComtradeFileHeadInfor.lTotalAnalogChs
                    Print #outfilehandle, Space(8) + FormatWithLeftSpace(rComtradeAnalogInfor(i).iChannelID, "0", 5) + Space(3); ' 通道号
                    Print #outfilehandle, Mid$(rComtradeAnalogInfor(i).sChannelName, 1, 30) + sFillSpace(Mid$(rComtradeAnalogInfor(i).sChannelName, 1, 30), 30) + Space(2); ' 通道名称
                    Print #outfilehandle, Mid$(rComtradeAnalogInfor(i).sPhaseName, 1, 4) + sFillSpace(Mid$(rComtradeAnalogInfor(i).sPhaseName, 1, 4), 4) + Space(2); ' 相序
                    Print #outfilehandle, Mid$(rComtradeAnalogInfor(i).sUnitName, 1, 4) + sFillSpace(Mid$(rComtradeAnalogInfor(i).sUnitName, 1, 4), 4) + Space(2); ' 单位
                    Print #outfilehandle, FormatWithLeftSpace(rComtradeAnalogInfor(i).fCoefficient, "0.000000", 10) + Space(2); ' 系数
                    Print #outfilehandle, FormatWithLeftSpace(rComtradeAnalogInfor(i).fOffset, "0.000000", 10) + Space(2); ' 偏移量
                    Print #outfilehandle, FormatWithLeftSpace(rComtradeAnalogInfor(i).lMinValue, "0", 10) + Space(2); ' 最小整数值
                    Print #outfilehandle, FormatWithLeftSpace(rComtradeAnalogInfor(i).lMaxValue, "0", 10) + Space(2); ' 最大整数值
                    Print #outfilehandle, Space(2) + IIf(rComtradeAnalogInfor(i).blSelected, "是", Space(2)) + Space(4); ' 是否被选择输出:True-是
                    Print #outfilehandle, FormatWithLeftSpace(rComtradeAnalogInfor(i).fSkewTime, "0.000000", 10) + Space(2); ' 本通道相对于采样周期的时间偏移
                    Print #outfilehandle, Trim$(rComtradeAnalogInfor(i).sCirCompName) ' 被监测的电路或元件名称
                Next i
            End If ' 是否有模拟量信息
        End If ' 是否输出模拟量通道定义信息
        
        If frmOutputAnalog.chkOutputSwitchDefInfor = 1 Then ' 是否输出开关量通道定义信息:0-否,1-是
            If rComtradeFileHeadInfor.lTotalSwitchChs > 0 Then
                Print #outfilehandle, "开关量通道: " + Trim$(Str(rComtradeFileHeadInfor.lTotalSwitchChs)) + "个"
                Print #outfilehandle, "-----------------"
                Print #outfilehandle, Space(8) + "通道号" + Space(2) + "通道名称" + Space(22 + 2) + "常态" + Space(2) + "选择否"
                Print #outfilehandle, Space(8) + "------  ------------------------------  ----  ------"
                For i = 1 To rComtradeFileHeadInfor.lTotalSwitchChs
                    Print #outfilehandle, Space(8) + FormatWithLeftSpace(rComtradeSwitchInfor(i).iChannelID, "0", 5) + Space(3);
                    Print #outfilehandle, Mid$(rComtradeSwitchInfor(i).sChannelName, 1, 30) + sFillSpace(Mid$(rComtradeSwitchInfor(i).sChannelName, 1, 30), 30) + Space(2);
                    Print #outfilehandle, FormatWithLeftSpace(rComtradeSwitchInfor(i).iNormalStatus, "0", 3) + Space(3);
                    Print #outfilehandle, Space(2) + IIf(rComtradeSwitchInfor(i).blSelected, "是", Space(2))
                Next i
            End If ' 是否有开关量信息
        End If ' 是否输出开关量通道定义信息
    End If ' 是否输出配置文件信息
    
    If InStr(rComtradeFileHeadInfor.sFileFormat, "ASCII") > 0 Then
        ' ASCII格式的数据文件
        blOutputAnalogDataTxtFile = OutputAnalogFromAsciiDataFile(outfilehandle)
    Else
        ' BINARY格式的数据文件
        blOutputAnalogDataTxtFile = OutputAnalogFromBinaryDataFile(outfilehandle)
    End If
    
    Close #outfilehandle ' 关闭输出文件
    Exit Function
    
lbFileAccessErrorOutAna: ' 文件访问失败
    Close #outfilehandle ' 关闭输出文件
    blOutputAnalogDataTxtFile = False ' 失败
    MsgBox "文件" + Trim$(sOutFileName) + "访问失败;原因:" + Err.Description + "。", vbCritical + vbOKOnly, "错误"
    Exit Function
End Function

' 输出模拟量数据
Public Sub OutputAnalogData(sOutFileName As String, iFileFormat As Integer)
    Dim blRet As Boolean
    Select Case iFileFormat
        Case cnTxtFileType   ' 文本格式
            blRet = blOutputAnalogDataTxtFile(sOutFileName)
        Case cnExcelFileType ' EXCEL格式
        Case cnWordFileType  ' WORD格式
        Case cnPdfFileType   ' PDF格式
    End Select
    
    If blRet Then ' 成功
        MsgBox "模拟量输出成功:" + Trim$(sOutFileName) + "。", vbInformation + vbOKOnly, "结果提示"
    Else '失败
        MsgBox "模拟量输出失败", vbCritical + vbOKOnly, "结果提示"
    End If
End Sub

' 从ASCII格式的数据文件中倒出数据: True-成功;False-失败
Function OutputSwitchFromAsciiDataFile(outfilehandle As Integer) As Boolean
    On Error GoTo lbAsciiSwitchFileError
    
    Dim infilehandle As Integer, sLineString As String
    Dim iComPos As Integer, iLastComPos As Integer
    Dim lLineCount As Long, sErrorMessage As String
    
    infilehandle = FreeFile
    Open rComtradeFileHeadInfor.sDatFileName For Input Access Read As #infilehandle
    
    ' 9. Example Ascii Date File
    '      0000000001, 0000000000, 002090, 001827, 002090, 002044,  0, 0
    '      ----------  ----------  -------------------------------  --------
    '       Sample     Time in us  Switch Data Values for Channels  Status
    '       Number     from begi-              1-4                  Infor
    '                  nning or                                     Channels
    '                  record                                       5 and 6
    
    Dim lPoints As Long, iSwitchChns As Integer, lEndPoints As Long
    
    ' 结束采样点
    lEndPoints = rComtradeAcqSegInfor(Val(frmOutputSwitch.txtEndAcqSeg.Text)).lEndPointOffset
    
    '----------
    ' 输出标题
    '----------
    Print #outfilehandle, ""
    Print #outfilehandle, "采样点序号" + Space(2) + "时间偏移(us)" + Space(2);
    For iSwitchChns = 1 To rComtradeFileHeadInfor.lTotalSwitchChs
        If rComtradeSwitchInfor(iSwitchChns).blSelected Then ' 是否被选择输出:True-是
            Print #outfilehandle, "DI" + Format(rComtradeSwitchInfor(iSwitchChns).iChannelID, "00000") + Space(2);  ' 通道号
        End If
    Next iSwitchChns
    Print #outfilehandle, "" ' 换行
    Print #outfilehandle, "----------  --------------  ";
    For iSwitchChns = 1 To rComtradeFileHeadInfor.lTotalSwitchChs
        If rComtradeSwitchInfor(iSwitchChns).blSelected Then ' 是否被选择输出:True-是
            Print #outfilehandle, "-------  ";
        End If
    Next iSwitchChns
    Print #outfilehandle, "" ' 换行
    
    '-------------
    ' 输出采样数据
    '-------------
    lLineCount = 0  ' 行计数
    For lPoints = 1 To lEndPoints
        lLineCount = lLineCount + 1 ' 行计数
        Line Input #infilehandle, sLineString
    
        iComPos = InStr(sLineString, ",")
        If iComPos >= 1 Then ' 读取采样序号
            ' 读取采样序号
            Print #outfilehandle, FormatWithLeftSpace(Val(Mid$(sLineString, 1, iComPos - 1)), "0", 10) + Space(2);
            
            iLastComPos = iComPos
            iComPos = InStr(iLastComPos + 1, sLineString, ",")
            If iComPos >= 1 Then ' 读取采样点的时间偏移
                ' 读取采样点的时间偏移
                Print #outfilehandle, FormatWithLeftSpace(Val(Mid$(sLineString, iLastComPos + 1, iComPos - iLastComPos - 1)), "0.0", 14) + Space(2);
            
                ' 忽略模拟量信息, 借用变量iSwitchChns
                For iSwitchChns = 1 To rComtradeFileHeadInfor.lTotalAnalogChs
                    iLastComPos = iComPos
                    iComPos = InStr(iLastComPos + 1, sLineString, ",")
                Next iSwitchChns
                
                ' 读取开关量信息
                For iSwitchChns = 1 To rComtradeFileHeadInfor.lTotalSwitchChs
                    If iSwitchChns = rComtradeFileHeadInfor.lTotalSwitchChs Then
                        ' 防止没有开关量时出错
                        If rComtradeSwitchInfor(iSwitchChns).blSelected Then ' 是否被选择输出:True-是
                            ' 输出
      

⌨️ 快捷键说明

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