// Shows how to configure the OPC UA Complex Data plug-in to use a shared data type model provider.
using System;
using System.Diagnostics;
using OpcLabs.EasyOpc.UA;
using OpcLabs.EasyOpc.UA.OperationModel;
using OpcLabs.EasyOpc.UA.Plugins.ComplexData;
namespace UADocExamples.ComplexData._UAComplexDataClientPluginParameters
{
class IsolatedDataTypeModelProvider
{
public static void Main1()
{
// Define which server and node we will work with.
UAEndpointDescriptor endpointDescriptor =
"opc.tcp://opcua.demo-this.com:51210/UA/SampleServer";
// or "http://opcua.demo-this.com:51211/UA/SampleServer" (not in .NET Standard)
// or "https://opcua.demo-this.com:51212/UA/SampleServer/"
UANodeDescriptor nodeDescriptor =
"nsu=http://test.org/UA/Data/ ;i=10239"; // [ObjectsFolder]/Data.Static.Scalar.StructureValue
// We will create two instances of EasyUAClient class, and configure each of them to use the shared data type
// model provider.
// Configure the first client object.
var client1 = new EasyUAClient();
UAComplexDataClientPluginParameters complexDataClientPluginParameters1 =
client1.InstanceParameters.PluginConfigurations.Find<UAComplexDataClientPluginParameters>();
Debug.Assert(complexDataClientPluginParameters1 != null);
complexDataClientPluginParameters1.IsolatedDataTypeModelProvider = false;
// Configure the second client object.
var client2 = new EasyUAClient();
UAComplexDataClientPluginParameters complexDataClientPluginParameters2 =
client2.InstanceParameters.PluginConfigurations.Find<UAComplexDataClientPluginParameters>();
Debug.Assert(complexDataClientPluginParameters2 != null);
complexDataClientPluginParameters2.IsolatedDataTypeModelProvider = false;
// We will now read the same complex data node using the two client objects.
//
// There is no noticeable difference in the results from the default state in which the client objects are
// set to use per-instance data type model provider. But, with the shared data type model provider, the metadata
// obtained during the read on the first client object and cached inside the data type model provider are reused
// during the read on the second client object, making this and the subsequent operations more efficient.
// Read the complex data node using the first client.
object value1;
try
{
value1 = client1.ReadValue(endpointDescriptor, nodeDescriptor);
}
catch (UAException uaException)
{
Console.WriteLine("*** Failure: {0}", uaException.GetBaseException().Message);
return;
}
Console.WriteLine(value1);
// Read the complex data node using the second client.
object value2;
try
{
value2 = client2.ReadValue(endpointDescriptor, nodeDescriptor);
}
catch (UAException uaException)
{
Console.WriteLine("*** Failure: {0}", uaException.GetBaseException().Message);
return;
}
Console.WriteLine(value2);
}
}
}
// Shows how to configure the OPC UA Complex Data plug-in to use a shared data type model provider.
class procedure IsolatedDataTypeModelProvider.Main;
var
Client1, Client2: _EasyUAClient;
ComplexDataClientPluginParameters1, ComplexDataClientPluginParameters2: OpcLabs_EasyOpcUA_TLB._UAComplexDataClientPluginParameters;
EndpointDescriptor: string;
NodeDescriptor: string;
Value1, Value2: OleVariant;
begin
// Define which server and node we will work with.
EndpointDescriptor :=
'http://opcua.demo-this.com:51211/UA/SampleServer';
//or 'https://opcua.demo-this.com:51212/UA/SampleServer/';
//or 'opc.tcp://opcua.demo-this.com:51210/UA/SampleServer';
NodeDescriptor := 'nsu=http://test.org/UA/Data/ ;i=10239'; // [ObjectsFolder]/Data.Static.Scalar.StructureValue
// We will create two instances of EasyUAClient class, and configure each of them to use the shared data type
// model provider.
// Configure the first client object.
Client1 := CoEasyUAClient.Create;
ComplexDataClientPluginParameters1 := IUnknown(Client1.InstanceParameters.PluginConfigurations.Find('OpcLabs.EasyOpc.UA.Plugins.ComplexData.UAComplexDataClientPluginParameters')) as OpcLabs_EasyOpcUA_TLB._UAComplexDataClientPluginParameters;
ComplexDataClientPluginParameters1.IsolatedDataTypeModelProvider := false;
// Configure the second client object.
Client2 := CoEasyUAClient.Create;
ComplexDataClientPluginParameters2 := IUnknown(Client2.InstanceParameters.PluginConfigurations.Find('OpcLabs.EasyOpc.UA.Plugins.ComplexData.UAComplexDataClientPluginParameters')) as OpcLabs_EasyOpcUA_TLB._UAComplexDataClientPluginParameters;
ComplexDataClientPluginParameters2.IsolatedDataTypeModelProvider := false;
// We will now read the same complex data node using the two client objects.
//
// There is no noticeable difference in the results from the default state in which the client objects are
// set to use per-instance data type model provider. But, with the shared data type model provider, the metadata
// obtained during the read on the first client object and cached inside the data type model provider are reused
// during the read on the second client object, making this and the subsequent operations more efficient.
// Read the complex data node using the first client.
try
Value1 := Client1.ReadValue(EndpointDescriptor, NodeDescriptor);
except
on E: EOleException do
begin
WriteLn(Format('*** Failure: %s', [E.GetBaseException.Message]));
Exit;
end;
end;
WriteLn(Value1);
// Read the complex data node using the second client.
try
Value2 := Client2.ReadValue(EndpointDescriptor, NodeDescriptor);
except
on E: EOleException do
begin
WriteLn(Format('*** Failure: %s', [E.GetBaseException.Message]));
Exit;
end;
end;
WriteLn(Value2);
end;
' Shows how to configure the OPC UA Complex Data plug-in to use a shared data type model provider.
Imports System
Imports OpcLabs.EasyOpc.UA
Imports OpcLabs.EasyOpc.UA.OperationModel
Imports OpcLabs.EasyOpc.UA.Plugins.ComplexData
Namespace UADocExamples.ComplexData._UAComplexDataClientPluginParameters
Friend Class IsolatedDataTypeModelProvider
Public Shared Sub Main1()
' Define which server we will work with.
Dim endpointDescriptor As UAEndpointDescriptor =
"opc.tcp://opcua.demo-this.com:51210/UA/SampleServer"
' or "http://opcua.demo-this.com:51211/UA/SampleServer" (not in .NET Standard)
' or "https://opcua.demo-this.com:51212/UA/SampleServer/"
' Define which node we will work with.
Dim nodeDescriptor As UANodeDescriptor =
"nsu=http://test.org/UA/Data/ ;i=10239" ' [ObjectsFolder]/Data.Static.Scalar.StructureValue
' We will create two instances of EasyUAClient class, and configure each of them to use the shared data type
' model provider.
' Configure the first client object.
Dim client1 = New EasyUAClient
Dim complexDataClientPluginParameters1 As UAComplexDataClientPluginParameters =
client1.InstanceParameters.PluginConfigurations.Find(Of UAComplexDataClientPluginParameters)()
Debug.Assert(complexDataClientPluginParameters1 IsNot Nothing)
complexDataClientPluginParameters1.IsolatedDataTypeModelProvider = False
' Configure the second client object.
Dim client2 = New EasyUAClient
Dim complexDataClientPluginParameters2 As UAComplexDataClientPluginParameters =
client2.InstanceParameters.PluginConfigurations.Find(Of UAComplexDataClientPluginParameters)()
Debug.Assert(complexDataClientPluginParameters2 IsNot Nothing)
complexDataClientPluginParameters2.IsolatedDataTypeModelProvider = False
' We will now read the same complex data node using the two client objects.
'
' There is no noticeable difference in the results from the default state in which the client objects are
' set to use per-instance data type model provider. But, with the shared data type model provider, the metadata
' obtained during the read on the first client object and cached inside the data type model provider are reused
' during the read on the second client object, making this and the subsequent operations more efficient.
' Read the complex data node using the first client.
Dim value1 As Object
Try
value1 = client1.ReadValue(endpointDescriptor, nodeDescriptor)
Catch uaException As UAException
Console.WriteLine("*** Failure: {0}", uaException.GetBaseException.Message)
Exit Sub
End Try
Console.WriteLine(value1)
' Read the complex data node using the second client.
Dim value2 As Object
Try
value2 = client2.ReadValue(endpointDescriptor, nodeDescriptor)
Catch uaException As UAException
Console.WriteLine("*** Failure: {0}", uaException.GetBaseException.Message)
Exit Sub
End Try
Console.WriteLine(value2)
End Sub
End Class
End Namespace
Rem Shows how to configure the OPC UA Complex Data plug-in to use a shared data type model provider.
Option Explicit
' Define which server and node we will work with.
Dim endpointDescriptor: endpointDescriptor = _
"http://opcua.demo-this.com:51211/UA/SampleServer"
'or "https://opcua.demo-this.com:51212/UA/SampleServer/"
'or "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer"
Dim nodeDescriptor: nodeDescriptor = _
"nsu=http://test.org/UA/Data/ ;i=10239" ' [ObjectsFolder]/Data.Static.Scalar.StructureValue
' We will create two instances of EasyUAClient class, and configure each of them to use the shared data type
' model provider.
' Configure the first client object.
Dim Client1: Set Client1 = CreateObject("OpcLabs.EasyOpc.UA.EasyUAClient")
Dim ComplexDataClientPluginParameters1: Set ComplexDataClientPluginParameters1 = Client1.InstanceParameters.PluginConfigurations.Find( _
"OpcLabs.EasyOpc.UA.Plugins.ComplexData.UAComplexDataClientPluginParameters")
ComplexDataClientPluginParameters1.IsolatedDataTypeModelProvider = False
' Configure the second client object.
Dim Client2: Set Client2 = CreateObject("OpcLabs.EasyOpc.UA.EasyUAClient")
Dim ComplexDataClientPluginParameters2: Set ComplexDataClientPluginParameters2 = Client2.InstanceParameters.PluginConfigurations.Find( _
"OpcLabs.EasyOpc.UA.Plugins.ComplexData.UAComplexDataClientPluginParameters")
ComplexDataClientPluginParameters2.IsolatedDataTypeModelProvider = False
' We will now read the same complex data node using the two client objects.
'
' There is no noticeable difference in the results from the default state in which the client objects are
' set to use per-instance data type model provider. But, with the shared data type model provider, the metadata
' obtained during the read on the first client object and cached inside the data type model provider are reused
' during the read on the second client object, making this and the subsequent operations more efficient.
' Read the complex data node using the first client.
On Error Resume Next
Dim Value1: Set Value1 = Client1.ReadValue(endpointDescriptor, nodeDescriptor)
If Err.Number <> 0 Then
WScript.Echo "*** Failure: " & Err.Source & ": " & Err.Description
WScript.Quit
End If
On Error Goto 0
WScript.Echo Value1
' Read the complex data node using the second client.
On Error Resume Next
Dim Value2: Set Value2 = Client2.ReadValue(endpointDescriptor, nodeDescriptor)
If Err.Number <> 0 Then
WScript.Echo "*** Failure: " & Err.Source & ": " & Err.Description
WScript.Quit
End If
On Error Goto 0
WScript.Echo Value2