www.pudn.com > ModBusUtility.rar > frmUtility.frm
VERSION 5.00
Object = "{648A5603-2C6E-101B-82B6-000000000014}#1.1#0"; "MSCOMM32.OCX"
Object = "{BDC217C8-ED16-11CD-956C-0000C04E4C0A}#1.1#0"; "TABCTL32.OCX"
Object = "{831FDD16-0C5C-11D2-A9FC-0000F8754DA1}#2.0#0"; "MSCOMCTL.OCX"
Begin VB.Form frmUtility
Caption = "ModBus Utility (Ver 1.0.0)"
ClientHeight = 7515
ClientLeft = 60
ClientTop = 750
ClientWidth = 10095
Icon = "frmUtility.frx":0000
LockControls = -1 'True
MaxButton = 0 'False
ScaleHeight = 7515
ScaleWidth = 10095
StartUpPosition = 2 '屏幕中心
Begin MSCommLib.MSComm MsCOM
Left = 9045
Top = 0
_ExtentX = 1005
_ExtentY = 1005
_Version = 393216
DTREnable = -1 'True
BaudRate = 19200
SThreshold = 2
InputMode = 1
End
Begin MSComctlLib.ImageList ImageList
Left = 9600
Top = -120
_ExtentX = 1005
_ExtentY = 1005
BackColor = -2147483643
ImageWidth = 16
ImageHeight = 16
MaskColor = 12632256
_Version = 393216
BeginProperty Images {2C247F25-8591-11D1-B16A-00C0F0283628}
NumListImages = 8
BeginProperty ListImage1 {2C247F27-8591-11D1-B16A-00C0F0283628}
Picture = "frmUtility.frx":0E42
Key = ""
EndProperty
BeginProperty ListImage2 {2C247F27-8591-11D1-B16A-00C0F0283628}
Picture = "frmUtility.frx":2B4C
Key = ""
EndProperty
BeginProperty ListImage3 {2C247F27-8591-11D1-B16A-00C0F0283628}
Picture = "frmUtility.frx":399E
Key = ""
EndProperty
BeginProperty ListImage4 {2C247F27-8591-11D1-B16A-00C0F0283628}
Picture = "frmUtility.frx":47F0
Key = ""
EndProperty
BeginProperty ListImage5 {2C247F27-8591-11D1-B16A-00C0F0283628}
Picture = "frmUtility.frx":64FA
Key = ""
EndProperty
BeginProperty ListImage6 {2C247F27-8591-11D1-B16A-00C0F0283628}
Picture = "frmUtility.frx":734C
Key = ""
EndProperty
BeginProperty ListImage7 {2C247F27-8591-11D1-B16A-00C0F0283628}
Picture = "frmUtility.frx":7666
Key = ""
EndProperty
BeginProperty ListImage8 {2C247F27-8591-11D1-B16A-00C0F0283628}
Picture = "frmUtility.frx":84B8
Key = ""
EndProperty
EndProperty
End
Begin MSComctlLib.Toolbar Toolbar
Align = 1 'Align Top
Height = 360
Left = 0
TabIndex = 23
Top = 0
Width = 10095
_ExtentX = 17806
_ExtentY = 635
ButtonWidth = 609
ButtonHeight = 582
Style = 1
ImageList = "ImageList"
_Version = 393216
BeginProperty Buttons {66833FE8-8583-11D1-B16A-00C0F0283628}
NumButtons = 11
BeginProperty Button1 {66833FEA-8583-11D1-B16A-00C0F0283628}
Key = "ComSet"
Object.ToolTipText = "端口设置"
ImageIndex = 5
EndProperty
BeginProperty Button2 {66833FEA-8583-11D1-B16A-00C0F0283628}
Style = 3
EndProperty
BeginProperty Button3 {66833FEA-8583-11D1-B16A-00C0F0283628}
Key = "ProtOpen"
Object.ToolTipText = "打开端口"
ImageIndex = 2
EndProperty
BeginProperty Button4 {66833FEA-8583-11D1-B16A-00C0F0283628}
Key = "CRC"
Object.ToolTipText = "CRC测试"
ImageIndex = 6
EndProperty
BeginProperty Button5 {66833FEA-8583-11D1-B16A-00C0F0283628}
Key = "Send"
Object.ToolTipText = "发送数据"
ImageIndex = 7
EndProperty
BeginProperty Button6 {66833FEA-8583-11D1-B16A-00C0F0283628}
Key = "Clcer"
Object.ToolTipText = "清空接收区"
ImageIndex = 1
EndProperty
BeginProperty Button7 {66833FEA-8583-11D1-B16A-00C0F0283628}
Style = 3
EndProperty
BeginProperty Button8 {66833FEA-8583-11D1-B16A-00C0F0283628}
Key = "Help"
Object.ToolTipText = "Online Help"
ImageIndex = 4
EndProperty
BeginProperty Button9 {66833FEA-8583-11D1-B16A-00C0F0283628}
Key = "About"
Object.ToolTipText = "About CH2000M Utility"
ImageIndex = 3
EndProperty
BeginProperty Button10 {66833FEA-8583-11D1-B16A-00C0F0283628}
Style = 3
EndProperty
BeginProperty Button11 {66833FEA-8583-11D1-B16A-00C0F0283628}
Key = "Exit"
Object.ToolTipText = "退出"
ImageIndex = 8
EndProperty
EndProperty
BorderStyle = 1
Begin VB.Timer TmFlash
Enabled = 0 'False
Interval = 500
Left = 8610
Top = -30
End
End
Begin VB.CommandButton cmdExit
Caption = "退 出(E)"
Height = 615
Left = 8370
TabIndex = 5
Top = 6510
Width = 1545
End
Begin VB.CommandButton cmdClcer
Caption = "清空接收区(&C)"
Height = 615
Left = 6750
TabIndex = 4
Top = 6510
Width = 1620
End
Begin VB.CommandButton cmdSend
Caption = "发送数据(&S)"
Enabled = 0 'False
Height = 615
Left = 5130
TabIndex = 3
Top = 6510
Width = 1620
End
Begin VB.CommandButton cmdCRC
Caption = "CRC测试(&T)"
Height = 615
Left = 3510
TabIndex = 2
Top = 6510
Width = 1620
End
Begin VB.CommandButton cmdOpenCOM
Caption = "打开通讯口(&O)"
Height = 615
Left = 1890
TabIndex = 1
Top = 6510
Width = 1620
End
Begin VB.CommandButton cmdComSet
Caption = "通讯口设置(&P)"
Height = 615
Left = 270
TabIndex = 0
Top = 6510
Width = 1620
End
Begin VB.TextBox txtCRC
Alignment = 2 'Center
Height = 270
Left = 8940
Locked = -1 'True
TabIndex = 13
Text = "45CA"
Top = 6150
Width = 630
End
Begin VB.TextBox txtPSum
Alignment = 2 'Center
Height = 270
Left = 7290
MaxLength = 4
TabIndex = 12
Text = "0000"
Top = 6150
Width = 630
End
Begin VB.TextBox txtSAddr
Alignment = 2 'Center
Height = 270
Left = 5280
MaxLength = 4
TabIndex = 11
Text = "0000"
Top = 6150
Width = 630
End
Begin VB.TextBox txtCommand
Alignment = 2 'Center
Height = 270
Left = 3270
MaxLength = 2
TabIndex = 10
Text = "03"
Top = 6150
Width = 630
End
Begin VB.TextBox txtMAddr
Alignment = 2 'Center
Height = 270
Left = 1425
MaxLength = 2
TabIndex = 9
Text = "01"
Top = 6150
Width = 630
End
Begin TabDlg.SSTab SSTab
Height = 5025
Left = 255
TabIndex = 6
Top = 1035
Width = 9660
_ExtentX = 17039
_ExtentY = 8864
_Version = 393216
Tabs = 2
TabsPerRow = 2
TabHeight = 520
ForeColor = 16711680
BeginProperty Font {0BE35203-8F91-11CE-9DE3-00AA004BB851}
Name = "宋体"
Size = 10.5
Charset = 134
Weight = 400
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
TabCaption(0) = "主机发送"
TabPicture(0) = "frmUtility.frx":930A
Tab(0).ControlEnabled= -1 'True
Tab(0).Control(0)= "Frame(1)"
Tab(0).Control(0).Enabled= 0 'False
Tab(0).ControlCount= 1
TabCaption(1) = "从机响应"
TabPicture(1) = "frmUtility.frx":9326
Tab(1).ControlEnabled= 0 'False
Tab(1).Control(0)= "lblMsg"
Tab(1).Control(0).Enabled= 0 'False
Tab(1).Control(1)= "Frame(2)"
Tab(1).Control(1).Enabled= 0 'False
Tab(1).Control(2)= "chkAutoSend"
Tab(1).Control(2).Enabled= 0 'False
Tab(1).Control(3)= "chkSetMax"
Tab(1).Control(3).Enabled= 0 'False
Tab(1).ControlCount= 4
Begin VB.CheckBox chkSetMax
Caption = "置最大值"
ForeColor = &H00808000&
Height = 180
Left = -66795
TabIndex = 31
Top = 150
Width = 1020
End
Begin VB.CheckBox chkAutoSend
Caption = "自动响应"
ForeColor = &H000040C0&
Height = 180
Left = -69645
TabIndex = 26
Top = 150
Width = 1020
End
Begin VB.Frame Frame
Caption = "响应数据"
Height = 4560
Index = 2
Left = -74880
TabIndex = 21
Top = 345
Width = 9420
Begin VB.TextBox txtHCommand
Height = 1335
Left = 60
MultiLine = -1 'True
ScrollBars = 2 'Vertical
TabIndex = 28
Top = 3165
Width = 9285
End
Begin VB.TextBox txtData
Height = 2820
Left = 60
MultiLine = -1 'True
ScrollBars = 2 'Vertical
TabIndex = 25
Top = 330
Width = 9285
End
Begin VB.Label Label1
BackStyle = 0 'Transparent
Caption = "01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33"
ForeColor = &H00C000C0&
Height = 165
Left = 105
TabIndex = 30
Top = 165
Width = 8820
End
End
Begin VB.Frame Frame
Caption = "数据"
Height = 4560
Index = 1
Left = 120
TabIndex = 19
Top = 345
Width = 9420
Begin VB.TextBox txtMData
Appearance = 0 'Flat
BackColor = &H8000000F&
BorderStyle = 0 'None
Height = 4320
Left = 30
Locked = -1 'True
MultiLine = -1 'True
ScrollBars = 2 'Vertical
TabIndex = 20
TabStop = 0 'False
Top = 195
Width = 9345
End
End
Begin VB.Label lblMsg
BackStyle = 0 'Transparent
Caption = "→ → →"
BeginProperty Font
Name = "宋体"
Size = 10.5
Charset = 134
Weight = 700
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
ForeColor = &H000000FF&
Height = 195
Left = -68205
TabIndex = 29
Top = 210
Visible = 0 'False
Width = 945
End
End
Begin VB.Label lblPort
Caption = "端口关闭"
ForeColor = &H000000FF&
Height = 165
Left = 3360
TabIndex = 27
Top = 7245
Width = 720
End
Begin VB.Label Label
Alignment = 2 'Center
Caption = "ModBus 通 讯 测 试"
BeginProperty Font
Name = "楷体_GB2312"
Size = 21.75
Charset = 134
Weight = 400
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
Height = 495
Index = 0
Left = 2130
TabIndex = 24
Top = 450
Width = 6000
End
Begin VB.Label lblComsettings
BackColor = &H008080FF&
BackStyle = 0 'Transparent
Caption = "COM:1 Settings:19200,n,8,1"
BeginProperty Font
Name = "宋体"
Size = 10.5
Charset = 134
Weight = 400
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
ForeColor = &H00FF0000&
Height = 240
Left = 270
TabIndex = 22
Top = 7200
Width = 4875
End
Begin VB.Label Label5
Alignment = 2 'Center
Caption = "CRC码:"
ForeColor = &H00FF0000&
Height = 210
Left = 8340
TabIndex = 18
Top = 6195
Width = 705
End
Begin VB.Label Label4
Alignment = 2 'Center
Caption = "点数/数据:"
ForeColor = &H00FF0000&
Height = 210
Left = 6360
TabIndex = 17
Top = 6195
Width = 1005
End
Begin VB.Label Label3
Alignment = 2 'Center
Caption = "起始地址:"
ForeColor = &H00FF0000&
Height = 210
Left = 4425
TabIndex = 16
Top = 6195
Width = 945
End
Begin VB.Label Label2
Alignment = 2 'Center
Caption = "功能码:"
ForeColor = &H00FF0000&
Height = 210
Left = 2505
TabIndex = 15
Top = 6195
Width = 945
End
Begin VB.Label lblAddr
Alignment = 2 'Center
Caption = "从机地址:"
ForeColor = &H00FF0000&
Height = 210
Left = 570
TabIndex = 14
Top = 6195
Width = 945
End
Begin VB.Label Label
Alignment = 2 'Center
BackColor = &H00FF8080&
BackStyle = 0 'Transparent
Caption = "Copyright (C) 2004 C.Y.Huang"
BeginProperty Font
Name = "宋体"
Size = 10.5
Charset = 134
Weight = 700
Underline = 0 'False
Italic = 0 'False
Strikethrough = 0 'False
EndProperty
ForeColor = &H00808080&
Height = 255
Index = 39
Left = 4890
TabIndex = 8
Top = 7200
Width = 3435
End
Begin VB.Label Label
BorderStyle = 1 'Fixed Single
Height = 6120
Index = 1
Left = 240
TabIndex = 7
Top = 1020
Width = 9690
End
Begin VB.Menu Oper
Caption = "设置(&S)"
Begin VB.Menu ProtSettings
Caption = "端口设置(&P)"
End
Begin VB.Menu N1
Caption = "-"
End
Begin VB.Menu Close
Caption = "退 出(&C)"
End
End
Begin VB.Menu Cor
Caption = "通信(&C)"
Begin VB.Menu ProtOpen
Caption = "打开端口(&O)"
End
Begin VB.Menu N3
Caption = "-"
End
Begin VB.Menu crc
Caption = "CRC测试(&T)"
End
Begin VB.Menu SendData
Caption = "发送数据(&S)"
Enabled = 0 'False
End
Begin VB.Menu N5
Caption = "-"
End
Begin VB.Menu Clcer
Caption = "清空接收区(&C)"
End
End
Begin VB.Menu Help
Caption = "帮助(&H)"
Begin VB.Menu Content
Caption = "Content(&C)"
End
Begin VB.Menu N4
Caption = "-"
End
Begin VB.Menu About
Caption = "About ModBus Utility(&A)"
End
End
End
Attribute VB_Name = "frmUtility"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit
Dim CRC16Lo As Byte, CRC16Hi As Byte 'CRC寄存器
Dim LoadOK As Boolean, AutoSend As Boolean
Dim SendBuf() As Byte, ByteSize As Long
Dim SetMax As Boolean
Private Sub CRC16(data As Byte)
Dim CL As Byte, CH As Byte '多项式码&HA001
Dim SaveHi As Byte, SaveLo As Byte
Dim i As Integer
CL = &H1
CH = &HA0
CRC16Lo = CRC16Lo Xor data '每一个数据与CRC寄存器低位进行异或
For i = 0 To 7
SaveHi = CRC16Hi
SaveLo = CRC16Lo
CRC16Hi = CRC16Hi \ 2 '高位右移一位
CRC16Lo = CRC16Lo \ 2 '低位右移一位
If ((SaveHi And &H1) = &H1) Then '如果右移前高位字节最后一位为1
CRC16Lo = CRC16Lo Or &H80 '则低位字节右移后前面补1
End If '否则自动补0
If ((SaveLo And &H1) = &H1) Then '如果右移前低位字节最后一位为1,则与多项式码进行异或
CRC16Hi = CRC16Hi Xor CH
CRC16Lo = CRC16Lo Xor CL
End If
Next i
End Sub
Private Sub About_Click()
frmAbout.Show
End Sub
Private Sub chkAutoSend_Click()
If chkAutoSend.Value = 1 Then
AutoSend = True
TmFlash.Enabled = True
cmdSend.Enabled = False
ElseIf chkAutoSend.Value = 0 Then
AutoSend = False
TmFlash.Enabled = False
lblMsg.Visible = False
txtMAddr = "01": txtCommand = "03": txtSAddr = "0000": txtPSum = "0000": txtCRC = "45CA"
cmdSend.Enabled = True
End If
End Sub
Private Sub chkSetMax_Click()
If chkSetMax.Value = 1 Then
SetMax = True
Else: SetMax = False
End If
End Sub
Private Sub Clcer_Click()
cmdClcer_Click
End Sub
Private Sub Close_Click()
cmdExit_Click
End Sub
Private Sub cmdClcer_Click()
Dim InBufCount As Integer
If SSTab.Tab = 0 Then
InBufCount = MsCOM.InBufferCount
txtMData = ""
ElseIf SSTab.Tab = 1 Then
txtHCommand = ""
InBufCount = MsCOM.InBufferCount
End If
End Sub
Private Sub cmdComSet_Click()
frmCOM.Show
frmCOMopen = True
End Sub
Private Sub cmdCRC_Click()
Dim WriteBuf(7) As Byte, Tem As Single
WriteBuf(0) = Hex2Dec(txtMAddr)
WriteBuf(1) = Hex2Dec(txtCommand)
WriteBuf(2) = Hex2Dec(Left$(txtSAddr, 2))
WriteBuf(3) = Hex2Dec(Right$(txtSAddr, 2))
WriteBuf(4) = Hex2Dec(Left$(txtPSum, 2))
WriteBuf(5) = Hex2Dec(Right$(txtPSum, 2))
CRC16Lo = &HFF
CRC16Hi = &HFF
CRC16 WriteBuf(0)
CRC16 WriteBuf(1)
CRC16 WriteBuf(2)
CRC16 WriteBuf(3)
CRC16 WriteBuf(4)
CRC16 WriteBuf(5)
WriteBuf(6) = CRC16Lo '取低位
WriteBuf(7) = CRC16Hi '取高位
' txtMData = ""
If Len(Hex(CRC16Lo)) > 1 And Len(Hex(CRC16Hi)) <= 1 Then
txtCRC = Hex(CRC16Lo) & "0" & Hex(CRC16Hi)
ElseIf Len(Hex(CRC16Lo)) <= 1 And Len(Hex(CRC16Hi)) > 1 Then
txtCRC = "0" & Hex(CRC16Lo) & Hex(CRC16Hi)
ElseIf Len(Hex(CRC16Lo)) <= 1 And Len(Hex(CRC16Hi)) <= 1 Then
txtCRC = "0" & Hex(CRC16Lo) & "0" & Hex(CRC16Hi)
ElseIf Len(Hex(CRC16Lo)) > 1 And Len(Hex(CRC16Hi)) > 1 Then
txtCRC = Hex(CRC16Lo) & Hex(CRC16Hi)
End If
End Sub
Private Sub cmdExit_Click()
If MsgBox("你真的退出吗?", vbYesNo + vbQuestion, "确认") = vbYes Then
LoadOK = False
If MsCOM.PortOpen = True Then MsCOM.PortOpen = False
MsCOM.InBufferCount = 0
If frmCOMopen = True Then Unload frmCOM
Set frmUtility = Nothing
End
Unload Me
End If
End Sub
Private Sub cmdOpenCOM_Click()
On Error GoTo OpenErr:
If cmdOpenCOM.Caption = "打开通讯口(&O)" Then
MsCOM.CommPort = xCOM
MsCOM.Settings = ComSetting
If MsCOM.PortOpen = False Then MsCOM.PortOpen = True
cmdOpenCOM.Caption = "关闭通讯口(&C)"
ProtOpen.Caption = "关闭端口"
cmdComSet.Enabled = False
ProtSettings.Enabled = False
cmdSend.Enabled = True
SendData.Enabled = True
lblPort.Caption = "端口打开"
lblPort.ForeColor = &HC000&
ElseIf cmdOpenCOM.Caption = "关闭通讯口(&C)" Then
If MsCOM.PortOpen = True Then MsCOM.PortOpen = False
cmdOpenCOM.Caption = "打开通讯口(&O)"
ProtOpen.Caption = "打开端口"
cmdComSet.Enabled = True
ProtSettings.Enabled = True
SendData.Enabled = False
cmdSend.Enabled = False
lblPort.Caption = "端口关闭"
lblPort.ForeColor = vbRed
End If
Exit Sub
OpenErr:
If Err.Number = 8002 Then
MsgBox "端口号无效,系统找不到指定端口。", vbCritical
Exit Sub
ElseIf Err.Number = 8005 Then
MsgBox "端口已被其它程序占用,请关闭程序或选择其它可用端口!", vbCritical
Exit Sub
Else
MsgBox "系统打开端口出错!", vbExclamation
Exit Sub
End If
End Sub
Private Sub cmdSend_Click()
Dim WriteBuf(7) As Byte, TemStr As String, i As Integer
Dim ChangeStr As String, ChangeStrLen As Long, j As Long, Lencount As Long, ShowStr As String
On Error Resume Next
If SSTab.Tab = 0 Then
If txtCommand.Text <> "03" And txtCommand.Text <> "06" Then
MsgBox "ModBus通讯协议支持的功能码为:03、06,请重新输入。", vbCritical, "错误"
Exit Sub
End If
WriteBuf(0) = Hex2Dec(txtMAddr)
WriteBuf(1) = Hex2Dec(txtCommand)
WriteBuf(2) = Hex2Dec(Left$(txtSAddr, 2))
WriteBuf(3) = Hex2Dec(Right$(txtSAddr, 2))
WriteBuf(4) = Hex2Dec(Left$(txtPSum, 2))
WriteBuf(5) = Hex2Dec(Right$(txtPSum, 2))
CRC16Lo = &HFF
CRC16Hi = &HFF
CRC16 WriteBuf(0)
CRC16 WriteBuf(1)
CRC16 WriteBuf(2)
CRC16 WriteBuf(3)
CRC16 WriteBuf(4)
CRC16 WriteBuf(5)
WriteBuf(6) = CRC16Lo '取低位
WriteBuf(7) = CRC16Hi '取高位
If Len(Hex(CRC16Lo)) > 1 And Len(Hex(CRC16Hi)) <= 1 Then
txtCRC = Hex(CRC16Lo) & "0" & Hex(CRC16Hi)
ElseIf Len(Hex(CRC16Lo)) <= 1 And Len(Hex(CRC16Hi)) > 1 Then
txtCRC = "0" & Hex(CRC16Lo) & Hex(CRC16Hi)
ElseIf Len(Hex(CRC16Lo)) <= 1 And Len(Hex(CRC16Hi)) <= 1 Then
txtCRC = "0" & Hex(CRC16Lo) & "0" & Hex(CRC16Hi)
ElseIf Len(Hex(CRC16Lo)) > 1 And Len(Hex(CRC16Hi)) > 1 Then
txtCRC = Hex(CRC16Lo) & Hex(CRC16Hi)
End If
If CInt(txtCommand) = 3 Then '计算返回数长
MsCOM.RThreshold = 5 + Hex2Dec(txtPSum) * 2
ElseIf CInt(txtCommand) = 6 Then
MsCOM.RThreshold = 8
End If
If MsCOM.PortOpen = True Then
MsCOM.Output = WriteBuf
For i = 0 To 7
If WriteBuf(i) < 16 Then
TemStr = TemStr & "0" & Hex(WriteBuf(i)) & Space(1)
Else
TemStr = TemStr & Hex(WriteBuf(i)) & Space(1)
End If
Next
txtMData.Text = "TX:" & TemStr & Space(2) & "[" & Now() & "]" & vbCrLf & txtMData.Text
Else
MsgBox "通讯口未打开,请先打开通讯口再试!", vbExclamation
Exit Sub
End If
ElseIf SSTab.Tab = 1 Then
ChangeStr = Replace(txtData, " ", "", 1)
ChangeStr = Replace(ChangeStr, vbCr, "", 1)
ChangeStr = Replace(ChangeStr, vbLf, "", 1)
ChangeStrLen = Len(ChangeStr) / 2 - 1
ReDim SendBuf(ChangeStrLen)
j = 1
For i = 0 To ChangeStrLen - 2
SendBuf(i) = Hex2Dec(Mid$(ChangeStr, j, 2))
j = j + 2
Next
CRC16Lo = &HFF
CRC16Hi = &HFF
For i = 0 To ChangeStrLen - 2
CRC16 SendBuf(i)
Next
SendBuf(ChangeStrLen - 1) = CRC16Lo '取低位
SendBuf(ChangeStrLen) = CRC16Hi '取高位
MsCOM.Output = SendBuf
For i = 0 To ChangeStrLen
Lencount = Len(Hex(SendBuf(i)))
If Lencount > 1 Then
ShowStr = ShowStr & Hex(SendBuf(i)) & Space(1)
Else
ShowStr = ShowStr & "0" & Hex(SendBuf(i)) & Space(1)
End If
Next i
txtData = ShowStr
End If
End Sub
Private Sub Content_Click()
MsgBox "当前支持 [03]、[06] 两类ModBus功能码。", vbInformation
Exit Sub
End Sub
Private Sub crc_Click()
cmdCRC_Click
End Sub
Private Sub Form_Load()
LoadOK = True
xCOM = "1"
ComSetting = "19200,N,8,1"
lblComsettings = "COM:" & xCOM & Space(2) & "Settings:" & ComSetting
MsCOM.RThreshold = 0
End Sub
Private Sub Form_Unload(Cancel As Integer)
Cancel = True
cmdExit_Click
End Sub
Private Sub MsCOM_OnComm()
Dim InputData() As Byte, MData As String, HCommand As String, CRCcheck(2) As String
Dim i As Long, Lencount As Long
Dim InBufCount As Integer
If MsCOM.CommEvent = 1 Then
InBufCount = MsCOM.InBufferCount
ElseIf MsCOM.CommEvent = comEvReceive Then
InputData = Trim$(MsCOM.Input)
For i = LBound(InputData) To UBound(InputData)
Lencount = Len(Hex(InputData(i)))
If Lencount > 1 Then
MData = MData & Hex(InputData(i)) & Space(1)
HCommand = HCommand & Hex(InputData(i))
Else
MData = MData & "0" & Hex(InputData(i)) & Space(1)
HCommand = HCommand & "0" & Hex(InputData(i))
End If
Next i
' 校验
CRC16Lo = &HFF
CRC16Hi = &HFF
For i = LBound(InputData) To UBound(InputData) - 2
CRC16 InputData(i)
Next
If Len(Hex(CRC16Lo)) > 1 Then
CRCcheck(0) = Hex(CRC16Lo)
Else: CRCcheck(0) = "0" & Hex(CRC16Lo)
End If
If Len(Hex(CRC16Hi)) > 1 Then
CRCcheck(1) = Hex(CRC16Hi)
Else: CRCcheck(1) = "0" & Hex(CRC16Hi)
End If
CRCcheck(2) = CRCcheck(0) & CRCcheck(1)
' 校验正确
If CRCcheck(2) = Right$(HCommand, 4) Then
If SSTab.Tab = 0 Then
txtMData = "RX:" & MData & Space(2) & "[" & Now & "]" & vbCrLf & txtMData
ElseIf SSTab.Tab = 1 Then
txtHCommand.Text = "Rx:" & MData & Space(2) & "[" & Now & "]" & vbCrLf & txtHCommand.Text
If AutoSend = True Then
' If AutoSend = True And HCommand = "0103200000330E1F" Then
' If AutoSend = True And HCommand = "0103206000158FDB" Then
txtMAddr = Left$(HCommand, 2): txtCommand = Mid$(HCommand, 3, 2): txtSAddr = Mid$(HCommand, 5, 4): txtPSum = Mid$(HCommand, 9, 4): txtCRC = Mid$(HCommand, 13, 4)
SendDataPro (HCommand)
End If
End If
End If
End If
End Sub
Private Sub SendDataPro(RCommand As String)
Dim Tem As Single, i As Integer, j As Integer, Lencount As Long, ShowStr As String, FunStr As String
On Error Resume Next
' 确定发送寄存器个数及字节数大小
FunStr = Mid$(RCommand, 3, 2)
If FunStr = "03" Then
ByteSize = Hex2Dec(Mid$(RCommand, 9, 4)) * 2
ReDim SendBuf(ByteSize + 4) As Byte
SendBuf(0) = Hex2Dec(Left$(RCommand, 2))
SendBuf(1) = Hex2Dec(FunStr)
SendBuf(2) = ByteSize
If chkSetMax.Value = 1 Then
For i = 3 To ByteSize + 2
SendBuf(i) = &HFF
Next
End If
ElseIf FunStr = "06" Then
ByteSize = 8
ReDim SendBuf(8) As Byte
SendBuf(0) = Hex2Dec(Left$(RCommand, 2))
SendBuf(1) = Hex2Dec(FunStr)
SendBuf(2) = Hex2Dec(Mid$(RCommand, 5, 2))
SendBuf(3) = Hex2Dec(Mid$(RCommand, 7, 2))
SendBuf(4) = Hex2Dec(Mid$(RCommand, 9, 2))
SendBuf(5) = Hex2Dec(Mid$(RCommand, 11, 2))
SendBuf(6) = Hex2Dec(Mid$(RCommand, 13, 2))
SendBuf(7) = Hex2Dec(Mid$(RCommand, 15, 2))
End If
CRC16Lo = &HFF
CRC16Hi = &HFF
For i = 0 To ByteSize + 2
CRC16 SendBuf(i)
Next
SendBuf(ByteSize + 3) = CRC16Lo '取低位
SendBuf(ByteSize + 4) = CRC16Hi '取高位
MsCOM.Output = SendBuf
For i = 0 To ByteSize + 4
Lencount = Len(Hex(SendBuf(i)))
If Lencount > 1 Then
ShowStr = ShowStr & Hex(SendBuf(i)) & Space(1)
Else
ShowStr = ShowStr & "0" & Hex(SendBuf(i)) & Space(1)
End If
Next i
txtData.Text = ShowStr
End Sub
Private Sub ProtOpen_Click()
cmdOpenCOM_Click
End Sub
Private Sub ProtSettings_Click()
cmdComSet_Click
End Sub
Private Sub SendData_Click()
cmdSend_Click
End Sub
Private Sub SSTab_Click(PreviousTab As Integer)
Dim i As Integer
If SSTab.Tab = 1 Then
txtCommand = "03"
txtSAddr = "0000"
txtPSum = "0000"
txtCRC = "45CA"
txtCommand.Locked = True
txtSAddr.Locked = True
txtPSum.Locked = True
txtMAddr.Locked = True
cmdCRC.Enabled = False
If cmdOpenCOM.Caption = "关闭通讯口(&C)" Then
cmdSend.Enabled = True
SendData.Enabled = True
Else
cmdSend.Enabled = False
SendData.Enabled = False
End If
lblAddr.Caption = "响应地址:"
MsCOM.RThreshold = 8: ByteSize = 0
ElseIf SSTab.Tab = 0 Then
txtSAddr = "0000"
txtPSum = "0000"
txtCRC = "45CA"
txtCommand.Locked = False
txtSAddr.Locked = False
txtPSum.Locked = False
cmdCRC.Enabled = True
If cmdOpenCOM.Caption = "关闭通讯口(&C)" Then
cmdSend.Enabled = True
SendData.Enabled = True
Else
cmdSend.Enabled = False
SendData.Enabled = False
End If
lblAddr.Caption = "从机地址:"
chkAutoSend.Value = 0
chkAutoSend_Click
MsCOM.RThreshold = 0
End If
End Sub
Private Sub TmFlash_Timer()
If chkAutoSend.Value = 1 Then
If lblMsg.Visible = True Then
lblMsg.Visible = False
Else: lblMsg.Visible = True
End If
Else: lblMsg.Visible = False
End If
End Sub
Private Sub Toolbar_ButtonClick(ByVal Button As MSComctlLib.Button)
Select Case Button.Key
Case "ComSet"
cmdComSet_Click
Case "ProtOpen"
cmdOpenCOM_Click
Case "CRC"
cmdCRC_Click
Case "Send"
cmdSend_Click
Case "Clcer"
cmdClcer_Click
Case "Help"
Content_Click
Case "About"
About_Click
Case "Exit"
cmdExit_Click
End Select
End Sub