You are on page 1of 18

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

You might also like