Code examples PLCcom for Modbus

The integration of PLCcom for Modbus is very easy and user-friendly. 
In the following examples will show you the most important functionality.

You will find other documentations with more code examples in our example application in the downloadpackage or under the button "Documentation".

Create a Modbus Master instance
  • C#
  • Visual Basic
  • Java
using PLCcomModbus.Core;
using PLCcomModbus.DataAdapter;
using PLCcomModbus.Master;

    class MasterExample
    {

        #region CreateAndInitDevice

        //Declare the Modbus master Device
        private ModbusMaster Device = null;

        public MasterExample()
        {
            CreateAndInitDevice();
        }


        private void CreateAndInitDevice()
        {
            Device = new ModbusMaster();
            Device.SetUser("my user name from licence document");
            Device.SetSerial("my serial from licence document");


            try
            {
                //create new interface instance (if not applicable please uncomment)
                // "TCP" interface:
                Device.SetConnector_TCP("192.168.1.21", 502);

                //or (if not applicable please uncomment)
                // "UDP" interface:
                //Device.SetConnector_UDP("192.168.1.100",502);

                //or (if not applicable please uncomment)
                // "RTU" interface:
                //Device.SetConnector_RTU("COM1",
                //                        eBaudrate.b9600,
                //                        eDataBits.DataBits8,
                //                        System.IO.Ports.Parity.None,
                //                        System.IO.Ports.StopBits.One,
                //                        System.IO.Ports.Handshake.None);

                //or (if not applicable please uncomment)
                // "ASCII interface":
                //Device.SetConnector_ASCII("COM1",
                //                        eBaudrate.b9600,
                //                        eDataBits.DataBits8,
                //                        System.IO.Ports.Parity.None,
                //                        System.IO.Ports.StopBits.One,
                //                        System.IO.Ports.Handshake.None);


                //set max idleTime (max idle timespan in milliseconds between open and close interface or connection), Standard = 10000ms
                Device.Connector.SetMaxIdleTime(5000);

                //Set RegisterMode >> 16bit or 32bit register, settings must match with settings of slave
                Device.RegisterMode = eRegisterMode._16Bit;

                //register OnConnectionStateChange event
                Device.Connector.OnConnectionStateChange += new ModbusConnector.ConnectionStateChangeEventHandler(Device_OnConnectionStateChange);

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return;
            }
        }


        private void Device_OnConnectionStateChange(object sender, eConnectionState e)
        {
            //do anything
            Console.WriteLine("Change PortState ==> " + e.ToString());
        }
        #endregion

}
Imports PLCcomModbus.Core
Imports PLCcomModbus.DataAdapter
Imports PLCcomModbus.Master


Class MasterExample

#Region "CreateAndInitDevice"

    'Declare the Modbus master Device
    Private Device As ModbusMaster = Nothing

    Public Sub New()
        CreateAndInitDevice()
    End Sub


    Private Sub CreateAndInitDevice()
        Device = New ModbusMaster()
        Device.SetUser("my user name from licence document");
        Device.SetSerial("my serial from licence document");

        Try
            'create new interface instance (if not applicable please uncomment)
            ' "TCP" interface:
            Device.SetConnector_TCP("192.168.1.21", 502)

            'or (if not applicable please uncomment)
            ' "UDP" interface:
            'Device.SetConnector_UDP("192.168.1.100",502)

            'or (if not applicable please uncomment)
            ' "RTU" interface:
            'Device.SetConnector_RTU("COM1", _
            '                        eBaudrate.b9600, _
            '                        eDataBits.DataBits8, _
            '                        System.IO.Ports.Parity.None, _
            '                        System.IO.Ports.StopBits.One, _
            '                        System.IO.Ports.Handshake.None)

            'or (if not applicable please uncomment)
            ' "ASCII interface":
            'Device.SetConnector_ASCII("COM1", _
            '                        eBaudrate.b9600, _
            '                        eDataBits.DataBits8, _
            '                        System.IO.Ports.Parity.None, _
            '                        System.IO.Ports.StopBits.One, _
            '                        System.IO.Ports.Handshake.None)


            'set max idleTime (max idle timespan in milliseconds between open and close interface or connection), Standard = 10000ms
            Device.Connector.SetMaxIdleTime(5000)

            'Set RegisterMode >> 16bit or 32bit register, settings must match with settings of slave
            Device.RegisterMode = eRegisterMode._16Bit

            'register OnConnectionStateChange event
            AddHandler Device.Connector.OnConnectionStateChange, AddressOf Device_OnConnectionStateChange

        Catch ex As Exception
            Console.WriteLine(ex.Message)
            Return
        End Try
    End Sub


    Private Sub Device_OnConnectionStateChange(sender As Object, e As eConnectionState)
        'do anything
        Console.WriteLine("Change PortState ==> " & e.ToString())
    End Sub
#End Region

End Class
import java.text.DateFormat;
import java.util.Calendar;

import PLCComMB.*;
import PLCComMB.Enums.*;

public class MasterExample implements iConnectionStateChangeEvent {

	// <editor-fold defaultstate="collapsed" desc="CreateAndInitDevice">

	//Declare the Modbus master Device
	private ModbusMaster Device = null;
	private PortStateEventHandler portStateEventHandler = new PortStateEventHandler(
			this);

	public MasterExample() {
		CreateAndInitDevice();
	}

	private void CreateAndInitDevice() {
		Device = new ModbusMaster();
		
		Device.setUser("my user name from licence document");
		Device.setSerial("my serial from licence document");

		try {
			//create new interface instance (if not applicable please uncomment)
			// "TCP" interface:
			Device.setConnector_TCP("192.168.1.100", 502);

			//or (if not applicable please uncomment)
			// "UDP" interface:
			//Device.SetConnector_UDP("192.168.1.100",502);

			//or (if not applicable please uncomment)
			// "RTU" interface:
			//Device.SetConnector_RTU("COM1",
			//                        eBaudrate.b9600,
			//                        eDataBits.DataBits8,
			//                        System.IO.Ports.Parity.None,
			//                        System.IO.Ports.StopBits.One,
			//                        System.IO.Ports.Handshake.None);

			//or (if not applicable please uncomment)
			// "ASCII interface":
			//Device.SetConnector_ASCII("COM1",
			//                        eBaudrate.b9600,
			//                        eDataBits.DataBits8,
			//                        System.IO.Ports.Parity.None,
			//                        System.IO.Ports.StopBits.One,
			//                        System.IO.Ports.Handshake.None);

			//set max idleTime (max idle timespan in milliseconds between open and close interface or connection), Standard = 10000ms
			Device.getConnector().setMaxIdleTime(5000);

			//Set RegisterMode >> 16bit or 32bit register, settings must match with settings of slave
			Device.setRegisterMode(eRegisterMode._16Bit);

			//register OnConnectionStateChange event
			Device.getConnector().addConnectionStateEventHandler(
					portStateEventHandler);

		} catch (Exception ex) {
			System.out.println(ex.getMessage());
			return;
		}
	}

	@Override
	public void On_ConnectionStateChange(eConnectionState e) {
		//do anything
		System.out.println("Change PortState ==> " + e.toString());
	}
}

Example:

Simple creation of a Modbus Master instance.
After creation, a connector will be bind to the instance. (in this case a TCP-connector).

Read Modbus Master data
  • C#
  • Visual Basic
  • Java
using PLCcomModbus.Core;
using PLCcomModbus.DataAdapter;
using PLCcomModbus.Master;


    class MasterExample
    {

        #region CreateAndInitDevice

        //Declare the Modbus master Device
        private ModbusMaster Device = null;

        public MasterExample()
        {
            CreateAndInitDevice();
        }


        private void CreateAndInitDevice()
        {
            Device = new ModbusMaster();
            Device.SetUser("my user name from licence document");
            Device.SetSerial("my serial from licence document");

            try
            {
                //create new interface instance (if not applicable please uncomment)
                // "TCP" interface:
                Device.SetConnector_TCP("192.168.1.21", 502);

                //or (if not applicable please uncomment)
                // "UDP" interface:
                //Device.SetConnector_UDP("192.168.1.100",502);

                //or (if not applicable please uncomment)
                // "RTU" interface:
                //Device.SetConnector_RTU("COM1",
                //                        eBaudrate.b9600,
                //                        eDataBits.DataBits8,
                //                        System.IO.Ports.Parity.None,
                //                        System.IO.Ports.StopBits.One,
                //                        System.IO.Ports.Handshake.None);

                //or (if not applicable please uncomment)
                // "ASCII interface":
                //Device.SetConnector_ASCII("COM1",
                //                        eBaudrate.b9600,
                //                        eDataBits.DataBits8,
                //                        System.IO.Ports.Parity.None,
                //                        System.IO.Ports.StopBits.One,
                //                        System.IO.Ports.Handshake.None);


                //set max idleTime (max idle timespan in milliseconds between open and close interface or connection), Standard = 10000ms
                Device.Connector.SetMaxIdleTime(5000);

                //Set RegisterMode >> 16bit or 32bit register, settings must match with settings of slave
                Device.RegisterMode = eRegisterMode._16Bit;

                //register OnConnectionStateChange event
                Device.Connector.OnConnectionStateChange += new ModbusConnector.ConnectionStateChangeEventHandler(Device_OnConnectionStateChange);

                //read data
                readModbus();

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return;
            }
        }


        private void Device_OnConnectionStateChange(object sender, eConnectionState e)
        {
            //do anything
            Console.WriteLine("Change PortState ==> " + e.ToString());
        }
        #endregion

        #region read

        private void readModbus()
        {

            Console.WriteLine("start reading modbus");

            //declare a ReadRequest object
            //and set the request parameters >> read 10 holding register from adress 100
            ReadRequest myReadRequest = RequestBuilder.ReadRequestBuilder.Create(1, //Slave ID
                                                                                eReadFunction.F03_Read_Holding_Registers,//modbus function
                                                                                100,//Read start adress
                                                                                eDataType.SHORT,//Target Datatype
                                                                                10); //quantity of objects to be read

            //set eventual byte order, standard = eByteOrder.AB_CD;
            myReadRequest.ByteOrder = eByteOrder.AB_CD;

            Console.WriteLine(myReadRequest.ToString());

            //read from device
            ReadResult res = Device.Read(myReadRequest);

            //evaluate results
            Console.WriteLine(DateTime.Now.ToString() + ": " + res.Message);

            if (res.Quality == OperationResult.eQuality.GOOD)
            {
                StringBuilder sb = new StringBuilder();
                foreach (ReadValue item in res.FetchValues())
                {
                    sb.Append("Address " + item.Address.ToString() + " / Pos" + item.AddressPosition.ToString());
                    sb.Append(" >> ");
                    sb.Append(item.ToString());
                    sb.Append(Environment.NewLine);
                }
                Console.WriteLine(sb.ToString());
            }
            Console.WriteLine("end reading modbus");
            Console.WriteLine(Environment.NewLine);
        }

        #endregion

   
}
Imports PLCcomModbus.Core
Imports PLCcomModbus.DataAdapter
Imports PLCcomModbus.Master


