Skip to content

���ٿ�ʼ

��ָ�Ͻ��������������� Modbus ��⣬������������վ�ʹ�վӦ�á�


? ǰ��׼��

�����ļ�

ȷ�������ļ������ӵ���Ŀ�У�

�ļ�λ��˵��
cWinsock.clsadd/�ײ� Socket ��װ
cByteBuffer.clssrc/�ֽڻ�������
cModbusMaster.clssrc/Modbus/��վ��
cModbusSlave.clssrc/Modbus/��վ��

���ӵ���Ŀ

  1. �� VB6 ��Ŀ
  2. �˵�����Ŀ �� ������ģ��
  3. �������Ӧ�ļ�������

? ��վ�������ţ�TCP ģʽ��

���� 1����������

����һ���´��壬�������¿ؼ���

  • 1 �� TextBox (txtHost) - ��������ַ
  • 1 �� TextBox (txtPort) - �˿ں�
  • 1 �� TextBox (txtSlaveID) - ��վ ID
  • 2 �� CommandButton (cmdConnect, cmdDisconnect) - ����/�Ͽ�
  • 1 �� TextBox (txtAddress) - �Ĵ�����ַ
  • 1 �� TextBox (txtCount) - ��ȡ����
  • 1 �� CommandButton (cmdRead) - ��ȡ����
  • 1 �� TextBox (txtLog) - ��ʾ��־��MultiLine = True��

���� 2�������

vb
Option Explicit

Private WithEvents mbMaster As cModbusMaster

Private Sub Form_Load()
    Set mbMaster = New cModbusMaster
    
    txtHost.Text = "127.0.0.1"
    txtPort.Text = "502"
    txtSlaveID.Text = "1"
    txtAddress.Text = "0"
    txtCount.Text = "10"
    
    UpdateUI False
End Sub

Private Sub cmdConnect_Click()
    On Error GoTo EH
    
    mbMaster.ProtocolType = MB_MASTER_PROTOCOL_TCP
    mbMaster.TCPHost = txtHost.Text
    mbMaster.TCPPort = CLng(txtPort.Text)
    mbMaster.SlaveID = CByte(txtSlaveID.Text)
    mbMaster.Connect
    
    LogMessage "�������ӵ�: " & txtHost.Text & ":" & txtPort.Text
    Exit Sub
    
EH:
    LogMessage "����ʧ��: " & Err.Description
End Sub

Private Sub cmdDisconnect_Click()
    On Error Resume Next
    
    mbMaster.Disconnect
    LogMessage "�ѶϿ�����"
    UpdateUI False
End Sub

Private Sub cmdRead_Click()
    On Error GoTo EH
    
    If mbMaster.State <> MB_MASTER_STATE_CONNECTED Then
        LogMessage "���"
        Exit Sub
    End If
    
    Dim lAddr As Long
    Dim lCount As Long
    Dim iRegs() As Integer
    Dim i As Long
    
    lAddr = CLng(txtAddress.Text)
    lCount = CLng(txtCount.Text)
    
    LogMessage "��ȡ�Ĵ���: ��ַ=" & lAddr & ", ����=" & lCount
    
    iRegs = mbMaster.ReadHoldingRegisters(lAddr, lCount)
    
    Dim sResult As String
    For i = 0 To UBound(iRegs)
        sResult = sResult & "Reg[" & (lAddr + i) & "]=" & iRegs(i) & "  "
    Next i
    
    LogMessage sResult
    Exit Sub
    
EH:
    LogMessage "��ȡʧ��: " & Err.Description
End Sub

' ====== Modbus Master �¼����� ======

Private Sub mbMaster_OnConnect()
    LogMessage "*** ���ӳɹ�! ***"
    UpdateUI True
End Sub

Private Sub mbMaster_OnDisconnect()
    LogMessage "*** ���ӶϿ� ***"
    UpdateUI False
End Sub

Private Sub mbMaster_OnError(ByVal Description As String)
    LogMessage "*** ����: " & Description & " ***"
End Sub

' ====== �������� ======

Private Sub LogMessage(sMessage As String)
    txtLog.Text = txtLog.Text & Format$(Now, "hh:mm:ss") & " - " & sMessage & vbCrLf
    txtLog.SelStart = Len(txtLog.Text)
End Sub

Private Sub UpdateUI(bConnected As Boolean)
    txtHost.Enabled = Not bConnected
    txtPort.Enabled = Not bConnected
    txtSlaveID.Enabled = Not bConnected
    cmdConnect.Enabled = Not bConnected
    cmdDisconnect.Enabled = bConnected
    cmdRead.Enabled = bConnected
End Sub

