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

📄 frmvfd_rtu.frm

📁 modbusRTU
💻 FRM
📖 第 1 页 / 共 2 页
字号:
         Top             =   555
         Width           =   975
      End
      Begin VB.TextBox Text1 
         Alignment       =   1  'Right Justify
         BorderStyle     =   0  'None
         Height          =   285
         Left            =   1080
         TabIndex        =   11
         Text            =   "VW"
         Top             =   600
         Width           =   495
      End
      Begin VB.Label Label3 
         Caption         =   "返回值:"
         Height          =   375
         Left            =   240
         TabIndex        =   7
         Top             =   1800
         Width           =   975
      End
      Begin VB.Label Label2 
         Caption         =   "长度:"
         Height          =   375
         Left            =   240
         TabIndex        =   6
         Top             =   1200
         Width           =   975
      End
      Begin VB.Label Label1 
         Caption         =   "起始地址:"
         Height          =   375
         Left            =   240
         TabIndex        =   5
         Top             =   600
         Width           =   975
      End
   End
   Begin VB.Frame Frame5 
      Caption         =   "参数设定"
      Height          =   735
      Left            =   120
      TabIndex        =   0
      Top             =   600
      Width           =   8895
      Begin VB.ComboBox CombAddPLC 
         Height          =   315
         Left            =   6000
         TabIndex        =   23
         Text            =   "Combo6"
         Top             =   240
         Width           =   975
      End
      Begin VB.CommandButton CmdPort 
         Caption         =   "打开端口"
         Height          =   375
         Left            =   7320
         TabIndex        =   2
         Top             =   240
         Width           =   1215
      End
      Begin VB.ComboBox ComboPort 
         Height          =   315
         Left            =   1440
         TabIndex        =   1
         Top             =   270
         Width           =   975
      End
      Begin VB.Label Label7 
         Caption         =   "从站地址:"
         Height          =   255
         Left            =   4680
         TabIndex        =   22
         Top             =   240
         Width           =   975
      End
      Begin VB.Label Label8 
         Caption         =   "端口选择:"
         Height          =   375
         Left            =   240
         TabIndex        =   21
         Top             =   240
         Width           =   975
      End
   End
   Begin MSCommLib.MSComm MSComm1 
      Left            =   0
      Top             =   0
      _ExtentX        =   1005
      _ExtentY        =   1005
      _Version        =   393216
      DTREnable       =   -1  'True
      ParityReplace   =   64
      RTSEnable       =   -1  'True
      ParitySetting   =   2
      InputMode       =   1
   End
End
Attribute VB_Name = "FrmMain1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
'***********************************************************************************************
'读多个保持寄存器值  功能码=03H
'[地址][功能码][寄存器起始地址高8位][寄存器起始地址低8位][寄存器数量高8位][寄存器数量低8位][CRC低字节][CRC高字节]

'写多个保持寄存器值  功能码=10H
'[地址][功能码][寄存器起始地址高8位][寄存器起始地址低8位][寄存器数量高8位][寄存器数量低8位][字节计数][数据高字节][数据低字节]...[数据高字节][数据低字节][CRC低字节][CRC高字节]

'写单个保持寄存器值  功能码=06H
'[地址][功能码][寄存器起始地址高8位][寄存器起始地址低8位][数据高字节][数据低字节][CRC低字节][CRC高字节]
'
'编程 刘胜红 2007-07-13
'************************************************************************************************
Option Explicit

Public AddPLC As String
Public FlagVW As Boolean
Public FlagVD As Boolean
Public RecVW As String
Public RecVD As String
Public FLAG As Boolean
'


Private Sub CmdPort_Click()
 If MSComm1.PortOpen = False Then
 
 MSComm1.CommPort = Me.ComboPort.ListIndex + 1
        MSComm1.Settings = "19200,e,8,1"
        MSComm1.InputMode = comInputModeBinary
        MSComm1.PortOpen = True
    '    Timer1.Enabled = True
End If
 

    If Err Then                                       '打开串口失败,则显示出错信息
        MsgBox Error$, 48, "错误信息"
        Exit Sub
    End If
End Sub

Private Sub CmdReadVD_Click()
 Dim AddRead As String
   ' Dim NumRead As Integer
   ' Dim A As Single
    
     AddPLC = CStr(Me.CombAddPLC.Text)
   ' NumRead = Val(Me.CobNumRead.Text)
     AddRead = CStr(TextAddR.Text)
      
  '  A = HextoSng("41CC0000")
     FrameFun AddPLC, 3, AddRead, 2
     MSComm1.RThreshold = 9
     FlagVD = True
End Sub

