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

📄 frm_readstat.frm

📁 电能表抄表软件,基本符合国家颁布的DL645通讯规约,去除了一些不必要的功能
💻 FRM
📖 第 1 页 / 共 4 页
字号:
   End
End
Attribute VB_Name = "Frm_readstat"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False

Dim i, arr_i As Byte
Dim ii As Integer
Dim outbyte() As Byte
Dim Inbyte() As Byte
Dim start, finish, totaltime As Long

Private Sub Com_cancel_Click()
            Timer1.Enabled = False
            Timer3.Enabled = False
            Timer4.Enabled = False
            If MSComm1.PortOpen Then MSComm1.PortOpen = False
            end_s = True
            MARK = 0 '发送完毕
            Com_cancel.Visible = False
            MousePointer = 0 '鼠标形状还原
            Label13.Visible = False
            ProgressBar1.Visible = False
End Sub
Private Sub Form_Load()
mtitle = "读状态"
End Sub

Private Sub Form_Unload(Cancel As Integer)
   If MSComm1.PortOpen Then MSComm1.PortOpen = False
End Sub
Private Sub send_meter_Click() '发送到表
 Dim gvbh_str(5) As Byte
 Dim pp As Boolean
 If end_s Then       '正在通讯不执行发送.
'计算选择项数目
j = 0
For n = 17 To 30
        If Check1(n).Value Then j = j + 1
Next
If j = 0 Then
            Err.Number = 621        '没有选择命令项错误
            GoTo line_err2
End If
    MSComm1.CommPort = B_COMPORT
   
  If MSComm1.PortOpen Then MSComm1.PortOpen = False
     MSComm1.OutBufferSize = 1
        On Error Resume Next
        MSComm1.PortOpen = True
        If Err.Number = 8002 Then
            MsgBox "通讯端口号错误!", vbExclamation, mtitle        '错误信息,一个确认键,标题栏文本
            MARK = 0
            Exit Sub
        End If

        MSComm1.InputMode = comInputModeBinary
        'MSComm1.RThreshold = 1 '收到一个字符产生一次ONCOMM事件
        MSComm1.InBufferCount = 0
        MSComm1.PortOpen = False
  Call chang_color          '改变已抄数据的颜色为黑色

 
If Option3.Value Then
  If Option1.Value Then
        If Text0.Text <> "" Then
        
        Else
line_err0:        Err.Number = 2
line_err2:        OnErrStatement (mtitle)
        Exit Sub
        End If
  Else
        If Text4.Text <> "" Then
        
        Else
        GoTo line_err0
        End If
  End If
Else
    For i = 0 To 5
    gvbh_str(i) = &HAA
    Next
End If
      Call copy_Com(Check1, gvbh_str, 17, 31) '拼装抄表命令字
      end_s = False             '设通讯状态标志
      ii = 16:  SEND_MARK = 0 '开始发送命令通讯
      Label6.Visible = False
      ProgressBar1.Visible = True
      ProgressBar1.Value = ProgressBar1.Min '设置进度的值为 Min,初始化ProgressBar。
      Label13.Visible = True
    MousePointer = 11 '设置鼠标为沙漏型
    If MSComm1.PortOpen <> True Then MSComm1.PortOpen = True
    start = Timer   ' 设置开始通讯的时刻。
    Timer1.Enabled = True
    Com_cancel.Visible = True
   End If
End Sub

Private Sub Timer1_Timer() '启动发送命令
'If Err.Number = 0 Then
       If (SEND_MARK = 0) And (IsEmpty(send_r(ii)) = False) Then
            Timer1.Enabled = False
            outbyte() = send_r(ii)
            send_count = 1 + UBound(send_r(ii), 1)  '发送的字节数
            arr_i = 0 '发送命令数组的起始下标
            MSComm1.RTSEnable = False
            Timer3.Enabled = True '启动发送命令定时器
                  
       Else
       Call inc_ii
       End If
End Sub