Class MasterExample

#Region "CreateAndInitDevice"

    'Declare the Modbus master Device
    Private Device As ModbusMaster = Nothing

    Public Sub New()
        CreateAndInitDevice()
    End Sub


    Private Sub CreateAndInitDevice()
        Device = New ModbusMaster()
        Device.SetUser("my user name from licence document");
        Device.SetSerial("my serial from licence document");

        Try
            'create new interface instance (if not applicable please uncomment)
            ' "TCP" interface:
            Device.SetConnector_TCP("192.168.1.21", 502)

            'or (if not applicable please uncomment)
            ' "UDP" interface:
            'Device.SetConnector_UDP("192.168.1.100",502)

            'or (if not applicable please uncomment)
            ' "RTU" interface:
            'Device.SetConnector_RTU("COM1", _
            '                        eBaudrate.b9600, _
            '                        eDataBits.DataBits8, _
            '                        System.IO.Ports.Parity.None, _
            '                        System.IO.Ports.StopBits.One, _
            '                        System.IO.Ports.Handshake.None)

            'or (if not applicable please uncomment)
            ' "ASCII interface":
            'Device.SetConnector_ASCII("COM1", _
            '                        eBaudrate.b9600, _
            '                        eDataBits.DataBits8, _
            '                        System.IO.Ports.Parity.None, _
            '                        System.IO.Ports.StopBits.One, _
            '                        System.IO.Ports.Handshake.None)


            'set max idleTime (max idle timespan in milliseconds between open and close interface or connection), Standard = 10000ms
            Device.Connector.SetMaxIdleTime(5000)

            'Set RegisterMode >> 16bit or 32bit register, settings must match with settings of slave
            Device.RegisterMode = eRegisterMode._16Bit

            'register OnConnectionStateChange event
            AddHandler Device.Connector.OnConnectionStateChange, AddressOf Device_OnConnectionStateChange

            'read data
            readModbus()

        Catch ex As Exception
            Console.WriteLine(ex.Message)
            Return
        End Try
    End Sub


    Private Sub Device_OnConnectionStateChange(sender As Object, e As eConnectionState)
        'do anything
        Console.WriteLine("Change PortState ==> " & e.ToString())
    End Sub
#End Region

#Region "read"

    Private Sub readModbus()

        Console.WriteLine("start reading modbus")

        'declare a ReadRequest object
        'and set the request parameters >> read 10 holding register from adress 100
        'Slave ID
        'modbus function
        'Read start adress
        'Target Datatype
        'quantity of objects to be read
        Dim myReadRequest As ReadRequest = RequestBuilder.ReadRequestBuilder.Create(1, _
                                                                                    eReadFunction.F03_Read_Holding_Registers, _
                                                                                    100, _
                                                                                    eDataType.[SHORT], _
                                                                                    10)

        'set eventual byte order, standard = eByteOrder.AB_CD;
        myReadRequest.ByteOrder = eByteOrder.AB_CD

        Console.WriteLine(myReadRequest.ToString())

        'read from device
        Dim res As ReadResult = Device.Read(myReadRequest)

        'evaluate results
        Console.WriteLine((DateTime.Now.ToString() & ": ") + res.Message)

        If res.Quality = OperationResult.eQuality.GOOD Then
            Dim sb As New StringBuilder()
            For Each item As ReadValue In res.FetchValues()
                sb.Append("Address " & item.Address.ToString() & " / Pos" & item.AddressPosition.ToString())
                sb.Append(" >> ")
                sb.Append(item.ToString())
                sb.Append(Environment.NewLine)
            Next
            Console.WriteLine(sb.ToString())
        End If
        Console.WriteLine("end reading modbus")
        Console.WriteLine(Environment.NewLine)
    End Sub

#End Region

End Class
import java.text.DateFormat;
import java.util.Calendar;

import PLCComMB.*;
import PLCComMB.Enums.*;

public class MasterExample implements iConnectionStateChangeEvent {

	// <editor-fold defaultstate="collapsed" desc="CreateAndInitDevice">

	//Declare the Modbus master Device
	private ModbusMaster Device = null;
	private PortStateEventHandler portStateEventHandler = new PortStateEventHandler(
			this);

	public MasterExample() {
		CreateAndInitDevice();
		AccessToModbus();
	}

	private void CreateAndInitDevice() {
		Device = new ModbusMaster();
		
		Device.setUser("my user name from licence document");
		Device.setSerial("my serial from licence document");

		try {
			//create new interface instance (if not applicable please uncomment)
			// "TCP" interface:
			Device.setConnector_TCP("192.168.1.100", 502);

			//or (if not applicable please uncomment)
			// "UDP" interface:
			//Device.SetConnector_UDP("192.168.1.100",502);

			//or (if not applicable please uncomment)
			// "RTU" interface:
			//Device.SetConnector_RTU("COM1",
			//                        eBaudrate.b9600,
			//                        eDataBits.DataBits8,
			//                        System.IO.Ports.Parity.None,
			//                        System.IO.Ports.StopBits.One,
			//                        System.IO.Ports.Handshake.None);

			//or (if not applicable please uncomment)
			// "ASCII interface":
			//Device.SetConnector_ASCII("COM1",
			//                        eBaudrate.b9600,
			//                        eDataBits.DataBits8,
			//                        System.IO.Ports.Parity.None,
			//                        System.IO.Ports.StopBits.One,
			//                        System.IO.Ports.Handshake.None);

			//set max idleTime (max idle timespan in milliseconds between open and close interface or connection), Standard = 10000ms
			Device.getConnector().setMaxIdleTime(5000);

			//Set RegisterMode >> 16bit or 32bit register, settings must match with settings of slave
			Device.setRegisterMode(eRegisterMode._16Bit);

			//register OnConnectionStateChange event
			Device.getConnector().addConnectionStateEventHandler(
					portStateEventHandler);

		} catch (Exception ex) {
			System.out.println(ex.getMessage());
			return;
		}
	}

	@Override
	public void On_ConnectionStateChange(eConnectionState e) {
		//do anything
		System.out.println("Change PortState ==> " + e.toString());
	}
	
	private void AccessToModbus() {
		try {
			//read data (FC1-4)
			readModbus();
			
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
			return;
		}
	}
	
	private void readModbus() {

		System.out.println("start reading modbus");

		//declare a ReadRequest object
		//and set the request parameters >> read 10 holding register from adress 100
		ReadRequest myReadRequest = RequestBuilder.ReadRequestBuilder.create(1, //Slave ID
				eReadFunction.F03_Read_Holding_Registers,//modbus function
				100,//Read start adress
				eDataType.SHORT,//Target Datatype
				10); //quantity of objects to be read

		//set eventual byte order, standard = eByteOrder.AB_CD;
		myReadRequest.setByteOrder(eByteOrder.AB_CD);

		System.out.println(myReadRequest.toString());

		//read from device
		ReadResult res = Device.read(myReadRequest);

		//evaluate results
		System.out.println(DateFormat.getDateTimeInstance().format(
				Calendar.getInstance().getTime())
				+ ": " + res.getMessage());

		if (res.getQuality().equals(OperationResult.eQuality.GOOD)) {
			StringBuilder sb = new StringBuilder();
			for (ReadValue item : res.fetchValues()) {
				sb.append("Address " + String.valueOf(item.getAddress())
						+ " / Pos" + String.valueOf(item.getAddressPosition()));
				sb.append(" >> ");
				sb.append(item.toString());
				sb.append(System.getProperty("line.separator"));
			}
			System.out.println(sb.toString());
		}
		System.out.println("end reading modbus");
		System.out.println(System.getProperty("line.separator"));
	}
}

Example:

Simple creation of a Modbus Master instance.
After creation, a connector will be bind to the instance. (in this case a TCP-connector).
Read raw data from puffer.

More examples to read data with a certain data type you’ll find in the documentation or with the download of the PLCcom trial versions!

Read Modbus Master Data as collection
  • C#
  • Visual Basic
  • Java