Private Sub CmdReadVW_Click()
   Dim AddRead As String
 
   ' Dim NumRead As Integer
      
     AddPLC = CStr(Me.CombAddPLC.Text)
   ' NumRead = Val(Me.CobNumRead.Text)
     AddRead = CStr(TextAddR.Text)
               
     FrameFun AddPLC, 3, AddRead, 1
   
 
     MSComm1.RThreshold = 7
     FlagVW = True
End Sub

Private Sub CmdWriteVD_Click()
    Dim AddWrite As String
    'Dim NumWrite As Integer
    Dim DataWrite As Single

    AddPLC = CStr(Me.CombAddPLC.Text)
   ' NumWrite = Val(Me.CobNumWrite.Text)
    AddWrite = CStr(TextAddD.Text)
    DataWrite = Val(Me.TextDataD.Text)

     FrameFunTwo AddPLC, 10, AddWrite, 2, 4, DataWrite
     MSComm1.RThreshold = 8
End Sub

Private Sub CmdWriteVW_Click()
    Dim AddWrite As String
    'Dim NumWrite As Integer
    Dim DataWrite As Integer

    AddPLC = CStr(Me.CombAddPLC.Text)
   ' NumWrite = Val(Me.CobNumWrite.Text)
    AddWrite = CStr(TextAddW.Text)
    DataWrite = Val(Me.TextDataW.Text)

     FrameFun AddPLC, 6, AddWrite, DataWrite
     MSComm1.RThreshold = 7
End Sub

Private Sub CombAddPLC_Change()
AddPLC = Me.CombAddPLC.ListIndex
End Sub



Private Sub Form_Load()
Dim i As Integer
    Me.Move (Screen.Width - Me.Width) \ 2, (Screen.Height - Me.Height) \ 2
    
    ComboPort.AddItem "1"
    ComboPort.AddItem "2"
    ComboPort.AddItem "3"
    ComboPort.ListIndex = 0

    For i = 0 To 254
        CobNumRead.AddItem i
        CobNumWrite.AddItem i
        Me.CombAddPLC.AddItem i
    Next
    Me.CombAddPLC.ListIndex = 2
    CobNumRead.ListIndex = 1
    CobNumWrite.ListIndex = 1
    
    FlagVW = False
    FlagVD = False
End Sub

Private Sub Form_Unload(Cancel As Integer)
    If MSComm1.PortOpen = True Then MSComm1.PortOpen = False
End Sub
Sub 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

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

    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 Sub
        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

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



End Sub
 Sub 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

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

    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 Sub
        End If
    Next

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

    Next
     
        MSComm1.Output = hexchrgroup ''''ComStr '
        Sleep 100
     
      
   
 
End Sub

Private Sub MSComm1_OnComm()
    Dim Inbyte() As Byte
    
    Dim InHEx As String
    Dim i, j As Integer
    
   ' TextDataR.Text = ""
    ReDim inSafeArray(MSComm1.RThreshold)
    If MSComm1.CommEvent = comEvReceive Then          '收到 RThreshold # of chars.
            Inbyte = MSComm1.Input
        For i = 0 To MSComm1.RThreshold - 1
            InHEx = Hex(Val(Inbyte(i)))
            inSafeArray(i) = IIf(Len(InHEx) < 2, "0" + InHEx, InHEx)
            Me.Text6.Text = Me.Text6.Text & inSafeArray(i)
        Next i
         RecVW = Text6.Text
          
          FLAG = 1
          
        If FlagVW = True Then
           RecVW = Text6.Text
           Call ProcessRecVW

           For j = 3 To MSComm1.RThreshold - 3 Step 2
              Me.TextDataRW.Text = Me.TextDataRW.Text + " " & DataVW((j - 3) / 2)
            Next j

        ElseIf FlagVD = True Then
           RecVD = Text6.Text
           Call ProcessRecVD

           For j = 3 To MSComm1.RThreshold - 3 Step 4
              Me.TextDataRD.Text = Me.TextDataRD.Text + " " & DataVD((j - 3) / 4)
            Next j

        End If
        
    End If

End Sub

Private Sub ComboPort_Click()              '串口选择
    MSComm1.CommPort = ComboPort.ListIndex + 1
End Sub


Private Sub Timer1_Timer()
 Dim AddRead As String
   ' Dim NumRead As Integer
   ' Dim A As Single
    
     AddPLC = CStr(Me.CombAddPLC.Text)
   ' NumRead = Val(Me.CobNumRead.Text)
     AddRead = CStr(TextAddR.Text)
      
  '  A = HextoSng("41CC0000")
     FrameFun AddPLC, 3, AddRead, 2
     MSComm1.RThreshold = 9
     FlagVD = True
End Sub

⌨️ 快捷键说明

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