Private Sub Timer2_Timer()
MSComm1.RTSEnable = True  '最后一个字节发送完毕,RTS使能,启动丕希485通讯转换器RTS(232的7脚)的控制
Timer2.Enabled = False  '关闭发送状态,打开接收状态
End Sub

Private Sub timer3_timer() '发送命令定时器,每个字节之间停顿12ms
Dim ARRR(0) As Byte
    ARRR(0) = outbyte(arr_i)
    MSComm1.Output = ARRR
    arr_i = arr_i + 1
    send_count = send_count - 1
            If send_count = 0 Then
                Timer3.Enabled = False
                Timer2.Enabled = True                   '等待15ms至最后一个字节的最后一位发送完毕
                SEND_MARK = 1                           '一条命令发送完毕
                MSComm1.InBufferCount = 0
                Timer4.Interval = 650
           If ii = 25 Then Timer4.Interval = 1200      '启动等待应答延时监视器(<=1300ms)
           Timer4.Enabled = True                       '启动等待应答延时监视器(<=1300ms)
                           End If
End Sub

Private Sub TIMER4_TIMER() '等待应答延时监视器
           Timer4.Enabled = False
           If MSComm1.InBufferCount = 0 Then
                    MSComm1.PortOpen = False
                    Err.Number = 630
                    OnErrStatement (mtitle)
                    end_s = True '发送完毕
                    Com_cancel.Visible = False
                    MousePointer = 0 '鼠标形状还原
                    ProgressBar1.Visible = False
                    Label13.Visible = False
                    ProgressBar1.Value = ProgressBar1.Min
                    Exit Sub
           End If
            Inbyte() = MSComm1.Input
            Call com_analy(Inbyte)
            SEND_MARK = 0
            If Err.Number = 0 Then
            Call inc_ii
                       Else
            Com_cancel_Click
            End If
 End Sub

Public Sub inc_ii()
            ii = ii + 1
            ProgressBar1.Value = ii
            Timer1.Interval = 22
            If ii < 31 Then
                Timer1.Enabled = True
            Else:
                    Timer1.Enabled = False
                    MSComm1.PortOpen = False
                    
            finish = Timer   ' 设置结束时刻。
            Com_cancel.Visible = False
            totaltime = finish - start   ' 计算总时间。
             end_s = True '发送完毕
             FrmMDI.Timer1 = True '开放时间刷新
            Label13.Visible = False
            ProgressBar1.Visible = False
            MousePointer = 0 '鼠标形状还原
            Label6.Visible = True
            Label6.Caption = "抄表通讯时间共" & CStr(totaltime) & "秒"
            End If
End Sub
Private Sub com_analy(aray() As Byte)
Dim bx, cx, dx, ex, fx, gx, hx, ix, k As Byte
Dim ss(6) As String
Dim FUN_NO As String
cx = UBound(aray()) '接收的字节数
If cx < 10 Then
          Err.Number = 630
            OnErrStatement (mtitle)
            Com_cancel_Click '发送完毕
            Exit Sub
End If
k = 0
'寻找FEH,68H开始的有效应答信号
Do
k = k + 1
Loop Until ((aray(k - 1) = 254) And (aray(k) = 104)) Or (k = cx)
'如果找到了,求和
SUM1 = 0
If (k < cx) Then
j = k + 9 + aray(k + 9)
If j > cx Then GoTo err_line1 '如果接收到的数据长度<应答命令给出的数据长度,说明应答命令错误
For n = k To j
        SUM1 = SUM1 + aray(n)
        Next
        SUM1 = SUM1 Mod 256
        If SUM1 <> aray(n) Then
err_line1:            Err.Number = 631
            OnErrStatement (mtitle)
            Exit Sub
        Else
