OPC Studio User's Guide and Reference
OnRead Method
Example 



OpcLabs.ServerOpcUA Assembly > OpcLabs.EasyOpc.UA.NodeSpace Namespace > UAServerNode Class : OnRead Method
The event arguments.

The value of this parameter cannot be null (Nothing in Visual Basic).

Raises the Read event to obtain the data for OPC UA read.
Syntax
'Declaration
 
Protected Overridable Sub OnRead( _
   ByVal e As UADataVariableReadEventArgs _
) 
'Usage
 
Dim instance As UAServerNode
Dim e As UADataVariableReadEventArgs
 
instance.OnRead(e)
protected virtual void OnRead( 
   UADataVariableReadEventArgs e
)
protected:
virtual void OnRead( 
   UADataVariableReadEventArgs^ e
) 

Parameters

e
The event arguments.

The value of this parameter cannot be null (Nothing in Visual Basic).

Exceptions
ExceptionDescription

One of the arguments provided to a method is not valid.

This is a usage error, i.e. it will never occur (the exception will not be thrown) in a correctly written program. Your code should not catch this exception.

A null reference (Nothing in Visual Basic) is passed to a method that does not accept it as a valid argument.

This is a usage error, i.e. it will never occur (the exception will not be thrown) in a correctly written program. Your code should not catch this exception.

Remarks

The design of this method, including its naming and purpose, is according to Event Design recommendations in "Member design guidelines" by Microsoft.

In the derived classes, you can override this method instead of having to add an event handler for the event.

As opposed to the behavior of the Read event, this method is also always called for child nodes, even when the HandleChildNodes property is set to false.

Example
// This example shows how to define a custom folder class which implements reading from its data variables.
// You can use any OPC UA client, including our Connectivity Explorer and OpcCmd utility, to connect to the server. 
//
// Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html .
// OPC client, server and subscriber examples in C# on GitHub: https://github.com/OPCLabs/Examples-OPCStudio-CSharp .
// Missing some example? Ask us for it on our Online Forums, https://www.opclabs.com/forum/index ! You do not have to own
// a commercial license in order to use Online Forums, and we reply to every post.

using System;
using OpcLabs.BaseLib.NodeSpace;
using OpcLabs.EasyOpc.UA;
using OpcLabs.EasyOpc.UA.NodeSpace;
using OpcLabs.EasyOpc.UA.OperationModel;

namespace UAServerDocExamples._UAServerNode
{
    class OnRead
    {
        /// <summary>
        /// A folder in the OPC UA address space, with specialized read behavior.
        /// </summary>
        class FolderWithOnRead : UAFolder
        {
            public FolderWithOnRead(string name) : base(name)
            {
            }

            /// <summary>
            /// Obtains the data for OPC UA read.
            /// </summary>
            /// <param name="e">The event arguments.</param>
            protected override void OnRead(UADataVariableReadEventArgs e)
            {
                // Obtain the state associated with the data variable that is being read.
                // Use it as the offset for the random value, so that each data variable generates values in a unique range.
                int offset = (int)e.DataVariable.State*100;

                // Generate a random value, indicate that the read has been handled, and return the generated value.
                e.HandleAndReturn(Random.Next(offset, offset + 100));
            }

            static private readonly Random Random = new Random();
        }

