• Libraries
  • Shop
  • Doc
  • Free Modbus
  • Support
  • Login
  • 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. Import the library packages

uses
   MbusRtuMasterProtocol,
   BusProtocolExceptions;

2. Device data profile definition

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

var
   readRegSet: array[1..20] of word;
   writeRegSet: array[1..10] of word;
   readBitSet: array[1..10] of boolean;
   writeBitSet: array[1..10] of boolean;

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

var
   readFloatSet: array[1..10] of single;
   writeFloatSet: array[1..10] of single;

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

var
   readLongSet: array[1..10] of integer;
   writeLongSet: array[1..10] of integer;

3. Declare and instantiate a protocol object

var
   TMbusRtuMasterProtocol mbusProtocol;

4. Instantiate and open the protocol

   try
      mbusProtocol := TMbusRtuMasterProtocol.Create(nil);
      mbusProtocol.portName := 'COM1';
      mbusProtocol.baudRate := 19200;
      mbusProtocol.dataBits := 8;
      mbusProtocol.stopBits := 1;
      mbusProtocol.parity := 2;
      mbusProtocol.openProtocol;
   except
      on e: Exception do
      begin
         writeln('Error opening protocol: ', e.message, '!');
         halt(1);
      end;
   end;

5. Perform the data transfer functions

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

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 throw an exception. The following code snippet can handle and report these errors:

      try
         mbusProtocol.readMultipleRegisters(1, 100, dataSetArray);
      except
         on e: EBusProtocolException do
            writeln(e.message, '!');
         on e: Exception do
         begin
            writeln('Fatal error: ', e.message, '!');
            halt(1);
         end;
      end;

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. Import the library package

uses
   MbusTcpMasterProtocol,
   BusProtocolExceptions;

2. Device data profile definition

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

var
   readRegSet: array[1..20] of word;
   writeRegSet: array[1..10] of word;
   readBitSet: array[1..10] of boolean;
   writeBitSet: array[1..10] of boolean;

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

var
   readFloatSet: array[1..10] of single;
   writeFloatSet: array[1..10] of single;

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

var
   readLongSet: array[1..10] of integer;
   writeLongSet: array[1..10] of integer;

3. Declare and instantiate a protocol object

var
   TMbusTcpMasterProtocol mbusProtocol;

4. Open the protocol

mbusProtocol.hostName := ' 10.0.0.11';
mbusProtocol.openProtocol;

5. Perform the data transfer functions

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

6. Close the protocol port 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:

      try
         mbusProtocol.readMultipleRegisters(1, 100, dataSetArray);
      except
         on e: EBusProtocolException do
            writeln(e.message, '!');
         on e: Exception do
         begin
            writeln('Fatal error: ', e.message, '!');
            halt(1);
         end;
      end;

If the method throws EConnectionWasClosed, 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 Library, Delphi Edition
Library version 2.6.2
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.