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

📄 vfd-con485.bas

📁 modbusRTU
💻 BAS
字号:
Attribute VB_Name = "Module1"
Option Explicit

Public DataVW(100) As Long
Public DataVD(100) As Single
Public DataVB(100) As Integer
Public ResultBit(0 To 20) As Integer

Public inSafeArray() As String
Public AddPLC As String
Public FlagRec As Boolean
Public FlagVW As Boolean
Public FlagVD As Boolean
Public FlagVB As Boolean

Public BitNumber As Integer

Public ReadNumberB As Integer
Public ReadNumberW As Integer
Public ReadNumberD As Integer

Public AddrReadB As String
Public AddrReadW As String
Public AddrReadD As String

Public Bit(0 To 7) As Integer


 Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
 Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _
hpvDest As Any, hpvSource As Any, ByVal cbCopy As Long)


'CRC校验码生成
 Function CrcResult(ByVal Data As Long, ByVal Genpoly As Long, ByVal CrcData As Long) As Long
    Dim n As Integer
    Data = Data * 2
    For n = 8 To 1 Step -1
        Data = Fix(Data / 2)
        If ((Data Xor CrcData) And 1) Then
            CrcData = Fix(CrcData / 2) Xor Genpoly
        Else
            CrcData = Fix(CrcData / 2)
        End If
    Next n
    CrcResult = CrcData
End Function


Function Chr_4(str As String) As String
    Dim Lenstr As Integer
    Lenstr = Len(str)

    If Lenstr = 1 Then str = "000" + str
    If Lenstr = 2 Then str = "00" + str
    If Lenstr = 3 Then str = "0" + str
    Chr_4 = str
End Function

Function Chr_8(str As String) As String
    Dim Lenstr As Integer
    Lenstr = Len(str)

    If Lenstr = 1 Then str = "0000000" + str
    If Lenstr = 2 Then str = "000000" + str
    If Lenstr = 3 Then str = "00000" + str
    If Lenstr = 4 Then str = "0000" + str
    If Lenstr = 5 Then str = "000" + str
    If Lenstr = 6 Then str = "00" + str
    If Lenstr = 7 Then str = "0" + str
   
    Chr_8 = str
End Function
Function Chr_2(str As String) As String
    Dim Lenstr As Integer
    Lenstr = Len(str)

    If Lenstr = 1 Then str = "0" + str
    Chr_2 = str
End Function

Function HextoSng(strhex As String) As String
    Dim l As Long
    Dim f As Single
    Dim s As String
    
    'strhex = "4131999A"

    l = Val("&H" & strhex)
    CopyMemory f, l, 4
    f = f
    s = Format(f, "0.000")
    HextoSng = s
End Function

Function SngtoHex(SngData As Single) As String
  Dim lngNum     As Long
 
  'SngData = 25.5
  CopyMemory lngNum, SngData, 4
   SngtoHex = Chr_8(Hex(lngNum))
   SngtoHex = Mid(SngtoHex, 1, 4) + Mid(SngtoHex, 5, 4)
   

End Function
Public Function ProcessRecVW()
Dim strVW As String

    Dim i As Integer

        For i = 3 To FrmMain1.MSComm1.RThreshold - 3 Step 2
          strVW = inSafeArray(i) + inSafeArray(i + 1)
         DataVW((i - 3) / 2) = "&H" & strVW
         
        Next i
            
End Function
Public Function ProcessRecBit(BitNumber As Integer)
Dim strVB As String
 Dim i, j As Integer

     For i = 3 To FrmMain1.MSComm1.RThreshold - 3 Step 2
            strVB = inSafeArray(i)
          DataVB((i - 3) / 2) = "&H" & strVB
         
         For j = 7 To 0 Step -1
            If DataVB((i - 3) / 2) \ (2 ^ j) Then
                Bit(j) = 1
            Else
                Bit(j) = 0
            End If
            DataVB((i - 3) / 2) = DataVB((i - 3) / 2) - (2 ^ j) * Bit(j)
         Next j
             ResultBit((i - 3) / 2) = Bit(BitNumber)
    Next i
        
  
            
End Function
Public Function ProcessRecVD()
Dim strVD As String

    Dim i As Integer

        For i = 3 To FrmMain1.MSComm1.RThreshold - 3 Step 4
          strVD = inSafeArray(i) + inSafeArray(i + 1) + inSafeArray(i + 2) + inSafeArray(i + 3)
         DataVD((i - 3) / 4) = HextoSng(strVD)
         
        Next i
            
End Function

Public Function ReadVW(FlagRec As Boolean, AddrReadW As String, ReadNumberW As Integer)
Dim i As Integer

