📄 frmmodbusplat.frm
字号:
iAddress = byInBuffer(2) * &H100 + byInBuffer(3)
iAddress = iAddress - gtPLSet.iInputAddress
iDataCount = byInBuffer(4) * &H100 + byInBuffer(5)
If iAddress < 0 Then
iPkgLen = 2 + gtPLSet.byCRCByte
ReDim byOutBuffer(iPkgLen)
byOutBuffer(0) = gtPLSet.byAddress
byOutBuffer(1) = &H81
byOutBuffer(2) = &H2
ElseIf iDataCount > gcMAXINPUT Or iDataCount < 1 Then
iPkgLen = 2 + gtPLSet.byCRCByte
ReDim byOutBuffer(iPkgLen)
byOutBuffer(0) = gtPLSet.byAddress
byOutBuffer(1) = &H81
byOutBuffer(2) = &H3
Else
If iDataCount Mod 8 = 0 Then
byByteCount = Int(iDataCount / 8)
Else
byByteCount = Int(iDataCount / 8) + 1
End If
iPkgLen = 2 + byByteCount + gtPLSet.byCRCByte
ReDim byOutBuffer(iPkgLen)
byOutBuffer(0) = gtPLSet.byAddress
byOutBuffer(1) = &H2
byOutBuffer(2) = byByteCount
For i = 0 To byByteCount - 1
byOutBuffer(3 + i) = 0
For j = 0 To 15
byOutBuffer(3 + i) = byOutBuffer(3 + i) + gbyInput(iAddress) * 2 ^ j
iAddress = iAddress + 1
Next j
Next i
End If
Case 3 ' holding register
iAddress = byInBuffer(2) * &H100 + byInBuffer(3)
iAddress = iAddress - gtPLSet.iHoldRegAddress
iDataCount = byInBuffer(4) * &H100 + byInBuffer(5)
If iAddress < 0 Then
iPkgLen = 2 + gtPLSet.byCRCByte
ReDim byOutBuffer(iPkgLen)
byOutBuffer(0) = gtPLSet.byAddress
byOutBuffer(1) = &H81
byOutBuffer(2) = &H2
ElseIf iDataCount > gcMAXHOLDREG Or iDataCount < 1 Or iDataCount > 125 Then
iPkgLen = 2 + gtPLSet.byCRCByte
ReDim byOutBuffer(iPkgLen)
byOutBuffer(0) = gtPLSet.byAddress
byOutBuffer(1) = &H81
byOutBuffer(2) = &H3
Else
byByteCount = iDataCount * 2
iPkgLen = 2 + byByteCount + gtPLSet.byCRCByte
ReDim byOutBuffer(iPkgLen)
byOutBuffer(0) = gtPLSet.byAddress
byOutBuffer(1) = &H3
byOutBuffer(2) = byByteCount
For i = 0 To byByteCount - 1 Step 2
byOutBuffer(3 + i) = gfunRightMove(giHoldReg(iAddress), 8)
byOutBuffer(4 + i) = giHoldReg(iAddress) And &HFF
iAddress = iAddress + 1
Next i
End If
Case 4 ' input register
iAddress = byInBuffer(2) * &H100 + byInBuffer(3)
iAddress = iAddress - gtPLSet.iInputRegAddress
iDataCount = byInBuffer(4) * &H100 + byInBuffer(5)
If iAddress < 0 Then
iPkgLen = 2 + gtPLSet.byCRCByte
ReDim byOutBuffer(iPkgLen)
byOutBuffer(0) = gtPLSet.byAddress
byOutBuffer(1) = &H81
byOutBuffer(2) = &H2
ElseIf iDataCount > gcMAXINPUTREG Or iDataCount < 1 Or iDataCount > 125 Then
iPkgLen = 2 + gtPLSet.byCRCByte
ReDim byOutBuffer(iPkgLen)
byOutBuffer(0) = gtPLSet.byAddress
byOutBuffer(1) = &H81
byOutBuffer(2) = &H3
Else
byByteCount = iDataCount * 2
iPkgLen = 2 + byByteCount + gtPLSet.byCRCByte
ReDim byOutBuffer(iPkgLen)
byOutBuffer(0) = gtPLSet.byAddress
byOutBuffer(1) = &H4
byOutBuffer(2) = byByteCount
For i = 0 To byByteCount - 1 Step 2
byOutBuffer(3 + i) = gfunRightMove(giInputReg(iAddress), 8)
byOutBuffer(4 + i) = giInputReg(iAddress) And &HFF
iAddress = iAddress + 1
Next i
End If
Case 5 ' force single coil
iAddress = byInBuffer(2) * &H100 + byInBuffer(3)
iAddress = iAddress - gtPLSet.iForceCoilAddress
If iAddress < 0 Then
iPkgLen = 2 + gtPLSet.byCRCByte
ReDim byOutBuffer(iPkgLen)
byOutBuffer(0) = gtPLSet.byAddress
byOutBuffer(1) = &H81
byOutBuffer(2) = &H2
Else
If byInBuffer(4) = &HFF And byInBuffer(5) = &H0 Then
gbyForceCoil(iAddress) = 1
iPkgLen = 5 + gtPLSet.byCRCByte
ReDim byOutBuffer(iPkgLen)
byOutBuffer(0) = gtPLSet.byAddress
For i = 1 To 5
byOutBuffer(i) = byInBuffer(i)
Next i
ElseIf byInBuffer(4) = &H0 And byInBuffer(5) = &H0 Then
gbyForceCoil(iAddress) = 0
iPkgLen = 5 + gtPLSet.byCRCByte
ReDim byOutBuffer(iPkgLen)
byOutBuffer(0) = gtPLSet.byAddress
For i = 1 To 5
byOutBuffer(i) = byInBuffer(i)
Next i
Else
iPkgLen = 2 + gtPLSet.byCRCByte
ReDim byOutBuffer(iPkgLen)
byOutBuffer(0) = gtPLSet.byAddress
byOutBuffer(1) = &H81
byOutBuffer(2) = &H2
End If
End If
Case 6 ' preset single register
iAddress = byInBuffer(2) * &H100 + byInBuffer(3)
iAddress = iAddress - gtPLSet.iPresetRegAddress
If iAddress < 0 Then
iPkgLen = 2 + gtPLSet.byCRCByte
ReDim byOutBuffer(iPkgLen)
byOutBuffer(0) = gtPLSet.byAddress
byOutBuffer(1) = &H81
byOutBuffer(2) = &H2
Else
giPresetReg(iAddress) = byOutBuffer(4) * &H100 + byOutBuffer(5)
iPkgLen = 2 + gtPLSet.byCRCByte
ReDim byOutBuffer(iPkgLen)
byOutBuffer(0) = gtPLSet.byAddress
For i = 1 To 5
byOutBuffer(i) = byInBuffer(i)
Next i
End If
Case 15 ' force multiple coils
iAddress = byInBuffer(2) * &H100 + byInBuffer(3)
iAddress = iAddress - gtPLSet.iForceCoilAddress
iDataCount = byInBuffer(4) * &H100 + byInBuffer(5)
If iDataCount Mod 8 = 0 Then
byByteCount = Int(iDataCount / 8)
Else
byByteCount = Int(iDataCount / 8) + 1
End If
If iAddress < 0 Then
iPkgLen = 2 + gtPLSet.byCRCByte
ReDim byOutBuffer(iPkgLen)
byOutBuffer(0) = gtPLSet.byAddress
byOutBuffer(1) = &H81
byOutBuffer(2) = &H2
ElseIf iDataCount > gcMAXFORCECOIL Or iDataCount < 1 Or byByteCount <> byInBuffer(6) Then
iPkgLen = 2 + gtPLSet.byCRCByte
ReDim byOutBuffer(iPkgLen)
byOutBuffer(0) = gtPLSet.byAddress
byOutBuffer(1) = &H81
byOutBuffer(2) = &H3
Else
For i = 0 To byByteCount - 1
For j = 0 To 7
If byInBuffer(7 + i) And 2 ^ j Then
gbyForceCoil(iAddress + j) = 1
Else
gbyForceCoil(iAddress + j) = 0
End If
Next j
iAddress = iAddress + 8
Next i
iPkgLen = 5 + gtPLSet.byCRCByte
ReDim byOutBuffer(iPkgLen)
byOutBuffer(0) = gtPLSet.byAddress
For i = 1 To 5
byOutBuffer(i) = byInBuffer(i)
Next i
End If
Case 16 ' preset multiple registers
iAddress = byInBuffer(2) * &H100 + byInBuffer(3)
iAddress = iAddress - gtPLSet.iForceCoilAddress
iDataCount = byInBuffer(4) * &H100 + byInBuffer(5)
byByteCount = iDataCount * 2
If iAddress < 0 Then
iPkgLen = 2 + gtPLSet.byCRCByte
ReDim byOutBuffer(iPkgLen)
byOutBuffer(0) = gtPLSet.byAddress
byOutBuffer(1) = &H81
byOutBuffer(2) = &H2
ElseIf iDataCount > gcMAXFORCECOIL Or iDataCount < 1 Or byByteCount <> byInBuffer(6) Then
iPkgLen = 2 + gtPLSet.byCRCByte
ReDim byOutBuffer(iPkgLen)
byOutBuffer(0) = gtPLSet.byAddress
byOutBuffer(1) = &H81
byOutBuffer(2) = &H3
Else
For i = 0 To byByteCount - 1 Step 2
giPresetReg(iAddress) = byInBuffer(7 + i) * &H100 + byInBuffer(8 + i)
iAddress = iAddress + 1
Next i
iPkgLen = 5 + gtPLSet.byCRCByte
ReDim byOutBuffer(iPkgLen)
byOutBuffer(0) = gtPLSet.byAddress
For i = 1 To 5
byOutBuffer(i) = byInBuffer(i)
Next i
End If
Case Else
iPkgLen = 2 + gtPLSet.byCRCByte
ReDim byOutBuffer(iPkgLen)
byOutBuffer(0) = gtPLSet.byAddress
byOutBuffer(1) = &H81
byOutBuffer(2) = &H1
End Select
End If
stbStatus.Panels(cPLDESPINDEX).Text = ""
Select Case gtPLSet.byCheckMode
Case 1, 2
iCrc = &HFFFF
For i = 0 To iPkgLen - 2
iCrc = gfunCal_CRC16(byOutBuffer(i), iCrc)
Next i
byOutBuffer(iPkgLen - 1) = iCrc And &HFF
byOutBuffer(iPkgLen) = gfunRightMove(iCrc, 8)
vaOutBuffer = byOutBuffer
MSComm1.Output = vaOutBuffer
End Select
If gbSpy Then
strTemp = "←" & " " & Format$(Time, "hh:mm:ss")
If gtPLSet.byFrameType = 0 Then
Else
For i = 0 To iPkgLen
If byOutBuffer(i) < 16 Then
strTemp = strTemp & " 0" & Hex$(byOutBuffer(i))
Else
strTemp = strTemp & " " & Hex$(byOutBuffer(i))
End If
Next i
End If
frmPortSpy.txtCOMSpy.Text = strTemp & vbCrLf & frmPortSpy.txtCOMSpy.Text
End If
End If
End If
End Sub
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -