// This example shows how to obtain all nodes under the "Simulation" branch of the address space. For each node, it displays
// whether the node is a branch or a leaf.
//
// Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html .
// OPC client and subscriber examples in C# on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-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.EasyOpc.DataAccess;
using OpcLabs.EasyOpc.DataAccess.AddressSpace;
using OpcLabs.EasyOpc.OperationModel;
namespace DocExamples.DataAccess._EasyDAClient
{
partial class BrowseNodes
{
public static void Main1()
{
// Instantiate the client object.
var client = new EasyDAClient();
DANodeElementCollection nodeElements;
try
{
nodeElements = client.BrowseNodes("", "OPCLabs.KitServer.2", "Greenhouse", DABrowseParameters.Default);
}
catch (OpcException opcException)
{
Console.WriteLine($"*** Failure: {opcException.GetBaseException().Message}");
return;
}
foreach (DANodeElement nodeElement in nodeElements)
{
Console.WriteLine($"NodeElements(\"{nodeElement.Name}\"):");
Console.WriteLine($" .IsBranch: {nodeElement.IsBranch}");
Console.WriteLine($" .IsLeaf: {nodeElement.IsLeaf}");
}
}
}
}
# This example shows how to obtain all nodes under the "Simulation" branch of the address space. For each node, it displays
# whether the node is a branch or a leaf.
#
# Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html .
# OPC client and subscriber examples in PowerShell on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-PowerShell .
# 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.
#requires -Version 5.1
using namespace OpcLabs.EasyOpc.OperationModel
using namespace OpcLabs.EasyOpc.DataAccess
# The path below assumes that the current directory is [ProductDir]/Examples-NET/PowerShell/Windows .
Add-Type -Path "../../../Components/Opclabs.QuickOpc/net472/OpcLabs.EasyOpcClassicCore.dll"
Add-Type -Path "../../../Components/Opclabs.QuickOpc/net472/OpcLabs.EasyOpcClassic.dll"
Add-Type -Path "../../../Components/Opclabs.QuickOpc/net472/OpcLabs.EasyOpcClassicComponents.dll"
# Instantiate the client object.
$client = New-Object EasyDAClient
try {
$nodeElements = [IEasyDAClientExtension]::BrowseNodes($client,
"", "OPCLabs.KitServer.2", "Greenhouse", [DABrowseParameters]::Default)
}
catch [OpcException] {
Write-Host "*** Failure: $($PSItem.Exception.GetBaseException().Message)"
return
}
Foreach ($nodeElement in $nodeElements) {
Write-Host "NodeElements(`"$($nodeElement.Name)`"):"
Write-Host " .IsBranch: $($nodeElement.IsBranch)"
Write-Host " .IsLeaf: $($nodeElement.IsLeaf)"
}
' This example shows how to obtain all nodes under the "Simulation" branch of the address space. For each node, it displays
' whether the node is a branch or a leaf.
'
' 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 OpcLabs.EasyOpc.DataAccess
Imports OpcLabs.EasyOpc.DataAccess.AddressSpace
Imports OpcLabs.EasyOpc.OperationModel
Namespace DataAccess._EasyDAClient
Partial Friend Class BrowseNodes
Shared Sub Main1()
Dim client = New EasyDAClient()
Dim nodeElements As DANodeElementCollection
Try
nodeElements = client.BrowseNodes("", "OPCLabs.KitServer.2", "Greenhouse", DABrowseParameters.Default)
Catch opcException As OpcException
Console.WriteLine("*** Failure: {0}", opcException.GetBaseException().Message)
Exit Sub
End Try
For Each nodeElement In nodeElements
Console.WriteLine($"NodeElements(""{nodeElement.Name}""):")
Console.WriteLine($" .IsBranch: {nodeElement.IsBranch}")
Console.WriteLine($" .IsLeaf: {nodeElement.IsLeaf}")
Next nodeElement
End Sub
End Class
End Namespace
# This example shows how to obtain all nodes under the "Simulation" branch of the address space. For each node, it displays
# whether the node is a branch or a leaf.
#
# Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html .
# OPC client and subscriber examples in Python on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-Python .
# 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.
# The QuickOPC package is needed. Install it using "pip install opclabs_quickopc".
import opclabs_quickopc
# Import .NET namespaces.
from OpcLabs.EasyOpc.DataAccess import *
from OpcLabs.EasyOpc.OperationModel import *
# Instantiate the client object
client = EasyDAClient()
# Perform the operation
try:
nodeElements = IEasyDAClientExtension.BrowseNodes(client,
'', 'OPCLabs.KitServer.2', 'Greenhouse', DABrowseParameters.Default)
except OpcException as opcException:
print('*** Failure: ' + opcException.GetBaseException().Message)
exit()
# Display results
for nodeElement in nodeElements:
print('NodeElements("' + nodeElement.Name + '"):')
print(' .IsBranch:', nodeElement.IsBranch)
print(' .IsLeaf:', nodeElement.IsLeaf)
# Example output:
#
#NodeElements("Register_ArrayOfI1"):
# .IsBranch: False
# .IsLeaf: True
#NodeElements("Register_ArrayOfI2"):
# .IsBranch: False
# .IsLeaf: True
#NodeElements("Register_ArrayOfI4"):
# .IsBranch: False
# .IsLeaf: True
#NodeElements("Staircase 0:2 (10 s)"):
# .IsBranch: False
# .IsLeaf: True
#NodeElements("Constant_VARIANT"):
# .IsBranch: False
# .IsLeaf: True
#...
// This example shows how to obtain data types of leaves in the OPC-DA address
// space by browsing and filtering, i.e. without the use of OPC properties.
// This technique allows determining the data types with servers that only
// support OPC-DA 1.0. It can also be more effective than the use of
// GetMultiplePropertyValues, if there is large number of leaves, and
// relatively small number of data types to be checked.
//
// Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html .
// OPC client and subscriber examples in C# on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-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 System.Collections.Generic;
using OpcLabs.BaseLib.ComInterop;
using OpcLabs.EasyOpc.DataAccess;
using OpcLabs.EasyOpc.DataAccess.AddressSpace;
using OpcLabs.EasyOpc.OperationModel;
namespace DocExamples.DataAccess._EasyDAClient
{
partial class BrowseNodes
{
public static void DataTypes()
{
// Instantiate the client object.
var client = new EasyDAClient();
// Define the list of data types we will be checking for.
// Change as needed for your application.
// This technique is only usable if there is a known list of
// data types you are interested in. If you are interested in
// all leaves, even those that are of data types not explicitly
// listed, always include VarTypes.Empty as the first data type.
// The leaves of "unlisted" data types will have VarTypes.Empty
// associated with them.
var dataTypes = new VarType[] { VarTypes.Empty, VarTypes.I2, VarTypes.R4 };
// For each leaf found, this dictionary wil hold its associated data type.
var dataTypeDictionary = new Dictionary<DANodeElement, VarType>();
// For each data type, browse for leaves of this data type.
foreach (VarType dataType in dataTypes)
{
var browseParameters = new DABrowseParameters(DABrowseFilter.Leaves, "", "", dataType);
DANodeElementCollection nodeElements;
try
{
nodeElements = client.BrowseNodes("", "OPCLabs.KitServer.2", "Greenhouse", browseParameters);
}
catch (OpcException opcException)
{
Console.WriteLine("*** Failure: {0}", opcException.GetBaseException().Message);
return;
}
// Store the leaf information into the dictionary, and
// associate the current data type with it.
foreach (var nodeElement in nodeElements)
dataTypeDictionary[nodeElement] = dataType;
}
// Display each leaf found, and its associated data type.
foreach (KeyValuePair<DANodeElement, VarType> pair in dataTypeDictionary)
{
DANodeElement nodeElement = pair.Key;
VarType dataType = pair.Value;
Console.WriteLine("{0}: {1}", nodeElement, dataType);
}
}
}
}
' This example shows how to obtain data types of leaves in the OPC-DA address
' space by browsing and filtering, i.e. without the use of OPC properties.
' This technique allows determining the data types with servers that only
' support OPC-DA 1.0. It can also be more effective than the use of
' GetMultiplePropertyValues, if there is large number of leaves, and
' relatively small number of data types to be checked.
'
' 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 OpcLabs.BaseLib.ComInterop
Imports OpcLabs.EasyOpc.DataAccess
Imports OpcLabs.EasyOpc.DataAccess.AddressSpace
Imports OpcLabs.EasyOpc.OperationModel
Namespace DataAccess._EasyDAClient
Partial Friend Class BrowseNodes
Shared Sub DataTypes()
Dim client = New EasyDAClient()
' Define the list of data types we will be checking for.
' Change as needed for your application.
' This technique is only usable if there is a known list of
' data types you are interested in. If you are interested in
' all leaves, even those that are of data types not explicitly
' listed, always include VarTypes.Empty as the first data type.
' The leaves of "unlisted" data types will have VarTypes.Empty
' associated with them.
Dim dataTypes() = New VarType() {VarTypes.Empty, VarTypes.I2, VarTypes.R4}
' For each leaf found, this dictionary wil hold its associated data type.
Dim dataTypeDictionary = New Dictionary(Of DANodeElement, VarType)()
' For each data type, browse for leaves of this data type.
For Each dataType As VarType In dataTypes
Dim browseParameters = New DABrowseParameters(DABrowseFilter.Leaves, "", "", dataType)
Dim nodeElements As DANodeElementCollection
Try
nodeElements = client.BrowseNodes("", "OPCLabs.KitServer.2", "Greenhouse", browseParameters)
Catch opcException As OpcException
Console.WriteLine("*** Failure: {0}", opcException.GetBaseException().Message)
Exit Sub
End Try
' Store the leaf information into the dictionary, and
' associate the current data type with it.
For Each nodeElement In nodeElements
dataTypeDictionary(nodeElement) = dataType
Next nodeElement
Next dataType
For Each pair In dataTypeDictionary
Dim nodeElement As DANodeElement = pair.Key
Dim dataType As VarType = pair.Value
Console.WriteLine("{0}: {1}", nodeElement, dataType)
Next pair
End Sub
End Class
End Namespace
# This example shows how to obtain data types of leaves in the OPC-DA address
# space by browsing and filtering, i.e. without the use of OPC properties.
# This technique allows determining the data types with servers that only
# support OPC-DA 1.0. It can also be more effective than the use of
# GetMultiplePropertyValues, if there is large number of leaves, and
# relatively small number of data types to be checked.
#
# Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html .
# OPC client and subscriber examples in Python on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-Python .
# 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.
# The QuickOPC package is needed. Install it using "pip install opclabs_quickopc".
import opclabs_quickopc
# Import .NET namespaces.
from OpcLabs.BaseLib.ComInterop import *
from OpcLabs.EasyOpc.DataAccess import *
from OpcLabs.EasyOpc.OperationModel import *
# Instantiate the client object.
client = EasyDAClient()
# Define the list of data types we will be checking for.
# Change as needed for your application.
# This technique is only usable if there is a known list of
# data types you are interested in. If you are interested in
# all leaves, even those that are of data types not explicitly
# listed, always include VarTypes.Empty as the first data type.
# The leaves of "unlisted" data types will have VarTypes.Empty
# associated with them.
dataTypes = [VarType(VarTypes.Empty), VarType(VarTypes.I2), VarType(VarTypes.R4)]
# For each leaf found, this dictionary wil hold its associated data type.
dataTypeDictionary = {}
# For each data type, browse for leaves of this data type.
for dataType in dataTypes:
browseParameters = DABrowseParameters(DABrowseFilter.Leaves, '', '', dataType)
try:
nodeElements = IEasyDAClientExtension.BrowseNodes(client,
'', 'OPCLabs.KitServer.2', 'Greenhouse', browseParameters)
except OpcException as opcException:
print('*** Failure: ' + opcException.GetBaseException().Message)
exit()
# Store the leaf information into the dictionary, and
# associate the current data type with it.
for nodeElement in nodeElements:
dataTypeDictionary[nodeElement] = dataType
# Display each leaf found, and its associated data type.
for nodeElement, dataType in dataTypeDictionary.items():
print(nodeElement, ': ', dataType, sep='')
// This example shows how to recursively browse the nodes in the OPC address space.
//
// Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html .
// OPC client and subscriber examples in C# on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-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 System.Diagnostics;
using OpcLabs.EasyOpc;
using OpcLabs.EasyOpc.DataAccess;
using OpcLabs.EasyOpc.DataAccess.AddressSpace;
using OpcLabs.EasyOpc.OperationModel;
namespace DocExamples.DataAccess._EasyDAClient
{
partial class BrowseNodes
{
public static void Recursive()
{
var stopwatch = new Stopwatch();
stopwatch.Start();
// Instantiate the client object.
var client = new EasyDAClient();
_branchCount = 0;
_leafCount = 0;
try
{
BrowseFromNode(client, "OPCLabs.KitServer.2", "");
}
catch (OpcException opcException)
{
Console.WriteLine("*** Failure: {0}", opcException.GetBaseException().Message);
return;
}
stopwatch.Stop();
Console.WriteLine("Browsing has taken (milliseconds): {0}", stopwatch.ElapsedMilliseconds);
Console.WriteLine("Branch count: {0}", _branchCount);
Console.WriteLine("Leaf count: {0}", _leafCount);
}
private static void BrowseFromNode(
EasyDAClient client,
ServerDescriptor serverDescriptor,
DANodeDescriptor parentNodeDescriptor)
{
Debug.Assert(client != null);
Debug.Assert(serverDescriptor != null);
Debug.Assert(parentNodeDescriptor != null);
// Obtain all node elements under parentNodeDescriptor
var browseParameters = new DABrowseParameters(); // no filtering whatsoever
DANodeElementCollection nodeElementCollection =
client.BrowseNodes(serverDescriptor, parentNodeDescriptor, browseParameters);
// Remark: that BrowseNodes(...) may also throw OpcException; a production code should contain handling for
// it, here omitted for brevity.
foreach (DANodeElement nodeElement in nodeElementCollection)
{
Debug.Assert(nodeElement != null);
Console.WriteLine(nodeElement);
// If the node is a branch, browse recursively into it.
if (nodeElement.IsBranch)
{
_branchCount++;
BrowseFromNode(client, serverDescriptor, nodeElement);
}
else
{
_leafCount++;
}
}
}
private static int _branchCount;
private static int _leafCount;
}
}
' This example shows how to recursively browse the nodes in the OPC address space.
'
' 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 OpcLabs.EasyOpc
Imports OpcLabs.EasyOpc.DataAccess
Imports OpcLabs.EasyOpc.DataAccess.AddressSpace
Imports OpcLabs.EasyOpc.OperationModel
Namespace DataAccess._EasyDAClient
Partial Friend Class BrowseNodes
Shared Sub Recursive()
Dim stopwatch = New Stopwatch()
stopwatch.Start()
Dim client = New EasyDAClient()
_branchCount = 0
_leafCount = 0
Try
BrowseFromNode(client, "OPCLabs.KitServer.2", "")
Catch opcException As OpcException
Console.WriteLine("*** Failure: {0}", opcException.GetBaseException().Message)
Exit Sub
End Try
stopwatch.Stop()
Console.WriteLine("Browsing has taken (milliseconds): {0}", stopwatch.ElapsedMilliseconds)
Console.WriteLine("Branch count: {0}", _branchCount)
Console.WriteLine("Leaf count: {0}", _leafCount)
End Sub
Private Shared Sub BrowseFromNode( _
client As EasyDAClient,
serverDescriptor As ServerDescriptor,
parentNodeDescriptor As DANodeDescriptor)
Debug.Assert(client IsNot Nothing)
Debug.Assert(serverDescriptor IsNot Nothing)
Debug.Assert(parentNodeDescriptor IsNot Nothing)
' Obtain all node elements under parentNodeDescriptor
Dim browseParameters = New DABrowseParameters() ' no filtering whatsoever
Dim nodeElementCollection As DANodeElementCollection =
client.BrowseNodes(serverDescriptor, parentNodeDescriptor, browseParameters)
' Remark: that BrowseNodes(...) may also throw OpcException; a production code should contain handling for
' it, here omitted for brevity.
For Each nodeElement As DANodeElement In nodeElementCollection
Debug.Assert(nodeElement IsNot Nothing)
Console.WriteLine(nodeElement)
' If the node is a branch, browse recursively into it.
If nodeElement.IsBranch Then
_branchCount += 1
BrowseFromNode(client, serverDescriptor, nodeElement)
Else
_leafCount += 1
End If
Next nodeElement
End Sub
Private Shared _branchCount As Integer
Private Shared _leafCount As Integer
End Class
End Namespace
# This example shows how to recursively browse the nodes in the OPC address space.
#
# Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html .
# OPC client and subscriber examples in Python on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-Python .
# 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.
# The QuickOPC package is needed. Install it using "pip install opclabs_quickopc".
import opclabs_quickopc
import timeit
# Import .NET namespaces.
from OpcLabs.EasyOpc import *
from OpcLabs.EasyOpc.DataAccess import *
from OpcLabs.EasyOpc.OperationModel import *
def browseFromNode(client, serverDescriptor, parentNodeDescriptor):
global branchCount
global leafCount
assert client is not None
assert serverDescriptor is not None
assert parentNodeDescriptor is not None
# Obtain all node elements under parentNodeDescriptor.
browseParameters = DABrowseParameters() # no filtering whatsoever
nodeElementCollection = client.BrowseNodes(serverDescriptor, parentNodeDescriptor, browseParameters)
# BrowseNodes(...) may also throw OpcException; here it is handled by the caller.
for nodeElement in nodeElementCollection:
assert nodeElement is not None
print(nodeElement)
# If the node is a branch, browse recursively into it.
if nodeElement.IsBranch:
branchCount = branchCount + 1
browseFromNode(client, serverDescriptor, DANodeDescriptor(nodeElement))
else:
leafCount = leafCount + 1
beginTime = timeit.default_timer()
# Instantiate the client object.
client = EasyDAClient()
branchCount = 0
leafCount = 0
try:
browseFromNode(client, ServerDescriptor('OPCLabs.KitServer.2'), DANodeDescriptor(''))
except OpcException as opcException:
print('*** Failure: ' + opcException.GetBaseException().Message)
exit()
endTime = timeit.default_timer()
print()
print('Browsing has taken (milliseconds): ',(endTime - beginTime)*1000)
print('Branch count: ', branchCount);
print('Leaf count: ', leafCount);
// Recursively browses and displays the nodes in the OPC address space, and attempts to read and display values of all OPC
// items it finds.
//
// Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html .
// OPC client and subscriber examples in C# on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-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 System.Diagnostics;
using OpcLabs.EasyOpc.DataAccess;
using OpcLabs.EasyOpc.DataAccess.AddressSpace;
using OpcLabs.EasyOpc.OperationModel;
namespace DocExamples.DataAccess._EasyDAClient
{
partial class BrowseNodes
{
const string ServerClass = "OPCLabs.KitServer.2";
// Instantiate the client object.
static readonly EasyDAClient Client = new EasyDAClient();
static void BrowseAndReadFromNode(string parentItemId)
{
// Obtain all node elements under parentItemId
var browseParameters = new DABrowseParameters(); // no filtering whatsoever
DANodeElementCollection nodeElementCollection = Client.BrowseNodes("", ServerClass, parentItemId,
browseParameters);
// Remark: that BrowseNodes(...) may also throw OpcException; a production code should contain handling for it, here
// omitted for brevity.
foreach (DANodeElement nodeElement in nodeElementCollection)
{
Debug.Assert(nodeElement != null);
// If the node is a leaf, it might be possible to read from it
if (nodeElement.IsLeaf)
{
// Determine what the display - either the value read, or exception message in case of failure.
string display;
try
{
object value = Client.ReadItemValue("", ServerClass, nodeElement);
display = $"{value}";
}
catch (OpcException exception)
{
display = $"** {exception.GetBaseException().Message} **";
}
Console.WriteLine("{0} -> {1}", nodeElement.ItemId, display);
}
// If the node is not a leaf, just display its itemId
else
Console.WriteLine("{0}", nodeElement.ItemId);
// If the node is a branch, browse recursively into it.
if (nodeElement.IsBranch &&
(nodeElement.ItemId != "SimulateEvents")
/* this branch is too big for the purpose of this example */)
BrowseAndReadFromNode(nodeElement);
}
}
public static void RecursiveWithRead()
{
Console.WriteLine("Browsing and reading values...");
// Set timeout to only wait 1 second - default would be 1 minute to wait for good quality that may never come.
Client.InstanceParameters.Timeouts.ReadItem = 1000;
// Do the actual browsing and reading, starting from root of OPC address space (denoted by empty string for itemId)
try
{
BrowseAndReadFromNode("");
}
catch (OpcException opcException)
{
Console.WriteLine("*** Failure: {0}", opcException.GetBaseException().Message);
}
}
}
}
' Recursively browses and displays the nodes in the OPC address space, and attempts to read and display values of all OPC
' items it finds.
'
' 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 OpcLabs.EasyOpc.DataAccess
Imports OpcLabs.EasyOpc.DataAccess.AddressSpace
Imports OpcLabs.EasyOpc.OperationModel
Namespace DataAccess._EasyDAClient
Partial Friend Class BrowseNodes
Private Const ServerClass As String = "OPCLabs.KitServer.2"
Private Shared ReadOnly Client As New EasyDAClient()
Private Shared Sub BrowseAndReadFromNode(parentItemId As String)
' Obtain all node elements under parentItemId
Dim browseParameters = New DABrowseParameters() ' no filtering whatsoever
Dim nodeElementCollection As DANodeElementCollection = Client.BrowseNodes("", ServerClass, parentItemId, browseParameters)
' Remark: that BrowseNodes(...) may also throw OpcException; a production code should contain handling for it, here
' omitted for brevity.
For Each nodeElement As DANodeElement In nodeElementCollection
Debug.Assert(nodeElement IsNot Nothing)
' If the node is a leaf, it might be possible to read from it
If nodeElement.IsLeaf Then
' Determine what the display - either the value read, or exception message in case of failure.
Dim display As String
Try
Dim value As Object = Client.ReadItemValue("", ServerClass, nodeElement.ItemId)
display = String.Format("{0}", value)
Catch exception As OpcException
display = String.Format("** {0} **", exception.GetBaseException().Message)
End Try
Console.WriteLine("{0} -> {1}", nodeElement.ItemId, display)
' If the node is not a leaf, just display its itemId
Else
Console.WriteLine("{0}", nodeElement.ItemId)
End If
' If the node is a branch, browse recursively into it.
If nodeElement.IsBranch AndAlso (nodeElement.ItemId <> "SimulateEvents") Then ' this branch is too big for the purpose of this example
BrowseAndReadFromNode(nodeElement.ItemId)
End If
Next nodeElement
End Sub
Shared Sub RecursiveWithRead()
Console.WriteLine("Browsing and reading values...")
' Set timeout to only wait 1 second - default would be 1 minute to wait for good quality that may never come.
Client.InstanceParameters.Timeouts.ReadItem = 1000
' Do the actual browsing and reading, starting from root of OPC address space (denoted by empty string for itemId)
Try
BrowseAndReadFromNode("")
Catch opcException As OpcException
Console.WriteLine("*** Failure: {0}", opcException.GetBaseException().Message)
Exit Sub
End Try
End Sub
End Class
End Namespace
# Recursively browses and displays the nodes in the OPC address space, and attempts to read and display values of all
# OPC items it finds.
#
# Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html .
# OPC client and subscriber examples in Python on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-Python .
# 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.
# The QuickOPC package is needed. Install it using "pip install opclabs_quickopc".
import opclabs_quickopc
# Import .NET namespaces.
from OpcLabs.EasyOpc import *
from OpcLabs.EasyOpc.DataAccess import *
from OpcLabs.EasyOpc.OperationModel import *
SERVER_CLASS = 'OPCLabs.KitServer.2'
def browseAndReadFromNode(parentItemId):
global client
#
# Obtain all node elements under parentItemId.
browseParameters = DABrowseParameters() # no filtering whatsoever
nodeElementCollection = client.BrowseNodes(ServerDescriptor(SERVER_CLASS),
DANodeDescriptor(parentItemId),
browseParameters)
# BrowseNodes(...) may also throw OpcException; here it is handled by the caller.
#
for nodeElement in nodeElementCollection:
assert nodeElement is not None
print(nodeElement)
# If the node is a leaf, it might be possible to read from it.
if nodeElement.IsLeaf:
# Determine what to display - either the value read, or exception message in case of failure.
try:
value = IEasyDAClientExtension.ReadItemValue(client, '', SERVER_CLASS, nodeElement.ItemId)
display = value
except OpcException as opcException:
display = '** ' + opcException.GetBaseException().Message + ' **'
#
print(nodeElement.ItemId, ' -> ', display, sep='')
# If the node is not a leaf, just display its itemId.
else:
print(nodeElement.ItemId)
# If the node is a branch, browse recursively into it.
if nodeElement.IsBranch and nodeElement.ItemId != 'SimulateEvents':
# this branch is too big for the purpose of this example
browseAndReadFromNode(nodeElement.ItemId)
# Instantiate the client object.
client = EasyDAClient('Browsing and reading values...')
print('Browsing and reading values...')
# Do the actual browsing and reading, starting from root of OPC address space (denoted by empty string for itemId).
try:
browseAndReadFromNode('')
except OpcException as opcException:
print('*** Failure: ' + opcException.GetBaseException().Message)
exit()
print()
print('Finished.')
// This example shows how to recursively browse the nodes in the OPC XML-DA address space.
//
// Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html .
// OPC client and subscriber examples in C# on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-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 System.Diagnostics;
using OpcLabs.EasyOpc;
using OpcLabs.EasyOpc.DataAccess;
using OpcLabs.EasyOpc.DataAccess.AddressSpace;
using OpcLabs.EasyOpc.OperationModel;
namespace DocExamples.DataAccess.Xml
{
class BrowseNodes
{
public static void RecursiveXml()
{
var stopwatch = new Stopwatch();
stopwatch.Start();
// Instantiate the client object.
var client = new EasyDAClient();
_branchCount = 0;
_leafCount = 0;
try
{
BrowseFromNode(client, "http://opcxml.demo-this.com/XmlDaSampleServer/Service.asmx", "");
}
catch (OpcException opcException)
{
Console.WriteLine("*** Failure: {0}", opcException.GetBaseException().Message);
return;
}
stopwatch.Stop();
Console.WriteLine("Browsing has taken (milliseconds): {0}", stopwatch.ElapsedMilliseconds);
Console.WriteLine("Branch count: {0}", _branchCount);
Console.WriteLine("Leaf count: {0}", _leafCount);
}
private static void BrowseFromNode(
EasyDAClient client,
ServerDescriptor serverDescriptor,
DANodeDescriptor parentNodeDescriptor)
{
Debug.Assert(client != null);
Debug.Assert(serverDescriptor != null);
Debug.Assert(parentNodeDescriptor != null);
// Obtain all node elements under parentNodeDescriptor
var browseParameters = new DABrowseParameters(); // no filtering whatsoever
DANodeElementCollection nodeElementCollection =
client.BrowseNodes(serverDescriptor, parentNodeDescriptor, browseParameters);
// Remark: that BrowseNodes(...) may also throw OpcException; a production code should contain handling for
// it, here omitted for brevity.
foreach (DANodeElement nodeElement in nodeElementCollection)
{
Debug.Assert(nodeElement != null);
Console.WriteLine(nodeElement);
// If the node is a branch, browse recursively into it.
if (nodeElement.IsBranch)
{
_branchCount++;
BrowseFromNode(client, serverDescriptor, nodeElement);
}
else
{
_leafCount++;
}
}
}
private static int _branchCount;
private static int _leafCount;
}
}
' This example shows how to recursively browse the nodes in the OPC XML-DA address space.
'
' 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 OpcLabs.EasyOpc
Imports OpcLabs.EasyOpc.DataAccess
Imports OpcLabs.EasyOpc.DataAccess.AddressSpace
Imports OpcLabs.EasyOpc.OperationModel
Namespace DataAccess.Xml
Partial Friend Class BrowseNodes
Shared Sub RecursiveXml()
Dim stopwatch = New Stopwatch()
stopwatch.Start()
Dim client = New EasyDAClient()
_branchCount = 0
_leafCount = 0
Try
BrowseFromNode(client, "http://opcxml.demo-this.com/XmlDaSampleServer/Service.asmx", "")
Catch opcException As OpcException
Console.WriteLine("*** Failure: {0}", opcException.GetBaseException().Message)
Exit Sub
End Try
stopwatch.Stop()
Console.WriteLine("Browsing has taken (milliseconds): {0}", stopwatch.ElapsedMilliseconds)
Console.WriteLine("Branch count: {0}", _branchCount)
Console.WriteLine("Leaf count: {0}", _leafCount)
End Sub
Private Shared Sub BrowseFromNode( _
client As EasyDAClient,
serverDescriptor As ServerDescriptor,
parentNodeDescriptor As DANodeDescriptor)
Debug.Assert(client IsNot Nothing)
Debug.Assert(serverDescriptor IsNot Nothing)
Debug.Assert(parentNodeDescriptor IsNot Nothing)
' Obtain all node elements under parentNodeDescriptor
Dim browseParameters = New DABrowseParameters() ' no filtering whatsoever
Dim nodeElementCollection As DANodeElementCollection =
client.BrowseNodes(serverDescriptor, parentNodeDescriptor, browseParameters)
' Remark: that BrowseNodes(...) may also throw OpcException; a production code should contain handling for
' it, here omitted for brevity.
For Each nodeElement As DANodeElement In nodeElementCollection
Debug.Assert(nodeElement IsNot Nothing)
Console.WriteLine(nodeElement)
' If the node is a branch, browse recursively into it.
If nodeElement.IsBranch Then
_branchCount += 1
BrowseFromNode(client, serverDescriptor, nodeElement)
Else
_leafCount += 1
End If
Next nodeElement
End Sub
Private Shared _branchCount As Integer
Private Shared _leafCount As Integer
End Class
End Namespace
# This example shows how to recursively browse the nodes in the OPC XML-DA address space.
#
# Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html .
# OPC client and subscriber examples in Python on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-Python .
# 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.
# The QuickOPC package is needed. Install it using "pip install opclabs_quickopc".
import opclabs_quickopc
import timeit
# Import .NET namespaces.
from OpcLabs.EasyOpc import *
from OpcLabs.EasyOpc.DataAccess import *
from OpcLabs.EasyOpc.OperationModel import *
def browseFromNode(client, serverDescriptor, parentNodeDescriptor):
global branchCount
global leafCount
assert client is not None
assert serverDescriptor is not None
assert parentNodeDescriptor is not None
# Obtain all node elements under parentNodeDescriptor.
browseParameters = DABrowseParameters() # no filtering whatsoever
nodeElementCollection = client.BrowseNodes(serverDescriptor, parentNodeDescriptor, browseParameters)
# BrowseNodes(...) may also throw OpcException; here it is handled by the caller.
for nodeElement in nodeElementCollection:
assert nodeElement is not None
print(nodeElement)
# If the node is a branch, browse recursively into it.
if nodeElement.IsBranch:
branchCount = branchCount + 1
browseFromNode(client, serverDescriptor, DANodeDescriptor(nodeElement))
else:
leafCount = leafCount + 1
beginTime = timeit.default_timer()
# Instantiate the client object.
client = EasyDAClient()
branchCount = 0
leafCount = 0
try:
browseFromNode(client,
ServerDescriptor('http://opcxml.demo-this.com/XmlDaSampleServer/Service.asmx'),
DANodeDescriptor(''))
except OpcException as opcException:
print('*** Failure: ' + opcException.GetBaseException().Message)
exit()
endTime = timeit.default_timer()
print()
print('Browsing has taken (milliseconds): ',(endTime - beginTime)*1000)
print('Branch count: ', branchCount);
print('Leaf count: ', leafCount);