PLCcom Opc Ua Sdk

The PLCcom.Opc.Ua.Sdk is a highly optimized and modern component specially developed for .Net or Java software developers to provide a convenient access to a client-side OPC UA interface, e.g. to read or write data.

Innovative and fast to use

With the PLCcom.Opc.Ua.Sdk you will be able to add a standardized Opc Ua client access to their developed applications with a few lines of code.
Connect you application quick and easy with one or more OPC-UA-Server(s) and read, write or monitore data. Make your application fit for Industrial 4.0

PLCcom.Opc.Ua.Sdk is available in two versions:

  1. Net version
    The .Net version supports classic .Net Framework-programming.
    Furthermore, the delivery package contains versions for .Net-Standard Version 2.1 and a version for .Net 5.0
    This component can be used to develop .Net-Core-, Xamarin-, UWP- or Unity- applications.
    Additionally, a nuget package is provided via
  2. Java version
    The Java version provides developers with a Java component for Java application development, e.g. with Eclipse or Netbeans. Since version 9, the development of Android apps is also supported.

Here are some simple code examples (further examples):

//discovery endpoints
EndpointDescriptionCollection ep = UaClient.GetEndpoints(new Uri("opc.tcp://localhost:4048"));

'discovery endpoints
Dim ep As EndpointDescriptionCollection = UaClient.GetEndpoints(New Uri("opc.tcp://localhost:4048"))

//discovery endpoints
EndpointDescription[] endpoints = UaClient.discoverEndpoints(Hostname, Port);

Example: Queries of existing endpoints of a server

//simple browse command example
//Set start NodeId by path
NodeId sourceNode = client.GetNodeIdByPath("Objects.Data.Dynamic.Scalar");
// find all of the components of the node.
BrowseDescription nodeToBrowse = new BrowseDescription();
nodeToBrowse.NodeId = sourceNode;
nodeToBrowse.BrowseDirection = BrowseDirection.Forward;
nodeToBrowse.ReferenceTypeId = ReferenceTypeIds.Aggregates;
nodeToBrowse.IncludeSubtypes = true;
nodeToBrowse.NodeClassMask = (uint)(NodeClass.Object | NodeClass.Variable);
nodeToBrowse.ResultMask = (uint)BrowseResultMask.All;
//now, browse the node
ReferenceDescriptionCollection rdc = client.BrowseFull(nodeToBrowse);

'simple browse command example
'Set start NodeId by path'
Dim sourceNode As NodeId = client.GetNodeIdByPath("Objects.Data.Dynamic.Scalar")
'find all of the components of the node. '
Dim nodeToBrowse As BrowseDescription = New BrowseDescription()
nodeToBrowse.NodeId = sourceNode
nodeToBrowse.BrowseDirection = BrowseDirection.Forward
nodeToBrowse.ReferenceTypeId = ReferenceTypeIds.Aggregates
nodeToBrowse.IncludeSubtypes = True
nodeToBrowse.NodeClassMask = CUInt(NodeClass.Object Or NodeClass.Variable)
nodeToBrowse.ResultMask = CUInt(BrowseResultMask.All)
//now, browse the node
Dim rdc As ReferenceDescriptionCollection = client.BrowseFull(nodeToBrowse)

//simple browse command example
//create a BrowseDescription object
BrowseDescription browseDescription = new BrowseDescription();
browseDescription.setNodeClassMask(NodeClass.Object, NodeClass.Variable);
//set start nodeId
//create a BrowseRequest or browse the BrowseDescription direct
BrowseRequest browseRequest = new BrowseRequest(null, null, null,
                                new BrowseDescription[] { browseDescription });
//browse the node
BrowseResponse results = client.browse(browseRequest);

Example: Browse nodes

//read values from OPC UA Node into DataValue object
 DataValue value = client.ReadValue("Objects.Server.Data.Static.Scalar.Int64Value");

'reading values from OPC UA Node into DataValue object
 Dim value As DataValue = client.ReadValue("Objects.Server.Data.Static.Scalar.Int64Value")

//read values from OPC UA Node into DataValue object
ReadResponse res ="Objects.Server.Data.Static.Scalar.Int16Value"),

Example: Read data

//write value 123 to OPC UA Node and receive the status code
 StatusCode sc = client.WriteValue("Objects.Server.Data.Static.Scalar.Int64Value",123);

'writing value 123 to OPC UA Node and receive the status code
 Dim sc As StatusCode = client.WriteValue("Objects.Server.Data.Static.Scalar.Int64Value", 123)