using PLCcomModbus.Core;
using PLCcomModbus.DataAdapter;
using PLCcomModbus.Master;

    class MasterExample
    {

        #region CreateAndInitDevice

        //Declare the Modbus master Device
        private ModbusMaster Device = null;

        public MasterExample()
        {
            CreateAndInitDevice();
        }


        private void CreateAndInitDevice()
        {
            Device = new ModbusMaster();
            Device.SetUser("my user name from licence document");
            Device.SetSerial("my serial from licence document");

            try
            {
                //create new interface instance (if not applicable please uncomment)
                // "TCP" interface:
                Device.SetConnector_TCP("192.168.1.21", 502);

                //or (if not applicable please uncomment)
                // "UDP" interface:
                //Device.SetConnector_UDP("192.168.1.100",502);

                //or (if not applicable please uncomment)
                // "RTU" interface:
                //Device.SetConnector_RTU("COM1",
                //                        eBaudrate.b9600,
                //                        eDataBits.DataBits8,
                //                        System.IO.Ports.Parity.None,
                //                        System.IO.Ports.StopBits.One,
                //                        System.IO.Ports.Handshake.None);

                //or (if not applicable please uncomment)
                // "ASCII interface":
                //Device.SetConnector_ASCII("COM1",
                //                        eBaudrate.b9600,
                //                        eDataBits.DataBits8,
                //                        System.IO.Ports.Parity.None,
                //                        System.IO.Ports.StopBits.One,
                //                        System.IO.Ports.Handshake.None);


                //set max idleTime (max idle timespan in milliseconds between open and close interface or connection), Standard = 10000ms
                Device.Connector.SetMaxIdleTime(5000);

                //Set RegisterMode >> 16bit or 32bit register, settings must match with settings of slave
                Device.RegisterMode = eRegisterMode._16Bit;

                //register OnConnectionStateChange event
                Device.Connector.OnConnectionStateChange += new ModbusConnector.ConnectionStateChangeEventHandler(Device_OnConnectionStateChange);

                //reading Collection from Modbus
                readCollection();

            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return;
            }
        }


        private void Device_OnConnectionStateChange(object sender, eConnectionState e)
        {
            //do anything
            Console.WriteLine("Change PortState ==> " + e.ToString());
        }
        #endregion

        #region Read Collection

        private void readCollection()
        {
Console.WriteLine("start read request collection from modbus");

                //declare a ReadRequest object
                ReadRequestCollection RequestCollection = new ReadRequestCollection();

                #region Edit Collection
                //set request parameter

                //declare a ReadRequest object
                //and set the request parameters >> reading 6 holding register at adress 10
                ReadRequest RequestItem = RequestBuilder.ReadRequestBuilder.Create(1, //Slave ID
                                                                                   eReadFunction.F03_Read_Holding_Registers,//modbus function
                                                                                   10,                          //Read start adress
                                                                                   eDataType.BOOLEAN,           //Target Datatype
                                                                                   6,                           //quantity of objects to be read
                                                                                   0);                          //Address of first Bit by reading register


                //add Request to Collection
                RequestCollection.AddReadRequest("Item1", RequestItem);
                Console.WriteLine("add ReadRequest "+ RequestItem.ToString());

                //reading 8 holding register at adress 0
                RequestItem = RequestBuilder.ReadRequestBuilder.Create(1, //Slave ID
                                                                      eReadFunction.F03_Read_Holding_Registers,//modbus function
                                                                      0,                                        //Read start adress
                                                                      eDataType.BYTE,                           //Target Datatype
                                                                      8);                                       //quantity of objects to be read


                //add Request to Collection
                RequestCollection.AddReadRequest("Item2", RequestItem);
                Console.WriteLine("add ReadRequest " + RequestItem.ToString());

                //reading 2 holding register at adress 12
                RequestItem = RequestBuilder.ReadRequestBuilder.Create(1, //Slave ID
                                                                      eReadFunction.F03_Read_Holding_Registers,//modbus function
                                                                      12,                                        //Read start adress
                                                                      eDataType.USHORT,                         //Target Datatype
                                                                      2);                                       //quantity of objects to be read


                //add Request to Collection
                RequestCollection.AddReadRequest("Item3", RequestItem);
                Console.WriteLine("add ReadRequest " + RequestItem.ToString());

                //reading 2 holding register at adress 20
                RequestItem = RequestBuilder.ReadRequestBuilder.Create(1, //Slave ID
                                                                        eReadFunction.F01_Read_Coils,//modbus function
                                                                        2,                          //Read start adress
                                                                        eDataType.BOOLEAN,           //Target Datatype
                                                                        20,                           //quantity of objects to be read
                                                                        0);                          //Address of first Bit by reading register


                //add Request to Collection
                RequestCollection.AddReadRequest("Item4", RequestItem);
                Console.WriteLine("add ReadRequest " + RequestItem.ToString());

                //reading 8 coils at adress 8
                RequestItem = RequestBuilder.ReadRequestBuilder.Create(1, //Slave ID
                                                                        eReadFunction.F01_Read_Coils,//modbus function
                                                                        8,                           //Read start adress
                                                                        eDataType.BOOLEAN,           //Target Datatype
                                                                        8,                           //quantity of objects to be read
                                                                        0);                          //Address of first Bit by reading register


                //add Request to Collection
                RequestCollection.AddReadRequest("Item5", RequestItem);
                Console.WriteLine("add ReadRequest " + RequestItem.ToString());

                #endregion
                //enable optimize mode
                RequestCollection.Optmize = true;

                Console.WriteLine(RequestCollection.ToString());

                //read from device
                ReadResultCollection ResultCollection = Device.Read(RequestCollection);

                //evaluate results

                Console.WriteLine(DateTime.Now.ToString() + ": " + ResultCollection.Message);

                //find itemresult with foreach-loop
                StringBuilder sb = new StringBuilder();
                foreach (ReadResult res in ResultCollection.GetReadItemResult())
                {
                    sb.Append("Start Item:");
                    sb.Append(res.RequestKey);
                    sb.Append(" ");
                    sb.Append("Quality:");
                    sb.Append(" ");
                    sb.Append(res.Quality.ToString());
                    sb.Append(Environment.NewLine);

                    if (res.Quality == OperationResult.eQuality.GOOD)
                    {
                        Array Values = res.FetchValues();
                        for (int i = 0; i < Values.Length; i++)
                        {
                            sb.Append(Values.GetValue(i).ToString());
                            sb.Append(Environment.NewLine);
                        }
                        sb.Append("End Item:");
                        sb.Append(res.RequestKey);
                    }
                }
                Console.WriteLine(sb.ToString());

                Console.WriteLine("end read request collection from modbus");
                Console.WriteLine(Environment.NewLine);
        }

        #endregion

}
Imports PLCcomModbus.Core
Imports PLCcomModbus.DataAdapter
Imports PLCcomModbus.Master


Class MasterExample

#Region "CreateAndInitDevice"

    'Declare the Modbus master Device
    Private Device As ModbusMaster = Nothing

    Public Sub New()
        CreateAndInitDevice()
    End Sub


    Private Sub CreateAndInitDevice()
        Device = New ModbusMaster()
        Device.SetUser("my user name from licence document");
        Device.SetSerial("my serial from licence document");

        Try
            'create new interface instance (if not applicable please uncomment)
            ' "TCP" interface:
            Device.SetConnector_TCP("192.168.1.21", 502)

            'or (if not applicable please uncomment)
            ' "UDP" interface:
            'Device.SetConnector_UDP("192.168.1.100",502)

            'or (if not applicable please uncomment)
            ' "RTU" interface:
            'Device.SetConnector_RTU("COM1", _
            '                        eBaudrate.b9600, _
            '                        eDataBits.DataBits8, _
            '                        System.IO.Ports.Parity.None, _
            '                        System.IO.Ports.StopBits.One, _
            '                        System.IO.Ports.Handshake.None)

            'or (if not applicable please uncomment)
            ' "ASCII interface":
            'Device.SetConnector_ASCII("COM1", _
            '                        eBaudrate.b9600, _
            '                        eDataBits.DataBits8, _
            '                        System.IO.Ports.Parity.None, _
            '                        System.IO.Ports.StopBits.One, _
            '                        System.IO.Ports.Handshake.None)


            'set max idleTime (max idle timespan in milliseconds between open and close interface or connection), Standard = 10000ms
            Device.Connector.SetMaxIdleTime(5000)

            'Set RegisterMode >> 16bit or 32bit register, settings must match with settings of slave
            Device.RegisterMode = eRegisterMode._16Bit

            'register OnConnectionStateChange event
            AddHandler Device.Connector.OnConnectionStateChange, AddressOf Device_OnConnectionStateChange

            'reading Collection from Modbus
            readCollection()

        Catch ex As Exception
            Console.WriteLine(ex.Message)
            Return
        End Try
    End Sub


    Private Sub Device_OnConnectionStateChange(sender As Object, e As eConnectionState)
        'do anything
        Console.WriteLine("Change PortState ==> " & e.ToString())
    End Sub
#End Region


#Region "Read Collection"

    Private Sub readCollection()
        Console.WriteLine("start read request collection from modbus")

        'declare a ReadRequest object
        Dim RequestCollection As New ReadRequestCollection()

        '#Region "Edit Collection"
        'set request parameter

        'declare a ReadRequest object
        'and set the request parameters >> reading 6 holding register at adress 10
        'Slave ID
        'modbus function
        'Read start adress
        'Target Datatype
        'quantity of objects to be read
        'Address of first Bit by reading register
        Dim RequestItem As ReadRequest = RequestBuilder.ReadRequestBuilder.Create(1, _
                                                                                  eReadFunction.F03_Read_Holding_Registers, _
                                                                                  10, _
                                                                                  eDataType.[BOOLEAN], _
                                                                                  6, _
                                                                                  0)


        'add Request to Collection
        RequestCollection.AddReadRequest("Item1", RequestItem)
        Console.WriteLine("add ReadRequest " & RequestItem.ToString())

        'reading 8 holding register at adress 0
        'Slave ID
        'modbus function
        'Read start adress
        'Target Datatype
        'quantity of objects to be read
        RequestItem = RequestBuilder.ReadRequestBuilder.Create(1, _
                                                               eReadFunction.F03_Read_Holding_Registers, _
                                                               0, _
                                                               eDataType.[BYTE], _
                                                               8)


        'add Request to Collection
        RequestCollection.AddReadRequest("Item2", RequestItem)
        Console.WriteLine("add ReadRequest " & RequestItem.ToString())

        'reading 2 holding register at adress 12
        'Slave ID
        'modbus function
        'Read start adress
        'Target Datatype
        'quantity of objects to be read
        RequestItem = RequestBuilder.ReadRequestBuilder.Create(1, _
                                                               eReadFunction.F03_Read_Holding_Registers, _
                                                               12, _
                                                               eDataType.[USHORT], _
                                                               2)


        'add Request to Collection
        RequestCollection.AddReadRequest("Item3", RequestItem)
        Console.WriteLine("add ReadRequest " & RequestItem.ToString())

        'reading 2 holding register at adress 20
        'Slave ID
        'modbus function
        'Read start adress
        'Target Datatype
        'quantity of objects to be read
        'Address of first Bit by reading register
        RequestItem = RequestBuilder.ReadRequestBuilder.Create(1, _
                                                               eReadFunction.F01_Read_Coils, _
                                                               2, _
                                                               eDataType.[BOOLEAN], _
                                                               20, _
                                                               0)


        'add Request to Collection
        RequestCollection.AddReadRequest("Item4", RequestItem)
        Console.WriteLine("add ReadRequest " & RequestItem.ToString())

        'reading 8 coils at adress 8
        'Slave ID
        'modbus function
        'Read start adress
        'Target Datatype
        'quantity of objects to be read
        'Address of first Bit by reading register
        RequestItem = RequestBuilder.ReadRequestBuilder.Create(1, _
                                                               eReadFunction.F01_Read_Coils, _
                                                               8, _
                                                               eDataType.[BOOLEAN], _
                                                               8, _
                                                               0)


        'add Request to Collection
        RequestCollection.AddReadRequest("Item5", RequestItem)
        Console.WriteLine("add ReadRequest " & RequestItem.ToString())

        '#End Region
        'enable optimize mode
        RequestCollection.Optmize = True

        Console.WriteLine(RequestCollection.ToString())

        'read from device
        Dim ResultCollection As ReadResultCollection = Device.Read(RequestCollection)

        'evaluate results

        Console.WriteLine((DateTime.Now.ToString() & ": ") + ResultCollection.Message)

        'find itemresult with foreach-loop
        Dim sb As New StringBuilder()
        For Each res As ReadResult In ResultCollection.GetReadItemResult()
            sb.Append("Start Item:")
            sb.Append(res.RequestKey)
            sb.Append(" ")
            sb.Append("Quality:")
            sb.Append(" ")
            sb.Append(res.Quality.ToString())
            sb.Append(Environment.NewLine)

            If res.Quality = OperationResult.eQuality.GOOD Then
                Dim Values As Array = res.FetchValues()
                For i As Integer = 0 To Values.Length - 1
                    sb.Append(Values.GetValue(i).ToString())
                    sb.Append(Environment.NewLine)
                Next
                sb.Append("End Item:")
                sb.Append(res.RequestKey)
            End If
        Next
        Console.WriteLine(sb.ToString())

        Console.WriteLine("end read request collection from modbus")
        Console.WriteLine(Environment.NewLine)
    End Sub

