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

📄 modmodbusresp.bas

📁 一个modbus的测试工具
💻 BAS
字号:
Attribute VB_Name = "modModbusResp"
Option Explicit

Type HardwareSet
    byInterfaceType As Byte
    byCOMPort As Byte
    byBaudRate As Integer
    byParityMode As Byte
    byDataBit As Byte
    byStopBit As Byte
    byHandShaking As Byte
    bEOFEnable As Boolean
    bNullDiscard As Boolean
    bRTSEnable As Boolean
    bDTREnable As Boolean
End Type

Type ProtocolSet
    byAddress As Byte
    byFrameType As Byte
    byCheckMode As Byte
    byCRCByte As Byte
    iScan As Integer
    iCoilAddress As Integer
    iInputAddress As Integer
    iHoldRegAddress As Integer
    iInputRegAddress As Integer
    iForceCoilAddress As Integer
    iPresetRegAddress As Integer
End Type

Global Const gcMAXCOIL = 2000
Global Const gcMAXINPUT = 2000
Global Const gcMAXHOLDREG = 512
Global Const gcMAXINPUTREG = 512
Global Const gcMAXFORCECOIL = 800
Global Const gcMAXPRESETREG = 100

Global gbOnline As Boolean
Global gtHDSet As HardwareSet
Global gtPLSet As ProtocolSet
Global gsBaudRate(17) As String
Global gsParityMode(4) As String
Global gsDataBit(4) As String
Global gsStopBit(2) As String
Global gsFrameType(1) As String
Global gsCheckMode(3) As String
Global gbSpy As Boolean
Global gbyCoil(gcMAXCOIL) As Byte
Global gbyInput(gcMAXINPUT) As Byte
Global giHoldReg(gcMAXHOLDREG) As Integer
Global giInputReg(gcMAXINPUTREG) As Integer
Global gbyForceCoil(gcMAXFORCECOIL) As Byte
Global giPresetReg(gcMAXPRESETREG) As Integer

