Services
Services
OpcSharp provides typed service interfaces for the most common OPC UA operations.
Attribute Service
Read and write node attributes.
// Read multiple values
var results = await client.ReadAsync(new[]
{
new ReadValueId { NodeId = new NodeId(0, 2258), AttributeId = AttributeIds.Value },
new ReadValueId { NodeId = new NodeId(0, 2259), AttributeId = AttributeIds.Value }
});
// Write a value
var statusCodes = await client.WriteAsync(new[]
{
new WriteValue
{
NodeId = new NodeId(2, "MyVar"),
AttributeId = AttributeIds.Value,
Value = new DataValue(new Variant(42))
}
});Browse Service
Navigate the server’s address space.
// Browse children of the Objects folder
var browseResults = await client.BrowseAsync(new[]
{
new BrowseDescription
{
NodeId = ObjectIds.ObjectsFolder,
BrowseDirection = BrowseDirection.Forward,
ReferenceTypeId = ReferenceTypeIds.HierarchicalReferences,
IncludeSubtypes = true,
ResultMask = (uint)BrowseResultMask.All
}
});
foreach (var reference in browseResults[0].References)
{
Console.WriteLine($"{reference.DisplayName} ({reference.NodeId})");
}
// Limit references per node (useful for large address spaces)
var pagedResults = await client.BrowseAsync(new[]
{
new BrowseDescription
{
NodeId = ObjectIds.ObjectsFolder,
BrowseDirection = BrowseDirection.Forward
}
}, requestedMaxReferencesPerNode: 100);TranslateBrowsePathsToNodeIds
Resolve nodes by path instead of NodeId:
// Batch API — takes BrowsePath[]
var results = await client.TranslateBrowsePathsToNodeIdsAsync(new[]
{
new BrowsePath
{
StartingNode = ObjectIds.ObjectsFolder,
RelativePath = RelativePath.Parse("Server/ServerStatus/CurrentTime")
}
});
// Convenience API — single path
var result = await client.TranslateBrowsePathAsync(
ObjectIds.ObjectsFolder,
"Server/ServerStatus/CurrentTime");Method Service
Call methods on the server.
var results = await client.CallAsync(new[]
{
new CallMethodRequest
{
ObjectId = new NodeId(2, "MyObject"),
MethodId = new NodeId(2, "MyMethod"),
InputArguments = new Variant[] { new Variant(42), new Variant("hello") }
}
});Subscription Service
Create and manage subscriptions for real-time data.
// Create a subscription
var subscription = await client.CreateSubscriptionAsync(
publishingInterval: 1000,
lifetimeCount: 60,
maxKeepAliveCount: 10);
// Delete subscriptions
var statusCodes = await client.DeleteSubscriptionsAsync(
new[] { subscription.SubscriptionId });MonitoredItem Service
Add items to a subscription to watch for changes.
// Create monitored items
var items = await client.CreateMonitoredItemsAsync(
subscription.SubscriptionId,
new[]
{
new MonitoredItemCreateRequest
{
ItemToMonitor = new ReadValueId
{
NodeId = new NodeId(0, 2258),
AttributeId = AttributeIds.Value
},
MonitoringMode = MonitoringMode.Reporting,
RequestedParameters = new MonitoringParameters
{
SamplingInterval = 500,
QueueSize = 10,
DiscardOldest = true
}
}
});
// Handle data changes
client.DataChanged += (sender, args) =>
{
Console.WriteLine($"Node {args.NodeId}: {args.Value}");
};
// Modify monitored items at runtime
var modifyResults = await client.ModifyMonitoredItemsAsync(
subscription.SubscriptionId,
new[]
{
new MonitoredItemModifyRequest
{
MonitoredItemId = items[0].MonitoredItemId,
RequestedParameters = new MonitoringParameters
{
SamplingInterval = 100
}
}
});
// Delete monitored items
var deleteResults = await client.DeleteMonitoredItemsAsync(
subscription.SubscriptionId,
new[] { items[0].MonitoredItemId });Discovery Service
Discover available endpoints on a server.
// Get available endpoints
var endpoints = await client.GetEndpointsAsync();
foreach (var ep in endpoints)
{
Console.WriteLine($"{ep.EndpointUrl} — {ep.SecurityPolicyUri} [{ep.SecurityMode}]");
}Note:
FindServersAsync()is available on the lower-levelIDiscoveryServiceinterface, not directly onIOpcSharpClient.