#End Region

End Class
import java.text.DateFormat;
import java.util.Calendar;

import PLCComMB.*;
import PLCComMB.Enums.*;

public class MasterExample implements iConnectionStateChangeEvent {

	// <editor-fold defaultstate="collapsed" desc="CreateAndInitDevice">

	//Declare the Modbus master Device
	private ModbusMaster Device = null;
	private PortStateEventHandler portStateEventHandler = new PortStateEventHandler(
			this);

	public MasterExample() {
		CreateAndInitDevice();
		AccessToModbus();
	}

	private void CreateAndInitDevice() {
		Device = new ModbusMaster();
		
		Device.setUser("my user name from licence document");
		Device.setSerial("my serial from licence document");

		try {
			//create new interface instance (if not applicable please uncomment)
			// "TCP" interface:
			Device.setConnector_TCP("192.168.1.100", 502);

			//or (if not applicable please uncomment)
			// "UDP" interface:
			//Device.SetConnector_UDP("192.168.1.100",502);

			//or (if not applicable please uncomment)
			// "RTU" interface:
			//Device.SetConnector_RTU("COM1",
			//                        eBaudrate.b9600,
			//                        eDataBits.DataBits8,
			//                        System.IO.Ports.Parity.None,
			//                        System.IO.Ports.StopBits.One,
			//                        System.IO.Ports.Handshake.None);

			//or (if not applicable please uncomment)
			// "ASCII interface":
			//Device.SetConnector_ASCII("COM1",
			//                        eBaudrate.b9600,
			//                        eDataBits.DataBits8,
			//                        System.IO.Ports.Parity.None,
			//                        System.IO.Ports.StopBits.One,
			//                        System.IO.Ports.Handshake.None);

			//set max idleTime (max idle timespan in milliseconds between open and close interface or connection), Standard = 10000ms
			Device.getConnector().setMaxIdleTime(5000);

			//Set RegisterMode >> 16bit or 32bit register, settings must match with settings of slave
			Device.setRegisterMode(eRegisterMode._16Bit);

			//register OnConnectionStateChange event
			Device.getConnector().addConnectionStateEventHandler(
					portStateEventHandler);

		} catch (Exception ex) {
			System.out.println(ex.getMessage());
			return;
		}
	}

	@Override
	public void On_ConnectionStateChange(eConnectionState e) {
		//do anything
		System.out.println("Change PortState ==> " + e.toString());
	}
	
	private void AccessToModbus() {
		try {
			//reading Collection from Modbus (FC1-4)
			readCollection();
			
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
			return;
		}
	}
	
	private void readCollection() {
		System.out.println("start read request collection from modbus");

		//declare a ReadRequest object
		ReadRequestCollection RequestCollection = new ReadRequestCollection();

		// <editor-fold defaultstate="collapsed" desc="edit Collection">
		//set request parameter

		//declare a ReadRequest object
		//and set the request parameters >> reading 6 holding register at adress 10
		ReadRequest RequestItem = RequestBuilder.ReadRequestBuilder.create(1, //Slave ID
				eReadFunction.F03_Read_Holding_Registers,//modbus function
				10, //Read start adress
				eDataType.BOOLEAN, //Target Datatype
				6, //quantity of objects to be read
				(byte) 0); //Address of first Bit by reading register

		//add Request to Collection
		RequestCollection.addReadRequest("Item1", RequestItem);
		System.out.println("add ReadRequest " + RequestItem.toString());

		//reading 8 holding register at adress 0
		RequestItem = RequestBuilder.ReadRequestBuilder.create(1, //Slave ID
				eReadFunction.F03_Read_Holding_Registers,//modbus function
				0, //Read start adress
				eDataType.BYTE, //Target Datatype
				8); //quantity of objects to be read

		//add Request to Collection
		RequestCollection.addReadRequest("Item2", RequestItem);
		System.out.println("add ReadRequest " + RequestItem.toString());

		//reading 2 holding register at adress 12
		RequestItem = RequestBuilder.ReadRequestBuilder.create(1, //Slave ID
				eReadFunction.F03_Read_Holding_Registers,//modbus function
				12, //Read start adress
				eDataType.USHORT, //Target Datatype
				2); //quantity of objects to be read

		//add Request to Collection
		RequestCollection.addReadRequest("Item3", RequestItem);
		System.out.println("add ReadRequest " + RequestItem.toString());

		//reading 2 holding register at adress 20
		RequestItem = RequestBuilder.ReadRequestBuilder.create(1, //Slave ID
				eReadFunction.F01_Read_Coils, //modbus function
				2, //Read start adress
				eDataType.BOOLEAN, //Target Datatype
				20, //quantity of objects to be read
				(byte) 0); //Address of first Bit by reading register

		//add Request to Collection
		RequestCollection.addReadRequest("Item4", RequestItem);
		System.out.println("add ReadRequest " + RequestItem.toString());

		//reading 8 coils at adress 8
		RequestItem = RequestBuilder.ReadRequestBuilder.create(1, //Slave ID
				eReadFunction.F01_Read_Coils, //modbus function
				8, //Read start adress
				eDataType.BOOLEAN, //Target Datatype
				8, //quantity of objects to be read
				(byte) 0); //Address of first Bit by reading register

		//add Request to Collection
		RequestCollection.addReadRequest("Item5", RequestItem);
		System.out.println("add ReadRequest " + RequestItem.toString());

		// </editor-fold>
		//enable optimize mode
		RequestCollection.setOptmize(true);

		System.out.println(RequestCollection.toString());

		//read from device
		ReadResultCollection ResultCollection = Device.read(RequestCollection);

		//evaluate results

		System.out.println(DateFormat.getDateTimeInstance().format(
				Calendar.getInstance().getTime())
				+ ": " + ResultCollection.getMessage());

		//find itemresult with foreach-loop
		StringBuilder sb = new StringBuilder();
		for (ReadResult res : ResultCollection.getReadItemResults()) {
			sb.append("Start Item:");
			sb.append(res.getRequestKey());
			sb.append(" ");
			sb.append("Quality:");
			sb.append(" ");
			sb.append(res.getQuality().toString());
			sb.append(System.getProperty("line.separator"));

			if (res.getQuality().equals(OperationResult.eQuality.GOOD)) {
				ReadValue[] Values = res.fetchValues();
				for (int i = 0; i < Values.length; i++) {
					sb.append(Values[i].toString());
					sb.append(System.getProperty("line.separator"));
				}
				sb.append("End Item:");
				sb.append(res.getRequestKey());
			}
		}
		System.out.println(sb.toString());

		System.out.println("end read request collection from modbus");
		System.out.println(System.getProperty("line.separator"));
	}
}

Example:

Simple creation of a Modbus Master instance.
After creation, a connector will be bind to the instance. (in this case a TCP-connector).
Read data from several plc regions with one access. Creating a 'ReadRequestCollection'. The device receive this collection for reading. The necessary reading accesses will be automatically reduced and optimized.

You will find more 'read' examples of specific data types (String, DINT, etc.) in our documentation or in our example application!

Write Modbus Master data
  • C#
  • Visual Basic
  • Java
Imports PLCcomModbus.Core
Imports PLCcomModbus.DataAdapter
Imports PLCcomModbus.Master


Class MasterExample

