Modbus TCP Client Manual
Installation, Configuration, and Operation Manual versions 8.x.x
Table of Contents
Installation
System Requirements:
Windows NT, 95, 2000, XP, Windows7, Windows8,
Windows10 & 11
display resolution: 800 x 600 minimum
Simply Modbus TCP Client 8.1.2
Download the installation file and unzip the contents into a folder. Run setup.exe and follow the installation wizard.
Starting the Program
Click on the Simply Modbus TCP Client item in the start menu to start the program.
Unlicensed versions will start with the Loading Demo window, which takes about 15 seconds.


The main read window is then shown.
Controls (inputs) that can be changed by the user.
Indicators (outputs) that cannot be directly changed.
Modbus mode
Select "Modbus TCP" or "Modbus RTU-over-TCP" protocol. → Modbus TCP
Modbus TCP messages include a 6 byte TCP header followed by the same data in a modbus RTU message.
Modbus RTU-over-TCP messages includes a cyclic redundancy check (CRC) as the last 2 bytes of the Request. These are error detection bytes that are not present in Modbus TCP messages.
Network Settings
Select the IP Address of the Server (Slave device) that you wish to connect to.
Select the Server's Port to connect to.
Press the Connect button and the program will attempt to connect to the Modbus Server.
Each 6 second attempt will count up on the button after the word CONNECTING.
The program will keep trying to connect until a connection is made or the button is pressed again.
Press the Connect button and the program will attempt to connect to the Modbus Server.
Each 6 second attempt will count up on the button after the word CONNECTING.
The connection status is displayed as CONNECTED or NOT CONNECTED.
Building a Request
When in RTU-over-TCP Mode, the first six bytes of the MBAP header are not present. The Request starts with the Slave ID.
SlaveID: The 7th byte in the Request string in TCP Mode
(The 1st byte in RTU-over-TCP mode)
The unit address of the Slave device to get data from. normal range: 1 to 247.
→ SlaveID
2byte ID: Setting a Slave ID over 255 will automatically check this box
and allow Slave IDs up to 65535.
→ SlaveID
Remains on for all addresses until a Slave ID below 256 is entered and the box manually unchecked.
Function code: The 8th byte in the Request string in TCP Mode
(The 2nd byte in RTU-over-TCP mode
Used to select which table to read from.
The main Read Window supports Function codes 01, 02, 03 & 04
→ Function codes
First Register: The 9th & 10th bytes in the Request string in TCP Mode
(The 3rd & 4th bytes in RTU-over-TCP mode)
The register (or coil) number at the start of the block to read.
→ Data tables
Offset: This value is subtracted from the First Register to get the data address used in the Request. → Data tables
Number of Registers: The 11th & 12th bytes in the Request string. in TCP Mode
(The 5th & 6th bytes in RTU-over-TCP mode)
The quantity of registers (or coils) requested.
Register size: The size of the requested registers.
16 bit registers - standard modbus registers.
1 bit coils - standard modbus coils.
32 bit registers - most Enron modbus registers.
→ Data tables
Events: Selected for Enron Event polls from register 32. → Events
History: Selected for Enron History polls from registers 701-799. → History
Use defaults: When checked, the program will automatically populate the circled settings to default values as the value in "First Register" changes. To use non-default settings, or to keep these controls from changing with First Register, uncheck "Use defaults".
Default values
| First Register | Function Code | Offset | Register Size |
|---|---|---|---|
| 1-10000 | 01 | 1 | 1 bit coils |
| 10001-20000 | 02 | 10001 | 1 bit coils |
| 20001-30000 | 03 | 0 | 32 bit regs |
| 30001-40000 | 04 | 30001 | 16 bit regs |
| 40001+ | 03 | 40001 | 16 bit regs |
Enron Exceptions:
| First Register | Function Code | Offset | Register Size |
|---|---|---|---|
| 32 (events) | 03 | 0 | 32 bit regs |
| 701-799 (history) | 03 | 0 | 32 bit regs |
| 1001-1999 (boolean) | 03 | 0 | 1 bit coils |
| 3001-3999 (short int) | 03 | 0 | 16 bit regs |
| 5001-5999 (long int) | 03 | 0 | 32 bit regs |
| 7001-7999 (float) | 03 | 0 | 32 bit regs |
Sending a Request
Set "fail in" time large enough to keep the program from timing out before the full response is received.
The default is 2 seconds.
Press SEND to transmit the request to the slave device.
As the program waits for a response, a red progress bar is shown.
The program stops when the expected response bytes are received or the "fail in" time is reached.
This button is greyed ou when not connected to a network.
The response time and a progress bar are shown as the program waits for a response. It stops when the expected response bytes are received or the "fail in" time is reached.
Reading the Response
After pressing SEND, the response bytes received from the slave device are displayed in the response indicator.
The data in the response is copied into in the results table.
Press clear notes to erase the whole notes column.
Data Types
Select the data types in the first column. The table will be adjusted to show the correct number of bytes in each row.
These are the available Datatypes that can be selected. → Data Types
Press copy down to set all Data Types to match the top row.
High Byte first and High Word first
The bytes and words can be swapped by toggling these check boxes. → Byte/Word Order
Send Continuously
Check this box to sent requests back-to-back continuously. A pause between sends can be eneterd as the seconds between the start of one send request until the start of the next send request. This will continuously send the same command unless combined with the load before send feature (see below). The wait time is shown in a progress bar.
Load Before Send - Sending a series of requests
When this box is selected, and the SEND button is pressed (or SEND CONTINUOUSLY is selected), the program will Restore a previously defined Configuration File and then SEND the request as saved in the file.
The filenames must be in the format: request-1.txt,
request-2.txt, etc...
and saved in the default folder (where the exe file is saved)
If request-1.txt doesn t exist, a window showing instructions similar to these will appear.
SEND CONTINUOUSLY is not saved in the configuration files.
SEND CONTINUOUSLY is always set to unselected when you use the RESTORE CFG button
to restore a configuration file.
This keeps polling from automatically starting when you
manually restore a configuration file.
If a request-*.txt Configuration file is being loaded during a Load before Send,
and the file was saved with LOAD BEFORE SEND selected,
then both SEND CONTINUOUSLY and LOAD BEFORE SEND will both be selected.
Following the LOAD and SEND, the program will wait for the TIME BETWEEN SENDS to expire
before the next LOAD (request2.txt) and SEND.
The program will continue to automatically LOAD,
SEND and WAIT through a series of request-*.txt files
as long as each file has LOAD BEFORE SEND selected.
When the end of the series is reached and the next file is not found,
the series will start over with request-1.txt
and continue until SEND CONTINUOUSLY is manually unchecked.
When a file is LOADED without LOAD BEFORE SEND selected,
following this last SEND, the series will STOP..
The series can be stopped at any time by unchecking SEND CONTINOUSLY.
Log Results
Press LOG to save the results to a tabbed-text file for later analysis.
register# and notes are used as column headers in the file.
When data is received, a row is added to the file with date/time stamp and the results.
Pressing the button again will close the file and stop logging the results.
Byte History Log
All bytes sent and received are added to the byte history log with date/time stamps.The maximum size of the byte log is 50,000 bytes when the oldest 10,000 is removed to keep the program from slowing down.
Press Save Bytes to Display a 'Save As..' dialog box to
save log contents to a text file.
Press Clear Bytes to empty the byte log contents.
Statistics
The seconds taken for the slave to respond to last message.
The number of message responses received (meeting the expected response bytes).
The number of message with an incomplete or absent response
The longest amount of seconds taken for a response (not including failed responses).
The average amount of seconds taken for a response (not including failed responses).
The shortest amount of seconds taken for a response (not including failed responses).
Press Reset to set all statistical values back to zero.
Save and Restore Configurations
Press Save Configuration to display a 'Save As..' dialog box
to save the current settings to a text file.
Press Restore Configuration to display an 'Open File' dialog box
to select a previously saved settings file.
Configuration File Format
The file is saved in tabbed-text format (tab separated values).Sending it to, or opening it from, a spreadsheet program like Excel will use the tabs as column delimiters as shown here...
Columns A & B contain the setting descriptions and their values.
Column C contains the data type numbers 0 through 13 for the selected data types.
Column D contains the selected data type descriptions.
Column E contains the register numbers (hex values plus offset).
Column F contains the register values from the last poll, if any.
Cell G1 contains the result string from the last poll, if any.
Writing Data
Press the WRITE button to write coils and registers in a separate window.
About Box
Press the About button to display the About Box and see the full version number and if you are in demo mode.

Context help
Press Control-H to open the Context Help box which shows additional help information as you hover over the controls and indicators.

Troubleshooting
If you see no response after hitting send- Check slave device is powered on and connected to the network
- Check the IP Address and Port in the Modbus Server (Slave device) to make sure it matches the settings in the TCP Client program (Master device)
- Check IP Address and port number.
- Check mode. TCP or RTU-over-TCP.
- Check slave ID.
- Check slave device tables to verify the addresses of registers or coils.
- Check offset to verify the hexadecimal address in the request message.
- Check "fail in" time is not too low causing the program to time out before the response is received.