If FlagRec = 0 Then
         FrmMain1.MSComm1.RThreshold = 5 + ReadNumberW * 2
         Call FrameFun(AddPLC, 3, AddrReadW / 2, ReadNumberW)
         FlagVW = True

Else
         Call ProcessRecVW
         FlagVW = False
        For i = 0 To (FrmMain1.MSComm1.RThreshold - 5) / 2 - 1
                FrmMain1.TextDataRW.Text = FrmMain1.TextDataRW.Text & " " & DataVW(i) & Chr(13)
        Next i
       
End If

End Function
Public Function ReadVD(FlagRec As Boolean, AddrReadD As String, ReadNumberD As Integer)
Dim i As Integer

If FlagRec = 0 Then
        FrmMain1.MSComm1.RThreshold = 5 + ReadNumberD * 4
        Call FrameFun(AddPLC, 3, AddrReadD / 2, ReadNumberD * 2)
        FlagVD = True
Else
        Call ProcessRecVD
        FlagVD = False
        For i = 0 To (FrmMain1.MSComm1.RThreshold - 5) / 4 - 1
                FrmMain1.TextDataRD.Text = FrmMain1.TextDataRD.Text & " " & DataVD(i) & Chr(13)
        Next i
       
End If
End Function
Public Function WriteVW(AddrWrite As String, DataWrite As Integer)
       Call FrameFun(AddPLC, 6, AddrWrite / 2, DataWrite)
      FrmMain1.MSComm1.RThreshold = 8
End Function
Public Function WriteVD(AddrWrite As String, DataWrite As Single)
       Call FrameFunTwo(AddPLC, 10, AddrWrite / 2, 2, 4, DataWrite)
       FrmMain1.MSComm1.RThreshold = 8
End Function
Public Function GetBit(FlagRec As Boolean, AddrReadB As String, BitNumber As Integer, ReadNumberB As Integer)
Dim i As Integer

If FlagRec = 0 Then
         FrmMain1.MSComm1.RThreshold = 5 + ReadNumberB * 2
         Call FrameFun(AddPLC, 3, AddrReadB / 2, ReadNumberB)
         FlagVB = True

Else
        Call ProcessRecBit(BitNumber)
        FlagVB = False
          For i = 0 To (FrmMain1.MSComm1.RThreshold - 5) / 2 - 1
                FrmMain1.TextDataRB.Text = FrmMain1.TextDataRB.Text & " " & ResultBit(i) & Chr(13)
          Next i
        
End If

End Function
Public Function SetBitTrue(AddrWrite As String, BitNumber As Integer)
      Call FrameFun(AddPLC, 6, AddrWrite / 2, -1)
      FrmMain1.MSComm1.RThreshold = 8
End Function
Public Function SetBitFalse(AddrWrite As String, BitNumber As Integer)
      Call FrameFun(AddPLC, 6, AddrWrite / 2, 0)
      FrmMain1.MSComm1.RThreshold = 8
End Function

