📄 modmodbusresp.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 + -