        public static void Main1()
        {
            // Instantiate the server object.
            // By default, the server will run on endpoint URL "opc.tcp://localhost:48040/".
            var server = new EasyUAServer();

            // Create a folder node.
            var myFolder = new FolderWithOnRead("MyFolder");
            server.Add(myFolder);

            // Create data variables in the folder. Distinguish them by their state.
            myFolder.Add(new UADataVariable("MyDataVariable1").ValueType<int>().SetState(1));
            myFolder.Add(new UADataVariable("MyDataVariable2").ValueType<int>().SetState(2));
            myFolder.Add(new UADataVariable("MyDataVariable3").ValueType<int>().SetState(3));
            myFolder.Add(new UADataVariable("MyDataVariable4").ValueType<int>().SetState(4));
            myFolder.Add(new UADataVariable("MyDataVariable5").ValueType<int>().SetState(5));

            // Start the server.
            Console.WriteLine("The server is starting...");
            server.Start();

            Console.WriteLine("The server is started.");
            Console.WriteLine();

            // Let the user decide when to stop.
            Console.WriteLine("Press Enter to stop the server...");
            Console.ReadLine();

            // Stop the server.
            Console.WriteLine("The server is stopping...");
            server.Stop();

            Console.WriteLine("The server is stopped.");
        }
    }
}
' This example shows how to define a custom folder class which implements reading from its data variables.
' You can use any OPC UA client, including our Connectivity Explorer and OpcCmd utility, to connect to the server. 
'
' Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html .
' OPC client and subscriber examples in VB.NET on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-VBNET .
' Missing some example? Ask us for it on our Online Forums, https://www.opclabs.com/forum/index ! You do not have to own
' a commercial license in order to use Online Forums, and we reply to every post.

Imports System
Imports OpcLabs.BaseLib.NodeSpace
Imports OpcLabs.EasyOpc.UA
Imports OpcLabs.EasyOpc.UA.NodeSpace
Imports OpcLabs.EasyOpc.UA.OperationModel

Namespace _UAServerNode
    Partial Friend Class OnRead
        ''' <summary>
        ''' A folder in the OPC UA address space, with specialized read behavior.
        ''' </summary>
        Class FolderWithOnRead
            Inherits UAFolder

            Public Sub New(ByVal name As String)
                MyBase.New(name)
            End Sub

            ''' <summary>
            ''' Obtains the data for OPC UA read.
            ''' </summary>
            ''' <param name="e">The event arguments.</param>
            Protected Overrides Sub OnRead(ByVal e As UADataVariableReadEventArgs)
                ' Obtain the state associated with the data variable that is being read.
                ' Use it as the offset for the random value, so that each data variable generates values in a unique range.
                Dim offset As Integer = CInt(e.DataVariable.State * 100)

                ' Generate a random value, indicate that the read has been handled, and return the generated value.
                e.HandleAndReturn(Random.Next(offset, offset + 100))
            End Sub

            Private Shared ReadOnly Random As Random = New Random()
        End Class

        Shared Sub Main1()
            ' Instantiate the server object.
            ' By default, the server will run on endpoint URL "opc.tcp://localhost:48040/".
            Dim server = New EasyUAServer()

            ' Create a folder node.
            Dim myFolder = New FolderWithOnRead("MyFolder")
            server.Add(myFolder)

            ' Create data variables in the folder. Distinguish them by their state.
            myFolder.Add(New UADataVariable("MyDataVariable1").ValueType(Of Integer)().SetState(1))
            myFolder.Add(New UADataVariable("MyDataVariable2").ValueType(Of Integer)().SetState(2))
            myFolder.Add(New UADataVariable("MyDataVariable3").ValueType(Of Integer)().SetState(3))
            myFolder.Add(New UADataVariable("MyDataVariable4").ValueType(Of Integer)().SetState(4))
            myFolder.Add(New UADataVariable("MyDataVariable5").ValueType(Of Integer)().SetState(5))

            ' Start the server.
            Console.WriteLine("The server is starting...")
            server.Start()

            Console.WriteLine("The server is started.")
            Console.WriteLine()

            ' Let the user decide when to stop.
            Console.WriteLine("Press Enter to stop the server...")
            Console.ReadLine()

            ' Stop the server.
            Console.WriteLine("The server is stopping...")
            server.Stop()

            Console.WriteLine("The server is stopped.")
        End Sub
    End Class
End Namespace
Requirements

Target Platforms: .NET Framework: Windows 10 (selected versions), Windows 11 (selected versions), Windows Server 2016, Windows Server 2022; .NET: Linux, macOS, Microsoft Windows

See Also