📄 frmmodbusplat.frm
字号:
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 + -