Private Sub Form_Unload(Cancel As Integer)
    On Error Resume Next
    mbMaster.Disconnect
End Sub

���� 3�������

  1. �� F5 �����
  2. �����������ַ���� 127.0.0.1��
  3. ���"����"
  4. ���ӳɹ��������ַ������
  5. ���"��ȡ����"

? ��վ�������ţ�TCP ģʽ��

���� 1����������

����һ���´��壬�������¿ؼ���

  • 1 �� TextBox (txtPort) - �����˿�
  • 1 �� TextBox (txtSlaveID) - ��վ ID
  • 2 �� CommandButton (cmdStart, cmdStop) - ����/ֹͣ
  • 1 �� ListBox (lstRegisters) - �Ĵ����б�
  • 1 �� TextBox (txtRegAddr) - �Ĵ�����ַ
  • 1 �� TextBox (txtRegValue) - �Ĵ���ֵ
  • 1 �� CommandButton (cmdSetReg) - ���üĴ���
  • 1 �� TextBox (txtLog) - ��ʾ��־��MultiLine = True��

���� 2�������

vb
Option Explicit

Private WithEvents mbSlave As cModbusSlave

Private Sub Form_Load()
    Set mbSlave = New cModbusSlave
    
    txtPort.Text = "502"
    txtSlaveID.Text = "1"
    txtRegAddr.Text = "0"
    txtRegValue.Text = "0"
    
    UpdateServerUI False
End Sub

Private Sub cmdStart_Click()
    On Error GoTo EH
    
    mbSlave.ProtocolType = MB_SLAVE_PROTOCOL_TCP
    mbSlave.SlaveID = CByte(txtSlaveID.Text)
    mbSlave.Start CLng(txtPort.Text)
    
    LogMessage "��������������, �˿�: " & txtPort.Text
    Exit Sub
    
EH:
    LogMessage "����ʧ��: " & Err.Description
End Sub

Private Sub cmdStop_Click()
    On Error Resume Next
    
    mbSlave.StopMe
    LogMessage "��������ֹͣ"
    UpdateServerUI False
End Sub

Private Sub cmdSetReg_Click()
    On Error GoTo EH
    
    If mbSlave.State <> MB_SLAVE_STATE_RUNNING Then
        LogMessage "���������"
        Exit Sub
    End If
    
    Dim lAddr As Long
    Dim iValue As Integer
    
    lAddr = CLng(txtRegAddr.Text)
    iValue = CInt(txtRegValue.Text)
    
    mbSlave.SetHoldingRegister lAddr, iValue
    LogMessage "���üĴ���: ��ַ=" & lAddr & ", ֵ=" & iValue
    
    RefreshRegisterList
    Exit Sub
    
EH:
    LogMessage "����ʧ��: " & Err.Description
End Sub

Private Sub RefreshRegisterList()
    Dim i As Long
    
    lstRegisters.Clear
    For i = 0 To 10
        Dim iValue As Integer
        iValue = mbSlave.GetHoldingRegister(i)
        lstRegisters.AddItem "Reg[" & i & "] = " & iValue
    Next i
End Sub

' ====== Modbus Slave �¼����� ======

Private Sub mbSlave_OnStarted()
    LogMessage "*** ������������! ***"
    UpdateServerUI True
End Sub

Private Sub mbSlave_OnStopped()
    LogMessage "*** ��������ֹͣ ***"
    UpdateServerUI False
End Sub

Private Sub mbSlave_OnClientConnect(ByVal ClientID As String, ByVal RemoteAddress As String)
    LogMessage "�ͻ�������: " & ClientID & " (" & RemoteAddress & ")"
End Sub

Private Sub mbSlave_OnClientDisconnect(ByVal ClientID As String, ByVal Reason As String)
    LogMessage "�ͻ��˶Ͽ�: " & ClientID & " - " & Reason
End Sub

Private Sub mbSlave_OnError(ByVal Description As String)
    LogMessage "*** ����: " & Description & " ***"
End Sub

' ====== �������� ======

Private Sub LogMessage(sMessage As String)
    txtLog.Text = txtLog.Text & Format$(Now, "hh:mm:ss") & " - " & sMessage & vbCrLf
    txtLog.SelStart = Len(txtLog.Text)
End Sub

Private Sub UpdateServerUI(bRunning As Boolean)
    txtPort.Enabled = Not bRunning
    txtSlaveID.Enabled = Not bRunning
    cmdStart.Enabled = Not bRunning
    cmdStop.Enabled = bRunning
    cmdSetReg.Enabled = bRunning
End Sub

Private Sub Form_Unload(Cancel As Integer)
    On Error Resume Next
    mbSlave.StopMe