If k < cx Then                      '将FEH,68H...,16H的数据移动到数组的最开头,覆盖前面的无效数据。便于下面取数据
For ix = 0 To n
aray(ix) = aray(ix + k - 1)
Next
End If


 FUN_NO = CStr(Hex(aray(11))) + CStr(Hex(aray(12)))
 Select Case FUN_NO
 
 Case "43E5" '读最近编程时间
    bx = (aray(16) - &H33) \ 16: cx = (aray(16) - &H33) Mod 16
    dx = (aray(15) - &H33) \ 16: ex = (aray(15) - &H33) Mod 16
    fx = (aray(14) - &H33) \ 16: gx = (aray(14) - &H33) Mod 16
    hx = (aray(13) - &H33) \ 16: ix = (aray(13) - &H33) Mod 16
Text1(65).ForeColor = &HFF&
Text1(65).Text = CStr(bx) + CStr(cx) + "-" + CStr(dx) + CStr(ex) + " " + CStr(fx) + CStr(gx) + ":" + CStr(hx) + CStr(ix)

 
 
 Case "4DE5" '读最近清零时间
    bx = (aray(16) - &H33) \ 16: cx = (aray(16) - &H33) Mod 16
    dx = (aray(15) - &H33) \ 16: ex = (aray(15) - &H33) Mod 16
    fx = (aray(14) - &H33) \ 16: gx = (aray(14) - &H33) Mod 16
    hx = (aray(13) - &H33) \ 16: ix = (aray(13) - &H33) Mod 16
Text1(66).ForeColor = &HFF&
Text1(66).Text = CStr(bx) + CStr(cx) + "-" + CStr(dx) + CStr(ex) + " " + CStr(fx) + CStr(gx) + ":" + CStr(hx) + CStr(ix)
 
 Case "45E5" '读编程次数
    dx = (aray(14) - &H33) \ 16: ex = (aray(14) - &H33) Mod 16
    fx = (aray(13) - &H33) \ 16: gx = (aray(13) - &H33) Mod 16
Text1(67).ForeColor = &HFF&
Text1(67).Text = CStr(dx) + CStr(ex) + CStr(fx) + CStr(gx) & "次"
 
 Case "4EE5" '读清零次数
    dx = (aray(14) - &H33) \ 16: ex = (aray(14) - &H33) Mod 16
    fx = (aray(13) - &H33) \ 16: gx = (aray(13) - &H33) Mod 16
Text1(68).ForeColor = &HFF&
Text1(68).Text = CStr(dx) + CStr(ex) + CStr(fx) + CStr(gx) & "次"
 
 Case "44F3" '读时间
    bx = (aray(15) - &H33) \ 16: cx = (aray(15) - &H33) Mod 16 '时
    dx = (aray(14) - &H33) \ 16: ex = (aray(14) - &H33) Mod 16 '分
    fx = (aray(13) - &H33) \ 16: gx = (aray(13) - &H33) Mod 16 '秒
Text1(70).ForeColor = &HFF&
Text1(70).Text = CStr(bx) + CStr(cx) + ":" + CStr(dx) + CStr(ex) + ":" + CStr(fx) + CStr(gx)
 
  Case "43F3" '读日期及周次
    bx = (aray(16) - &H33) \ 16: cx = (aray(16) - &H33) Mod 16 '年
    dx = (aray(15) - &H33) \ 16: ex = (aray(15) - &H33) Mod 16 '月
    fx = (aray(14) - &H33) \ 16: gx = (aray(14) - &H33) Mod 16 '日
    hx = (aray(13) - &H33) Mod 16 '星期
Text1(69).ForeColor = &HFF&
Dim weekchr(7) As String * 1
 weekchr(1) = "一": weekchr(2) = "二": weekchr(3) = "三"
weekchr(4) = "四": weekchr(5) = "五": weekchr(6) = "六": weekchr(7) = "日"
Text1(69).Text = Left(CStr(Year(Date)), 2) + CStr(bx) + CStr(cx) + "-" + CStr(dx) + CStr(ex) + "-" + CStr(fx) + CStr(gx) + " 星期" + weekchr(hx)


Case "4AF4" '读自动抄表日期
    dx = (aray(14) - &H33) \ 16: ex = (aray(14) - &H33) Mod 16
    fx = (aray(13) - &H33) \ 16: gx = (aray(13) - &H33) Mod 16