Private Sub Main()
    Dim strTemp As String
    Dim i As Integer
    Dim strOutBuf(10) As String
    Dim byData As Byte
    Dim iItem As Integer
    Dim iData As Integer
    
    gbOnline = False
    gbSpy = False
    iItem = 0
    gsBaudRate(0) = "75"
    gsBaudRate(1) = "110"
    gsBaudRate(2) = "134"
    gsBaudRate(3) = "150"
    gsBaudRate(4) = "300"
    gsBaudRate(5) = "600"
    gsBaudRate(6) = "1200"
    gsBaudRate(7) = "1800"
    gsBaudRate(8) = "2400"
    gsBaudRate(9) = "4800"
    gsBaudRate(10) = "7200"
    gsBaudRate(11) = "9600"
    gsBaudRate(12) = "14400"
    gsBaudRate(13) = "19200"
    gsBaudRate(14) = "38400"
    gsBaudRate(15) = "57600"
    gsBaudRate(16) = "115200"
    gsBaudRate(17) = "128000"
    gsParityMode(0) = "Even"
    gsParityMode(1) = "Mask"
    gsParityMode(2) = "None"
    gsParityMode(3) = "Odd"
    gsParityMode(4) = "Space"
    gsDataBit(0) = "4"
    gsDataBit(1) = "5"
    gsDataBit(2) = "6"
    gsDataBit(3) = "7"
    gsDataBit(4) = "8"
    gsStopBit(0) = "1"
    gsStopBit(1) = "1.5"
    gsStopBit(2) = "2"
    gsFrameType(0) = "ASCII"
    gsFrameType(1) = "RTU"
    gsCheckMode(0) = "None"
    gsCheckMode(1) = "CRC1"
    gsCheckMode(2) = "CRC2"
    gsCheckMode(3) = "LRC"
    
    Call gsubCRC16_Init
    
    On Error GoTo ErrIni
    Open App.Path & "\ModbusResp.ini" For Input As #1
    While Not EOF(1)
        Line Input #1, strTemp
        i = gfunSepString(strTemp, "=", strOutBuf)
        If i = 2 Then
            Select Case Trim$(strOutBuf(0))
                Case "InterfaceType"
                    byData = Val(strOutBuf(1))
                    If byData < 0 Or byData > 1 Then
                        GoTo ErrIni
                    Else
                        gtHDSet.byInterfaceType = byData
                        iItem = iItem + 1
                    End If
                Case "COMPort"
                    byData = Val(strOutBuf(1))
                    If byData < 1 Or byData > 10 Then
                        GoTo ErrIni
                    Else
                        gtHDSet.byCOMPort = byData
                        iItem = iItem + 1
                    End If
                Case "BaudRate"
                    For i = 0 To 17
                        If gsBaudRate(i) = Trim$(strOutBuf(1)) Then
                            gtHDSet.byBaudRate = i
                            iItem = iItem + 1
                            i = 99
                        End If
                    Next i
                    If i < 99 Then
                        GoTo ErrIni
                    End If
                Case "ParityMode"
                    For i = 0 To 4
                        If gsParityMode(i) = Trim$(strOutBuf(1)) Then
                            gtHDSet.byParityMode = i
                            iItem = iItem + 1
                            i = 99
                        End If
                    Next i
                    If i < 99 Then
                        GoTo ErrIni
                    End If
                Case "DataBit"
                    For i = 0 To 4
                        If gsDataBit(i) = Trim$(strOutBuf(1)) Then
                            gtHDSet.byDataBit = i
                            iItem = iItem + 1
                            i = 99
                        End If
                    Next i
                    If i < 99 Then
                        GoTo ErrIni
                    End If
                Case "StopBit"
                    For i = 0 To 2
                        If gsStopBit(i) = Trim$(strOutBuf(1)) Then
                            gtHDSet.byStopBit = i
                            iItem = iItem + 1
                            i = 99
                        End If
                    Next i
                    If i < 99 Then
                        GoTo ErrIni
                    End If
                Case "HandShaking"
                    byData = Val(strOutBuf(1))
                    If byData < 0 Or byData > 3 Then
                        GoTo ErrIni
                    Else
                        gtHDSet.byHandShaking = byData
                        iItem = iItem + 1
                    End If
                Case "EOFEnable"
                    byData = Val(strOutBuf(1))
                    If byData = 0 Then
                        gtHDSet.bEOFEnable = False
                        iItem = iItem + 1
                    ElseIf byData = 1 Then
                        gtHDSet.bEOFEnable = True
                        iItem = iItem + 1
                    Else
                        GoTo ErrIni
                    End If
                Case "NullDiscard"
                    byData = Val(strOutBuf(1))
                    If byData = 0 Then
                        gtHDSet.bNullDiscard = False
                        iItem = iItem + 1
                    ElseIf byData = 1 Then
                        gtHDSet.bNullDiscard = True
                        iItem = iItem + 1
                    Else
                        GoTo ErrIni
                    End If
                Case "RTSEnable"
                    byData = Val(strOutBuf(1))
                    If byData = 0 Then
                        gtHDSet.bRTSEnable = False
                        iItem = iItem + 1
                    ElseIf byData = 1 Then
                        gtHDSet.bRTSEnable = True
                        iItem = iItem + 1
                    Else
                        GoTo ErrIni
                    End If
                Case "DTREnable"
                    byData = Val(strOutBuf(1))
                    If byData = 0 Then
                        gtHDSet.bDTREnable = False
                        iItem = iItem + 1
                    ElseIf byData = 1 Then
                        gtHDSet.bDTREnable = True
                        iItem = iItem + 1
                    Else
                        GoTo ErrIni
                    End If
                Case "Address"
                    byData = Val(strOutBuf(1))
                    If byData < 1 Or byData > 247 Then
                        GoTo ErrIni
                    Else
                        gtPLSet.byAddress = byData
                        iItem = iItem + 1
                    End If
                Case "FrameType"
                    For i = 0 To 1
                        If gsFrameType(i) = Trim$(strOutBuf(1)) Then
                            gtPLSet.byFrameType = i
                            iItem = iItem + 1
                            i = 99
                        End If
                    Next i
                    If i < 99 Then
                        GoTo ErrIni
                    End If
                Case "CheckMode"
                    For i = 0 To 3
                        If gsCheckMode(i) = Trim$(strOutBuf(1)) Then
                            gtPLSet.byCheckMode = i
                            If gtPLSet.byFrameType = 0 Then
                                If i = 0 Then
                                    gtPLSet.byCRCByte = 0
                                ElseIf i = 3 Then
                                    gtPLSet.byCRCByte = 2
                                Else
                                    GoTo ErrIni
                                End If
                            ElseIf gtPLSet.byFrameType = 1 Then
                                If i = 0 Then
                                    gtPLSet.byCRCByte = 0
                                ElseIf i = 3 Then
                                    GoTo ErrIni
                                Else
                                    gtPLSet.byCRCByte = 2
                                End If
                            End If
                            iItem = iItem + 1
                            i = 99
                        End If
                    Next i
                    If i < 99 Then
                        GoTo ErrIni
                    End If
                Case "Scan"
                    iData = Val(strOutBuf(1))
                    If iData < 200 Or iData > 1000 Then
                        GoTo ErrIni
                    Else
                        gtPLSet.iScan = iData
                        iItem = iItem + 1
                    End If
                Case "CoilAddress"
                    iData = Val(strOutBuf(1))
                    If iData < 0 Or iData > 65536 - gcMAXCOIL Then
                        GoTo ErrIni
                    Else
                        gtPLSet.iCoilAddress = iData
                        iItem = iItem + 1
                    End If
                Case "InputAddress"
                    iData = Val(strOutBuf(1))
                    If iData < 0 Or iData > 65536 - gcMAXINPUT Then
                        GoTo ErrIni
                    Else
                        gtPLSet.iInputAddress = iData
                        iItem = iItem + 1
                    End If
                Case "HoldRegAddress"
                    iData = Val(strOutBuf(1))
                    If iData < 0 Or iData > 65536 - gcMAXHOLDREG Then
                        GoTo ErrIni
                    Else
                        gtPLSet.iHoldRegAddress = iData
                        iItem = iItem + 1
                    End If
                Case "InputRegAddress"
                    iData = Val(strOutBuf(1))
                    If iData < 0 Or iData > 65536 - gcMAXINPUTREG Then
                        GoTo ErrIni
                    Else
                        gtPLSet.iInputRegAddress = iData
                        iItem = iItem + 1
                    End If
                Case "ForceCoilAddress"
                    iData = Val(strOutBuf(1))
                    If iData < 0 Or iData > 65536 - gcMAXFORCECOIL Then
                        GoTo ErrIni
                    Else
                        gtPLSet.iForceCoilAddress = iData
                        iItem = iItem + 1
                    End If
                Case "PresetRegAddress"
                    iData = Val(strOutBuf(1))
                    If iData < 0 Or iData > 65536 - gcMAXPRESETREG Then
                        GoTo ErrIni
                    Else
                        gtPLSet.iPresetRegAddress = iData
                        iItem = iItem + 1
                    End If
                Case Else
                    GoTo ErrIni
            End Select
        ElseIf i <> 1 Then
            GoTo ErrIni
        End If
    Wend
    If iItem <> 21 Then
        GoTo ErrIni
    End If
    Close (1)
    Load frmModbusPlat
    frmModbusPlat.Show
    Exit Sub