//write value 123 to OPC UA Node and receive the status code
StatusCode res = client.write(myClient.getNodeIdByPath("Objects.Server.Data.Static.Scalar.Int16Value"), 
                                (short) 123,

Example: Write data

//create a new subscription
Subscription subscription = new Subscription();
subscription.PublishingInterval = 1000;
subscription.DisplayName = "mySubsription";
//register subscription events
subscription.StateChanged += Subscription_StateChanged;
subscription.PublishStatusChanged += Subscription_PublishStatusChanged;
//add new subscription to client
//Create a monitoring item and add to the subscription
NodeId nodeId = client.GetNodeIdByPath("Objects.Data.Dynamic.Scalar.Int64Value");
MonitoredItem monitoredItem = new MonitoredItem(subscription.DefaultItem)
                               StartNodeId = nodeId,
                               SamplingInterval = 500,
                               QueueSize = UInt32.MaxValue,
                               DisplayName = nodeId.ToString()
//register monitoring event
monitoredItem.Notification += Client_MonitorNotification;
//add Item to subscription
//apply changes
 //catch the monitoring event
private void Client_MonitorNotification(MonitoredItem monitoredItem, MonitoredItemNotificationEventArgs e)
    // notifications coming here, do what you want

'create a new subscription'
Dim subscription As Subscription = New Subscription()
subscription.PublishingInterval = 1000
subscription.PublishingEnabled = False
subscription.DisplayName = "mySubsription"
'register subscription events'
AddHandler subscription.StateChanged, AddressOf Subscription_StateChanged
AddHandler subscription.PublishStatusChanged, AddressOf Subscription_PublishStatusChanged
'add new subscription to client'
'Create a monitoring item and add to the subscription'
Dim nodeId As NodeId = client.GetNodeIdByPath("Objects.Data.Dynamic.Scalar.Int64Value")
Dim monitoredItem As MonitoredItem = New MonitoredItem(subscription.DefaultItem) With {
                                    .StartNodeId = nodeId,
                                    .SamplingInterval = 500,
                                    .QueueSize = UInteger.MaxValue,
                                    .DisplayName = nodeId.ToString()
'register monitoring event'
AddHandler monitoredItem.Notification, AddressOf Client_MonitorNotification
'add Item to subscription'
'apply changes'
Private Sub Client_MonitorNotification(ByVal monitoredItem As MonitoredItem, ByVal e As MonitoredItemNotificationEventArgs)
    Dim notification As MonitoredItemNotification = TryCast(e.NotificationValue, MonitoredItemNotification)
    'notifications coming here, do what you want
End Sub

//create and register monitoring item
//step 1 create the request list
List requests = new ArrayList();
//step 2 create and add a create request for a monitoring item
ReadValueId readValueId = new ReadValueId(
                                UaAttributes.Value.getValue(), null, null);
requests.add(new MonitoredItemCreateRequest(readValueId, MonitoringMode.Reporting, new MonitoringParameters()));
//step3 create and add a subscription
UaSubscription subscription = myClient.getSubscriptionManager().createSubscription();
//final step create, monitoring items and add monitoring item event listener
List monitoredItems = subscription.createMonitoredItems(requests, new MonitoredItemNotificationListener() {
    public void onValueNotification(MonitoredItem monitoredItem, DataValue value) {
        // value notifications coming here, do what you want
    public void onEventNotification(MonitoredItem monitoredItem, EventFieldList eventFieldList) {
        // event notifications coming here, do what you want

Example: Monitoring of nodes

Tutorial, test software and code examples

Included in the software package are extensive code examples and tutorials, which illustrate the easy connection of an OPC UA server via an OPC interface to your application and can also be used in your projects.


  • finding nodes via node path e.g. "Objects.Server.Data.Static.Scalar.Int64Value"
  • automatical connect and disconnect of server connections (can be switched off)
  • no limits at instance, connections or subscription numbers
  • compatible to Opc Ua specification
  • extended security features, secure connections also possible via certificate exchange
  • easy creation and integration of your own certificates and your own certificate validations
  • various useful, helpful extensions and functions that are made available to the developer
  • and much more.

Especially for DotNet or Java developers

The component is depending on the version a 100% .Net or Java file.
PLCcom.Opc.Ua.Sdk can be directly linked as a reference, API calls are not necessary.
It is easily to use the components in 32 or 64 bit environments as well as across platforms.
The internal routines are optimized for high-performance access.

Simple license model, top-level support available

PLCcom.Opc.Ua.Sdk needs a license for each developer a runtime license is not necessary.
Try PLCcom.Opc.Ua.Sdk 30 days trial version before you license the library.
We want you to be satisfied with our product; even after purchase we will not leave you all alone!
If you encounter any unexpected problems or issues related to our product, we will be unbureaucratically and promptly available and assist you in solving the problem.

Indi.An is OPC foundation member for many years

With the OPC UA specification, the OPC Foundation provides a newly developed communication model for the uniform transport of machine data.
The goal was to adapt the OPC communication model to the requirements of future applications and to compensate for the existing disadvantages of the DCOM-based OPC interface.
The first version of the OPC UA specification was made available in 2006, a revision took place in 2009.

With OPC UA, a future-proof standardized communication standard is provided that also covers the requirements of industry 4.0 applications.

Indi.An is OPC foundation member for many years