📄 comtrade.bas
字号:
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 + -