#Region "CreateAndInitDevice"

    'Declare the Modbus master Device
    Private Device As ModbusMaster = Nothing

    Public Sub New()
        CreateAndInitDevice()
    End Sub


    Private Sub CreateAndInitDevice()
        Device = New ModbusMaster()
        Device.SetUser("my user name from licence document");
        Device.SetSerial("my serial from licence document");

        Try
            'create new interface instance (if not applicable please uncomment)
            ' "TCP" interface:
            Device.SetConnector_TCP("192.168.1.21", 502)

            'or (if not applicable please uncomment)
            ' "UDP" interface:
            'Device.SetConnector_UDP("192.168.1.100",502)

            'or (if not applicable please uncomment)
            ' "RTU" interface:
            'Device.SetConnector_RTU("COM1", _
            '                        eBaudrate.b9600, _
            '                        eDataBits.DataBits8, _
            '                        System.IO.Ports.Parity.None, _
            '                        System.IO.Ports.StopBits.One, _
            '                        System.IO.Ports.Handshake.None)

            'or (if not applicable please uncomment)
            ' "ASCII interface":
            'Device.SetConnector_ASCII("COM1", _
            '                        eBaudrate.b9600, _
            '                        eDataBits.DataBits8, _
            '                        System.IO.Ports.Parity.None, _
            '                        System.IO.Ports.StopBits.One, _
            '                        System.IO.Ports.Handshake.None)


            'set max idleTime (max idle timespan in milliseconds between open and close interface or connection), Standard = 10000ms
            Device.Connector.SetMaxIdleTime(5000)

            'Set RegisterMode >> 16bit or 32bit register, settings must match with settings of slave
            Device.RegisterMode = eRegisterMode._16Bit

            'register OnConnectionStateChange event
            AddHandler Device.Connector.OnConnectionStateChange, AddressOf Device_OnConnectionStateChange

            'write data
            writeModbus()

        Catch ex As Exception
            Console.WriteLine(ex.Message)
            Return
        End Try
    End Sub


    Private Sub Device_OnConnectionStateChange(sender As Object, e As eConnectionState)
        'do anything
        Console.WriteLine("Change PortState ==> " & e.ToString())
    End Sub
#End Region


#Region "Write"

    Private Sub writeModbus()
        Console.WriteLine("start writing modbus")

        'declare a WriteRequest object and
        'and set the request parameters >> //write multiple register at adress 100
        'Slave ID
        'modbus function
        'write start adress
        Dim myWriteRequest As WriteRequest = RequestBuilder.WriteRequestBuilder.Create(1, _
                                                                                       eWriteFunction.F16_Write_Multiple_Registers, _
                                                                                       100)

        'set eventual byte order, standard = eByteOrder.AB_CD;
        myWriteRequest.ByteOrder = eByteOrder.AB_CD

        'write 4 holding register at adress 100
        'add writable data to request
        myWriteRequest.AddShortRange(New Short() {11, 12, 13, 14})

        Console.WriteLine(myWriteRequest.ToString())

        'write
        Dim res As WriteResult = Device.Write(myWriteRequest)

        'evaluate results
        Console.WriteLine((DateTime.Now.ToString() & ": ") + res.Message)

        Console.WriteLine("end writing modbus")
        Console.WriteLine(Environment.NewLine)

    End Sub

#End Region

End Class
Imports PLCcom

Public Class newClass

    Private Device As PLCcomDevice
    'see section 'connect' for declare and connect a PLCcom-Device

    Private Sub btnWrite_Click(sender As Object, e As EventArgs) Handles btnWrite.Click
        'declare a WriteRequest object
        Dim myWriteRequest As WriteRequest() = New WriteRequest(0) {}
        myWriteRequest(0) = New WriteRequest()

        'set the request parameters
        'write 4 bytes in DB100
        myWriteRequest(0).Region = eRegion.DataBlock
        myWriteRequest(0).DB = 100
        myWriteRequest(0).StartByte = 0
        'add writable Data here
        myWriteRequest(0).setBuffer(New Byte() {11, 12, 13})
        'write
        Dim res As WriteResult() = Device.write(myWriteRequest)

        'evaluate results
        txtMessage.Text = (DateTime.Now.ToString() & ": ") + res(0).Message
        If res(0).Quality.Equals(OperationResult.eQuality.GOOD) Then
            MessageBox.Show("OK", "Result:", MessageBoxButtons.OK, MessageBoxIcon.Information)
        Else
            MessageBox.Show(res(0).Message, "Result:", MessageBoxButtons.OK, MessageBoxIcon.Information)
        End If
    End Sub

End Class
import java.text.DateFormat;
import java.util.Calendar;

import PLCComMB.*;
import PLCComMB.Enums.*;

public class MasterExample implements iConnectionStateChangeEvent {

	// <editor-fold defaultstate="collapsed" desc="CreateAndInitDevice">

	//Declare the Modbus master Device
	private ModbusMaster Device = null;
	private PortStateEventHandler portStateEventHandler = new PortStateEventHandler(
			this);

	public MasterExample() {
		CreateAndInitDevice();
		AccessToModbus();
	}

	private void CreateAndInitDevice() {
		Device = new ModbusMaster();
		
		Device.setUser("my user name from licence document");
		Device.setSerial("my serial from licence document");

		try {
			//create new interface instance (if not applicable please uncomment)
			// "TCP" interface:
			Device.setConnector_TCP("192.168.1.100", 502);

			//or (if not applicable please uncomment)
			// "UDP" interface:
			//Device.SetConnector_UDP("192.168.1.100",502);

			//or (if not applicable please uncomment)
			// "RTU" interface:
			//Device.SetConnector_RTU("COM1",
			//                        eBaudrate.b9600,
			//                        eDataBits.DataBits8,
			//                        System.IO.Ports.Parity.None,
			//                        System.IO.Ports.StopBits.One,
			//                        System.IO.Ports.Handshake.None);

			//or (if not applicable please uncomment)
			// "ASCII interface":
			//Device.SetConnector_ASCII("COM1",
			//                        eBaudrate.b9600,
			//                        eDataBits.DataBits8,
			//                        System.IO.Ports.Parity.None,
			//                        System.IO.Ports.StopBits.One,
			//                        System.IO.Ports.Handshake.None);

			//set max idleTime (max idle timespan in milliseconds between open and close interface or connection), Standard = 10000ms
			Device.getConnector().setMaxIdleTime(5000);

			//Set RegisterMode >> 16bit or 32bit register, settings must match with settings of slave
			Device.setRegisterMode(eRegisterMode._16Bit);

			//register OnConnectionStateChange event
			Device.getConnector().addConnectionStateEventHandler(
					portStateEventHandler);

		} catch (Exception ex) {
			System.out.println(ex.getMessage());
			return;
		}
	}

	@Override
	public void On_ConnectionStateChange(eConnectionState e) {
		//do anything
		System.out.println("Change PortState ==> " + e.toString());
	}
	
	private void AccessToModbus() {
		try {
			//write data (FC5,6,15,16)
			writeModbus();
			
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
			return;
		}
	}
	
	private void writeModbus() {
		System.out.println("start writing modbus");

		//declare a WriteRequest object and
		//and set the request parameters >> //write multiple register at adress 100
		WriteRequest myWriteRequest = RequestBuilder.WriteRequestBuilder
				.create(1, //Slave ID
						eWriteFunction.F16_Write_Multiple_Registers,//modbus function
						100);//write start adress

		//set eventual byte order, standard = eByteOrder.AB_CD;
		myWriteRequest.setByteOrder(eByteOrder.AB_CD);

		//write 4 holding register at adress 100
		//add writable data to request
		myWriteRequest.addShortRange(new short[] { 11, 12, 13, 14 });

		System.out.println(myWriteRequest.toString());

		//write
		WriteResult res = Device.write(myWriteRequest);

		//evaluate results
		System.out.println(DateFormat.getDateTimeInstance().format(
				Calendar.getInstance().getTime())
				+ ": " + res.getMessage());

		System.out.println("end writing modbus");
		System.out.println(System.getProperty("line.separator"));

	}
}

Example:

Simple creation of a Modbus Master instance.
After creation, a connector will be bind to the instance. (in this case a TCP-connector).
Writing raw data to PLC.

More examples to read data with a certain data type you’ll find in the documentation or with the download of the PLCcom trial versions!

Read Modbus Master diagnostic data
  • C#
  • Visual Basic
  • Java
using PLCcomModbus.Core;
using PLCcomModbus.DataAdapter;
using PLCcomModbus.Master;

    class MasterExample
    {

        #region CreateAndInitDevice

        //Declare the Modbus master Device
        private ModbusMaster Device = null;

        public MasterExample()
        {
            CreateAndInitDevice();
        }


        private void CreateAndInitDevice()
        {
            Device = new ModbusMaster();
            Device.SetUser("my user name from licence document");
            Device.SetSerial("my serial from licence document");

            try
            {
                //create new interface instance (if not applicable please uncomment)
                // "TCP" interface:
                Device.SetConnector_TCP("192.168.1.21", 502);

                //or (if not applicable please uncomment)
                // "UDP" interface:
                //Device.SetConnector_UDP("192.168.1.100",502);

                //or (if not applicable please uncomment)
                // "RTU" interface:
                //Device.SetConnector_RTU("COM1",
                //                        eBaudrate.b9600,
                //                        eDataBits.DataBits8,
                //                        System.IO.Ports.Parity.None,
                //                        System.IO.Ports.StopBits.One,
                //                        System.IO.Ports.Handshake.None);

                //or (if not applicable please uncomment)
                // "ASCII interface":
                //Device.SetConnector_ASCII("COM1",
                //                        eBaudrate.b9600,
                //                        eDataBits.DataBits8,
                //                        System.IO.Ports.Parity.None,
                //                        System.IO.Ports.StopBits.One,
                //                        System.IO.Ports.Handshake.None);


                //set max idleTime (max idle timespan in milliseconds between open and close interface or connection), Standard = 10000ms
                Device.Connector.SetMaxIdleTime(5000);

                //Set RegisterMode >> 16bit or 32bit register, settings must match with settings of slave
                Device.RegisterMode = eRegisterMode._16Bit;

                //register OnConnectionStateChange event
                Device.Connector.OnConnectionStateChange += new ModbusConnector.ConnectionStateChangeEventHandler(Device_OnConnectionStateChange);

                //write data
                writeModbus();

                //read data
                readModbus();

                //reading Collection from Modbus
                readCollection();

                //read write (FC 23)
                readWriteRegister();

                //reading diagnostic info (FC8)
                modbusDiagnostic();


            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
                return;
            }
        }


        private void Device_OnConnectionStateChange(object sender, eConnectionState e)
        {
            //do anything
            Console.WriteLine("Change PortState ==> " + e.ToString());
        }
        #endregion


        #region Diagnostic

        private void modbusDiagnostic()
        {
            Console.WriteLine("start reading modbus diagnostic");

            //declare a ReadRequest object
            //and set the request parameters
            DiagnosticRequest myDiagnosticRequest = RequestBuilder.DiagnosticRequestBuilder.Create(1, //Slave ID
                                                                                                   0); //subfunction

            Console.WriteLine(myDiagnosticRequest.ToString());

            //execute function
            DiagnosticResult res = Device.GetDiagnostics(myDiagnosticRequest);


            //evaluate results
            Console.WriteLine(DateTime.Now.ToString() + ": " + res.Message);

            if (res.Quality == OperationResult.eQuality.GOOD)
            {
                ushort counter = 0;
                StringBuilder sb = new StringBuilder();
                foreach (object value in res.ResultData)
                {
                    sb.Append(counter++.ToString("0000"));
                    sb.Append(" >> ");
                    sb.Append(value.ToString());
                    sb.Append(Environment.NewLine);
                }
                Console.WriteLine(sb.ToString());
            }

            Console.WriteLine("end reading modbus diagnostic");
            Console.WriteLine(Environment.NewLine);
        }

        #endregion
}
Imports PLCcomModbus.Core
Imports PLCcomModbus.DataAdapter
Imports PLCcomModbus.Master