Text1(73).ForeColor = &HFF&
Text1(74).ForeColor = &HFF&
Text1(73).Text = CStr(dx) + CStr(ex)
Text1(74).Text = CStr(fx) + CStr(gx)


 Case "46F4" '读循显时间
    bx = (aray(15) - &H33) \ 16: cx = (aray(15) - &H33) Mod 16
    dx = (aray(14) - &H33) \ 16: ex = (aray(14) - &H33) Mod 16
    fx = (aray(13) - &H33) \ 16: gx = (aray(13) - &H33) Mod 16
Text1(72).ForeColor = &HFF&
Text1(72).Text = CStr(bx) + CStr(cx) + CStr(dx) + CStr(ex) + CStr(fx) + CStr(gx) & "秒"






Case "65F3" '读表号
 'If aray(7) <> 170 Then
 '       Check1(25).Value = vbChecked
  '       Frame2.Visible = False
   '      Frame3.Visible = True
        Text1(71).ForeColor = &HFF&
        bx = (aray(18) - &H33) \ 16: cx = (aray(18) - &H33) Mod 16
        dx = (aray(17) - &H33) \ 16: ex = (aray(17) - &H33) Mod 16
        fx = (aray(16) - &H33) \ 16: gx = (aray(16) - &H33) Mod 16
        Text1(71).Text = CStr(bx) + CStr(cx) + CStr(dx) + CStr(ex) + CStr(fx) + CStr(gx)
        bx = (aray(15) - &H33) \ 16: cx = (aray(15) - &H33) Mod 16
        dx = (aray(14) - &H33) \ 16: ex = (aray(14) - &H33) Mod 16
        fx = (aray(13) - &H33) \ 16: gx = (aray(13) - &H33) Mod 16
        Text1(71).Text = Text1(71).Text + CStr(bx) + CStr(cx) + CStr(dx) + CStr(ex) + CStr(fx) + CStr(gx)
    'Else
     '   Check1(27).Value = vbChecked
      '  Frame2.Visible = True
       ' Frame3.Visible = False
      '  Text1(83).ForeColor = &HFF&
      '  Text1(84).ForeColor = &HFF&
      '  Text1(82).ForeColor = &HFF&
      '  dx = (aray(17) - &H33) \ 16: ex = (aray(17) - &H33) Mod 16
      '  Text1(82).Text = Left(CStr(Year(Now)), 2) + CStr(dx) + CStr(ex) '年份
      '  fx = aray(16) - &H33
      '  If fx > &H39 Then
      '      Text1(84).Text = Chr(fx)
      '  Else
      '      Text1(84).Text = CStr(fx)
      '  End If
      '  bx = (aray(15) - &H33) \ 16: cx = (aray(15) - &H33) Mod 16
      '  dx = (aray(14) - &H33) \ 16: ex = (aray(14) - &H33) Mod 16
      '  fx = (aray(13) - &H33) \ 16: gx = (aray(13) - &H33) Mod 16
      '  Text1(83).Text = CStr(bx) + CStr(cx) + CStr(dx) + CStr(ex) + CStr(fx) + CStr(gx)
   
'End If


 Case "67F3" '读设备码
    bx = (aray(18) - &H33) \ 16: cx = (aray(18) - &H33) Mod 16
    dx = (aray(17) - &H33) \ 16: ex = (aray(17) - &H33) Mod 16
    fx = (aray(16) - &H33) \ 16: gx = (aray(16) - &H33) Mod 16
    hx = (aray(15) - &H33) \ 16: ix = (aray(15) - &H33) Mod 16
    jx = (aray(14) - &H33) \ 16: kx = (aray(14) - &H33) Mod 16
    lx = (aray(13) - &H33) \ 16: mx = (aray(13) - &H33) Mod 16
