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

📄 frmmodbusplat.frm

📁 一个modbus的测试工具
💻 FRM
📖 第 1 页 / 共 4 页
字号:
    stbStatus.Panels(cTIMESTATUSINDEX).Text = Format$(Time, "hh:mm:ss")
    If gbOnline Then
        If MSComm1.InBufferCount > 4 Then
            iInSize = MSComm1.InBufferCount
            vaInBuffer = MSComm1.Input
            If gtPLSet.byFrameType = 0 Then
                ReDim strInBuffer(iInSize - 1)
                For i = 0 To iInSize - 1
                    strInBuffer(i) = Mid$(vaInBuffer, i, 1)
                Next i
            '    strInBuffer = MSComm1.Input
            Else
                byInBuffer = vaInBuffer
            End If
            If gbSpy Then
                strTemp = "→" & " " & Format$(Time, "hh:mm:ss")
                If gtPLSet.byFrameType = 0 Then
                    strTemp = strTemp & " " & vaInBuffer
                    frmPortSpy.txtCOMSpy.Text = strTemp & frmPortSpy.txtCOMSpy.Text
                Else
                    For i = 0 To iInSize - 1
                        If byInBuffer(i) < 16 Then
                            strTemp = strTemp & " 0" & Hex$(byInBuffer(i))
                        Else
                            strTemp = strTemp & " " & Hex$(byInBuffer(i))
                        End If
                    Next i
                    frmPortSpy.txtCOMSpy.Text = strTemp & vbCrLf & frmPortSpy.txtCOMSpy.Text
                End If
            End If
            If gtPLSet.byFrameType = 0 Then
                If strInBuffer(0) <> ":" Then
                    stbStatus.Panels(cPLDESPINDEX).Text = "报文头不正确"
                    Exit Sub
                End If
                If (CByte(strInBuffer(1)) * &H10 + CByte(strInBuffer(2))) <> gtPLSet.byAddress Then
                    stbStatus.Panels(cPLDESPINDEX).Text = "地址不匹配"
                    Exit Sub
                End If
                If strInBuffer(iInSize - 2) <> vbCr Or strInBuffer(iInSize - 1) <> vbLf Then
                    stbStatus.Panels(cPLDESPINDEX).Text = "报文尾不正确"
                    Exit Sub
                End If
            Else
                If byInBuffer(0) <> gtPLSet.byAddress Then
                    stbStatus.Panels(cPLDESPINDEX).Text = "地址不匹配"
                    Exit Sub
                End If
            End If
            
            Select Case gtPLSet.byCheckMode
                Case 1, 2           ' CRC1 or CRC 2
                    iCrc = &HFFFF
                    For i = 0 To iInSize - 3
                        iCrc = gfunCal_CRC16(byInBuffer(i), iCrc)
                    Next i
                    byCrc(0) = iCrc And &HFF
                    byCrc(1) = gfunRightMove(iCrc, 8)
                    If byCrc(0) <> byInBuffer(iInSize - 2) And byCrc(1) <> byInBuffer(iInSize - 1) Then
                        stbStatus.Panels(cPLDESPINDEX).Text = "校验码错误"
                        Exit Sub
                    End If
                Case 3              ' LRC
                    byCrc(0) = &H0
                    For i = 0 To iInSize - 5
                        byCrc(0) = byCrc(0) + CByte(strInBuffer(i + 1))
                    Next i
                    byCrc(0) = &HFF - byCrc(0)
                    byCrc(0) = 1 + byCrc(0)
                    If Left$(Hex$(byCrc(0)), 1) <> strInBuffer(iInSize - 4) And Left$(Hex$(byCrc(0)), 2) <> strInBuffer(iInSize - 3) Then
                        stbStatus.Panels(cPLDESPINDEX).Text = "校验码错误"
                        Exit Sub
                    End If
            End Select
            If gtPLSet.byFrameType = 0 Then
                Select Case CByte(strInBuffer(3)) * &H10 + CByte(strInBuffer(4))
                    Case 1          ' coil
                        iAddress = (CByte(strInBuffer(5)) * &H10 + CByte(strInBuffer(6))) _
                            * &H100 + CByte(strInBuffer(7)) * &H10 + CByte(strInBuffer(8))
                        iAddress = iAddress - gtPLSet.iCoilAddress
                        iDataCount = (CByte(strInBuffer(9)) * &H10 + CByte(strInBuffer(10))) _
                            * &H100 + CByte(strInBuffer(11)) * &H10 + CByte(strInBuffer(12))
                        If iAddress < 0 Then
                            iPkgLen = 8 + gtPLSet.byCRCByte
                            ReDim strOutBuffer(iPkgLen)
                            strOutBuffer(0) = ":"
                            strOutBuffer(1) = strInBuffer(1)
                            strOutBuffer(2) = strInBuffer(2)
                            strOutBuffer(3) = "8"
                            strOutBuffer(4) = "1"
                            strOutBuffer(5) = "0"
                            strOutBuffer(6) = "2"
                        ElseIf iDataCount > gcMAXCOIL Or iDataCount < 1 Then
                            iPkgLen = 8 + gtPLSet.byCRCByte
                            ReDim strOutBuffer(iPkgLen)
                            strOutBuffer(0) = ":"
                            strOutBuffer(1) = strInBuffer(1)
                            strOutBuffer(2) = strInBuffer(2)
                            strOutBuffer(3) = "8"
                            strOutBuffer(4) = "1"
                            strOutBuffer(5) = "0"
                            strOutBuffer(6) = "3"
                        Else
                            If iDataCount Mod 8 = 0 Then
                                byByteCount = iDataCount / 8
                            Else
                                byByteCount = iDataCount / 8 + 1
                            End If
                            iPkgLen = 8 + byByteCount * 2 + gtPLSet.byCRCByte
                            ReDim strOutBuffer(iPkgLen)
                            strOutBuffer(0) = ":"
                            strOutBuffer(1) = strInBuffer(1)
                            strOutBuffer(2) = strInBuffer(2)
                            strOutBuffer(3) = "0"
                            strOutBuffer(4) = "1"
                            strOutBuffer(5) = Mid$(Hex$(byByteCount), 1, 1)
                            strOutBuffer(6) = Mid$(Hex$(byByteCount), 2, 1)
                            k = 0
                            For i = 0 To byByteCount - 1
                                byData = 0
                                For j = 0 To 15
                                    byData = byData + gbyCoil(iAddress) * 2 ^ j
                                    iAddress = iAddress + 1
                                Next j
                                strOutBuffer(7 + k) = Mid$(Hex$(byData), 1, 1)
                                strOutBuffer(8 + k) = Mid$(Hex$(byData), 2, 1)
                                k = k + 2
                            Next i
                        End If
                    Case 2          ' input
                        iAddress = (CByte(strInBuffer(5)) * &H10 + CByte(strInBuffer(6))) _
                            * &H100 + CByte(strInBuffer(7)) * &H10 + CByte(strInBuffer(8))
                        iAddress = iAddress - gtPLSet.iCoilAddress
                        iDataCount = (CByte(strInBuffer(9)) * &H10 + CByte(strInBuffer(10))) _
                            * &H100 + CByte(strInBuffer(11)) * &H10 + CByte(strInBuffer(12))
                        If iAddress < 0 Then
                            iPkgLen = 8 + gtPLSet.byCRCByte
                            ReDim strOutBuffer(iPkgLen)
                            strOutBuffer(0) = ":"
                            strOutBuffer(1) = strInBuffer(1)
                            strOutBuffer(2) = strInBuffer(2)
                            strOutBuffer(3) = "8"
                            strOutBuffer(4) = "1"
                            strOutBuffer(5) = "0"
                            strOutBuffer(6) = "2"
                        ElseIf iDataCount > gcMAXINPUT Or iDataCount < 1 Then
                            iPkgLen = 8 + gtPLSet.byCRCByte
                            ReDim strOutBuffer(iPkgLen)
                            strOutBuffer(0) = ":"
                            strOutBuffer(1) = strInBuffer(1)
                            strOutBuffer(2) = strInBuffer(2)
                            strOutBuffer(3) = "8"
                            strOutBuffer(4) = "1"
                            strOutBuffer(5) = "0"
                            strOutBuffer(6) = "3"
                        Else
                            If iDataCount Mod 8 = 0 Then
                                byByteCount = iDataCount / 8
                            Else
                                byByteCount = iDataCount / 8 + 1
                            End If
                            iPkgLen = 8 + byByteCount * 2 + gtPLSet.byCRCByte
                            ReDim strOutBuffer(iPkgLen)
                            strOutBuffer(0) = ":"
                            strOutBuffer(1) = strInBuffer(1)
                            strOutBuffer(2) = strInBuffer(2)
                            strOutBuffer(3) = "0"
                            strOutBuffer(4) = "2"
                            strOutBuffer(5) = Mid$(Hex$(byByteCount), 1, 1)
                            strOutBuffer(6) = Mid$(Hex$(byByteCount), 2, 1)
                            k = 0
                            For i = 0 To byByteCount - 1
                                byData = 0
                                For j = 0 To 15
                                    byData = byData + gbyInput(iAddress) * 2 ^ j
                                    iAddress = iAddress + 1
                                Next j
                                strOutBuffer(7 + k) = Mid$(Hex$(byData), 1, 1)
                                strOutBuffer(8 + k) = Mid$(Hex$(byData), 2, 1)
                                k = k + 2
                            Next i
                        End If
                    Case 3          ' holding register
                        iAddress = (CByte(strInBuffer(5)) * &H10 + CByte(strInBuffer(6))) _
                            * &H100 + CByte(strInBuffer(7)) * &H10 + CByte(strInBuffer(8))
                        iAddress = iAddress - gtPLSet.iHoldRegAddress
                        iDataCount = (CByte(strInBuffer(9)) * &H10 + CByte(strInBuffer(10))) _
                            * &H100 + CByte(strInBuffer(11)) * &H10 + CByte(strInBuffer(12))
                        If iAddress < 0 Then
                            iPkgLen = 8 + gtPLSet.byCRCByte
                            ReDim strOutBuffer(iPkgLen)
                            strOutBuffer(0) = ":"
                            strOutBuffer(1) = strInBuffer(1)
                            strOutBuffer(2) = strInBuffer(2)
                            strOutBuffer(3) = "8"
                            strOutBuffer(4) = "1"
                            strOutBuffer(5) = "0"
                            strOutBuffer(6) = "2"
                        ElseIf iDataCount > gcMAXHOLDREG Or iDataCount < 1 Or iDataCount > 125 Then
                            iPkgLen = 8 + gtPLSet.byCRCByte
                            ReDim strOutBuffer(iPkgLen)
                            strOutBuffer(0) = ":"
                            strOutBuffer(1) = strInBuffer(1)
                            strOutBuffer(2) = strInBuffer(2)
                            strOutBuffer(3) = "8"
                            strOutBuffer(4) = "1"
                            strOutBuffer(5) = "0"
                            strOutBuffer(6) = "3"
                        Else
                            byByteCount = iDataCount * 2
                            iPkgLen = 8 + byByteCount * 2 + gtPLSet.byCRCByte
                            strOutBuffer(0) = ":"
                            strOutBuffer(1) = strInBuffer(1)
                            strOutBuffer(2) = strInBuffer(2)
                            strOutBuffer(3) = "0"
                            strOutBuffer(4) = "3"
                            strOutBuffer(5) = Mid$(Hex$(byByteCount), 1, 1)
                            strOutBuffer(6) = Mid$(Hex$(byByteCount), 2, 1)
                            k = 0
                            For i = 0 To byByteCount - 1 Step 2
                                byData = gfunRightMove(giHoldReg(iAddress), 8)
                                strOutBuffer(7 + k) = Mid$(Hex$(byData), 1, 1)
                                strOutBuffer(8 + k) = Mid$(Hex$(byData), 2, 1)
                                k = k + 2
                                byData = giHoldReg(iAddress) And &HFF
                                strOutBuffer(7 + k) = Mid$(Hex$(byData), 1, 1)
                                strOutBuffer(8 + k) = Mid$(Hex$(byData), 2, 1)
                                k = k + 2
                                iAddress = iAddress + 1
                            Next i
                        End If
                    Case 4          ' input register
                        iAddress = (CByte(strInBuffer(5)) * &H10 + CByte(strInBuffer(6))) _
                            * &H100 + CByte(strInBuffer(7)) * &H10 + CByte(strInBuffer(8))
                        iAddress = iAddress - gtPLSet.iHoldRegAddress
                        iDataCount = (CByte(strInBuffer(9)) * &H10 + CByte(strInBuffer(10))) _
                            * &H100 + CByte(strInBuffer(11)) * &H10 + CByte(strInBuffer(12))
                        If iAddress < 0 Then
                            iPkgLen = 8 + gtPLSet.byCRCByte
                            ReDim strOutBuffer(iPkgLen)
                            strOutBuffer(0) = ":"
                            strOutBuffer(1) = strInBuffer(1)
                            strOutBuffer(2) = strInBuffer(2)
                            strOutBuffer(3) = "8"
                            strOutBuffer(4) = "1"
                            strOutBuffer(5) = "0"
                            strOutBuffer(6) = "2"
                        ElseIf iDataCount > gcMAXINPUTREG Or iDataCount < 1 Or iDataCount > 125 Then
                            iPkgLen = 8 + gtPLSet.byCRCByte
                            ReDim strOutBuffer(iPkgLen)
                            strOutBuffer(0) = ":"
                            strOutBuffer(1) = strInBuffer(1)
                            strOutBuffer(2) = strInBuffer(2)

⌨️ 快捷键说明

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