Public Function FrameFun(Addr As String, Cmd As String, Register As String, Data As Integer)
    Dim ComStr          As String
    Dim Temp(6)         As String
    Dim BL              As Byte                       '数据长度
    Dim n               As Byte                       '循环量
    Dim CRC             As Long                       'CRC寄存器
    Dim fx()            As Byte

    Dim hexchrlen%
    Dim Hexchr          As String
    Dim hexcyc%
    Dim hexmid          As Byte
    Dim hexmiddle       As String
    Dim hexchrgroup()   As Byte
    Dim i               As Integer

    '--------------------------------------------------------
    ' 获得数据串

    FrmMain1.MSComm1.OutBufferCount = 0
    Temp(0) = Chr_2(Addr)
    Temp(1) = Chr_2(Cmd)
    Temp(2) = Chr_4(Hex(Register))
    Temp(3) = Chr_4(Hex(Data))

    ComStr = Temp(0) + Temp(1) + Temp(2) + Temp(3)

    '---CRC -----------------------------------------------------
    BL = Len(ComStr) / 2
    ReDim fx(BL + 1)                                  '按命令长度重新定义数组
    CRC = &HFFFF&                                     'CRC初值
    For n = 0 To BL - 1
        fx(n) = CLng("&H" & Mid(ComStr, 2 * n + 1, 2)) '分解命令为字节
        CRC = CrcResult(fx(n), &HA001&, CRC)          'CRC校验码生成调用
    Next

    fx(BL) = CByte(CRC And &HFF&)                     '得到的校验低位
    fx(BL + 1) = CByte(Fix(CRC / 256) And &HFF&)      '得到的校验高位
    Temp(4) = Chr_2(Hex(fx(BL)))
    Temp(5) = Chr_2(Hex(fx(BL + 1)))
    ComStr = Trim(ComStr + Temp(4) + Temp(5))

    '检查数据是否正确
    hexchrlen = Len(ComStr)
    For hexcyc = 1 To hexchrlen                       '检查Text1文本框内数值是否合适
        Hexchr = Mid(ComStr, hexcyc, 1)
        If InStr("0123456789ABCDEFabcdef", Hexchr) = 0 Then
            MsgBox "无效的数值,请重新输入", , "错误信息"
            Exit Function
        End If
    Next

    '分解数据 为 二进制发送 模式

   ' ReDim hexchrgroup(1 To hexchrlen \ 2) As Byte
    ReDim hexchrgroup(hexchrlen \ 2 - 1) ' As Byte
    For hexcyc = 1 To hexchrlen Step 2                '将文本框内数值分成两个、两个
       
         Hexchr = Mid(ComStr, hexcyc, 2)
    '    Hexchr = "FF"
        hexmid = Val("&H" & CStr(Hexchr))
        hexchrgroup(i) = hexmid
       i = i + 1
    Next

        FrmMain1.MSComm1.Output = hexchrgroup ''''ComStr '
        Sleep 100



End Function
Public Function FrameFunTwo(Addr As String, Cmd As String, Register As String, Number As String, ByteNum As String, Data As Single)
    Dim ComStr          As String
    Dim Temp(7)         As String
    Dim BL              As Byte                       '数据长度
    Dim n               As Byte                       '循环量
    Dim CRC             As Long                       'CRC寄存器
    Dim fx()            As Byte

    Dim hexchrlen%
    Dim Hexchr          As String
    Dim hexcyc%
    Dim hexmid          As Byte
    Dim hexmiddle       As String
    Dim hexchrgroup()   As Byte
    Dim i               As Integer

    '--------------------------------------------------------
    ' 获得数据串

    FrmMain1.MSComm1.OutBufferCount = 0
    Temp(0) = Chr_2(Addr)
    Temp(1) = Chr_2(Cmd)
    Temp(2) = Chr_4(Hex(Register))
    Temp(3) = Chr_4(Hex(Number))
    Temp(4) = Chr_2(Hex(ByteNum))
    Temp(5) = SngtoHex(Data)

    ComStr = Temp(0) + Temp(1) + Temp(2) + Temp(3) + Temp(4) + Temp(5)

    '---CRC -----------------------------------------------------
    BL = Len(ComStr) / 2
    ReDim fx(BL + 1)                                  '按命令长度重新定义数组
    CRC = &HFFFF&                                     'CRC初值
    For n = 0 To BL - 1
        fx(n) = CLng("&H" & Mid(ComStr, 2 * n + 1, 2)) '分解命令为字节
        CRC = CrcResult(fx(n), &HA001&, CRC)          'CRC校验码生成调用
    Next

    fx(BL) = CByte(CRC And &HFF&)                     '得到的校验低位
    fx(BL + 1) = CByte(Fix(CRC / 256) And &HFF&)      '得到的校验高位
    Temp(6) = Chr_2(Hex(fx(BL)))
    Temp(7) = Chr_2(Hex(fx(BL + 1)))
    ComStr = Trim(ComStr + Temp(6) + Temp(7))

    '检查数据是否正确
    hexchrlen = Len(ComStr)
    For hexcyc = 1 To hexchrlen                       '检查Text1文本框内数值是否合适
        Hexchr = Mid(ComStr, hexcyc, 1)
        If InStr("0123456789ABCDEFabcdef", Hexchr) = 0 Then
            MsgBox "无效的数值,请重新输入", , "错误信息"
            Exit Function
        End If
    Next

    '分解数据 为 二进制发送 模式
   
   ' ReDim hexchrgroup(1 To hexchrlen \ 2) As Byte
    ReDim hexchrgroup(hexchrlen \ 2 - 1) 'As Byte
    For hexcyc = 1 To hexchrlen Step 2                '将文本框内数值分成两个、两个
       
         Hexchr = Mid(ComStr, hexcyc, 2)
    '    Hexchr = "FF"
        hexmid = Val("&H" & CStr(Hexchr))
        hexchrgroup(i) = hexmid
     
        i = i + 1

    Next
     
        FrmMain1.MSComm1.Output = hexchrgroup ''''ComStr '
        Sleep 100
   
End Function

⌨️ 快捷键说明

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