���ٿ�ʼ
��ָ�Ͻ��������������� Modbus ��⣬������������վ�ʹ�վӦ�á�
? ǰ����
�����ļ�
ȷ�������ļ������ӵ���Ŀ�У�
| �ļ� | λ�� | ˵�� |
|---|---|---|
cWinsock.cls | add/ | �ײ� Socket ��װ |
cByteBuffer.cls | src/ | �ֽڻ������� |
cModbusMaster.cls | src/Modbus/ | ��վ�� |
cModbusSlave.cls | src/Modbus/ | ��վ�� |
���ӵ���Ŀ
- �� VB6 ��Ŀ
- �˵�����Ŀ �� ������ģ��
- �������Ӧ�ļ�������
? ��վ�������ţ�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�������
- �� F5 �����
- �����������ַ����
127.0.0.1�� - ���"����"
- ���ӳɹ��������ַ������
- ���"��ȡ����"
? ��վ�������ţ�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�������
- �� F5 ���д�վ����
- ���"��������"
- �������洴������վ����
- ���"����"
- ���Ͷ�ȡ�������
? ����ͨ��ʾ��
���Գ�������վ��ȡ��վ�Ĵ���
��վ���루�ṩ���ݣ�
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 �ࡣ
���:
- �˵�����Ŀ �� ������ģ��
- �����
src/cByteBuffer.cls - ���ӵ���Ŀ
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 SubQ5: 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.DisconnectQ7: ���ʵ�����ݻ���
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? ��һ��
- �鿴 master.md �˽���վ��ϸ API
- �鿴 slave.md �˽��վ��ϸ API
- �鿴 advanced.md �˽������
������: 2026-01-16
������־
2026-01-16 (v1.1.0)
- ���´�վʾ�����룬ʹ��
StopMe()���Stop() - ����
BindAddressʹ��ʾ������վ�� - ����ö�����ã����� v1.1.0 �����淶��