ErrIni:
    MsgBox "配置文件出错,初始化失败", vbOKOnly + vbCritical, "告警"
    Close (1)
End Sub

Public Sub gsubSaveINI()
    On Error Resume Next
    Kill App.Path & "\ModbusResp.ini"
    Open App.Path & "\ModbusResp.ini" For Output As #1
    Print #1, "[硬件设置]"
    Print #1, "InterfaceType = " & gtHDSet.byInterfaceType
    Print #1, ""
    Print #1, "[RS232参数]"
    Print #1, "COMPort = " & gtHDSet.byCOMPort
    Print #1, "BaudRate = " & gsBaudRate(gtHDSet.byBaudRate)
    Print #1, "ParityMode = " & gsParityMode(gtHDSet.byParityMode)
    Print #1, "DataBit = " & gsDataBit(gtHDSet.byDataBit)
    Print #1, "StopBit = " & gsStopBit(gtHDSet.byStopBit)
    Print #1, "HandShaking = " & gtHDSet.byHandShaking
    Print #1, "EOFEnable = " & -gtHDSet.bEOFEnable
    Print #1, "NullDiscard = " & -gtHDSet.bNullDiscard
    Print #1, "RTSEnable = " & -gtHDSet.bRTSEnable
    Print #1, "DTREnable = " & -gtHDSet.bDTREnable
    Print #1, ""
    Print #1, "[Modbus协议]"
    Print #1, "Address = " & gtPLSet.byAddress
    Print #1, "FrameType = " & gsFrameType(gtPLSet.byFrameType)
    Print #1, "CheckMode = " & gsCheckMode(gtPLSet.byCheckMode)
    Print #1, "Scan = " & gtPLSet.iScan
    Print #1, "CoilAddress = " & gtPLSet.iCoilAddress
    Print #1, "InputAddress = " & gtPLSet.iInputAddress
    Print #1, "HoldRegAddress = " & gtPLSet.iHoldRegAddress
    Print #1, "InputRegAddress = " & gtPLSet.iInputRegAddress
    Print #1, "ForceCoilAddress = " & gtPLSet.iForceCoilAddress
    Print #1, "PresetRegAddress = " & gtPLSet.iPresetRegAddress
    Print #1, ""
    Print #1, "[End]"
    Close (1)
End Sub

⌨️ 快捷键说明

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