// This example shows how to subscribe to changes of multiple monitored items // and display each change, identifying the different subscriptions by an // object. // // Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html . using System; using System.Threading; using OpcLabs.EasyOpc.UA; using OpcLabs.EasyOpc.UA.OperationModel; namespace UADocExamples._EasyUAClient { partial class SubscribeMultipleMonitoredItems { class CustomObject { public CustomObject(string name) { Name = name; } public string Name { get; } } public static void StateAsObject() { UAEndpointDescriptor endpointDescriptor = "opc.tcp://opcua.demo-this.com:51210/UA/SampleServer"; // or "http://opcua.demo-this.com:51211/UA/SampleServer" (currently not supported) // or "https://opcua.demo-this.com:51212/UA/SampleServer/" // Instantiate the client object and hook events var client = new EasyUAClient(); client.DataChangeNotification += ClientOnDataChangeNotification_StateAsObject; Console.WriteLine("Subscribing..."); int[] handleArray = client.SubscribeMultipleMonitoredItems(new[] { new EasyUAMonitoredItemArguments(null, endpointDescriptor, "nsu=http://test.org/UA/Data/ ;i=10845", 1000) {State = new CustomObject("First")}, // A custom object that corresponds to the subscription new EasyUAMonitoredItemArguments(null, endpointDescriptor, "nsu=http://test.org/UA/Data/ ;i=10853", 1000) {State = new CustomObject("Second")}, // A custom object that corresponds to the subscription new EasyUAMonitoredItemArguments(null, endpointDescriptor, "nsu=http://test.org/UA/Data/ ;i=10855", 1000) {State = new CustomObject("Third")}, // A custom object that corresponds to the subscription }); for (int i = 0; i < handleArray.Length; i++) Console.WriteLine($"handleArray[{i}]: {handleArray[i]}"); Console.WriteLine("Processing monitored item changed events for 10 seconds..."); Thread.Sleep(10 * 1000); Console.WriteLine("Unsubscribing..."); client.UnsubscribeAllMonitoredItems(); Console.WriteLine("Waiting for 5 seconds..."); Thread.Sleep(5 * 1000); Console.WriteLine("Finished."); } static void ClientOnDataChangeNotification_StateAsObject(object sender, EasyUADataChangeNotificationEventArgs eventArgs) { // Obtain the custom object we have passed in. var stateAsObject = (CustomObject) eventArgs.Arguments.State; // Display the data if (eventArgs.Succeeded) Console.WriteLine($"{stateAsObject.Name}: {eventArgs.AttributeData}"); else Console.WriteLine($"{stateAsObject.Name} *** Failure: {eventArgs.ErrorMessageBrief}"); } } }
# This example shows how to subscribe to changes of multiple monitored items # and display each change, identifying the different subscriptions by an # object. # # 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 . # The QuickOPC package is needed. Install it using "pip install opclabs_quickopc". import opclabs_quickopc import time # Import .NET namespaces. from OpcLabs.EasyOpc.UA import * from OpcLabs.EasyOpc.UA.OperationModel import * class CustomObject(object): def __init__(self, name): self.name = name def dataChangeNotification(sender, eventArgs): # Obtain the custom object we have passed in. stateAsObject = eventArgs.Arguments.State # Display value. if eventArgs.Succeeded: print(stateAsObject.name, ': ', eventArgs.AttributeData.Value, sep='') else: print(stateAsObject.name, ' *** Failure: ', eventArgs.ErrorMessageBrief, sep='') endpointDescriptor = UAEndpointDescriptor('opc.tcp://opcua.demo-this.com:51210/UA/SampleServer') # or 'http://opcua.demo-this.com:51211/UA/SampleServer' (currently not supported) # or 'https://opcua.demo-this.com:51212/UA/SampleServer/' # Instantiate the client object and hook events. client = EasyUAClient() client.DataChangeNotification += dataChangeNotification print('Subscribing...') monitoredItemArguments1 = EasyUAMonitoredItemArguments( None, endpointDescriptor, UANodeDescriptor('nsu=http://test.org/UA/Data/ ;i=10845'), UAMonitoringParameters(1000)) monitoredItemArguments1.State = CustomObject('First') # a custom object that corresponds to the subscription monitoredItemArguments2 = EasyUAMonitoredItemArguments( None, endpointDescriptor, UANodeDescriptor('nsu=http://test.org/UA/Data/ ;i=10853'), UAMonitoringParameters(1000)) monitoredItemArguments2.State = CustomObject('Second') # a custom object that corresponds to the subscription monitoredItemArguments3 = EasyUAMonitoredItemArguments( None, endpointDescriptor, UANodeDescriptor('nsu=http://test.org/UA/Data/ ;i=10855'), UAMonitoringParameters(1000)) monitoredItemArguments3.State = CustomObject('Third') # a custom object that corresponds to the subscription client.SubscribeMultipleMonitoredItems([ monitoredItemArguments1, monitoredItemArguments2, monitoredItemArguments3, ]) print('Processing data change events for 10 seconds...') time.sleep(10) print('Unsubscribing...') client.UnsubscribeAllMonitoredItems() print('Waiting for 5 seconds...') time.sleep(5) print('Finished.')
' This example shows how to subscribe to changes of multiple monitored items ' and display each change, identifying the different subscriptions by an ' object. ' ' Find all latest examples here: https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html . Imports OpcLabs.EasyOpc.UA Imports OpcLabs.EasyOpc.UA.OperationModel Namespace _EasyUAClient Partial Friend Class SubscribeMultipleMonitoredItems Class CustomObject Public Sub New(ByVal name As String) _Name = name End Sub Public ReadOnly Property Name As String Get Return _Name End Get End Property Private ReadOnly _Name As String End Class Public Shared Sub StateAsObject() ' 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" (currently not supported) ' or "https://opcua.demo-this.com:51212/UA/SampleServer/" ' Instantiate the client object and hook events Dim client = New EasyUAClient() AddHandler client.DataChangeNotification, AddressOf ClientOnDataChangeNotification_StateAsObject Console.WriteLine("Subscribing...") Dim handleArray() As Integer = client.SubscribeMultipleMonitoredItems(New EasyUAMonitoredItemArguments() _ { _ New EasyUAMonitoredItemArguments(Nothing, endpointDescriptor, _ "nsu=http://test.org/UA/Data/ ;i=10845", 1000) _ With {.State = New CustomObject("First")}, _ New EasyUAMonitoredItemArguments(Nothing, endpointDescriptor, _ "nsu=http://test.org/UA/Data/ ;i=10853", 1000) _ With {.State = New CustomObject("Second")}, _ New EasyUAMonitoredItemArguments(Nothing, endpointDescriptor, _ "nsu=http://test.org/UA/Data/ ;i=10855", 1000) _ With {.State = New CustomObject("Third")} _ } _ ) ' A custom object that corresponds to the subscription For i As Integer = 0 To handleArray.Length - 1 Console.WriteLine("handleArray[{0}]: {1}", i, handleArray(i)) Next i Console.WriteLine("Processing monitored item changed events for 10 seconds...") Threading.Thread.Sleep(10 * 1000) Console.WriteLine("Unsubscribing...") client.UnsubscribeAllMonitoredItems() Console.WriteLine("Waiting for 5 seconds...") Threading.Thread.Sleep(5 * 1000) Console.WriteLine("Finished.") End Sub Private Shared Sub ClientOnDataChangeNotification_StateAsObject(ByVal sender As Object, ByVal eventArgs As EasyUADataChangeNotificationEventArgs) ' Obtain the custom object we have passed in. Dim stateAsObject As CustomObject = CType(eventArgs.Arguments.State, CustomObject) ' Display the data If eventArgs.Succeeded Then Console.WriteLine("{0}: {1}", stateAsObject.Name, eventArgs.AttributeData) Else Console.WriteLine("{0} *** Failure: {1}", stateAsObject.Name, eventArgs.ErrorMessageBrief) End If End Sub End Class End Namespace
// This example shows how to subscribe to changes of multiple monitored items // and display each change, identifying the different subscriptions by an // object. // // Find all latest examples here : https://opclabs.doc-that.com/files/onlinedocs/OPCLabs-OpcStudio/Latest/examples.html . type TCustomObject = class Name: string; constructor Create(name: string); end; constructor TCustomObject.Create(name: string); begin Self.Name := name; end; type TObjectClientEventHandlers125 = class procedure OnDataChangeNotification( ASender: TObject; sender: OleVariant; const eventArgs: _EasyUADataChangeNotificationEventArgs); end; procedure TObjectClientEventHandlers125.OnDataChangeNotification( ASender: TObject; sender: OleVariant; const eventArgs: _EasyUADataChangeNotificationEventArgs); var stateAsObject: TCustomObject; begin // Obtain the custom object we have passed in. stateAsObject := TCustomObject(INT_PTR(eventArgs.Arguments.State)); // Display the data if eventArgs.Succeeded then WriteLn(stateAsObject.Name, ': ', eventArgs.AttributeData.ToString) else WriteLn(stateAsObject.Name, ' *** Failure: ', eventArgs.ErrorMessageBrief); end; class procedure SubscribeMultipleMonitoredItems.StateAsObject; var Arguments: OleVariant; Client: TEasyUAClient; ClientEventHandlers: TObjectClientEventHandlers125; Handle: Cardinal; HandleArray: OleVariant; I: Cardinal; MonitoredItemArguments1, MonitoredItemArguments2, MonitoredItemArguments3: _EasyUAMonitoredItemArguments; MonitoringParameters: _UAMonitoringParameters; CustomObject1, CustomObject2, CustomObject3: TCustomObject; begin CustomObject1 := TCustomObject.Create('First'); CustomObject2 := TCustomObject.Create('Second'); CustomObject3 := TCustomObject.Create('Third'); // Instantiate the client object and hook events Client := TEasyUAClient.Create(nil); ClientEventHandlers := TObjectClientEventHandlers125.Create; Client.OnDataChangeNotification := ClientEventHandlers.OnDataChangeNotification; WriteLn('Subscribing...'); MonitoringParameters := CoUAMonitoringParameters.Create; MonitoringParameters.SamplingInterval := 1000; MonitoredItemArguments1 := CoEasyUAMonitoredItemArguments.Create; MonitoredItemArguments1.EndpointDescriptor.UrlString := //'http://opcua.demo-this.com:51211/UA/SampleServer'; //'https://opcua.demo-this.com:51212/UA/SampleServer/'; 'opc.tcp://opcua.demo-this.com:51210/UA/SampleServer'; MonitoredItemArguments1.NodeDescriptor.NodeId.ExpandedText := 'nsu=http://test.org/UA/Data/ ;i=10845'; MonitoredItemArguments1.MonitoringParameters := MonitoringParameters; MonitoredItemArguments1.SetState(INT_PTR(CustomObject1)); // A custom object that corresponds to the subscription MonitoredItemArguments2 := CoEasyUAMonitoredItemArguments.Create; MonitoredItemArguments2.EndpointDescriptor.UrlString := //'http://opcua.demo-this.com:51211/UA/SampleServer'; //'https://opcua.demo-this.com:51212/UA/SampleServer/'; 'opc.tcp://opcua.demo-this.com:51210/UA/SampleServer'; MonitoredItemArguments2.NodeDescriptor.NodeId.ExpandedText := 'nsu=http://test.org/UA/Data/ ;i=10853'; MonitoredItemArguments2.MonitoringParameters := MonitoringParameters; MonitoredItemArguments2.SetState(INT_PTR(CustomObject2)); // A custom object that corresponds to the subscription MonitoredItemArguments3 := CoEasyUAMonitoredItemArguments.Create; MonitoredItemArguments3.EndpointDescriptor.UrlString := //'http://opcua.demo-this.com:51211/UA/SampleServer'; //'https://opcua.demo-this.com:51212/UA/SampleServer/'; 'opc.tcp://opcua.demo-this.com:51210/UA/SampleServer'; MonitoredItemArguments3.NodeDescriptor.NodeId.ExpandedText := 'nsu=http://test.org/UA/Data/ ;i=10855'; MonitoredItemArguments3.MonitoringParameters := MonitoringParameters; MonitoredItemArguments3.SetState(INT_PTR(CustomObject3)); // A custom object that corresponds to the subscription Arguments := VarArrayCreate([0, 2], varVariant); Arguments[0] := MonitoredItemArguments1; Arguments[1] := MonitoredItemArguments2; Arguments[2] := MonitoredItemArguments3; TVarData(HandleArray).VType := varArray or varVariant; TVarData(HandleArray).VArray := PVarArray( Client.SubscribeMultipleMonitoredItems(Arguments)); for I := VarArrayLowBound(HandleArray, 1) to VarArrayHighBound(HandleArray, 1) do begin Handle := Cardinal(HandleArray[I]); WriteLn('HandleArray[', I, ']: ', Handle); end; WriteLn('Processing monitored item changed events for 10 seconds...'); PumpSleep(10*1000); WriteLn('Unsubscribing...'); Client.UnsubscribeAllMonitoredItems; WriteLn('Waiting for 5 seconds...'); Sleep(5*1000); WriteLn('Finished.'); VarClear(HandleArray); VarClear(Arguments); FreeAndNil(Client); FreeAndNil(ClientEventHandlers); FreeAndNil(CustomObject1); FreeAndNil(CustomObject2); FreeAndNil(CustomObject3); end;
Copyright © 2004-2024 CODE Consulting and Development, s.r.o., Plzen. All rights reserved. Web page: www.opclabs.com
Send Documentation Feedback. Resources: Knowledge Base, Product Downloads. Technical support: Online Forums, FAQ.Missing some example? Ask us for it on our Online Forums! You do not have to own a commercial license in order to use Online Forums, and we reply to every post.