Modbus �����ĵ�
? Modbus ��� - ���� cWinsock ��װ�� VB6 Modbus ʵ�ֿ⣬�� woeoio@qq.com ʹ�� claude ai ��������
? Ŀ¼
����
Modbus �����һ��Ϊ VB6 ��Ƶ������� Modbus ͨ�ſ⣬��ȫ���� Modbus Э��淶��RTU �� TCP���������� cWinsock ��ʵ�֣��ṩ�˼�����õ� API �������Ĺ���֧�֡�
? ��Ҫ����
- ? ����ʵ�� - ����ؼ���ֱ��ʹ�ö�����
- ? ����ʽ��� - ��վ��Master���ʹ�վ��Slave��������⣬ְ������
- ? ����Э��֧�� - ֧�� Modbus RTU �� TCP ����ģʽ
- ? ���������� - ֧�����б� Modbus �����루0x01-0x10, 0x16, 0x17��
- ? ��Ч������ - ʹ�� cByteBuffer Ԥ�����ֽڻ������������ڴ�������
- ?? �Զ����� - �Զ����� MBAP ͷ��TCP���� CRC У�飨RTU��
- ? ���ݴ洢 - ��վ�������ݴ洢����֧�ֶ�̬��չ
- ? �¼����� - �������¼����ƣ����ɴ������ӡ����ݺʹ���
��������
1?? ������ְ����� ?
������ģ�黯��ƣ���վ�ʹ�վ��ȫ������
vb
' cModbusMaster - Modbus ��վ���ͻ��ˣ�
Set mbMaster = New cModbusMaster
mbMaster.ProtocolType = MB_MASTER_PROTOCOL_TCP
mbMaster.TCPHost = "192.168.1.100"
mbMaster.TCPPort = 502
mbMaster.Connect
' cModbusSlave - Modbus ��վ����������
Set mbSlave = New cModbusSlave
mbSlave.ProtocolType = MB_SLAVE_PROTOCOL_TCP
mbSlave.SlaveID = 1
mbSlave.BindAddress = "0.0.0.0" ' �������нӿڣ�Ĭ�ϣ�
mbSlave.Start 502
' cByteBuffer - ��Ч�ֽڻ��������ڲ�ʹ�ã�
' cWinsock - �ײ� Socket ��װ2?? ˫Э��֧�� ?
���ͬʱ֧�� Modbus RTU �� TCP ����ģʽ��
TCP ģʽ
vb
mbMaster.ProtocolType = MB_MASTER_PROTOCOL_TCP
mbMaster.TCPHost = "192.168.1.100"
mbMaster.TCPPort = 502
mbMaster.ConnectRTU ģʽ
vb
mbMaster.ProtocolType = MB_MASTER_PROTOCOL_RTU
mbMaster.SerialPort = "COM1"
mbMaster.BaudRate = 9600
mbMaster.DataBits = 8
mbMaster.Parity = "N"
mbMaster.StopBits = 1
mbMaster.Connect "COM1"3?? �����Ĺ�����֧�� ?
֧�����б� Modbus �����룺
| ������ | ���� | ˵�� |
|---|---|---|
| 0x01 | Read Coils | ��ȡ��Ȧ |
| 0x02 | Read Discrete Inputs | ��ȡ��ɢ���� |
| 0x03 | Read Holding Registers | ��ȡ���ּĴ��� |
| 0x04 | Read Input Registers | ��ȡ����Ĵ��� |
| 0x05 | Write Single Coil | д�뵥����Ȧ |
| 0x06 | Write Single Register | д�뵥���Ĵ��� |
| 0x0F | Write Multiple Coils | д������Ȧ |
| 0x10 | Write Multiple Registers | д�����Ĵ��� |
| 0x16 | Mask Write Register | ����д�Ĵ��� |
| 0x17 | Read/Write Multiple Registers | ��д����Ĵ��� |
4?? ��վ���ݴ洢 ?
��վ���������ݴ洢����֧�ֶ�̬��չ��
vb
' ������Ȧ
mbSlave.SetCoil 0, True
mbSlave.SetCoil 1, False
' ���üĴ���
mbSlave.SetHoldingRegister 0, 1234
mbSlave.SetHoldingRegister 1, 5678
' ��ȡ����
Dim bCoil As Boolean
bCoil = mbSlave.GetCoil(0)
Dim iReg As Integer
iReg = mbSlave.GetHoldingRegister(0)5?? �Զ�Э�鴦�� ??
TCP ģʽ - MBAP ͷ�Զ�����
vb
' ��վ�Զ����� MBAP ͷ
' ��վ�Զ����� MBAP ͷ
' �����ֶ����� Transaction ID��Protocol ID��Length��Unit IDRTU ģʽ - CRC У���Զ�����
vb
' ��վ�Զ����㲢���� CRC16
' ��վ�Զ���֤ CRC16
' �����ֶ�����У��6?? �¼�����ģ�� ?
��վ�¼�
vb
Event OnConnect() ' ���ӳɹ�
Event OnDisconnect() ' ���ӶϿ�
Event OnError(ByVal Description As String) ' ��������
Event OnDataReceived(Data() As Byte) ' �յ�������վ�¼�
vb
Event OnStarted() ' ����������
Event OnStopped() ' ������ֹͣ
Event OnClientConnect(ByVal ClientID As String, ByVal RemoteAddress As String) ' �ͻ�������
Event OnClientDisconnect(ByVal ClientID As String, ByVal Reason As String) ' �ͻ��˶Ͽ�
Event OnReadRequest(ByVal ClientID As String, ByVal FunctionCode As ModbusSlaveFunctionCode, ...) ' ��ȡ����
Event OnWriteRequest(ByVal ClientID As String, ByVal FunctionCode As ModbusSlaveFunctionCode, ...) ' �����
Event OnError(ByVal Description As String) ' ��������
Event OnDataReceived(ByVal ClientID As String, Data() As Byte) ' �յ�����7?? �쳣��֧�� ??
������ Modbus �쳣��֧�֣�
| �쳣�� | ���� | ˵�� |
|---|---|---|
| 0x01 | Illegal Function | �Ƿ������� |
| 0x02 | Illegal Data Address | �Ƿ����ݵ�ַ |
| 0x03 | Illegal Data Value | �Ƿ�����ֵ |
| 0x04 | Slave Device Failure | ��վ�豸���� |
| 0x05 | Acknowledge | ȷ�� |
| 0x06 | Slave Device Busy | ��վ�豸æ |
| 0x08 | Memory Parity Error | �ڴ���żУ����� |
| 0x0A | Gateway Path Unavailable | ����·�������� |
| 0x0B | Gateway Target Device Failed | ����Ŀ���豸ʧ�� |
�ܹ����
���νṹ
Modbus ���
������ cModbusMaster (��վ/�ͻ���)
�� ������ m_Socket: cWinsock (TCP ���� Socket)
�� ������ m_hSerialPort: Long (RTU ���ھ��)
�� ������ m_RTUBuffer: cByteBuffer (RTU ���ջ�����)
�� ������ ����/��Ӧ����
��
������ cModbusSlave (��վ/������)
�� ������ m_ListenSocket: cWinsock (TCP ���� Socket)
�� ������ m_Clients: Collection (TCP �ͻ��˼���)
�� ������ m_hSerialPort: Long (RTU ���ھ��)
�� ������ m_RTUBuffer: cByteBuffer (RTU ���ջ�����)
�� ������ m_Coils: Boolean() (��Ȧ����)
�� ������ m_DiscreteInputs: Boolean() (��ɢ��������)
�� ������ m_HoldingRegisters: Integer() (���ּĴ�������)
�� ������ m_InputRegisters: Integer() (����Ĵ�������)
��
������ cByteBuffer (�ֽڻ�����)
�� ������ Ԥ���䡢�Զ�������Peek/Consume/Extract
��
������ cWinsock (�ײ� Socket ��װ)
������ TCP ���Ӻ������շ���վ�����ϵͼ
cModbusMaster (��վ)
������ TCP ģʽ
�� ������ Socket (���� Socket: cWinsock)
�� ������ TransactionID (���� ID)
��
������ RTU ģʽ
������ SerialPort (���ھ��)
������ RecvBuffer (cByteBuffer)
������ SerialConfig (�����ʡ�����λ��У��λ��ֹͣλ)��վ�����ϵͼ
cModbusSlave (��վ)
������ TCP ģʽ
�� ������ ListenSocket (���� Socket: cWinsock)
�� ������ Clients ����
�� �� ������ �ͻ��� 1 (cWinsock)
�� �� ������ �ͻ��� 2 (cWinsock)
�� �� ������ ...
�� ������ ���ݴ洢
�� ������ Coils (Boolean ����)
�� ������ DiscreteInputs (Boolean ����)
�� ������ HoldingRegisters (Integer ����)
�� ������ InputRegisters (Integer ����)
��
������ RTU ģʽ
������ SerialPort (���ھ��)
������ RecvBuffer (cByteBuffer)
������ ���ݴ洢
������ Coils (Boolean ����)
������ DiscreteInputs (Boolean ����)
������ HoldingRegisters (Integer ����)
������ InputRegisters (Integer ����)ͨ������
��վ��ȡ����
1. ���ö�ȡ�������� ReadHoldingRegisters��
��
2. ��������֡
- RTU: SlaveID + FC + Addr(2) + Quantity(2) + CRC(2)
- TCP: MBAP(7) + FC + Addr(2) + Quantity(2)
��
3. ��������
- RTU: ͨ�����ڷ���
- TCP: ͨ�� Socket ����
��
4. �ȴ���Ӧ������ʱ��
��
5. ������Ӧ����
- RTU: ��֤ CRC
- TCP: ��֤ Transaction ID
��
6. ������Ӧ
- ����쳣��
- ��ȡ����
��
7. ���ؽ������������վ��������
1. ���������������� TCP ����ڣ�
��
2. �ȴ�����
��
3. ���յ�����
- TCP: �ͻ��˷�������
- RTU: ���ڽ�������
��
4. ��������֡
- RTU: ��֤ CRC
- TCP: ���� MBAP ͷ
��
5. ��� Slave ID
- �Ƿ���
��
6. ���ݹ�����ִ�в���
- ��ȡ���ݣ����ڲ��洢����ȡ
- д�����ݣ������ڲ��洢��
��
7. ������Ӧ֡
- RTU: PDU + CRC(2)
- TCP: MBAP(7) + PDU
��
8. ������Ӧ
- RTU: ͨ�����ڷ���
- TCP: ͨ�� Socket �����ĵ�����
| �ĵ� | ���� |
|---|---|
| �����ĵ� | Modbus ����������ܺ���������ǰ�ĵ��� |
| ��վ����ϸ�ĵ� | cModbusMaster �����ϸ˵�� |
| ��վ����ϸ�ĵ� | cModbusSlave �����ϸ˵�� |
| ���ٿ�ʼ | ��������ʾ�� |
| ����Ӧ�� | �����ܺ����ʵ�� |
������ϵ
| ��� | ���� |
|---|---|
| cWinsock.cls | λ�� add/ Ŀ¼�µĵײ� Socket ��װ���ṩ TCP ���ӹ��� |
| cByteBuffer.cls | λ�� src/ Ŀ¼�µ��ֽڻ������࣬���ڸ�Ч�����ֽ����� |
| cModbusMaster.cls | λ�� src/Modbus/ Ŀ¼�µ� Modbus ��վ�� |
| cModbusSlave.cls | λ�� src/Modbus/ Ŀ¼�µ� Modbus ��վ�� |
| ModbusMasterFunctionCode / ModbusSlaveFunctionCode | ������ö�٣�v1.1.0+�� |
| ModbusMasterExceptionCode / ModbusSlaveExceptionCode | �쳣��ö�٣�v1.1.0+�� |
| ModbusMasterState / ModbusSlaveState | ״̬ö�٣�v1.1.0+�� |
| ModbusMasterProtocolType / ModbusSlaveProtocolType | Э������ö�٣�v1.1.0+�� |
| ModbusMasterDefaults / ModbusSlaveDefaults | Ĭ�����ýṹ�壨v1.1.0+�� |
������
- VB6/VBA - ��ȫ����
- Windows - Windows XP �����ϰ汾
- Modbus Э�� - Modbus RTU �� TCP����ȫ���ݣ�
- ���� - �� COM �˿ڣ�RTU ģʽ��
- ���� - �� TCP/IP��TCP ģʽ��
����֤
���� VbAsyncSocket (wqweto@gmail.com) ����
����
Modbus ���: woeoio@qq.com
���� Socket ��: woeoio@qq.com
ԭʼ Socket ��: wqweto@gmail.com
�汾��Ϣ
- �ĵ��汾: 1.1.0
- ������: 2026-01-16
v1.1.0 ��Ҫ����
1. ö�������淶��
Ϊ��������վ��֮���ö�����Ƴ�ͻ������ö������������ Master �� Slave ����
��վö��:
ModbusMasterFunctionCode- ��վ������ModbusMasterExceptionCode- ��վ�쳣��ModbusMasterState- ��վ״̬ModbusMasterProtocolType- ��վЭ������ModbusMasterDefaults- ��վĬ������
��վö��:
ModbusSlaveFunctionCode- ��վ������ModbusSlaveExceptionCode- ��վ�쳣��ModbusSlaveState- ��վ״̬ModbusSlaveProtocolType- ��վЭ������ModbusSlaveDefaults- ��վĬ������
2. ���� BindAddress ���ܣ���վ��
��վ������ BindAddress ���ԣ�֧������ TCP ������ַ��
vb
' �������������ӣ�����ȫ��
mbSlave.BindAddress = "127.0.0.1"
mbSlave.Start 502
' ������������ӿڣ�Ĭ�ϣ�
mbSlave.BindAddress = "0.0.0.0"
mbSlave.Start 502
' �� Start ������ָ��
mbSlave.Start 502, "192.168.1.100"3. ����������
cModbusSlave.Stop() ��������Ϊ StopMe()�������� VB �ؼ��ֳ�ͻ��
������: 2026-01-16