📄 clsmodbus.txt
字号:
Option Strict Off
Option Explicit On
Imports System.Text
Public Class ClsModbus
#Region "声明"
Private ASCIIString As String 'ASCIIS格式定义
Private RTuStrs As String 'RTU格式定义串
Private RTUByte() As Byte 'RTU格式定义
#End Region
#Region "枚举"
' 此枚举提供Modbus功能值。
Public Enum ModbusFunction
ModbusFunction01 = &H1 ' READ COIL STATUS
ModbusFunction02 = &H2 'READ INPUT STATUS
ModbusFunction03 = &H3 'READ HOLDING REGISTER
ModbusFunction04 = &H4 'READ INPUT REGISTER
ModbusFunction05 = &H5 'WRITE SINGLE COIL
ModbusFunction06 = &H6 'WRITE SINGLE REGISTER
ModbusFunction15 = &H15 'WRITE MULTIPLE COIL
ModbusFunction16 = &H16 'WRITE MULTIPLE REGISTER
End Enum
#End Region
#Region "属性"
' 返回ASCIIS格式字符串
Public ReadOnly Property ASCII() As String
Get
Return ASCIIString
End Get
End Property
' 返回只读属性RTU格式位
Public Overridable ReadOnly Property RTU() As Byte()
Get
Return RTUByte
End Get
End Property
' 返回只读属性RTU格式字符串
Public ReadOnly Property RTUString() As String
Get
Return RTuStrs
End Get
End Property
#End Region
#Region "方法"
' ASCIIS命令格式字符串
'|?起始位(:)|SlaveAdress(0A)|Function(04)|First adress(0001)|number of registers(0005)|LRC 16|VbCRLF(结束位回车换行)
Public Sub GetASII(ByVal SlaveAdress As String, ByVal SendFunction As ModbusFunction, _
ByVal Firstadress As String, ByVal No_of_registers As String)
Dim SendFunctionStr As String = ""
Select Case SendFunction
Case ModbusFunction.ModbusFunction01
SendFunctionStr = "01"
Case ModbusFunction.ModbusFunction02
SendFunctionStr = "02"
Case ModbusFunction.ModbusFunction03
SendFunctionStr = "03"
Case ModbusFunction.ModbusFunction04
SendFunctionStr = "04"
Case ModbusFunction.ModbusFunction06
SendFunctionStr = "06"
Case ModbusFunction.ModbusFunction15
SendFunctionStr = "15"
Case ModbusFunction.ModbusFunction16
SendFunctionStr = "16"
End Select
ASCIIString = Trim(SlaveAdress) & Trim(SendFunctionStr) & Trim(Firstadress) & Trim(No_of_registers)
ASCIIString = ":" & ASCIIString & LRC(ASCIIString) & vbCrLf
End Sub
' RTU命令格式字符串
'|SlaveAdress(0A)|Function(04)|First adress(0001)|number of registers(0005)|CRC 16|
Public Sub GetRtu(ByVal SlaveAdress As String, ByVal SendFunction As ModbusFunction, _
ByVal Firstadress As String, ByVal No_of_registers As String)
Dim SendFunctionStr As String = ""
Dim RTUSTr As String = ""
Select Case SendFunction
Case ModbusFunction.ModbusFunction01
SendFunctionStr = "01"
Case ModbusFunction.ModbusFunction02
SendFunctionStr = "02"
Case ModbusFunction.ModbusFunction03
SendFunctionStr = "03"
Case ModbusFunction.ModbusFunction04
SendFunctionStr = "04"
Case ModbusFunction.ModbusFunction06
SendFunctionStr = "06"
Case ModbusFunction.ModbusFunction15
SendFunctionStr = "15"
Case ModbusFunction.ModbusFunction16
SendFunctionStr = "16"
End Select
Try
RTUSTr = Trim(SlaveAdress) & Trim(SendFunctionStr) & Trim(Firstadress) & Trim(No_of_registers)
RTUSTr = Trim(RTUSTr & getCrc(RTUSTr))
RTuStrs = RTUSTr
Dim bl As Integer
Dim n As Integer
bl = Len(RTUSTr) / 2
ReDim RTUByte(bl + 1) '按命令长度重新定义数组
For n = 0 To bl - 1
RTUByte(n) = CLng("&H" & Mid(RTUSTr, 2 * n + 1, 2)) '分解命令为字节
Next
Catch ex As Exception
Exit Try
End Try
End Sub
#End Region
#Region "函数"
'ASCII转换函数 ASCIIStringToBytes
Public Function ASCIIStringToBytes(ByVal str As String) As Byte 'ASCII转换函数
Dim fx() As Byte
Dim strInput As String
Dim BL As Byte '数据长度
'发送的数据
Dim n As Byte '循环量
Dim i As Integer, Buf As New StringBuilder
strInput = str '
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -