• Libraries
  • Shop
  • Doc
  • Free Modbus
  • Support
  • Login
FieldTalk Modbus Master C++ Library  Library version 2.13.3
  • Introduction
  • Chapters
  • Modules
  • Classes
How to integrate the Protocol in your Application

Using Serial Protocols

Let's assume we want to talk to a Modbus slave device with slave address 1.

The registers for reading are in the reference range 4:00100 to 4:00119 and the registers for writing are in the range 4:00200 to 4:00219. The discretes for reading are in the reference range 0:00010 to 0:00019 and the discretes for writing are in the range 0:00020 to 0:00029.

1. Include the library header files

#include "MbusRtuMasterProtocol.hpp"

2. Device data profile definition

Define the data sets which reflects the slave's data profile by type and size:

short readRegSet[20];
short writeRegSet[20];
int readBitSet[20];
int writeBitSet[20];

If you are using floats instead of 16-bit shorts define:

float readFloatSet[10];
float writeFloatSet[10];

Note that because a float occupies two 16-bit registers the array size is half the size it would be for 16-bit shorts!

If you are using 32-bit ints instead of 16-bit shorts define:

long readLongSet[10];
long writeLongSet[10];

Note that because a long occupies two 16-bit registers the array size is half the size it would be for 16-bit shorts!

3. Declare and instantiate a protocol object

MbusRtuMasterProtocol mbusProtocol;

4. Open the protocol

int result;
result = mbusProtocol.openProtocol(portName,
19200L, // Baudrate
8, // Databits
1, // Stopbits
2); // Even parity
if (result != FTALK_SUCCESS)
{
fprintf(stderr, "Error opening protocol: %s!\n",
getBusProtocolErrorText(result));
exit(EXIT_FAILURE);
}

5. Perform the data transfer functions

  • To read register values:
    mbusProtocol.readMultipleRegisters(1, 100, readRegSet,
    sizeof(readRegSet) / sizeof(short));
  • To write a single register value:
    mbusProtocol.writeSingleRegister(1, 200, 1234);
  • To write mutliple register values:
    mbusProtocol.writeMultipleRegisters(1, 200, writeRegSet,
    sizeof(writeRegSet) / sizeof(short));
  • To read discrete values:
    mbusProtocol.readCoils(1, 10, readBitSet, sizeof(readBitSet) / sizeof(int));
  • To write a single discrete value:
    mbusProtocol.writeCoil(1, 20, 1);
  • To write multiple discrete values:
    mbusProtocol.forceMultipleCoils(1, 20, sizeof(writeBitSet) / sizeof(int));
  • To read float values:
    mbusProtocol.readMultipleFloats(1, 100, readFloatSet,
    sizeof(readFloatSet) / sizeof(float));
  • To read long integer values:
    mbusProtocol.readMultipleLongInts(1, 100, readLongSet,
    sizeof(readLongSet) / sizeof(long));

6. Close the protocol port if not needed any more

mbusProtocol.closeProtocol();

7. Error Handling

Serial protocol errors like slave device failures, transmission failures, checksum errors and time-outs return an error code. The following code snippet can handle and report these errors:

int result;
result = mbusProtocol.readMultipleRegisters(1, 100, dataSetArray, 10);
if (result != FTALK_SUCCESS)
{
fprintf(stderr, "%s!\n", getBusProtocolErrorText(result));
// Stop for fatal errors
if (!(result & FTALK_BUS_PROTOCOL_ERROR_CLASS))
return;
}

An automatic retry mechanism is available and can be enabled with mbusProtocol.setRetryCnt(3) before opening the protocol port.

Using MODBUS/TCP Protocol

Let's assume we want to talk to a Modbus slave device with unit address 1 and IP address 10.0.0.11.

The registers for reading are in the reference range 4:00100 to 4:00119 and the registers for writing are in the range 4:00200 to 4:00219. The discretes for reading are in the reference range 0:00010 to 0:00019 and the discretes for writing are in the range 0:00020 to 0:00029.

1. Include the library header files

#include "MbusTcpMasterProtocol.hpp"

2. Device data profile definition

Define the data sets which reflects the slave's data profile by type and size:

short readRegSet[20];
short writeRegSet[20];
int readBitSet[10];
int writeBitSet[10];

If you are using floats instead of 16-bit shorts define:

float readFloatSet[10];
float writeFloatSet[10];

Note that because a float occupies two 16-bit registers the array size is half the size it would be for 16-bit shorts!

If you are using 32-bit ints instead of 16-bit shorts define:

long readLongSet[10];
long writeLongSet[10];

Note that because a long occupies two 16-bit registers the array size is half the size it would be for 16-bit shorts!

3. Declare and instantiate a protocol object

MbusTcpMasterProtocol mbusProtocol;

4. Open the protocol

mbusProtocol.openProtocol("10.0.0.11");

5. Perform the data transfer functions

  • To read register values:
    mbusProtocol.readMultipleRegisters(1, 100, readRegSet,
    sizeof(readRegSet) / sizeof(short));
  • To write a single register value:
    mbusProtocol.writeSingleRegister(1, 200, 1234);
  • To write mutliple register values:
    mbusProtocol.writeMultipleRegisters(1, 200, writeRegSet,
    sizeof(writeRegSet) / sizeof(short));
  • To read discrete values:
    mbusProtocol.readCoils(1, 10, readBitSet, sizeof(readBitSet) / sizeof(int));
  • To write a single discrete value:
    mbusProtocol.writeCoil(1, 20, 1);
  • To write multiple discrete values:
    mbusProtocol.forceMultipleCoils(1, 20, writeBitSet,
    sizeof(writeBitSet) / sizeof(int));
  • To read float values:
    mbusProtocol.readMultipleFloats(1, 100, readFloatSet,
    sizeof(readFloatSet) / sizeof(float));
  • To read long integer values:
    mbusProtocol.readMultipleLongInts(1, 100, readLongSet,
    sizeof(readLongSet) / sizeof(long));

6. Close the connection if not needed any more

mbusProtocol.closeProtocol();

7. Error Handling

TCP/IP protocol errors like slave failures, TCP/IP connection failures and time-outs return an error code. The following code snippet can handle these errors:

int result;
result = mbusProtocol.readMultipleRegisters(1, 100, dataSetArray, 10);
if (result != FTALK_SUCCESS)
{
fprintf(stderr, "%s!\n", getBusProtocolErrorText(result));
// Stop for fatal errors
if (!(result & FTALK_BUS_PROTOCOL_ERROR_CLASS))
return;
}

If the method returns FTALK_CONNECTION_WAS_CLOSED, it signals that the the TCP/IP connection was lost or closed by the remote end. Before using further data and control functions the connection has to be re-opened succesfully.

  • FieldTalk Modbus Master C++ Library Library version 2.13.3
Speak to the Experts
Modbus Organization Member logo

We are member of the Modbus Organization, Inc.

Buy with Confidence
30-day money back guarantee All our FieldTalk web sales are backed by a 30-day Money Back Guarantee.
We Accept
Bank VISA MasterCard PayPal
Customer Info
  • Info & Contact
  • Customer Login
  • Terms of Service
  • Terms of Sale
  • Privacy Policy
© 2005-2025 proconX Pty Ltd. All rights reserved. proconX and FieldTalk are trademarks of proconX Pty Ltd.
All other trademarks and registered trademarks appearing on www.modbusdriver.com are the property of their respective owners.