Text1(75).ForeColor = &HFF&
Text1(75).Text = CStr(bx) + CStr(cx) + CStr(dx) + CStr(ex) + CStr(fx) + CStr(gx) + CStr(hx) + CStr(ix) + CStr(jx) + CStr(kx) + CStr(lx) + CStr(mx)


Case "63F4" '读循环显示项目数
     hx = (aray(13) - &H33) \ 16: ix = (aray(13) - &H33) Mod 16
Text1(76).ForeColor = &HFF&
Text1(76).Text = CStr(hx) + CStr(ix)




Case "43F9" '读第01项循环显示项目
    fx = (aray(14) - &H33) \ 16: gx = (aray(14) - &H33) Mod 16
    hx = (aray(13) - &H33) \ 16: ix = (aray(13) - &H33) Mod 16
    Text1(77).ForeColor = &HFF&
    Text1(77).Text = CStr(fx) + CStr(gx) + CStr(hx) + CStr(ix)
    
Case "44F9" '读第02项循环显示项目
    fx = (aray(14) - &H33) \ 16: gx = (aray(14) - &H33) Mod 16
    hx = (aray(13) - &H33) \ 16: ix = (aray(13) - &H33) Mod 16
    Text1(78).ForeColor = &HFF&
    Text1(78).Text = CStr(fx) + CStr(gx) + CStr(hx) + CStr(ix)
    
Case "45F9" '读第03项循环显示项目
    fx = (aray(14) - &H33) \ 16: gx = (aray(14) - &H33) Mod 16
    hx = (aray(13) - &H33) \ 16: ix = (aray(13) - &H33) Mod 16
    Text1(79).ForeColor = &HFF&
    Text1(79).Text = CStr(fx) + CStr(gx) + CStr(hx) + CStr(ix)
    
Case "44F9" '读第04项循环显示项目
    fx = (aray(14) - &H33) \ 16: gx = (aray(14) - &H33) Mod 16
    hx = (aray(13) - &H33) \ 16: ix = (aray(13) - &H33) Mod 16
    Text1(80).ForeColor = &HFF&
  If (aray(13) Or aray(14)) = 0 Then
Text1(80).Text = "无"
Else
Text1(80).Text = CStr(fx) + CStr(gx) + CStr(hx) + CStr(ix)
End If
    
    
    
    
 Case "53E3" '最近反向起始时间
    bx = (aray(16) - &H33) \ 16: cx = (aray(16) - &H33) Mod 16
    dx = (aray(15) - &H33) \ 16: ex = (aray(15) - &H33) Mod 16
    fx = (aray(14) - &H33) \ 16: gx = (aray(14) - &H33) Mod 16
    hx = (aray(13) - &H33) \ 16: ix = (aray(13) - &H33) Mod 16
Text1(81).ForeColor = &HFF&
Text1(81).Text = CStr(bx) + CStr(cx) + "-" + CStr(dx) + CStr(ex) + " " + CStr(fx) + CStr(gx) + ":" + CStr(hx) + CStr(ix)
 
    bx = (aray(20) - &H33) \ 16: cx = (aray(20) - &H33) Mod 16
    dx = (aray(19) - &H33) \ 16: ex = (aray(19) - &H33) Mod 16
    fx = (aray(18) - &H33) \ 16: gx = (aray(18) - &H33) Mod 16
    hx = (aray(17) - &H33) \ 16: ix = (aray(17) - &H33) Mod 16
    
Text1(82).ForeColor = &HFF&
Text1(82).Text = bx + cx + dx + ex + fx + gx + hx + ix
 
 End Select
End If
Else
GoTo err_line1
 End If
End Sub

Private Sub chang_color()
For i = 65 To 84
Text1(i).ForeColor = &H80000008
Next


End Sub


Private Sub clr_select_Click() '取消选择
If end_s Then
For i = 17 To 30
Check1(i).Value = vbUnchecked
Next
End If
End Sub
Private Sub all_select_Click() '全选
If end_s Then
For i = 17 To 30
Check1(i).Value = vbChecked
Next
End If
End Sub

⌨️ 快捷键说明

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