Class MasterExample

#Region "CreateAndInitDevice"

    'Declare the Modbus master Device
    Private Device As ModbusMaster = Nothing

    Public Sub New()
        CreateAndInitDevice()
    End Sub


    Private Sub CreateAndInitDevice()
        Device = New ModbusMaster()
        Device.SetUser("my user name from licence document");
        Device.SetSerial("my serial from licence document");

        Try
            'create new interface instance (if not applicable please uncomment)
            ' "TCP" interface:
            Device.SetConnector_TCP("192.168.1.21", 502)

            'or (if not applicable please uncomment)
            ' "UDP" interface:
            'Device.SetConnector_UDP("192.168.1.100",502)

            'or (if not applicable please uncomment)
            ' "RTU" interface:
            'Device.SetConnector_RTU("COM1", _
            '                        eBaudrate.b9600, _
            '                        eDataBits.DataBits8, _
            '                        System.IO.Ports.Parity.None, _
            '                        System.IO.Ports.StopBits.One, _
            '                        System.IO.Ports.Handshake.None)

            'or (if not applicable please uncomment)
            ' "ASCII interface":
            'Device.SetConnector_ASCII("COM1", _
            '                        eBaudrate.b9600, _
            '                        eDataBits.DataBits8, _
            '                        System.IO.Ports.Parity.None, _
            '                        System.IO.Ports.StopBits.One, _
            '                        System.IO.Ports.Handshake.None)


            'set max idleTime (max idle timespan in milliseconds between open and close interface or connection), Standard = 10000ms
            Device.Connector.SetMaxIdleTime(5000)

            'Set RegisterMode >> 16bit or 32bit register, settings must match with settings of slave
            Device.RegisterMode = eRegisterMode._16Bit

            'register OnConnectionStateChange event
            AddHandler Device.Connector.OnConnectionStateChange, AddressOf Device_OnConnectionStateChange

            'reading diagnostic info (FC8)
            modbusDiagnostic()

        Catch ex As Exception
            Console.WriteLine(ex.Message)
            Return
        End Try
    End Sub


    Private Sub Device_OnConnectionStateChange(sender As Object, e As eConnectionState)
        'do anything
        Console.WriteLine("Change PortState ==> " & e.ToString())
    End Sub
#End Region



#Region "Diagnostic"

    Private Sub modbusDiagnostic()
        Console.WriteLine("start reading modbus diagnostic")

        'declare a ReadRequest object
        'and set the request parameters
        'Slave ID
        'subfunction
        Dim myDiagnosticRequest As DiagnosticRequest = RequestBuilder.DiagnosticRequestBuilder.Create(1, 0)

        Console.WriteLine(myDiagnosticRequest.ToString())

        'execute function
        Dim res As DiagnosticResult = Device.GetDiagnostics(myDiagnosticRequest)


        'evaluate results
        Console.WriteLine((DateTime.Now.ToString() & ": ") + res.Message)

        If res.Quality = OperationResult.eQuality.GOOD Then
            Dim counter As UShort = 0
            Dim sb As New StringBuilder()
            For Each value As Object In res.ResultData
                sb.Append(counter.ToString("0000"))
                sb.Append(" >> ")
                sb.Append(value.ToString())
                sb.Append(Environment.NewLine)
                counter += 1
            Next
            Console.WriteLine(sb.ToString())
        End If

        Console.WriteLine("end reading modbus diagnostic")
        Console.WriteLine(Environment.NewLine)
    End Sub

#End Region
End Class
import java.text.DateFormat;
import java.util.Calendar;

import PLCComMB.*;
import PLCComMB.Enums.*;

public class MasterExample implements iConnectionStateChangeEvent {

	// <editor-fold defaultstate="collapsed" desc="CreateAndInitDevice">

	//Declare the Modbus master Device
	private ModbusMaster Device = null;
	private PortStateEventHandler portStateEventHandler = new PortStateEventHandler(
			this);

	public MasterExample() {
		CreateAndInitDevice();
		AccessToModbus();
	}

	private void CreateAndInitDevice() {
		Device = new ModbusMaster();
		
		Device.setUser("my user name from licence document");
		Device.setSerial("my serial from licence document");

		try {
			//create new interface instance (if not applicable please uncomment)
			// "TCP" interface:
			Device.setConnector_TCP("192.168.1.100", 502);

			//or (if not applicable please uncomment)
			// "UDP" interface:
			//Device.SetConnector_UDP("192.168.1.100",502);

			//or (if not applicable please uncomment)
			// "RTU" interface:
			//Device.SetConnector_RTU("COM1",
			//                        eBaudrate.b9600,
			//                        eDataBits.DataBits8,
			//                        System.IO.Ports.Parity.None,
			//                        System.IO.Ports.StopBits.One,
			//                        System.IO.Ports.Handshake.None);

			//or (if not applicable please uncomment)
			// "ASCII interface":
			//Device.SetConnector_ASCII("COM1",
			//                        eBaudrate.b9600,
			//                        eDataBits.DataBits8,
			//                        System.IO.Ports.Parity.None,
			//                        System.IO.Ports.StopBits.One,
			//                        System.IO.Ports.Handshake.None);

			//set max idleTime (max idle timespan in milliseconds between open and close interface or connection), Standard = 10000ms
			Device.getConnector().setMaxIdleTime(5000);

			//Set RegisterMode >> 16bit or 32bit register, settings must match with settings of slave
			Device.setRegisterMode(eRegisterMode._16Bit);

			//register OnConnectionStateChange event
			Device.getConnector().addConnectionStateEventHandler(
					portStateEventHandler);

		} catch (Exception ex) {
			System.out.println(ex.getMessage());
			return;
		}
	}

	@Override
	public void On_ConnectionStateChange(eConnectionState e) {
		//do anything
		System.out.println("Change PortState ==> " + e.toString());
	}
	
	private void AccessToModbus() {
		try {
			//reading diagnostic info (FC8)
			modbusDiagnostic();
			
		} catch (Exception ex) {
			System.out.println(ex.getMessage());
			return;
		}
	}
	
	private void modbusDiagnostic() {
		System.out.println("start reading modbus diagnostic");

		//declare a ReadRequest object
		//and set the request parameters
		DiagnosticRequest myDiagnosticRequest = RequestBuilder.DiagnosticRequestBuilder
				.create(1, //Slave ID
						0); //subfunction

		System.out.println(myDiagnosticRequest.toString());

		//execute function
		DiagnosticResult res = Device.getDiagnostics(myDiagnosticRequest);

		//evaluate results
		System.out.println(DateFormat.getDateTimeInstance().format(
				Calendar.getInstance().getTime())
				+ ": " + res.getMessage());

		if (res.getQuality().equals(OperationResult.eQuality.GOOD)) {
			int counter = 0;
			StringBuilder sb = new StringBuilder();
			for (Object value : res.getResultData()) {
				sb.append(String.valueOf(counter++));
				sb.append(" >> ");
				sb.append(value.toString());
				sb.append(System.getProperty("line.separator"));
			}
			System.out.println(sb.toString());
		}

		System.out.println("end reading modbus diagnostic");
		System.out.println(System.getProperty("line.separator"));
	}
}

Example:

Simple creation of a Modbus Master instance.
After creation, a connector will be bind to the instance. (in this case a TCP-connector).
Read diacnostic data from plc

Create Modbus Slave Instance
  • C#
  • Visual Basic
  • Java
using System;
using System.Collections.Generic;
using PLCcomModbus.Core;
using PLCcomModbus.DataAdapter;
using PLCcomModbus.Slave;


    class SlaveExample : IDisposable
    {
        public SlaveExample()
        {
            CreateAndInitDevice();
        }

       
        private ModbusSlave slave = null;


        private void CreateAndInitDevice()
        {
            Console.WriteLine("starting modbus slave");
            //create new modbus slave with slave id 1
            slave = new ModbusSlave("<user name from licence document>",
                                    "<serial from licence document>",
                                    1);

            Console.WriteLine(slave.ToString());

        }
       
    }
Imports System.Collections.Generic
Imports System.IO.Ports
Imports System.Text
Imports PLCcomModbus.Core
Imports PLCcomModbus.DataAdapter
Imports PLCcomModbus.Slave

Class SlaveExample
    Implements IDisposable
    Public Sub New()
        CreateAndInitDevice()
    End Sub

#Region "CreateAndInitDevice"

    Private slave As ModbusSlave = Nothing


    Private Sub CreateAndInitDevice()
        Console.WriteLine("starting modbus slave")
        'create new modbus slave with slave id 1
        slave = New ModbusSlave("<user name from licence document>", _
        						"<serial from licence document>", _
        						1)

        Console.WriteLine(slave.ToString())

    End Sub


#End Region


End Class
import PLCComMB.*;
import PLCComMB.Enums.*;
import PLCComMB.UnsignedDatatypes.*;

