// This example shows how to subscribe to dataset messages on an OPC-UA PubSub connection, and then unsubscribe from that
// dataset.
//
// In order to produce network messages for this example, run the UADemoPublisher tool. For documentation, see
// https://kb.opclabs.com/UADemoPublisher_Basics . In some cases, you may have to specify the interface name to be used.
//
// 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 System.Threading;
using OpcLabs.EasyOpc.UA.PubSub;
using OpcLabs.EasyOpc.UA.PubSub.OperationModel;
namespace UASubscriberDocExamples.PubSub._EasyUASubscriber
{
class UnsubscribeDataSet
{
public static void Main1()
{
// Define the PubSub connection we will work with. Uses implicit conversion from a string.
UAPubSubConnectionDescriptor pubSubConnectionDescriptor = "opc.udp://239.0.0.1";
// In some cases you may have to set the interface (network adapter) name that needs to be used, similarly to
// the statement below. Your actual interface name may differ, of course.
//pubSubConnectionDescriptor.ResourceAddress.InterfaceName = "Ethernet";
// Define the filter. Publisher Id (unsigned 64-bits) is 31, and the dataset writer Id is 1.
var filter = new UASubscribeDataSetFilter(UAPublisherId.CreateUInt64(31), UAWriterGroupDescriptor.Null, 1);
// Instantiate the subscriber object and hook events.
var subscriber = new EasyUASubscriber();
subscriber.DataSetMessage += subscriber_DataSetMessage;
Console.WriteLine("Subscribing...");
int dataSetHandle = subscriber.SubscribeDataSet(pubSubConnectionDescriptor, filter);
Console.WriteLine("Processing dataset message events for 20 seconds...");
Thread.Sleep(20 * 1000);
Console.WriteLine("Unsubscribing...");
subscriber.UnsubscribeDataSet(dataSetHandle);
Console.WriteLine("Waiting for 1 second...");
// Unsubscribe operation is asynchronous, messages may still come for a short while.
Thread.Sleep(1 * 1000);
Console.WriteLine("Finished.");
}
static void subscriber_DataSetMessage(object sender, EasyUADataSetMessageEventArgs e)
{
// Display the dataset.
if (e.Succeeded)
{
// An event with null DataSetData just indicates a successful connection.
if (!(e.DataSetData is null))
{
Console.WriteLine();
Console.WriteLine($"Dataset data: {e.DataSetData}");
foreach (KeyValuePair<string, UADataSetFieldData> pair in e.DataSetData.FieldDataDictionary)
Console.WriteLine(pair);
}
}
else
{
Console.WriteLine();
Console.WriteLine($"*** Failure: {e.ErrorMessageBrief}");
}
}
// Example output:
//
//Subscribing...
//Processing dataset message events for 20 seconds...
//
//Dataset data: Good; Data; publisher=(UInt64)31, writer=1, fields: 4
//[#0, True {System.Boolean}; Good]
//[#1, 7134 {System.Int32}; Good]
//[#2, 7364 {System.Int32}; Good]
//[#3, 10/1/2019 10:42:16 AM {System.DateTime}; Good]
//
//Dataset data: Good; Data; publisher=(UInt64)31, writer=1, fields: 4
//[#1, 7135 {System.Int32}; Good]
//[#2, 7429 {System.Int32}; Good]
//[#3, 10/1/2019 10:42:17 AM {System.DateTime}; Good]
//[#0, True {System.Boolean}; Good]
//
//Dataset data: Good; Data; publisher=(UInt64)31, writer=1, fields: 4
//[#2, 7495 {System.Int32}; Good]
//[#3, 10/1/2019 10:42:17 AM {System.DateTime}; Good]
//[#0, True {System.Boolean}; Good]
//[#1, 7135 {System.Int32}; Good]
//
//Dataset data: Good; Data; publisher=(UInt64)31, writer=1, fields: 4
//[#1, 7136 {System.Int32}; Good]
//[#2, 7560 {System.Int32}; Good]
//[#3, 10/1/2019 10:42:18 AM {System.DateTime}; Good]
//[#0, True {System.Boolean}; Good]
//
//Dataset data: Good; Data; publisher=(UInt64)31, writer=1, fields: 4
//[#2, 7626 {System.Int32}; Good]
//[#3, 10/1/2019 10:42:18 AM {System.DateTime}; Good]
//[#0, True {System.Boolean}; Good]
//[#1, 7136 {System.Int32}; Good]
//
//...
}
}
' This example shows how to subscribe to dataset messages on an OPC-UA PubSub connection, and then unsubscribe from that
' dataset.
'
' In order to produce network messages for this example, run the UADemoPublisher tool. For documentation, see
' https://kb.opclabs.com/UADemoPublisher_Basics . In some cases, you may have to specify the interface name to be used.
'
' 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.UA.PubSub
Imports OpcLabs.EasyOpc.UA.PubSub.OperationModel
Namespace PubSub._EasyUASubscriber
Friend Class UnsubscribeDataSet
Public Shared Sub Main1()
' Define the PubSub connection we will work with. Uses implicit conversion from a string.
Dim pubSubConnectionDescriptor As UAPubSubConnectionDescriptor = "opc.udp://239.0.0.1"
' In some cases you may have to set the interface (network adapter) name that needs to be used, similarly to
' the statement below. Your actual interface name may differ, of course.
' pubSubConnectionDescriptor.ResourceAddress.InterfaceName = "Ethernet"
' Define the filter. Publisher Id (unsigned 64-bits) is 31, and the dataset writer Id is 1.
Dim filter = New UASubscribeDataSetFilter(UAPublisherId.CreateUInt64(31), UAWriterGroupDescriptor.Null, 1)
' Instantiate the subscriber object and hook events.
Dim subscriber = New EasyUASubscriber()
AddHandler subscriber.DataSetMessage, AddressOf subscriber_DataSetMessage
Console.WriteLine("Subscribing...")
subscriber.SubscribeDataSet(pubSubConnectionDescriptor, filter)
Console.WriteLine("Processing dataset message events for 20 seconds...")
Threading.Thread.Sleep(20 * 1000)
Console.WriteLine("Unsubscribing...")
subscriber.UnsubscribeAllDataSets()
Console.WriteLine("Waiting for 1 second...")
' Unsubscribe operation is asynchronous, messages may still come for a short while.
Threading.Thread.Sleep(1 * 1000)
Console.WriteLine("Finished...")
End Sub
Private Shared Sub subscriber_DataSetMessage(ByVal sender As Object, ByVal e As EasyUADataSetMessageEventArgs)
' Display the dataset.
If e.Succeeded Then
' An event with null DataSetData just indicates a successful connection.
If e.DataSetData IsNot Nothing Then
Console.WriteLine()
Console.WriteLine($"Dataset data: {e.DataSetData}")
For Each pair As KeyValuePair(Of String, UADataSetFieldData) In e.DataSetData.FieldDataDictionary
Console.WriteLine(pair)
Next
End If
Else
Console.WriteLine()
Console.WriteLine($"*** Failure: {e.ErrorMessageBrief}")
End If
End Sub
End Class
' Example output
'
'Subscribing...
'Processing dataset message events for 20 seconds...
'
'Dataset data: Good; Data; publisher=(UInt64)31, writer=1, fields: 4
'[#0, True {System.Boolean}; Good]
'[#1, 7134 {System.Int32}; Good]
'[#2, 7364 {System.Int32}; Good]
'[#3, 10/1/2019 10:42:16 AM {System.DateTime}; Good]
'
'Dataset data: Good; Data; publisher=(UInt64)31, writer=1, fields: 4
'[#1, 7135 {System.Int32}; Good]
'[#2, 7429 {System.Int32}; Good]
'[#3, 10/1/2019 10:42:17 AM {System.DateTime}; Good]
'[#0, True {System.Boolean}; Good]
'
'Dataset data: Good; Data; publisher=(UInt64)31, writer=1, fields: 4
'[#2, 7495 {System.Int32}; Good]
'[#3, 10/1/2019 10:42:17 AM {System.DateTime}; Good]
'[#0, True {System.Boolean}; Good]
'[#1, 7135 {System.Int32}; Good]
'
'Dataset data: Good; Data; publisher=(UInt64)31, writer=1, fields: 4
'[#1, 7136 {System.Int32}; Good]
'[#2, 7560 {System.Int32}; Good]
'[#3, 10/1/2019 10:42:18 AM {System.DateTime}; Good]
'[#0, True {System.Boolean}; Good]
'
'Dataset data: Good; Data; publisher=(UInt64)31, writer=1, fields: 4
'[#2, 7626 {System.Int32}; Good]
'[#3, 10/1/2019 10:42:18 AM {System.DateTime}; Good]
'[#0, True {System.Boolean}; Good]
'[#1, 7136 {System.Int32}; Good]
'
'...
End Namespace
// This example shows how to subscribe to dataset messages on an OPC-UA PubSub connection, and then unsubscribe from that
// dataset.
//
// In order to produce network messages for this example, run the UADemoPublisher tool. For documentation, see
// https://kb.opclabs.com/UADemoPublisher_Basics . In some cases, you may have to specify the interface name to be used.
//
// Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html .
// OPC client and subscriber examples in Object Pascal (Delphi) on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-OP .
// 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.
type
TSubscriberEventHandlers82 = class
procedure OnDataSetMessage(
ASender: TObject;
sender: OleVariant;
const eventArgs: _EasyUADataSetMessageEventArgs);
end;
class procedure UnsubscribeDataSet.Main1;
var
ConnectionDescriptor: _UAPubSubConnectionDescriptor;
SubscribeDataSetArguments: _EasyUASubscribeDataSetArguments;
Subscriber: TEasyUASubscriber;
SubscriberEventHandlers: TSubscriberEventHandlers82;
begin
// Define the PubSub connection we will work with.
SubscribeDataSetArguments := CoEasyUASubscribeDataSetArguments.Create;
ConnectionDescriptor := SubscribeDataSetArguments.DataSetSubscriptionDescriptor.ConnectionDescriptor;
ConnectionDescriptor.ResourceAddress.ResourceDescriptor.UrlString := 'opc.udp://239.0.0.1';
// In some cases you may have to set the interface (network adapter) name that needs to be used, similarly to
// the statement below. Your actual interface name may differ, of course.
//ConnectionDescriptor.ResourceAddress.InterfaceName := 'Ethernet';
// Define the filter. Publisher Id (unsigned 64-bits) is 31, and the dataset writer Id is 1.
SubscribeDataSetArguments.DataSetSubscriptionDescriptor.Filter.PublisherId.SetIdentifier(UAPublisherIdType_UInt64, 31);
SubscribeDataSetArguments.DataSetSubscriptionDescriptor.Filter.DataSetWriterDescriptor.DataSetWriterId := 1;
// Instantiate the subscriber object and hook events.
Subscriber := TEasyUASubscriber.Create(nil);
SubscriberEventHandlers := TSubscriberEventHandlers82.Create;
Subscriber.OnDataSetMessage := SubscriberEventHandlers.OnDataSetMessage;
WriteLn('Subscribing...');
Subscriber.SubscribeDataSet(SubscribeDataSetArguments);
WriteLn('Processing dataset message for 20 seconds...');
PumpSleep(20*1000);
WriteLn('Unsubscribing...');
Subscriber.UnsubscribeAllDataSets;
WriteLn('Waiting for 1 second...');
// Unsubscribe operation is asynchronous, messages may still come for a short while.
PumpSleep(1*1000);
WriteLn('Finished.');
FreeAndNil(Subscriber);
FreeAndNil(SubscriberEventHandlers);
end;
procedure TSubscriberEventHandlers82.OnDataSetMessage(
ASender: TObject;
sender: OleVariant;
const eventArgs: _EasyUADataSetMessageEventArgs);
var
Count: Cardinal;
DictionaryEntry2: _DictionaryEntry2;
Element: OleVariant;
FieldDataDictionaryEnumerator: IEnumVariant;
begin
// Display the dataset.
if eventArgs.Succeeded then
begin
// An event with null DataSetData just indicates a successful connection.
if eventArgs.DataSetData <> nil then
begin
WriteLn;
WriteLn('Dataset data: ', eventArgs.DataSetData.ToString);
FieldDataDictionaryEnumerator := eventArgs.DataSetData.FieldDataDictionary.GetEnumerator;
while (FieldDataDictionaryEnumerator.Next(1, Element, Count) = S_OK) do
begin
DictionaryEntry2 := IUnknown(Element) as _DictionaryEntry2;
WriteLn(DictionaryEntry2.ToString);
end;
end;
end
else begin
WriteLn;
WriteLn('*** Failure: ', eventArgs.ErrorMessageBrief);
end;
end;
// Example output:
//
//Subscribing...
//Processing dataset message events for 20 seconds...
//
//Dataset data: Good; Data; publisher=(UInt64)31, writer=1, fields: 4
//[#0, True {System.Boolean}; Good]
//[#1, 7134 {System.Int32}; Good]
//[#2, 7364 {System.Int32}; Good]
//[#3, 10/1/2019 10:42:16 AM {System.DateTime}; Good]
//
//Dataset data: Good; Data; publisher=(UInt64)31, writer=1, fields: 4
//[#1, 7135 {System.Int32}; Good]
//[#2, 7429 {System.Int32}; Good]
//[#3, 10/1/2019 10:42:17 AM {System.DateTime}; Good]
//[#0, True {System.Boolean}; Good]
//
//Dataset data: Good; Data; publisher=(UInt64)31, writer=1, fields: 4
//[#2, 7495 {System.Int32}; Good]
//[#3, 10/1/2019 10:42:17 AM {System.DateTime}; Good]
//[#0, True {System.Boolean}; Good]
//[#1, 7135 {System.Int32}; Good]
//
//Dataset data: Good; Data; publisher=(UInt64)31, writer=1, fields: 4
//[#1, 7136 {System.Int32}; Good]
//[#2, 7560 {System.Int32}; Good]
//[#3, 10/1/2019 10:42:18 AM {System.DateTime}; Good]
//[#0, True {System.Boolean}; Good]
//
//Dataset data: Good; Data; publisher=(UInt64)31, writer=1, fields: 4
//[#2, 7626 {System.Int32}; Good]
//[#3, 10/1/2019 10:42:18 AM {System.DateTime}; Good]
//[#0, True {System.Boolean}; Good]
//[#1, 7136 {System.Int32}; Good]
//
//...
Rem This example shows how to subscribe to dataset messages on an OPC-UA PubSub connection, and then unsubscribe from that
Rem dataset.
Rem
Rem In order to produce network messages for this example, run the UADemoPublisher tool. For documentation, see
Rem https://kb.opclabs.com/UADemoPublisher_Basics . In some cases, you may have to specify the interface name to be used.
Rem
Rem Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html .
Rem OPC client and subscriber examples in VBScript on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-VBScript .
Rem Missing some example? Ask us for it on our Online Forums, https://www.opclabs.com/forum/index ! You do not have to own
Rem a commercial license in order to use Online Forums, and we reply to every post.
Option Explicit
Const UAPublisherIdType_UInt64 = 4
' Define the PubSub connection we will work with.
Dim SubscribeDataSetArguments: Set SubscribeDataSetArguments = CreateObject("OpcLabs.EasyOpc.UA.PubSub.OperationModel.EasyUASubscribeDataSetArguments")
Dim ConnectionDescriptor: Set ConnectionDescriptor = SubscribeDataSetArguments.DataSetSubscriptionDescriptor.ConnectionDescriptor
ConnectionDescriptor.ResourceAddress.ResourceDescriptor.UrlString = "opc.udp://239.0.0.1"
' In some cases you may have to set the interface (network adapter) name that needs to be used, similarly to
' the statement below. Your actual interface name may differ, of course.
' ConnectionDescriptor.ResourceAddress.InterfaceName = "Ethernet"
' Define the filter. Publisher Id (unsigned 64-bits) is 31, and the dataset writer Id is 1.
SubscribeDataSetArguments.DataSetSubscriptionDescriptor.Filter.PublisherId.SetIdentifier UAPublisherIdType_UInt64, 31
SubscribeDataSetArguments.DataSetSubscriptionDescriptor.Filter.DataSetWriterDescriptor.DataSetWriterId = 1
' Instantiate the subscriber object and hook events.
Dim Subscriber: Set Subscriber = CreateObject("OpcLabs.EasyOpc.UA.PubSub.EasyUASubscriber")
WScript.ConnectObject Subscriber, "Subscriber_"
WScript.Echo "Subscribing..."
Dim dataSetHandle: dataSetHandle = Subscriber.SubscribeDataSet(SubscribeDataSetArguments)
WScript.Echo "Processing dataset message events for 20 seconds..."
WScript.Sleep 20*1000
WScript.Echo "Unsubscribing..."
Subscriber.UnsubscribeDataSet dataSetHandle
WScript.Echo "Waiting for 1 second..."
' Unsubscribe operation is asynchronous, messages may still come for a short while.
WScript.Sleep 1*1000
WScript.Echo "Finished."
Sub Subscriber_DataSetMessage(Sender, e)
' Display the dataset.
If e.Succeeded Then
' An event with null DataSetData just indicates a successful connection.
If Not (e.DataSetData Is Nothing) Then
WScript.Echo
WScript.Echo "Dataset data: " & e.DataSetData
Dim Pair: For Each Pair in e.DataSetData.FieldDataDictionary
WScript.Echo Pair
Next
End If
Else
WScript.Echo
WScript.Echo "*** Failure: " & e.ErrorMessageBrief
End If
End Sub
' Example output:
'
'Subscribing...
'Processing dataset message events for 20 seconds...
'
'Dataset data: Good; Data; publisher=(UInt64)31, writer=1, fields: 4
'[#0, True {System.Boolean}; Good]
'[#1, 7134 {System.Int32}; Good]
'[#2, 7364 {System.Int32}; Good]
'[#3, 10/1/2019 10:42:16 AM {System.DateTime}; Good]
'
'Dataset data: Good; Data; publisher=(UInt64)31, writer=1, fields: 4
'[#1, 7135 {System.Int32}; Good]
'[#2, 7429 {System.Int32}; Good]
'[#3, 10/1/2019 10:42:17 AM {System.DateTime}; Good]
'[#0, True {System.Boolean}; Good]
'
'Dataset data: Good; Data; publisher=(UInt64)31, writer=1, fields: 4
'[#2, 7495 {System.Int32}; Good]
'[#3, 10/1/2019 10:42:17 AM {System.DateTime}; Good]
'[#0, True {System.Boolean}; Good]
'[#1, 7135 {System.Int32}; Good]
'
'Dataset data: Good; Data; publisher=(UInt64)31, writer=1, fields: 4
'[#1, 7136 {System.Int32}; Good]
'[#2, 7560 {System.Int32}; Good]
'[#3, 10/1/2019 10:42:18 AM {System.DateTime}; Good]
'[#0, True {System.Boolean}; Good]
'
'Dataset data: Good; Data; publisher=(UInt64)31, writer=1, fields: 4
'[#2, 7626 {System.Int32}; Good]
'[#3, 10/1/2019 10:42:18 AM {System.DateTime}; Good]
'[#0, True {System.Boolean}; Good]
'[#1, 7136 {System.Int32}; Good]
'
'...
REM This example shows how to subscribe to dataset messages on an OPC-UA PubSub connection, and then unsubscribe from that
REM dataset.
REM
REM In order to produce network messages for this example, run the UADemoPublisher tool. For documentation, see
REM https://kb.opclabs.com/UADemoPublisher_Basics . In some cases, you may have to specify the interface name to be used.
REM
REM Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html .
REM OPC client and subscriber examples in Visual Basic on GitHub: https://github.com/OPCLabs/Examples-QuickOPC-VB .
REM Missing some example? Ask us for it on our Online Forums, https://www.opclabs.com/forum/index ! You do not have to own
REM a commercial license in order to use Online Forums, and we reply to every post.
' The subscriber object, with events.
'Public WithEvents Subscriber11 As EasyUASubscriber
Private Sub EasyUASubscriber_UnsubscribeDataSet_Main1_Command_Click()
OutputText = ""
' Define the PubSub connection we will work with.
Dim subscribeDataSetArguments: Set subscribeDataSetArguments = CreateObject("OpcLabs.EasyOpc.UA.PubSub.OperationModel.EasyUASubscribeDataSetArguments")
Dim ConnectionDescriptor: Set ConnectionDescriptor = subscribeDataSetArguments.dataSetSubscriptionDescriptor.ConnectionDescriptor
ConnectionDescriptor.ResourceAddress.ResourceDescriptor.UrlString = "opc.udp://239.0.0.1"
' In some cases you may have to set the interface (network adapter) name that needs to be used, similarly to
' the statement below. Your actual interface name may differ, of course.
' ConnectionDescriptor.ResourceAddress.InterfaceName = "Ethernet"
' Define the filter. Publisher Id (unsigned 64-bits) is 31, and the dataset writer Id is 1.
subscribeDataSetArguments.dataSetSubscriptionDescriptor.Filter.PublisherId.SetIdentifier UAPublisherIdType_UInt64, 31
subscribeDataSetArguments.dataSetSubscriptionDescriptor.Filter.DataSetWriterDescriptor.DataSetWriterId = 1
' Instantiate the subscriber object and hook events.
Set Subscriber11 = New EasyUASubscriber
OutputText = OutputText & "Subscribing..." & vbCrLf
Subscriber11.SubscribeDataSet subscribeDataSetArguments
OutputText = OutputText & "Processing dataset message events for 20 seconds..." & vbCrLf
Pause 20 * 1000
OutputText = OutputText & "Unsubscribing..." & vbCrLf
Subscriber11.UnsubscribeAllDataSets
OutputText = OutputText & "Waiting for 1 second..." & vbCrLf
' Unsubscribe operation is asynchronous, messages may still come for a short while.
Pause 1000
Set Subscriber11 = Nothing
OutputText = OutputText & "Finished." & vbCrLf
End Sub
Private Sub Subscriber11_DataSetMessage(ByVal sender As Variant, ByVal eventArgs As EasyUADataSetMessageEventArgs)
' Display the dataset.
If eventArgs.Succeeded Then
' An event with null DataSetData just indicates a successful connection.
If Not (eventArgs.DataSetData Is Nothing) Then
OutputText = OutputText & vbCrLf
OutputText = OutputText & "Dataset data: " & eventArgs.DataSetData & vbCrLf
Dim Pair: For Each Pair In eventArgs.DataSetData.FieldDataDictionary
OutputText = OutputText & Pair & vbCrLf
Next
End If
Else
OutputText = OutputText & vbCrLf
OutputText = OutputText & "*** Failure: " & eventArgs.ErrorMessageBrief & vbCrLf
End If
End Sub
'
' Example output:
'
'Subscribing...
'Processing dataset message events for 20 seconds...
'
'Dataset data: Good; Data; publisher=(UInt64)31, writer=1, fields: 4
'[#0, True {System.Boolean}; Good]
'[#1, 7134 {System.Int32}; Good]
'[#2, 7364 {System.Int32}; Good]
'[#3, 10/1/2019 10:42:16 AM {System.DateTime}; Good]
'
'Dataset data: Good; Data; publisher=(UInt64)31, writer=1, fields: 4
'[#1, 7135 {System.Int32}; Good]
'[#2, 7429 {System.Int32}; Good]
'[#3, 10/1/2019 10:42:17 AM {System.DateTime}; Good]
'[#0, True {System.Boolean}; Good]
'
'Dataset data: Good; Data; publisher=(UInt64)31, writer=1, fields: 4
'[#2, 7495 {System.Int32}; Good]
'[#3, 10/1/2019 10:42:17 AM {System.DateTime}; Good]
'[#0, True {System.Boolean}; Good]
'[#1, 7135 {System.Int32}; Good]
'
'Dataset data: Good; Data; publisher=(UInt64)31, writer=1, fields: 4
'[#1, 7136 {System.Int32}; Good]
'[#2, 7560 {System.Int32}; Good]
'[#3, 10/1/2019 10:42:18 AM {System.DateTime}; Good]
'[#0, True {System.Boolean}; Good]
'
'Dataset data: Good; Data; publisher=(UInt64)31, writer=1, fields: 4
'[#2, 7626 {System.Int32}; Good]
'[#3, 10/1/2019 10:42:18 AM {System.DateTime}; Good]
'[#0, True {System.Boolean}; Good]
'[#1, 7136 {System.Int32}; Good]
'
'...
'
# This example shows how to subscribe to all dataset messages on an OPC-UA PubSub connection with UDP UADP mapping.
#
# In order to produce network messages for this example, run the UADemoPublisher tool. For documentation, see
# https://kb.opclabs.com/UADemoPublisher_Basics . In some cases, you may have to specify the interface name to be used.
#
# 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 time
# Import .NET namespaces.
from System import *
from OpcLabs.EasyOpc.UA.PubSub import *
from OpcLabs.EasyOpc.UA.PubSub.OperationModel import *
def dataSetMessage(sender, e):
# Display the dataset.
if e.Succeeded:
# An event with null DataSetData just indicates a successful connection.
if e.DataSetData is not None:
print('')
print('Dataset data: ', e.DataSetData, sep='')
for pair in e.DataSetData.FieldDataDictionary:
print(pair)
else:
print('')
print('*** Failure: ', e.ErrorMessageBrief, sep='')
# Define the PubSub connection we will work with. Uses implicit conversion from a string.
pubSubConnectionDescriptor = UAPubSubConnectionDescriptor.op_Implicit('opc.udp://239.0.0.1')
# In some cases you may have to set the interface (network adapter) name that needs to be used, similarly to
# the statement below. Your actual interface name may differ, of course.
# pubSubConnectionDescriptor.ResourceAddress.InterfaceName = 'Ethernet'
# Define the filter. Publisher Id (unsigned 64-bits) is 31, and the dataset writer Id is 1.
filter = UASubscribeDataSetFilter(UAPublisherId.CreateUInt64(Decimal(31)),
UAWriterGroupDescriptor.Null,
UADataSetWriterDescriptor(1)) # dataSetWriterDescriptor
# Instantiate the subscriber object and hook events.
subscriber = EasyUASubscriber()
subscriber.DataSetMessage += dataSetMessage
print('Subscribing...')
dataSetHandle = IEasyUASubscriberExtension.SubscribeDataSet(subscriber, pubSubConnectionDescriptor, filter)
print('Processing dataset message events for 20 seconds...')
time.sleep(20)
print('Unsubscribing...')
subscriber.UnsubscribeDataSet(dataSetHandle)
print('Waiting for 1 second...')
# Unsubscribe operation is asynchronous, messages may still come for a short while.
time.sleep(1)
subscriber.DataSetMessage -= dataSetMessage
print('Finished.')
# This example shows how to subscribe to all dataset messages on an OPC-UA PubSub connection with UDP UADP mapping.
#
# In order to produce network messages for this example, run the UADemoPublisher tool. For documentation, see
# http:#kb.opclabs.com/UADemoPublisher_Basics . In some cases, you may have to specify the interface name to be used.
#
# 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.BaseLib.Networking
using namespace OpcLabs.EasyOpc.UA
using namespace OpcLabs.EasyOpc.UA.PubSub
using namespace OpcLabs.EasyOpc.UA.PubSub.OperationModel
# The path below assumes that the current directory is [ProductDir]/Examples-NET/PowerShell/Windows .
Add-Type -Path "../../../Components/Opclabs.QuickOpc/net472/OpcLabs.EasyOpcUA.dll"
Add-Type -Path "../../../Components/Opclabs.QuickOpc/net472/OpcLabs.EasyOpcUAComponents.dll"
# Define the PubSub connection we will work with. Uses implicit conversion from a string.
[UAPubSubConnectionDescriptor]$pubSubConnectionDescriptor = [ResourceAddress]"opc.udp://239.0.0.1"
# In some cases you may have to set the interface (network adapter) name that needs to be used, similarly to
# the statement below. Your actual interface name may differ, of course.
#$pubSubConnectionDescriptor.ResourceAddress.InterfaceName = "Ethernet"
# Instantiate the subscriber object.
$subscriber = New-Object EasyUASubscriber
# Event notification handler
Register-ObjectEvent -InputObject $subscriber -EventName DataSetMessage -Action {
# Display the dataset.
if ($EventArgs.Succeeded) {
# An event with null DataSetData just indicates a successful connection.
if ($EventArgs.DataSetData -ne $null) {
Write-Host
Write-Host "Dataset data: $($EventArgs.DataSetData)"
foreach ($pair in $EventArgs.DataSetData.FieldDataDictionary.GetEnumerator()) {
Write-Host $pair
}
}
}
else {
Write-Host
Write-Host "*** Failure: $($EventArgs.ErrorMessageBrief)"
}
}
Write-Host "Subscribing..."
[IEasyUASubscriberExtension]::SubscribeDataSet($subscriber, $pubSubConnectionDescriptor)
Write-Host "Processing dataset message events for 20 seconds..."
$stopwatch = [System.Diagnostics.Stopwatch]::StartNew()
while ($stopwatch.Elapsed.TotalSeconds -lt 20) {
Start-Sleep -Seconds 1
}
Write-Host "Unsubscribing..."
$subscriber.UnsubscribeAllDataSets()
Write-Host "Waiting for 1 second..."
# Unsubscribe operation is asynchronous, messages may still come for a short while.
Start-Sleep -Seconds 1
Write-Host "Finished."
# Example output (truncated):
#
#Subscribing...
#Processing dataset message events for 20 seconds...
#
#Dataset data: Good; Data; publisher="32", writer=1, class=eae79794-1af7-4f96-8401-4096cd1d8908, fields: 4
#[#0, True {System.Boolean} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
#[#1, 7945 {System.Int32} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
#[#2, 5246 {System.Int32} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
#[#3, 9/30/2019 11:19:14 AM {System.DateTime} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
#
#Dataset data: Good; Data; publisher="32", writer=3, class=96976b7b-0db7-46c3-a715-0979884b55ae, fields: 100
#[#0, 45 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
#[#1, 145 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
#[#2, 245 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
#[#3, 345 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
#[#4, 445 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
#[#5, 545 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
#[#6, 645 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
#[#7, 745 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
#[#8, 845 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
#[#9, 945 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
#[#10, 1045 {System.Int64} @0001-01-01T00:00:00.000 @@0001-01-01T00:00:00.000; Good]
#...