End Sub

���� 3�������

  1. �� F5 ���д�վ����
  2. ���"��������"
  3. �������洴������վ����
  4. ���"����"
  5. ���Ͷ�ȡ�������

? ����ͨ��ʾ��

���Գ�������վ��ȡ��վ�Ĵ���

��վ���루�ṩ���ݣ�

vb
Private Sub Form_Load()
    Set mbSlave = New cModbusSlave
    
    ' ����һЩ��ʼ����
    mbSlave.SetHoldingRegister 0, 100
    mbSlave.SetHoldingRegister 1, 200
    mbSlave.SetHoldingRegister 2, 300
    mbSlave.SetHoldingRegister 3, 400
    mbSlave.SetHoldingRegister 4, 500
    
    ' ����������
    mbSlave.ProtocolType = MB_SLAVE_PROTOCOL_TCP
    mbSlave.SlaveID = 1
    mbSlave.Start 502
End Sub

��վ���루��ȡ���ݣ�

vb
Private Sub cmdRead_Click()
    ' ���Ӵ�վ
    mbMaster.ProtocolType = MB_MASTER_PROTOCOL_TCP
    mbMaster.TCPHost = "127.0.0.1"
    mbMaster.TCPPort = 502
    mbMaster.SlaveID = 1
    mbMaster.Connect
    
    ' ��ȡ5���Ĵ���
    Dim iRegs() As Integer
    iRegs = mbMaster.ReadHoldingRegisters(0, 5)
    
    ' ��ʾ���
    Dim i As Long
    For i = 0 To UBound(iRegs)
        Debug.Print "Reg[" & i & "] = " & iRegs(i)
    Next i
    ' ���:
    ' Reg[0] = 100
    ' Reg[1] = 200
    ' Reg[2] = 300
    ' Reg[3] = 400
    ' Reg[4] = 500
End Sub

? RTU ģʽ���ٿ�ʼ

��վ RTU ģʽ

vb
' ���� RTU ģʽ
mbMaster.ProtocolType = MB_MASTER_PROTOCOL_RTU
mbMaster.SerialPort = "COM1"
mbMaster.BaudRate = 9600
mbMaster.DataBits = 8
mbMaster.Parity = "N"
mbMaster.StopBits = 1
mbMaster.SlaveID = 1

' ����
mbMaster.Connect "COM1"

' ��ȡ�Ĵ���
Dim iRegs() As Integer
iRegs = mbMaster.ReadHoldingRegisters(0, 10)

��վ RTU ģʽ

vb
' ���� RTU ģʽ
mbSlave.ProtocolType = MB_SLAVE_PROTOCOL_RTU
mbSlave.SerialPort = "COM1"
mbSlave.BaudRate = 9600
mbSlave.DataBits = 8
mbSlave.Parity = "N"
mbSlave.StopBits = 1
mbSlave.SlaveID = 1

' ����������
mbSlave.Start "COM1"

' �������ݹ���վ��ȡ
mbSlave.SetHoldingRegister 0, 1234
mbSlave.SetHoldingRegister 1, 5678

? �����Ĺ���ʾ��

��վ - ��ȡ�������͵�����

vb
Private Sub ReadAllTypes()
    ' ��ȡ��Ȧ
    Dim baCoils() As Boolean
    baCoils = mbMaster.ReadCoils(0, 10)
    
    ' ��ȡ��ɢ����
    Dim baInputs() As Boolean
    baInputs = mbMaster.ReadDiscreteInputs(0, 10)
    
    ' ��ȡ���ּĴ���
    Dim iHoldingRegs() As Integer
    iHoldingRegs = mbMaster.ReadHoldingRegisters(0, 10)
    
    ' ��ȡ����Ĵ���
    Dim iInputRegs() As Integer
    iInputRegs = mbMaster.ReadInputRegisters(0, 10)
End Sub

��վ - д���������͵�����

vb
Private Sub WriteAllTypes()
    ' д�뵥����Ȧ
    mbMaster.WriteSingleCoil 0, True
    
    ' д������Ȧ
    Dim baCoils(4) As Boolean
    baCoils(0) = True
    baCoils(1) = False
    baCoils(2) = True
    baCoils(3) = False
    baCoils(4) = True
    mbMaster.WriteMultipleCoils 0, baCoils
    
    ' д�뵥���Ĵ���
    mbMaster.WriteSingleRegister 0, 1234
    
    ' д�����Ĵ���
    Dim iRegs(4) As Integer
    iRegs(0) = 100
    iRegs(1) = 200
    iRegs(2) = 300
    iRegs(3) = 400
    iRegs(4) = 500
    mbMaster.WriteMultipleRegisters 0, iRegs
