19/7/2017 How to Implement Modbus TCP Protocol using VBA with Excel | Acc Automation
ACC, CANADA, COMMUNICATION, DATA LOGGING, DIGITAL, MANUFACTURING, MODBUS TCP, PLC, PROGRAMMABLE
LOGIC CONTROLLER, PROGRAMMING, PROGRAMMING EXAMPLE, SYSTEMS, UNCATEGORIZED
HOW TO IMPLEMENT MODBUS TCP
PROTOCOL USING VBA WITH EXCEL
NOVEMBER 7, 2015 | GARRYS
We will use Visual Basic for Applications (VBA) to communicate to a PLC using Modbus TCP
protocol. Reading ten registers in the PLC and displaying a bar graph in Excel. Previously we have
used VB6 to communicate Modbus TCP.
The following steps will be done:
1. Explain Modbus TCP protocol
2. Install OstroSoft Winsock Component
Winsock API Calls for communication on network
3. Develop the Excel and VBA application
(Microsoft Excel 2010)
4. Communicate to the PLC and sample code
(Do-More Simulator)
The Modbus TCP/IP or Modbus TCPis a Protocol that is used for communications over TCP/IP
networks. This is done on port 502.Modbus TCPdoes not require a checksum calculation as lower
layers already provide checksum protection. You can think of this as aletter being sent and Ethernet
http://accautomation.ca/how-to-implement-modbus-tcp-protocol-using-vba-with-excel/ 1/18
19/7/2017 How to Implement Modbus TCP Protocol using VBA with Excel | Acc Automation
TCP/IP acts like an envelope for the Modbus Commands. I will not go into the details of the
communication protocol but here are some links to references:
Introduction to Modbus TCP/IP
Simply Modbus Modbus TCP
OstroSoft Winsock Component
OSWINSCK.dll serves as a wrapper for the Winsock API and helps programmers to abstract from the
complexity of API calls and focus on application functionality. Works with programming and scripting
languages supporting COM.
You will need to download and install the OstroSoft Winsock Component on your computer.
For use with .NET, Visual Basic 4 or 5, Visual C++, ASP, VBA, VBScript, JavaScript or any other
language, supporting COM:
1. Download oswinsck.exe
2. Run downloaded le from Windows Explorer or command-line
Hit OK
I use the defaultdirectories where the program will be installed. Click the button to install.
http://accautomation.ca/how-to-implement-modbus-tcp-protocol-using-vba-with-excel/ 2/18
19/7/2017 How to Implement Modbus TCP Protocol using VBA with Excel | Acc Automation
Leave the program group to the default so I know what the program is after installation.Click
continue.
Click OK
The OstroSoft Winsock Component is now installed.
Start Microsoft Excel.
http://accautomation.ca/how-to-implement-modbus-tcp-protocol-using-vba-with-excel/ 3/18
19/7/2017 How to Implement Modbus TCP Protocol using VBA with Excel | Acc Automation
Select Developer along the top tabs.
If the Developer tab is not present then we must turn on the developer tab.
Select File | Options
http://accautomation.ca/how-to-implement-modbus-tcp-protocol-using-vba-with-excel/ 4/18
19/7/2017 How to Implement Modbus TCP Protocol using VBA with Excel | Acc Automation
Select Customize Ribbon
http://accautomation.ca/how-to-implement-modbus-tcp-protocol-using-vba-with-excel/ 5/18
19/7/2017 How to Implement Modbus TCP Protocol using VBA with Excel | Acc Automation
Checkthe Developer underMain Tabs.
http://accautomation.ca/how-to-implement-modbus-tcp-protocol-using-vba-with-excel/ 6/18
19/7/2017 How to Implement Modbus TCP Protocol using VBA with Excel | Acc Automation
http://accautomation.ca/how-to-implement-modbus-tcp-protocol-using-vba-with-excel/ 7/18
19/7/2017 How to Implement Modbus TCP Protocol using VBA with Excel | Acc Automation
Under the Developer menu. Select Visual Basic
The Visual Basic Editor window will now be displayed.
From the menu Tools | References
We can now add the OstroSoft Winsock Component to our application.
Select OK
http://accautomation.ca/how-to-implement-modbus-tcp-protocol-using-vba-with-excel/ 8/18
19/7/2017 How to Implement Modbus TCP Protocol using VBA with Excel | Acc Automation
Select Sheet1(Sheet1).
Now put the visual basic code in the Sheet1(Sheet1)
Here is the code:
This example uses OstroSoft Winsock Component
http://www.ostrosoft.com/oswinsck.asp
Option Explicit
http://accautomation.ca/how-to-implement-modbus-tcp-protocol-using-vba-with-excel/ 9/18
19/7/2017 How to Implement Modbus TCP Protocol using VBA with Excel | Acc Automation
Dim bytesTotal As Long
Dim sPage As String
Dim MbusQuery
Dim returnInfo
Dim wsTCPgdb
Dim WithEvents wsTCP As OSWINSCK.Winsock
Dim SetObject
Dim RetrieveData
Private Sub CommandButton1_Click() Retrieve Data
On Error GoTo ErrHandler
Dim sServer As String
Dim nPort As Long
Dim StartTime
DoEvents
nPort = 502 See con guration in Do-More Designer
Set the IP address of the PLC
sServer = Sheets(Sheet1).Range(B4) 192.168.1.3
RetrieveData = 1
CommandButton1.BackColor = &H0000FF00 Set colour to Green
Check to see if the object has been created. If not set wsTCP.
If SetObject = Then
Set wsTCP = CreateObject(OSWINSCK.Winsock)
wsTCP.Protocol = sckTCPProtocol
SetObject = 1
End If
Check the state of the TCP connection
0 sckClosed connection closed
1 sckOpen open
2 sckListening listening for incoming connections
3 sckConnectionPending connection pending
4 sckResolvingHost resolving remote host name
5 sckHostResolved remote host name successfully resolved
6 sckConnecting connecting to remote host
7 sckConnected connected to remote host
8 sckClosing Connection Is closing
9 sckError error occured
If TCP is not connected, try to connect again.
If wsTCP.State <> 7 Then
http://accautomation.ca/how-to-implement-modbus-tcp-protocol-using-vba-with-excel/ 10/18
19/7/2017 How to Implement Modbus TCP Protocol using VBA with Excel | Acc Automation
If (wsTCP.State <> sckClosed) Then
wsTCP.CloseWinsock
End If
Open the connection
wsTCP.Connect sServer, nPort
StartTime = Timer Use the timer to determine if a connection cannot be made
Do While ((Timer < StartTime + 2) And (wsTCP.State <> 7))
DoEvents
Loop
If (wsTCP.State = 7) Then
Else
Exit Sub
End If
End If
If we are connected then request the information.
If (wsTCP.State = 7) Then
MbusQuery = Chr(0) + Chr(0) + Chr(0) + Chr(0) + Chr(0) + Chr(6) + Chr(0) + Chr(3) + Chr(0) + Chr(0) +
Chr(0) + Chr(20)
wsTCP.SendData MbusQuery Send out the Modbus Information
Read the information
0000: Transaction Identi er
0000: Protocol Identi er
0006: Message Length (6 bytes to follow)
00: The Unit Identi er
03: The Function Code (read MHR Read Holding Registers)
0000: The Data Address of the rst register
0002: The number of registers to write
Write the information
0000: Transaction Identi er
0000: Protocol Identi er
0009: Message Length (6 bytes to follow)
01: The Unit Identi er
16: The Function Code (read Analog Output Holding Registers)
0000: The Data Address of the rst register
0001: The number of registers to write
02: The number of data bytes to follow
0030 The number to put into the register
Note: Addresses are offset by 1
Example: MHR1 = Address 0000
Example: MHR30 = Address 0029
http://accautomation.ca/how-to-implement-modbus-tcp-protocol-using-vba-with-excel/ 11/18
19/7/2017 How to Implement Modbus TCP Protocol using VBA with Excel | Acc Automation
End If
Exit Sub
ErrHandler:
MsgBox Error & Err.Number & : & Err.Description
End Sub
Private Sub CommandButton2_Click() Stop the communication
RetrieveData = 0
CommandButton1.BackColor = &H8000000F Set the default colour
End Sub
Private Sub wsTCP_OnDataArrival(ByVal bytesTotal As Long)
Dim sBuffer
Dim i
Dim MbusByteArray(500)
Dim h As Integer
Dim txtSource
wsTCP.GetData sBuffer
txtSource = txtSource & sBuffer
Dim j As Byte
returnInfo =
For i = 1 To bytesTotal
wsTCP.GetData j, vbByte
MbusByteArray(i) = Asc(Mid(sBuffer, i, 2))
returnInfo = returnInfo & Asc(Mid(sBuffer, i, 2))
Next
txtSource = returnInfo
txtSource = Val(Str((MbusByteArray(10) * 256) + MbusByteArray(11)))
Sheets(Sheet1).Range(B10) = Val(Str((MbusByteArray(10) * 256) + MbusByteArray(11)))
Sheets(Sheet1).Range(B11) = Val(Str((MbusByteArray(12) * 256) + MbusByteArray(13)))
Sheets(Sheet1).Range(B12) = Val(Str((MbusByteArray(14) * 256) + MbusByteArray(15)))
Sheets(Sheet1).Range(B13) = Val(Str((MbusByteArray(16) * 256) + MbusByteArray(17)))
Sheets(Sheet1).Range(B14) = Val(Str((MbusByteArray(18) * 256) + MbusByteArray(19)))
Sheets(Sheet1).Range(B15) = Val(Str((MbusByteArray(20) * 256) + MbusByteArray(21)))
Sheets(Sheet1).Range(B16) = Val(Str((MbusByteArray(22) * 256) + MbusByteArray(23)))
Sheets(Sheet1).Range(B17) = Val(Str((MbusByteArray(24) * 256) + MbusByteArray(25)))
Sheets(Sheet1).Range(B18) = Val(Str((MbusByteArray(26) * 256) + MbusByteArray(27)))
Sheets(Sheet1).Range(B19) = Val(Str((MbusByteArray(28) * 256) + MbusByteArray(29)))
DoEvents
Determine if we retrieve the data again.
http://accautomation.ca/how-to-implement-modbus-tcp-protocol-using-vba-with-excel/ 12/18
19/7/2017 How to Implement Modbus TCP Protocol using VBA with Excel | Acc Automation
If RetrieveData = 1 Then
Call CommandButton1_Click
End If
End Sub
Private Sub wsTCP_OnError(ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal
Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
MsgBox Number & : & Description
End Sub
Private Sub wsTCP_OnStatusChanged(ByVal Status As String)
Debug.Print Status
End Sub
Note: The program utilizes the CHR and STR functions to convert the data from binary to ASCII and
back.
The highest value of a byte of data is 256. This is why we have to multiply the highest signi cant byte
with 256
Interface:
Go back to Sheet1 and we can now put on the worksheet what we would like to see.
Note the following:
IP Address = B4
MHR 1 to 10 values located at B10 to B19
Stop Data CommandButton2
Retrieve Data CommandButton1
http://accautomation.ca/how-to-implement-modbus-tcp-protocol-using-vba-with-excel/ 13/18
19/7/2017 How to Implement Modbus TCP Protocol using VBA with Excel | Acc Automation
Communication to the PLC
Start the Do-More Designer software.
Under the Project Browser select System Con guration
http://accautomation.ca/how-to-implement-modbus-tcp-protocol-using-vba-with-excel/ 14/18
19/7/2017 How to Implement Modbus TCP Protocol using VBA with Excel | Acc Automation
Make note of the IP address. If you are running the simulator then this is automatically lled in.
Ensure that the Enable Modbus/TCP Server is checked. Also make sure that the TCP Port Number is
502.
http://accautomation.ca/how-to-implement-modbus-tcp-protocol-using-vba-with-excel/ 15/18
19/7/2017 How to Implement Modbus TCP Protocol using VBA with Excel | Acc Automation
The sample PLC program will write values in the range from 0 to 4000. These values will be put in
MHR 1 to MHR 10.
Here is the rst couple of rungs of the PLC program. It will use clock bit ags to increment the MHR 1
channel. When it gets to the value above 4000, a move instruction will put a 0 back into MHR 1.
If input X0 turns on then the value in XW0 will be moved into MHR1 and the previous clock bit will
not be in effect. Values will be between 0 and 4096. (12 bit resolution)
This is repeated with different internal clock bit ags up to MHR10.
http://accautomation.ca/how-to-implement-modbus-tcp-protocol-using-vba-with-excel/ 16/18
19/7/2017 How to Implement Modbus TCP Protocol using VBA with Excel | Acc Automation
Running the program will produce the following:
As you can see the Modbus TCP protocol is easy to implement with visual basic for applications.
Download the PLC program and Excel le.
Additional Information:
Excel Conditional Movement of Data
Watch on YouTube : How to Implement Modbus TCP Protocol using VBA with Excel
How to Implement Modbus TCP Protocol using VBA with Excel
If you have any questions or need further information please contact me.
Thank you,
Garry
http://accautomation.ca/how-to-implement-modbus-tcp-protocol-using-vba-with-excel/ 17/18
19/7/2017 How to Implement Modbus TCP Protocol using VBA with Excel | Acc Automation
If youre like most of my readers, youre committed to learning about technology. Numbering
systems used in PLCs are not dif cult to learn and understand. We will walk through the numbering
systems used in PLCs. This includes Bits, Decimal, Hexadecimal, ASCII and Floating Point.
To get this free article, subscribe to my free email newsletter.
Use the information to inform other people how numbering systems work. Sign up now.
The Robust Data Logging for Free eBook is also available as a free download. The link is included
when you subscribe to ACC Automation.
It's only fair to share...
http://accautomation.ca/how-to-implement-modbus-tcp-protocol-using-vba-with-excel/ 18/18