public class SlaveExample  {

	// <editor-fold defaultstate="collapsed" desc="CreateAndInitDevice">

	private ModbusSlave slave = null;


	public SlaveExample() {
		CreateAndInitDevice();
	}

	private void CreateAndInitDevice() {
		try {
			
			System.out.println("starting modbus slave");
			
			//create new modbus slave with slave id 1
			slave = new ModbusSlave("<user name from licence document>",
			            			"<serial from licence document>",
			            			1);

		} catch (Exception ex) {
			System.out.println(ex.getMessage());
			return;
		} catch (Throwable ex) {
			System.out.println(ex.getMessage());
		}
	}

	// </editor-fold>
}

Example:

Creation of a ModBus-Slave Instance.

Register a Modbus Slave listener
  • C#
  • Visual Basic
  • Java
using System;
using System.Collections.Generic;
using PLCcomModbus.Core;
using PLCcomModbus.DataAdapter;
using PLCcomModbus.Slave;


    class SlaveExample : IDisposable
    {
        public SlaveExample()
        {
            CreateAndInitDevice();
        }

        #region CreateAndInitDevice

        private ModbusSlave slave = null;


        private void CreateAndInitDevice()
        {
            Console.WriteLine("starting modbus slave");
            //create new modbus slave with slave id 1
            slave = new ModbusSlave("<user name from licence document>",
                                    "<serial from licence document>",
                                    1);


            Console.WriteLine(slave.ToString());

            //Add one or more listener

            //add TCP listener
            slave.AddOrReplaceListener_TCP("listener_tcp1", 502);

            //add UDP listener
            slave.AddOrReplaceListener_UDP("listener_udp1", 502);

            //or add RTU listener
            //slave.AddOrReplaceListener_RTU("listener_rtu1",
            //                               "COM1",
            //                               eBaudrate.b9600,
            //                               eDataBits.DataBits8,
            //                               Parity.None,
            //                               StopBits.One,
            //                               Handshake.None);

            //or add ASCII listener
            //slave.AddOrReplaceListener_ASCII("listener_ascii1",
            //                               "COM2",
            //                               eBaudrate.b9600,
            //                               eDataBits.DataBits8,
            //                               Parity.None,
            //                               StopBits.One,
            //                               Handshake.None);

        }

        #endregion


    }
Imports System.Collections.Generic
Imports System.IO.Ports
Imports System.Text
Imports PLCcomModbus.Core
Imports PLCcomModbus.DataAdapter
Imports PLCcomModbus.Slave

Class SlaveExample
    Implements IDisposable
    Public Sub New()
        CreateAndInitDevice()
    End Sub

#Region "CreateAndInitDevice"

    Private slave As ModbusSlave = Nothing


    Private Sub CreateAndInitDevice()
        Console.WriteLine("starting modbus slave")
        'create new modbus slave with slave id 1
        slave = New ModbusSlave("<user name from licence document>", _
        						"<serial from licence document>", _
        						1)


        Console.WriteLine(slave.ToString())


        'add TCP listener
        slave.AddOrReplaceListener_TCP("listener_tcp1", 502)

        'add UDP listener
        slave.AddOrReplaceListener_UDP("listener_udp1", 502)

        'or add RTU listener
        'slave.AddOrReplaceListener_RTU("listener_rtu1",
        '                               "COM1",
        '                               eBaudrate.b9600,
        '                               eDataBits.DataBits8,
        '                               Parity.None,
        '                               StopBits.One,
        '                               Handshake.None)

        'or add ASCII listener
        'slave.AddOrReplaceListener_ASCII("listener_ascii1",
        '                               "COM2",
        '                               eBaudrate.b9600,
        '                               eDataBits.DataBits8,
        '                               Parity.None,
        '                               StopBits.One,
        '                               Handshake.None)

    End Sub

#End Region



#Region "IDisposable Member"

    Public Sub Dispose() Implements IDisposable.Dispose
        StopSlave()
    End Sub

#End Region
End Class
import PLCComMB.*;
import PLCComMB.Enums.*;
import PLCComMB.UnsignedDatatypes.*;

public class SlaveExample  {

	// <editor-fold defaultstate="collapsed" desc="CreateAndInitDevice">

	private ModbusSlave slave = null;

	public SlaveExample() {
		CreateAndInitDevice();
	}

	private void CreateAndInitDevice() {
		try {
			
			System.out.println("starting modbus slave");
			
			//create new modbus slave with slave id 1
			slave = new ModbusSlave("<user name from licence document>",
			            "<serial from licence document>",
			            1);

			System.out.println(slave.toString());

			//Add one or more listener

			//add TCP listener
			slave.addOrReplaceListener_TCP("listener_tcp1", 502);

			//add UDP listener
			slave.addOrReplaceListener_UDP("listener_udp1", 502);

			//or add RTU listener
			slave.addOrReplaceListener_RTU("listener_rtu1",
			                               "COM1",
			                               eBaudrate.b9600,
			                               eDataBits.DataBits8,
			                               eParity.None,
			                               eStopBits.One,
			                               eFlowControl.None);

			//or add ASCII listener
			slave.addOrReplaceListener_ASCII("listener_ascii1",
			                               "COM2",
			                               eBaudrate.b9600,
			                               eDataBits.DataBits8,
			                               eParity.None,
			                               eStopBits.One,
			                               eFlowControl.None);

		} catch (Exception ex) {
			System.out.println(ex.getMessage());
			return;
		} catch (Throwable ex) {
			System.out.println(ex.getMessage());
		}
	}

	// </editor-fold>

}

Example:

Bind serveral listeners (different communication channels ) to the slave instance after creation.

Modbus Slave with events
  • C#
  • Visual Basic
  • Java
using System;
using System.Collections.Generic;
using PLCcomModbus.Core;
using PLCcomModbus.DataAdapter;
using PLCcomModbus.Slave;


    class SlaveExample : IDisposable
    {
        public SlaveExample()
        {
            CreateAndInitDevice();
        }

        #region CreateAndInitDevice

        private ModbusSlave slave = null;


        private void CreateAndInitDevice()
        {
            Console.WriteLine("starting modbus slave");
            //create new modbus slave with slave id 1
            slave = new ModbusSlave("testuser",
                                    "86882-21148-109248-1867141",
                                    1);

            //slave = new ModbusSlave("<user name from licence document>",
            //            "<serial from licence document>",
            //            1);

            Console.WriteLine(slave.ToString());

            //register slave events
            slave.OnPortStateChange += slave_OnPortStateChange;//event is triggered by changing state of communication port
            slave.OnIncomingLogEntry += slave_OnIncomingLogEntry; //event is triggered with a new log entry
            //register datastore events
            slave.OnDataStoreItemChange += slave_OnDataStoreItemChange; //event is triggered by changing of datastore
            slave.OnDataStoreItemRead += slave_OnDataStoreItemRead;//event is triggered by reading from datastore

            //Add one or more listener

            //add TCP listener
            slave.AddOrReplaceListener_TCP("listener_tcp1", 502);

            //add UDP listener
            slave.AddOrReplaceListener_UDP("listener_udp1", 502);

            //or add RTU listener
            //slave.AddOrReplaceListener_RTU("listener_rtu1",
            //                               "COM1",
            //                               eBaudrate.b9600,
            //                               eDataBits.DataBits8,
            //                               Parity.None,
            //                               StopBits.One,
            //                               Handshake.None);

            //or add ASCII listener
            //slave.AddOrReplaceListener_ASCII("listener_ascii1",
            //                               "COM2",
            //                               eBaudrate.b9600,
            //                               eDataBits.DataBits8,
            //                               Parity.None,
            //                               StopBits.One,
            //                               Handshake.None);

        }

        void slave_OnDataStoreItemRead(List<DataStoreItemReadEventArgs> e)
        {
            //do anything
        }

        void slave_OnDataStoreItemChange(List<DataStoreItemChangeEventArgs> e)
        {
            //do anything
        }

        void slave_OnIncomingLogEntry(LogEntry[] e)
        {
            //do anything

            //write LogEntry into listview
            foreach (LogEntry le in e)
            {
                Console.WriteLine(le.ToString());
            }
        }

        void slave_OnPortStateChange(object sender, eConnectionState e)
        {
            //do anything
            Console.WriteLine("Change PortState ==> " + e.ToString());
        }

        #endregion

        #region getvalues

        public object GetValues(ushort ModBusAddress, eModbusRegion Region)
        {
            return slave.GetValue(ModBusAddress, Region);
        }

        #endregion

        #region setvalues

        public void SetValues(ushort ModBusAddress, eModbusRegion Region, bool Value)
        {
            //set value of addressed coil to the passed value
            slave.SetValue(ModBusAddress, Region, Value);
        }

        public void SetValues(ushort ModBusAddress, eModbusRegion Region, ushort Value)
        {
            //set value of addressed holding register to the passed 16bit value (only in 16bit register mode)
            slave.SetValue(ModBusAddress, Region, Value);
        }

        public void SetValues(ushort ModBusAddress, eModbusRegion Region, uint Value)
        {
            //set value of addressed holding register to the passed 32bit value
            slave.SetValue(ModBusAddress, Region, Value);
        }
        #endregion

        #region stop slave

        public void StopSlave()
        {
            Console.WriteLine("stop modbus slave");
            //unregister Datastore events
            slave.OnDataStoreItemChange -= slave_OnDataStoreItemChange;
            slave.OnDataStoreItemRead -= slave_OnDataStoreItemRead;

            //unload existing listener
            List<ModbusListener> ModbusListenerItems = new List<ModbusListener>(slave.Listener.Values);
            foreach (ModbusListener ml in ModbusListenerItems)
            {
                slave.RemoveListener(ml.Name);
            }

            //unregister slave events
            slave.OnIncomingLogEntry -= slave_OnIncomingLogEntry;
            slave.OnPortStateChange -= slave_OnPortStateChange;

            slave.Listener.Clear();

            //dispose modbus slave
            slave.Dispose();
            slave = null;
        }

        #endregion

        #region IDisposable Member

        public void Dispose()
        {
            StopSlave();
        }

        #endregion
    }
