PLCcom.Opc.Ua.Sdk
10.5.6
dotnet add package PLCcom.Opc.Ua.Sdk --version 10.5.6
NuGet\Install-Package PLCcom.Opc.Ua.Sdk -Version 10.5.6
<PackageReference Include="PLCcom.Opc.Ua.Sdk" Version="10.5.6" />
<PackageVersion Include="PLCcom.Opc.Ua.Sdk" Version="10.5.6" />
<PackageReference Include="PLCcom.Opc.Ua.Sdk" />
paket add PLCcom.Opc.Ua.Sdk --version 10.5.6
#r "nuget: PLCcom.Opc.Ua.Sdk, 10.5.6"
#:package PLCcom.Opc.Ua.Sdk@10.5.6
#addin nuget:?package=PLCcom.Opc.Ua.Sdk&version=10.5.6
#tool nuget:?package=PLCcom.Opc.Ua.Sdk&version=10.5.6
PLCcom.Opc.Ua.Sdk
A comprehensive .NET SDK for building OPC UA client and server applications. The SDK is delivered as a single assembly — no API calls or COM registration necessary. It runs cross-platform on .NET Framework 4.7.2+, .NET Standard 2.1, .NET 8, .NET 9, and .NET 10.
What PLCcom.Opc.Ua.Sdk has to offer
The PLCcom.Opc.Ua.Sdk is a highly optimized library for .NET developers that provides both a full OPC UA Client SDK and a full OPC UA Server SDK in a single assembly.
Key advantages:
- Easy to use — many operations require just a single line of code
- Path-based node addressing — access nodes by browse path instead of cryptic NodeIds (see below)
- Automatic connect, reconnect, and disconnect — no manual connection state management needed
- Active keep-alive monitoring of the server state
- opc.tcp and opc.https transport protocols supported
Supported OPC UA specifications:
- Data Access (read, write, browse, monitor)
- Alarm and Conditions
- Historical Data and Historical Events
- Complex / Structured Data Types
- Simple Events
- Reverse Connect
Path-based Node Addressing
A unique feature of PLCcom.Opc.Ua.Sdk is the ability to address nodes by their browse path — just like navigating a folder structure — instead of using numeric NodeIds:
// Resolve a node by path — no cryptic NodeId needed
NodeId nodeId = client.GetNodeIdByPath("Objects.Plant.Line1.Machine1.Temperature");
// Read a value
DataValue value = client.ReadValue(nodeId);
// Write a value
client.WriteValue(nodeId, 23.5);
' Resolve a node by path
Dim nodeId As NodeId = client.GetNodeIdByPath("Objects.Plant.Line1.Machine1.Temperature")
' Read a value
Dim value As DataValue = client.ReadValue(nodeId)
' Write a value
client.WriteValue(nodeId, 23.5)
This makes your code readable, maintainable, and independent of server-specific NodeId assignments.
Classic NodeId-based access (ns=2;i=12345) is of course fully supported too.
OPC UA Client SDK
Getting started
1. Install the NuGet package
Install-Package PLCcom.Opc.Ua.Sdk
2. Import namespaces
using PLCcom.Opc.Ua;
using PLCcom.Opc.Ua.Client.Sdk;
3. Discover endpoints and connect
string LicenseUserName = "<Enter your UserName here>";
string LicenseSerial = "<Enter your Serial here>";
// Discover available endpoints
EndpointDescriptionCollection endpoints = UaClient.GetEndpoints(
new Uri("opc.tcp://localhost:48410"));
// Build a session configuration from the selected endpoint
SessionConfiguration sessionConfig = SessionConfiguration.Build(
"MyApplication", endpoints[0]);
// Create the client
UaClient client = new UaClient(LicenseUserName, LicenseSerial, sessionConfig);
// Register events
client.ServerConnected += (s, e) => Console.WriteLine("Connected");
client.ServerConnectionLost += (s, e) => Console.WriteLine("Connection lost");
client.CertificateValidation += (sender, e) => e.Accept = true;
// Connect (auto-reconnects on connection loss)
client.Connect();
Reading data
// Read a single value by path
DataValue value = client.ReadValue(
client.GetNodeIdByPath("Objects.Plant.Machine1.Temperature"));
// Read multiple values in one call
ReadValueIdCollection nodesToRead = new ReadValueIdCollection
{
new ReadValueId
{
NodeId = client.GetNodeIdByPath("Objects.Plant.Machine1.Temperature"),
AttributeId = Attributes.Value
},
new ReadValueId
{
NodeId = client.GetNodeIdByPath("Objects.Plant.Machine1.RPM"),
AttributeId = Attributes.Value
}
};
DataValueCollection results = client.Read(nodesToRead);
Writing data
// Write a single value by path
client.WriteValue(client.GetNodeIdByPath("Objects.Plant.Machine1.Setpoint"), 42.0);
// Write multiple values in one call
WriteValueCollection nodesToWrite = new WriteValueCollection
{
new WriteValue
{
NodeId = client.GetNodeIdByPath("Objects.Plant.Machine1.Setpoint"),
AttributeId = Attributes.Value,
Value = new DataValue(42.0)
},
new WriteValue
{
NodeId = client.GetNodeIdByPath("Objects.Plant.Machine1.Running"),
AttributeId = Attributes.Value,
Value = new DataValue(true)
}
};
StatusCodeCollection writeResults = client.Write(nodesToWrite);
Subscribing to data changes
// Create a subscription
Subscription subscription = new Subscription
{
PublishingInterval = 1000,
DisplayName = "MySubscription"
};
client.AddSubscription(subscription);
// Add a monitored item
NodeId nodeId = client.GetNodeIdByPath("Objects.Plant.Machine1.Temperature");
MonitoredItem monitoredItem = new MonitoredItem(subscription.DefaultItem)
{
StartNodeId = nodeId,
SamplingInterval = 500,
DisplayName = "Temperature"
};
monitoredItem.Notification += (item, e) =>
{
var notification = e.NotificationValue as MonitoredItemNotification;
Console.WriteLine($"{item.DisplayName} = {notification.Value.Value}");
};
subscription.AddItem(monitoredItem);
subscription.ApplyChanges();
subscription.SetPublishingMode(true);
subscription.Modify();
OPC UA Server SDK
Getting started
1. Import the server namespace
using PLCcom.Opc.Ua.Server.Sdk;
2. Configure and start the server
string LicenseUserName = "<Enter your UserName here>";
string LicenseSerial = "<Enter your Serial here>";
var config = new UaServerConfiguration
{
ApplicationName = "My OPC UA Server",
ApplicationUri = "urn:mycompany:myserver",
BaseAddresses = new List<string>
{
"opc.tcp://localhost:48410",
"opc.https://localhost:48411"
},
SecurityPolicies = UaServer.GetRecommendedSecurityPolicies(),
UserTokenPolicies = new List<UserTokenPolicy>
{
new UserTokenPolicy { TokenType = UserTokenType.Anonymous }
}
};
using var server = new UaServer(LicenseUserName, LicenseSerial);
server.CertificateValidation += (sender, e) => e.Accept = true;
server.Start(config);
3. Build the address space
// Create a folder hierarchy
UaFolder plant = server.CreateFolder("Plant", UaRolePermissions.WITHOUT_RESTRICTIONS);
UaFolder machine = server.CreateFolder(plant, "Machine1", UaRolePermissions.WITHOUT_RESTRICTIONS);
// Create typed variables — the generic parameter sets the OPC UA DataType
UaVariable<double> temperature = server.CreateVariable<double>(
machine, "Temperature", UaRolePermissions.WITHOUT_RESTRICTIONS, initialValue: 20.0);
UaVariable<int> rpm = server.CreateVariable<int>(
machine, "RPM", UaRolePermissions.WITHOUT_RESTRICTIONS, initialValue: 1500);
UaVariable<bool> running = server.CreateVariable<bool>(
machine, "Running", UaRolePermissions.WITHOUT_RESTRICTIONS, initialValue: true);
// Push value changes — subscribed clients are notified automatically
temperature.Value = 23.5;
4. Add methods
server.CreateMethod(machine, "Reset",
handler: (session, context, objectId, inputArgs, outputArgs) =>
{
temperature.Value = 0.0;
rpm.Value = 0;
running.Value = false;
return ServiceResult.Good;
},
UaRolePermissions.WITHOUT_RESTRICTIONS);
5. User authentication with roles
// Disable anonymous access and add named users
config.UserTokenPolicies = new List<UserTokenPolicy>
{
new UserTokenPolicy { TokenType = UserTokenType.UserName }
};
server.AddUser("operator", "secret123", Role.Operator); // read + write
server.AddUser("admin", "admin456", Role.Engineer); // full access
6. React to client writes
server.ValuesWritten += (s, e) =>
{
foreach (var item in e.Items)
Console.WriteLine($"Client wrote: {item.Path} = {item.Value}");
};
Server SDK features
- Folders, Variables (scalar + array), Objects, Methods
- Custom ObjectTypes, VariableTypes and structured DataTypes (Structs)
- NodeSet2 XML import (OPC UA companion specifications)
- Alarm & Conditions (AlarmCondition, ExclusiveLimitAlarm, DiscreteAlarm, Dialog)
- Historical Data Access and Historical Events
- Simple Events
- Reverse Connect (server-initiated connections through firewalls)
- User authentication with roles (Observer, Operator, Engineer)
- Custom credential and permission validators
- Multiple namespaces
- Configurable security policies and endpoint host normalization
- Integrated logging via
LogMessageevent
System Requirements
Supported platforms:
- Microsoft .NET Framework 4.7.2 or higher (up to 4.8.1)
- Microsoft .NET 5.0 to 7.0 via .NET Standard 2.1
- Microsoft .NET 8.0
- Microsoft .NET 9.0
- Microsoft .NET 10.0
To build and run the included examples:
- Visual Studio 2022 or higher (VS2026 recommended)
Additional Documentation
Online class reference: https://docs.plccom.net/help_opc_ua_sdk/net/help/html/R_Project_PLCcom_Opc_Ua_Sdk_Documentation.htm
Quick-start examples on GitHub: https://github.com/indi-an-gmbh/PLCcom-OpcUaSdk-examples-dotnet
Feedback
To provide feedback or report issues, please write to: support@indi-an.com
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
| .NET Core | netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
| .NET Standard | netstandard2.1 is compatible. |
| .NET Framework | net472 is compatible. net48 is compatible. net481 was computed. |
| MonoAndroid | monoandroid was computed. |
| MonoMac | monomac was computed. |
| MonoTouch | monotouch was computed. |
| Tizen | tizen60 was computed. |
| Xamarin.iOS | xamarinios was computed. |
| Xamarin.Mac | xamarinmac was computed. |
| Xamarin.TVOS | xamarintvos was computed. |
| Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETFramework 4.7.2
- BitFaster.Caching (>= 2.5.4)
- BouncyCastle.Cryptography (>= 2.6.2)
- Microsoft.AspNetCore.Http (>= 2.3.9)
- Microsoft.AspNetCore.Server.Kestrel (>= 2.3.9)
- Microsoft.AspNetCore.Server.Kestrel.Core (>= 2.3.9)
- Microsoft.AspNetCore.Server.Kestrel.Https (>= 2.3.9)
- Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets (>= 2.3.9)
- Microsoft.Bcl.HashCode (>= 6.0.0)
- Microsoft.Extensions.Logging (>= 10.0.7)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.7)
- Newtonsoft.Json (>= 13.0.4)
- System.Collections.Immutable (>= 10.0.7)
- System.Diagnostics.DiagnosticSource (>= 10.0.7)
- System.Formats.Asn1 (>= 10.0.7)
- System.Text.Json (>= 10.0.7)
-
.NETFramework 4.8
- BitFaster.Caching (>= 2.5.4)
- BouncyCastle.Cryptography (>= 2.6.2)
- Microsoft.AspNetCore.Http (>= 2.3.9)
- Microsoft.AspNetCore.Server.Kestrel (>= 2.3.9)
- Microsoft.AspNetCore.Server.Kestrel.Core (>= 2.3.9)
- Microsoft.AspNetCore.Server.Kestrel.Https (>= 2.3.9)
- Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets (>= 2.3.9)
- Microsoft.Bcl.HashCode (>= 6.0.0)
- Microsoft.Extensions.Logging (>= 10.0.7)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.7)
- Newtonsoft.Json (>= 13.0.4)
- System.Collections.Immutable (>= 10.0.7)
- System.Diagnostics.DiagnosticSource (>= 10.0.7)
- System.Formats.Asn1 (>= 10.0.7)
- System.Text.Json (>= 10.0.7)
-
.NETStandard 2.1
- BitFaster.Caching (>= 2.5.4)
- BouncyCastle.Cryptography (>= 2.6.2)
- Microsoft.AspNetCore.Http (>= 2.3.9)
- Microsoft.AspNetCore.Server.Kestrel (>= 2.3.9)
- Microsoft.AspNetCore.Server.Kestrel.Core (>= 2.3.9)
- Microsoft.AspNetCore.Server.Kestrel.Https (>= 2.3.9)
- Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets (>= 2.3.9)
- Microsoft.Extensions.Logging (>= 10.0.7)
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.7)
- Newtonsoft.Json (>= 13.0.4)
- System.Collections.Immutable (>= 10.0.7)
- System.Diagnostics.DiagnosticSource (>= 10.0.7)
- System.Formats.Asn1 (>= 10.0.7)
- System.ServiceModel.Primitives (>= 10.0.652802)
- System.Text.Json (>= 10.0.7)
-
net10.0
- BitFaster.Caching (>= 2.5.4)
- BouncyCastle.Cryptography (>= 2.6.2)
- Newtonsoft.Json (>= 13.0.4)
-
net8.0
- BitFaster.Caching (>= 2.5.4)
- BouncyCastle.Cryptography (>= 2.6.2)
- Microsoft.Extensions.Logging (>= 10.0.7)
- Newtonsoft.Json (>= 13.0.4)
- System.Collections.Immutable (>= 10.0.7)
- System.Diagnostics.DiagnosticSource (>= 10.0.7)
- System.Text.Json (>= 10.0.7)
-
net9.0
- BitFaster.Caching (>= 2.5.4)
- BouncyCastle.Cryptography (>= 2.6.2)
- Microsoft.Extensions.Logging (>= 10.0.7)
- Newtonsoft.Json (>= 13.0.4)
- System.Collections.Immutable (>= 10.0.7)
- System.Diagnostics.DiagnosticSource (>= 10.0.7)
- System.Text.Json (>= 10.0.7)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on PLCcom.Opc.Ua.Sdk:
| Package | Downloads |
|---|---|
|
PLCcom.Opc.Ua.PubSub
PLCcom.Opc.Ua.PubSub is a high-level .NET library for building OPC UA PubSub publisher and subscriber applications. It supports brokerless UDP/UADP (unicast and multicast) and broker-based MQTT transport with both UADP binary and JSON encoding, including MQTT TLS (mqtts://) and mutual TLS (mTLS). The fluent API requires only a few lines of code to publish or subscribe to OPC UA data sets. Runs cross-platform on .NET Framework 4.7.2+, .NET Standard 2.1, .NET 8, .NET 9, and .NET 10. Requires a valid PLCcom.Opc.Ua.PubSub license (30-day trial available). |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 10.5.6 | 151 | 6/29/2026 |
| 10.5.2 | 162 | 6/9/2026 |
| 10.5.1 | 150 | 5/26/2026 |
| 10.4.1 | 115 | 5/19/2026 |
| 10.3.4 | 121 | 5/7/2026 |
| 10.3.2 | 106 | 5/2/2026 |
| 10.3.1 | 125 | 4/27/2026 |
| 10.2.1 | 155 | 4/14/2026 |
| 10.1.6 | 188 | 3/28/2026 |
| 9.2.4.1 | 794 | 3/5/2025 |
| 9.2.3.1 | 419 | 11/20/2024 |
| 9.2.2.1 | 407 | 9/16/2024 |
| 9.1.1.2 | 1,319 | 7/3/2024 |
| 8.1.1.1 | 1,108 | 7/18/2023 |