End Sub

��վ - ��̬��������

vb
Private Sub UpdateDataRealtime()
    Dim i As Long
    Dim iValue As Integer
    
    ' �������¼Ĵ���
    Do While mbSlave.State = MB_SLAVE_STATE_RUNNING
        For i = 0 To 10
            iValue = GetSensorValue(i)  ' �Ӵ�������ȡֵ
            mbSlave.SetHoldingRegister i, iValue
        Next i
        
        DoEvents  ' �ó� CPU ʱ��
        Sleep 1000  ' �ȴ�1��
    Loop
End Sub

Private Function GetSensorValue(iSensorID As Long) As Integer
    ' ģ�⴫��������
    GetSensorValue = Rnd * 10000
End Function

? ��������

Q1: �������"�û���������δ����"

ԭ��: δ���� cByteBuffer.cls �ࡣ

���:

  1. �˵�����Ŀ �� ������ģ��
  2. ����� src/cByteBuffer.cls
  3. ���ӵ���Ŀ

Q2: ����ʧ��"�޷�����������"

ԭ��:

  • TCP ģʽ��URL ��ʽ�������������
  • RTU ģʽ�����ڲ����ڻ�ռ��

���:

  • TCP: ���������ַ�Ͷ˿ڣ�ȷ����վ������
  • RTU: ��鴮�����ƣ�COM1, COM2 �ȣ���ȷ������δ��ռ��

Q3: ��ȡ��ʱ

ԭ��:

  • ��վδ����
  • ������������
  • ��վ ID ��ƥ��
  • ��ʱʱ�����ù���

���:

  • ȷ����վ������
  • ��� Slave ID �Ƿ�ƥ��
  • ���� ResponseTimeout ֵ��Ĭ�� 1000ms��
vb
mbMaster.ResponseTimeout = 3000  ' 3�볬ʱ

Q4: �յ��쳣��Ӧ

ԭ��:

  • �����벻֧��
  • ��ַ������Χ
  • ����ֵ�Ƿ�

���:

  • ����վ֧�ֵĹ�����
  • ȷ����ַ����Ч��Χ��
  • �������ֵ�Ƿ�Ϸ�
vb
Private Sub mbMaster_OnError(ByVal Description As String)
    If InStr(Description, "Modbus Exception") > 0 Then
        MsgBox "Modbus �쳣: " & Description
    End If
End Sub

Q5: RTU ģʽ CRC У��ʧ��

ԭ��:

  • �������ò���ȷ�������ʡ�����λ��У��λ��ֹͣλ��
  • ͨ����·����

���:

  • ȷ������վ����������ȫһ��
  • ��鲨���ʡ�����λ��У��λ��ֹͣλ
  • ���ͨ����·����

Q6: ��δ��������վ

vb
' ���Ӷ����վ
mbMaster.SlaveID = 1
mbMaster.Connect
Dim iRegs1() As Integer
iRegs1 = mbMaster.ReadHoldingRegisters(0, 10)

mbMaster.Disconnect

mbMaster.SlaveID = 2
mbMaster.Connect
Dim iRegs2() As Integer
iRegs2 = mbMaster.ReadHoldingRegisters(0, 10)

mbMaster.Disconnect

Q7: ���ʵ�����ݻ���

vb
' ��վ - ���ݻ���
Private m_iRegisterCache(99) As Integer

Private Sub ReadWithCache(lAddr As Long, lCount As Long) As Integer()
    Dim iRegs() As Integer
    
    ' �ȴӻ����ȡ
    If lAddr + lCount <= UBound(m_iRegisterCache) + 1 Then
        ReDim iRegs(lCount - 1) As Integer
        Dim i As Long
        For i = 0 To lCount - 1
            iRegs(i) = m_iRegisterCache(lAddr + i)
        Next i
    Else
        ' ����δ���У��Ӵ�վ��ȡ
        iRegs = mbMaster.ReadHoldingRegisters(lAddr, lCount)
        
        ' ���»���
        If lAddr + lCount <= UBound(m_iRegisterCache) + 1 Then
            For i = 0 To lCount - 1
                m_iRegisterCache(lAddr + i) = iRegs(i)
            Next i
        End If
    End If
    
    ReadWithCache = iRegs
End Sub

? ��һ��


������: 2026-01-16

������־

2026-01-16 (v1.1.0)

  • ���´�վʾ�����룬ʹ�� StopMe() ��� Stop()
  • ���� BindAddress ʹ��ʾ������վ��
  • ����ö�����ã����� v1.1.0 �����淶��

VB6及其LOGO版权为微软公司所有