Imports System.Collections.Generic
Imports System.IO.Ports
Imports System.Text
Imports PLCcomModbus.Core
Imports PLCcomModbus.DataAdapter
Imports PLCcomModbus.Slave

Class SlaveExample
    Implements IDisposable
    Public Sub New()
        CreateAndInitDevice()
    End Sub

#Region "CreateAndInitDevice"

    Private slave As ModbusSlave = Nothing


    Private Sub CreateAndInitDevice()
        Console.WriteLine("starting modbus slave")
        'create new modbus slave with slave id 1
        slave = New ModbusSlave("testuser", "86882-21148-109248-1867141", 1)

        'slave = new ModbusSlave("<user name from licence document>",
        '            "<serial from licence document>",
        '            1);

        Console.WriteLine(slave.ToString())

        'register slave events
        AddHandler slave.OnPortStateChange, AddressOf slave_OnPortStateChange
        'event is triggered by changing state of communication port
        AddHandler slave.OnIncomingLogEntry, AddressOf slave_OnIncomingLogEntry
        'event is triggered with a new log entry
        'register datastore events
        AddHandler slave.OnDataStoreItemChange, AddressOf slave_OnDataStoreItemChange
        'event is triggered by changing of datastore
        AddHandler slave.OnDataStoreItemRead, AddressOf slave_OnDataStoreItemRead
        'event is triggered by reading from datastore
        'Add one or more listener

        'add TCP listener
        slave.AddOrReplaceListener_TCP("listener_tcp1", 502)

        'add UDP listener
        slave.AddOrReplaceListener_UDP("listener_udp1", 502)

        'or add RTU listener
        'slave.AddOrReplaceListener_RTU("listener_rtu1",
        '                               "COM1",
        '                               eBaudrate.b9600,
        '                               eDataBits.DataBits8,
        '                               Parity.None,
        '                               StopBits.One,
        '                               Handshake.None)

        'or add ASCII listener
        'slave.AddOrReplaceListener_ASCII("listener_ascii1",
        '                               "COM2",
        '                               eBaudrate.b9600,
        '                               eDataBits.DataBits8,
        '                               Parity.None,
        '                               StopBits.One,
        '                               Handshake.None)

    End Sub

    Private Sub slave_OnDataStoreItemRead(e As List(Of DataStoreItemReadEventArgs))
        'do anything
    End Sub

    Private Sub slave_OnDataStoreItemChange(e As List(Of DataStoreItemChangeEventArgs))
        'do anything
    End Sub

    Private Sub slave_OnIncomingLogEntry(e As LogEntry())
        'do anything

        'write LogEntry into listview
        For Each le As LogEntry In e
            Console.WriteLine(le.ToString())
        Next
    End Sub

    Private Sub slave_OnPortStateChange(sender As Object, e As eConnectionState)
        'do anything
        Console.WriteLine("Change PortState ==> " & e.ToString())
    End Sub

#End Region


#Region "getvalues"

    Public Function GetValues(ModBusAddress As UShort, Region As eModbusRegion) As Object
        Return slave.GetValue(ModBusAddress, Region)
    End Function

#End Region

#Region "setvalues"

    Public Sub SetValues(ModBusAddress As UShort, Region As eModbusRegion, Value As Boolean)
        'set value of addressed coil to the passed value
        slave.SetValue(ModBusAddress, Region, Value)
    End Sub

    Public Sub SetValues(ModBusAddress As UShort, Region As eModbusRegion, Value As UShort)
        'set value of addressed holding register to the passed 16bit value (only in 16bit register mode)
        slave.SetValue(ModBusAddress, Region, Value)
    End Sub

    Public Sub SetValues(ModBusAddress As UShort, Region As eModbusRegion, Value As UInteger)
        'set value of addressed holding register to the passed 32bit value
        slave.SetValue(ModBusAddress, Region, Value)
    End Sub
#End Region

#Region "stop slave"

    Public Sub StopSlave()
        Console.WriteLine("stop modbus slave")
        'unregister Datastore events
        RemoveHandler slave.OnDataStoreItemChange, AddressOf slave_OnDataStoreItemChange
        RemoveHandler slave.OnDataStoreItemRead, AddressOf slave_OnDataStoreItemRead

        'unload existing listener
        Dim ModbusListenerItems As New List(Of ModbusListener)(slave.Listener.Values)
        For Each ml As ModbusListener In ModbusListenerItems
            slave.RemoveListener(ml.Name)
        Next

        'unregister slave events
        RemoveHandler slave.OnIncomingLogEntry, AddressOf slave_OnIncomingLogEntry
        RemoveHandler slave.OnPortStateChange, AddressOf slave_OnPortStateChange

        slave.Listener.Clear()

        'dispose modbus slave
        slave.Dispose()
        slave = Nothing
    End Sub

#End Region

#Region "IDisposable Member"

    Public Sub Dispose() Implements IDisposable.Dispose
        StopSlave()
    End Sub

#End Region
End Class
import java.util.List;

import PLCComMB.*;
import PLCComMB.Enums.*;
import PLCComMB.UnsignedDatatypes.*;

public class SlaveExample implements iConnectionStateChangeEvent,
		iIncomingLogEntryEvent, iDataStoreItemChangeEvent,
		iDataStoreItemReadEvent {

	// <editor-fold defaultstate="collapsed" desc="CreateAndInitDevice">

	private ModbusSlave slave = null;

	private IncomingLogEntryEventHandler incomingLogEntryEventHandler = new IncomingLogEntryEventHandler(
			this);
	private DataStoreItemChangeEventHandler dataStoreItemChangeEventHandler = new DataStoreItemChangeEventHandler(
			this);
	private DataStoreItemReadEventHandler dataStoreItemReadEventHandler = new DataStoreItemReadEventHandler(
			this);
	private PortStateEventHandler portStateEventHandler = new PortStateEventHandler(
			this);

	public SlaveExample() {
		CreateAndInitDevice();
	}

	private void CreateAndInitDevice() {
		try {
			
			System.out.println("starting modbus slave");
			
			//create new modbus slave with slave id 1
			slave = new ModbusSlave("<user name from licence document>",
			            "<serial from licence document>",
			            1);

			System.out.println(slave.toString());

			//register slave events       
			slave.addIncomingLogEntryEventHandler(incomingLogEntryEventHandler);//event is triggered with a new log entry
			slave.addDataStoreItemChangeEventHandler(dataStoreItemChangeEventHandler);//event is triggered by changing of datastore
			slave.addDataStoreItemReadEventHandler(dataStoreItemReadEventHandler);//event is triggered by reading from datastore
			slave.addPortStateEventHandler(portStateEventHandler);//event is triggered by changing state of communication port

			//Add one or more listener

			//add TCP listener
			slave.addOrReplaceListener_TCP("listener_tcp1", 502);

			//add UDP listener
			slave.addOrReplaceListener_UDP("listener_udp1", 502);

			//or add RTU listener
			slave.addOrReplaceListener_RTU("listener_rtu1",
			                               "COM1",
			                               eBaudrate.b9600,
			                               eDataBits.DataBits8,
			                               eParity.None,
			                               eStopBits.One,
			                               eFlowControl.None);

			//or add ASCII listener
			slave.addOrReplaceListener_ASCII("listener_ascii1",
			                               "COM2",
			                               eBaudrate.b9600,
			                               eDataBits.DataBits8,
			                               eParity.None,
			                               eStopBits.One,
			                               eFlowControl.None);

		} catch (Exception ex) {
			System.out.println(ex.getMessage());
			return;
		} catch (Throwable ex) {
			System.out.println(ex.getMessage());
		}
	}

	@Override
	public void OnDataStoreItemRead(List<DataStoreItemReadArg> arg) {
		//do anything

	}

	@Override
	public void OnDataStoreItemChange(List<DataStoreItemChangeArg> arg) {
		//do anything

	}

	@Override
	public void OnIncomingLogEntry(LogEntry[] e) {
		//do anything

		//write LogEntry into listview
		for (LogEntry le : e) {
			System.out.println(le.toString());
		}

	}

	@Override
	public void On_ConnectionStateChange(eConnectionState e) {
		//do anything
		System.out.println("Change PortState ==> " + e.toString());
	}

	// </editor-fold>

	// <editor-fold defaultstate="collapsed" desc="getvalues">

	public Object getValues(UShort ModBusAddress, eModbusRegion Region) {
		return slave.getValue(ModBusAddress, Region);
	}

	// </editor-fold>

	// <editor-fold defaultstate="collapsed" desc="setvalues">

	public void setValues(UShort ModBusAddress, eModbusRegion Region,
			boolean Value) {
		//set value of addressed coil to the passed value
		slave.setValue(ModBusAddress, Region, Value);
	}

	public void setValues(UShort ModBusAddress, eModbusRegion Region,
			UShort Value) {
		//set value of addressed holding register to the passed 16bit value (only in 16bit register mode)
		slave.setValue(ModBusAddress, Region, Value);
	}

	public void setValues(UShort ModBusAddress, eModbusRegion Region,
			UInteger Value) {
		//set value of addressed holding register to the passed 32bit value
		slave.setValue(ModBusAddress, Region, Value);
	}

	// </editor-fold>

	// <editor-fold defaultstate="collapsed" desc="stop slave">

	public void StopSlave() {
		System.out.println("stop modbus slave");
		// unload existing listener
		String[] ListenerKeys = slave.getListener().keySet()
				.toArray(new String[slave.getListener().keySet().size()]);
		for (String key : ListenerKeys) {
			slave.removeListener(key);
		}

		// unregister slave events
		slave.removeIncomingLogEntryEventHandler(incomingLogEntryEventHandler);
		slave.removeDataStoreItemChangeEventHandler(dataStoreItemChangeEventHandler);
		slave.removeDataStoreItemReadEventHandler(dataStoreItemReadEventHandler);
		slave.removePortStateEventHandler(portStateEventHandler);

		// dispose modbus slave
		slave.unload();
		slave = null;

	}

	// </editor-fold>
}

Example:

Code of a simple Modbus-Slave with different listerners and the possibility to read and write from the data store directly.