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

📄 processcomm.vb

📁 modbusRTU
💻 VB
字号:
Option Strict Off
Option Explicit On
Module Module1
	
    Public DataVW(100) As Integer ''''读回来的字(分解后的)
    Public DataVD(100) As Single '''读回来的浮点数(分解后的)(PID参数用的是浮点型)
    Public DataVB(100) As Short '''读回来的字节(分解后的)(准备继续分解为位)
    Public ResultBit(20) As Short '''读回来的位(分解后的)(控制开关)
	
    Public inSafeArray() As String '''接收回来的字节数组(没有分解的包括地址、功能码、校验等)
    Public AddPLC As String  ''''PLC站地址

    Public FlagRec As Boolean  ''''是否有返回的标志(1为返回,0没有返回)
    Public FlagVW As Boolean     ''''读字的标志
    Public FlagVD As Boolean  ''''读双字(浮点数)的标志
    Public FlagVB As Boolean ''''读位(先返回字后分解为位)的标志
	
    Public BitNumber As Short ''''位(值为0到7)
	
    Public ReadNumberB As Short '''要读的位数(其实是字)
    Public ReadNumberW As Short '''读的字数
    Public ReadNumberD As Short '''读的双字数
	
    Public AddrReadB As String ''要读的位的起始地址
    Public AddrReadW As String ''读取字的起始地址
    Public AddrReadD As String ''读取的双字的起始地址
	
	Public Bit(7) As Short
	
	
	Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Integer)
	'UPGRADE_ISSUE: 不支持将参数声明为“As Any”。 单击以获得更多信息:“ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1016"”
	'UPGRADE_ISSUE: 不支持将参数声明为“As Any”。 单击以获得更多信息:“ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1016"”
    Declare Sub CopyMemoryHtoS Lib "kernel32" Alias "RtlMoveMemory" (ByRef hpvDest As Single, ByRef hpvSource As Integer, ByVal cbCopy As Integer)
    Declare Sub CopyMemoryStoH Lib "kernel32" Alias "RtlMoveMemory" (ByRef hpvDest As Integer, ByRef hpvSource As Single, ByVal cbCopy As Integer)
	
	
	'CRC校验码生成
	Function CrcResult(ByVal Data As Integer, ByVal Genpoly As Integer, ByVal CrcData As Integer) As Integer
		Dim n As Short
		Data = Data * 2
		For n = 8 To 1 Step -1
			Data = Fix(Data / 2)
			If ((Data Xor CrcData) And 1) Then
				CrcData = Fix(CrcData / 2) Xor Genpoly
			Else
				CrcData = Fix(CrcData / 2)
			End If
		Next n
		CrcResult = CrcData
	End Function
	
	
	'UPGRADE_NOTE: str 已升级到 str_Renamed。 单击以获得更多信息:“ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1061"”
	Function Chr_4(ByRef str_Renamed As String) As String
		Dim Lenstr As Short
		Lenstr = Len(str_Renamed)
		
		If Lenstr = 1 Then str_Renamed = "000" & str_Renamed
		If Lenstr = 2 Then str_Renamed = "00" & str_Renamed
		If Lenstr = 3 Then str_Renamed = "0" & str_Renamed
		Chr_4 = str_Renamed
	End Function
	
	'UPGRADE_NOTE: str 已升级到 str_Renamed。 单击以获得更多信息:“ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1061"”
	Function Chr_8(ByRef str_Renamed As String) As String
		Dim Lenstr As Short
		Lenstr = Len(str_Renamed)
		
		If Lenstr = 1 Then str_Renamed = "0000000" & str_Renamed
		If Lenstr = 2 Then str_Renamed = "000000" & str_Renamed
		If Lenstr = 3 Then str_Renamed = "00000" & str_Renamed
		If Lenstr = 4 Then str_Renamed = "0000" & str_Renamed
		If Lenstr = 5 Then str_Renamed = "000" & str_Renamed
		If Lenstr = 6 Then str_Renamed = "00" & str_Renamed
		If Lenstr = 7 Then str_Renamed = "0" & str_Renamed
		
		Chr_8 = str_Renamed
	End Function
	'UPGRADE_NOTE: str 已升级到 str_Renamed。 单击以获得更多信息:“ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1061"”
	Function Chr_2(ByRef str_Renamed As String) As String
		Dim Lenstr As Short
		Lenstr = Len(str_Renamed)
		
		If Lenstr = 1 Then str_Renamed = "0" & str_Renamed
		Chr_2 = str_Renamed
	End Function
	
	Function HextoSng(ByRef strhex As String) As String
		Dim l As Integer
		Dim f As Single
		Dim s As String
		
		'strhex = "4131999A"
		
		l = Val("&H" & strhex)
        CopyMemoryHtoS(f, l, 4)
		f = f
		s = VB6.Format(f, "0.000")
		HextoSng = s
	End Function
	
	Function SngtoHex(ByRef SngData As Single) As String
		Dim lngNum As Integer
		
		'SngData = 25.5
        CopyMemoryStoH(lngNum, SngData, 4)
		SngtoHex = Chr_8(Hex(lngNum))
		SngtoHex = Mid(SngtoHex, 1, 4) & Mid(SngtoHex, 5, 4)
		
		
	End Function
	Public Function ProcessRecVW() As Object
		Dim strVW As String
		
		Dim i As Short
		
		For i = 3 To FrmMain1.DefInstance.MSComm1.RThreshold - 3 Step 2
			strVW = inSafeArray(i) & inSafeArray(i + 1)
			DataVW((i - 3) / 2) = CInt("&H" & strVW)
			
		Next i
		
	End Function
	Public Function ProcessRecBit(ByRef BitNumber As Short) As Object
		Dim strVB As String
		Dim i As Object
		Dim j As Short
		
		For i = 3 To FrmMain1.DefInstance.MSComm1.RThreshold - 3 Step 2
			'UPGRADE_WARNING: 未能解析对象 i 的默认属性。 单击以获得更多信息:“ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1037"”
			strVB = inSafeArray(i)
			'UPGRADE_WARNING: 未能解析对象 i 的默认属性。 单击以获得更多信息:“ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1037"”
			DataVB((i - 3) / 2) = CShort("&H" & strVB)
			
			For j = 7 To 0 Step -1
				'UPGRADE_WARNING: 未能解析对象 i 的默认属性。 单击以获得更多信息:“ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1037"”
				If DataVB((i - 3) / 2) \ (2 ^ j) Then
					Bit(j) = 1
				Else
					Bit(j) = 0
				End If
				'UPGRADE_WARNING: 未能解析对象 i 的默认属性。 单击以获得更多信息:“ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1037"”
				DataVB((i - 3) / 2) = DataVB((i - 3) / 2) - (2 ^ j) * Bit(j)
			Next j
			'UPGRADE_WARNING: 未能解析对象 i 的默认属性。 单击以获得更多信息:“ms-help://MS.VSCC.2003/commoner/redir/redirect.htm?keyword="vbup1037"”
			ResultBit((i - 3) / 2) = Bit(BitNumber)
		Next i
		
		
		
	End Function
	Public Function ProcessRecVD() As Object
		Dim strVD As String
		
		Dim i As Short
		
		For i = 3 To FrmMain1.DefInstance.MSComm1.RThreshold - 3 Step 4
			strVD = inSafeArray(i) & inSafeArray(i + 1) & inSafeArray(i + 2) & inSafeArray(i + 3)
			DataVD((i - 3) / 4) = CSng(HextoSng(strVD))
			
		Next i
		
	End Function
	
	Public Function ReadVW(ByRef FlagRec As Boolean, ByRef AddrReadW As String, ByRef ReadNumberW As Short) As Object
		Dim i As Short
		
		If FlagRec = 0 Then
			FrmMain1.DefInstance.MSComm1.RThreshold = 5 + ReadNumberW * 2
			Call FrameFun(AddPLC, CStr(3), CStr(CDbl(AddrReadW) / 2), ReadNumberW)
			FlagVW = True
			
		Else
			Call ProcessRecVW()
			FlagVW = False
			For i = 0 To (FrmMain1.DefInstance.MSComm1.RThreshold - 5) / 2 - 1
                FrmMain1.DefInstance.TextDataRW.Text = FrmMain1.DefInstance.TextDataRW.Text & " " & DataVW(i) & Chr(13) '''Chr(13)是让文本框自动换行
			Next i
			
		End If
		
	End Function
	Public Function ReadVD(ByRef FlagRec As Boolean, ByRef AddrReadD As String, ByRef ReadNumberD As Short) As Object
		Dim i As Short
		
		If FlagRec = 0 Then
			FrmMain1.DefInstance.MSComm1.RThreshold = 5 + ReadNumberD * 4
			Call FrameFun(AddPLC, CStr(3), CStr(CDbl(AddrReadD) / 2), ReadNumberD * 2)
			FlagVD = True
		Else
			Call ProcessRecVD()
			FlagVD = False
			For i = 0 To (FrmMain1.DefInstance.MSComm1.RThreshold - 5) / 4 - 1
                FrmMain1.DefInstance.TextDataRD.Text = FrmMain1.DefInstance.TextDataRD.Text & " " & DataVD(i) & Chr(13) '''Chr(13)是让文本框自动换行
			Next i
			
		End If
	End Function
	Public Function WriteVW(ByRef AddrWrite As String, ByRef DataWrite As Short) As Object
		Call FrameFun(AddPLC, CStr(6), CStr(CDbl(AddrWrite) / 2), DataWrite)
		FrmMain1.DefInstance.MSComm1.RThreshold = 8
	End Function
	Public Function WriteVD(ByRef AddrWrite As String, ByRef DataWrite As Single) As Object
		Call FrameFunTwo(AddPLC, CStr(10), CStr(CDbl(AddrWrite) / 2), CStr(2), CStr(4), DataWrite)
		FrmMain1.DefInstance.MSComm1.RThreshold = 8
	End Function
	Public Function GetBit(ByRef FlagRec As Boolean, ByRef AddrReadB As String, ByRef BitNumber As Short, ByRef ReadNumberB As Short) As Object
		Dim i As Short
		
		If FlagRec = 0 Then
			FrmMain1.DefInstance.MSComm1.RThreshold = 5 + ReadNumberB * 2
			Call FrameFun(AddPLC, CStr(3), CStr(CDbl(AddrReadB) / 2), ReadNumberB)
			FlagVB = True
			
		Else
			Call ProcessRecBit(BitNumber)
			FlagVB = False
			For i = 0 To (FrmMain1.DefInstance.MSComm1.RThreshold - 5) / 2 - 1
                FrmMain1.DefInstance.TextDataRB.Text = FrmMain1.DefInstance.TextDataRB.Text & " " & ResultBit(i) & Chr(13) '''Chr(13)是让文本框自动换行
			Next i
			
		End If
		
	End Function
	Public Function SetBitTrue(ByRef AddrWrite As String, ByRef BitNumber As Short) As Object
		Call FrameFun(AddPLC, CStr(6), CStr(CDbl(AddrWrite) / 2), -1)
		FrmMain1.DefInstance.MSComm1.RThreshold = 8
	End Function
	Public Function SetBitFalse(ByRef AddrWrite As String, ByRef BitNumber As Short) As Object
		Call FrameFun(AddPLC, CStr(6), CStr(CDbl(AddrWrite) / 2), 0)
		FrmMain1.DefInstance.MSComm1.RThreshold = 8
	End Function
	
	Public Function FrameFun(ByRef Addr As String, ByRef Cmd As String, ByRef Register As String, ByRef Data As Short) As Object
		Dim ComStr As String
		Dim Temp(6) As String
		Dim BL As Byte '数据长度
		Dim n As Byte '循环量
		Dim CRC As Integer 'CRC寄存器
		Dim fx() As Byte
		
		Dim hexchrlen As Short
		Dim Hexchr As String
		Dim hexcyc As Short
		Dim hexmid As Byte
		Dim hexmiddle As String
		Dim hexchrgroup() As Byte
		Dim i As Short
		
		'--------------------------------------------------------
		' 获得数据串
		
		FrmMain1.DefInstance.MSComm1.OutBufferCount = 0
		Temp(0) = Chr_2(Addr)
		Temp(1) = Chr_2(Cmd)
		Temp(2) = Chr_4(Hex(CInt(Register)))
		Temp(3) = Chr_4(Hex(Data))
		
		ComStr = Temp(0) & Temp(1) & Temp(2) & Temp(3)
		
		'---CRC -----------------------------------------------------
		BL = Len(ComStr) / 2
		ReDim fx(BL + 1) '按命令长度重新定义数组
		CRC = &HFFFF 'CRC初值
		For n = 0 To BL - 1
			fx(n) = CInt("&H" & Mid(ComStr, 2 * n + 1, 2)) '分解命令为字节
			CRC = CrcResult(fx(n), &HA001, CRC) 'CRC校验码生成调用
		Next 
		
		fx(BL) = CByte(CRC And &HFF) '得到的校验低位
		fx(BL + 1) = CByte(Fix(CRC / 256) And &HFF) '得到的校验高位
		Temp(4) = Chr_2(Hex(fx(BL)))
		Temp(5) = Chr_2(Hex(fx(BL + 1)))
		ComStr = Trim(ComStr & Temp(4) & Temp(5))
		
		'检查数据是否正确
		hexchrlen = Len(ComStr)
		For hexcyc = 1 To hexchrlen '检查Text1文本框内数值是否合适
			Hexchr = Mid(ComStr, hexcyc, 1)
			If InStr("0123456789ABCDEFabcdef", Hexchr) = 0 Then
				MsgBox("无效的数值,请重新输入",  , "错误信息")
				Exit Function
			End If
		Next 
		
		'分解数据 为 二进制发送 模式
		
		' ReDim hexchrgroup(1 To hexchrlen \ 2) As Byte
		ReDim hexchrgroup(hexchrlen \ 2 - 1) ' As Byte
		For hexcyc = 1 To hexchrlen Step 2 '将文本框内数值分成两个、两个
			
			Hexchr = Mid(ComStr, hexcyc, 2)
			'    Hexchr = "FF"
			hexmid = Val("&H" & CStr(Hexchr))
			hexchrgroup(i) = hexmid
			i = i + 1
		Next 
		
		FrmMain1.DefInstance.MSComm1.Output = VB6.CopyArray(hexchrgroup) ''''ComStr '
		Sleep(100)
		
		
		
	End Function
	Public Function FrameFunTwo(ByRef Addr As String, ByRef Cmd As String, ByRef Register As String, ByRef Number As String, ByRef ByteNum As String, ByRef Data As Single) As Object
		Dim ComStr As String
		Dim Temp(7) As String
		Dim BL As Byte '数据长度
		Dim n As Byte '循环量
		Dim CRC As Integer 'CRC寄存器
		Dim fx() As Byte
		
		Dim hexchrlen As Short
		Dim Hexchr As String
		Dim hexcyc As Short
		Dim hexmid As Byte
		Dim hexmiddle As String
		Dim hexchrgroup() As Byte
		Dim i As Short
		
		'--------------------------------------------------------
		' 获得数据串
		
		FrmMain1.DefInstance.MSComm1.OutBufferCount = 0
		Temp(0) = Chr_2(Addr)
		Temp(1) = Chr_2(Cmd)
		Temp(2) = Chr_4(Hex(CInt(Register)))
		Temp(3) = Chr_4(Hex(CInt(Number)))
		Temp(4) = Chr_2(Hex(CInt(ByteNum)))
		Temp(5) = SngtoHex(Data)
		
		ComStr = Temp(0) & Temp(1) & Temp(2) & Temp(3) & Temp(4) & Temp(5)
		
		'---CRC -----------------------------------------------------
		BL = Len(ComStr) / 2
		ReDim fx(BL + 1) '按命令长度重新定义数组
		CRC = &HFFFF 'CRC初值
		For n = 0 To BL - 1
			fx(n) = CInt("&H" & Mid(ComStr, 2 * n + 1, 2)) '分解命令为字节
			CRC = CrcResult(fx(n), &HA001, CRC) 'CRC校验码生成调用
		Next 
		
		fx(BL) = CByte(CRC And &HFF) '得到的校验低位
		fx(BL + 1) = CByte(Fix(CRC / 256) And &HFF) '得到的校验高位
		Temp(6) = Chr_2(Hex(fx(BL)))
		Temp(7) = Chr_2(Hex(fx(BL + 1)))
		ComStr = Trim(ComStr & Temp(6) & Temp(7))
		
		'检查数据是否正确
		hexchrlen = Len(ComStr)
		For hexcyc = 1 To hexchrlen '检查Text1文本框内数值是否合适
			Hexchr = Mid(ComStr, hexcyc, 1)
			If InStr("0123456789ABCDEFabcdef", Hexchr) = 0 Then
				MsgBox("无效的数值,请重新输入",  , "错误信息")
				Exit Function
			End If
		Next 
		
		'分解数据 为 二进制发送 模式
		
		' ReDim hexchrgroup(1 To hexchrlen \ 2) As Byte
		ReDim hexchrgroup(hexchrlen \ 2 - 1) 'As Byte
		For hexcyc = 1 To hexchrlen Step 2 '将文本框内数值分成两个、两个
			
			Hexchr = Mid(ComStr, hexcyc, 2)
			'    Hexchr = "FF"
			hexmid = Val("&H" & CStr(Hexchr))
			hexchrgroup(i) = hexmid
			
			i = i + 1
			
		Next 
		
		FrmMain1.DefInstance.MSComm1.Output = VB6.CopyArray(hexchrgroup) ''''ComStr '
		Sleep(100)
		
	End Function
End Module

⌨️ 快捷键说明

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