// This example shows how to display all fields of incoming events, or extract specific fields.
type
THelperMethods15 = class
class function ObjectTypeIds_BaseEventType: _UANodeId; static;
class function UAFilterElements_SimpleAttribute(TypeId: _UANodeId; simpleRelativeBrowsePathString: string): _UASimpleAttributeOperand; static;
class function UABaseEventObject_Operands_SourceName: _UASimpleAttributeOperand; static;
class function UABaseEventObject_Operands_Message: _UASimpleAttributeOperand; static;
end;
type
TClientEventHandlers15 = class
procedure Client_EventNotification(
ASender: TObject;
sender: OleVariant;
const eventArgs: _EasyUAEventNotificationEventArgs);
end;
procedure TClientEventHandlers15.Client_EventNotification(
ASender: TObject;
sender: OleVariant;
const eventArgs: _EasyUAEventNotificationEventArgs);
var
AttributeField: OleVariant;
Count: Cardinal;
Element: OleVariant;
EntryEnumerator: IEnumVARIANT;
ValueResult: OleVariant;
begin
WriteLn;
// Display the event
if eventArgs.EventData = nil then
begin
WriteLn(eventArgs.ToString);
Exit;
end;
WriteLn('All fields:');
EntryEnumerator := eventArgs.EventData.FieldResults.GetEnumerator;
while (EntryEnumerator.Next(1, Element, Count) = S_OK) do
begin
AttributeField := IUnknown(Element.Key) as _UAAttributeField;
ValueResult := IUnknown(Element.Value) as _ValueResult;
WriteLn(' ', AttributeField.ToString, ' -> ', ValueResult.ToString);
end;
// Extracting specific fields using an event type ID and a simple relative path
WriteLn('Source name: ', eventArgs.EventData.FieldResults.Item[THelperMethods15.UABaseEventObject_Operands_SourceName.ToUAAttributeField].ToString);
WriteLn('Message: ', eventArgs.EventData.FieldResults.Item[THelperMethods15.UABaseEventObject_Operands_Message.ToUAAttributeField].ToString);
end;
class procedure FieldResults.Main;
const
UAObjectIds_Server = 'nsu=http://opcfoundation.org/UA/;i=2253';
var
Client: TEasyUAClient;
ClientEventHandlers: TClientEventHandlers15;
EndpointDescriptor: string;
begin
EndpointDescriptor := 'opc.tcp://opcua.demo-this.com:62544/Quickstarts/AlarmConditionServer';
// Instantiate the client object and hook events
Client := TEasyUAClient.Create(nil);
ClientEventHandlers := TClientEventHandlers15.Create;
Client.OnEventNotification := ClientEventHandlers.Client_EventNotification;
WriteLn('Subscribing...');
Client.SubscribeEvent(EndpointDescriptor, UAObjectIds_Server, 1000);
WriteLn('Processing event notifications for 30 seconds...');
PumpSleep(30*1000);
WriteLn('Unsubscribing...');
Client.UnsubscribeAllMonitoredItems;
WriteLn('Waiting for 5 seconds...');
Sleep(5*1000);
WriteLn('Finished.');
FreeAndNil(Client);
FreeAndNil(ClientEventHandlers);
end;
// Example output (truncated):
//Subscribing...
//Processing event notifications for 30 seconds...
//
//[] Success
//
///[] Success; Refresh; RefreshInitiated
//
//All fields:
// NodeId="BaseEventType", NodeId -> Success; nsu=http://opcfoundation.org/Quickstarts/AlarmCondition ;ns=2;s=1:Colours/EastTank?OnlineState {OpcLabs.EasyOpc.UA.AddressSpace.UANodeId}
// NodeId="BaseEventType"/EventId -> Success; [16] {95, 68, 22, 205, 114, ...} {System.Byte[]}
// NodeId="BaseEventType"/EventType -> Success; DialogConditionType {OpcLabs.EasyOpc.UA.AddressSpace.UANodeId}
// NodeId="BaseEventType"/SourceNode -> Success; nsu=http://opcfoundation.org/Quickstarts/AlarmCondition ;ns=2;s=1:Colours/EastTank {OpcLabs.EasyOpc.UA.AddressSpace.UANodeId}
// NodeId="BaseEventType"/SourceName -> Success; EastTank {System.String}
// NodeId="BaseEventType"/Time -> Success; 9/10/2019 8:08:23 PM {System.DateTime}
// NodeId="BaseEventType"/ReceiveTime -> Success; 9/10/2019 8:08:23 PM {System.DateTime}
// NodeId="BaseEventType"/LocalTime -> Success; 00:00, DST {OpcLabs.EasyOpc.UA.UATimeZoneData}
// NodeId="BaseEventType"/Message -> Success; The dialog was activated {System.String}
// NodeId="BaseEventType"/Severity -> Success; 100 {System.Int32}
//Source name: Success; EastTank {System.String}
//Message: Success; The dialog was activated {System.String}
//
//All fields:
// NodeId="BaseEventType", NodeId -> Success; nsu=http://opcfoundation.org/Quickstarts/AlarmCondition ;ns=2;s=1:Colours/EastTank?Red {OpcLabs.EasyOpc.UA.AddressSpace.UANodeId}
// NodeId="BaseEventType"/EventId -> Success; [16] {124, 156, 219, 54, 120, ...} {System.Byte[]}
// NodeId="BaseEventType"/EventType -> Success; ExclusiveDeviationAlarmType {OpcLabs.EasyOpc.UA.AddressSpace.UANodeId}
// NodeId="BaseEventType"/SourceNode -> Success; nsu=http://opcfoundation.org/Quickstarts/AlarmCondition ;ns=2;s=1:Colours/EastTank {OpcLabs.EasyOpc.UA.AddressSpace.UANodeId}
// NodeId="BaseEventType"/SourceName -> Success; EastTank {System.String}
// NodeId="BaseEventType"/Time -> Success; 10/14/2019 4:00:13 PM {System.DateTime}
// NodeId="BaseEventType"/ReceiveTime -> Success; 10/14/2019 4:00:13 PM {System.DateTime}
// NodeId="BaseEventType"/LocalTime -> Success; 00:00, DST {OpcLabs.EasyOpc.UA.UATimeZoneData}
// NodeId="BaseEventType"/Message -> Success; The alarm was acknoweledged. {System.String}
// NodeId="BaseEventType"/Severity -> Success; 500 {System.Int32}
//Source name: Success; EastTank {System.String}
//Message: Success; The alarm was acknoweledged. {System.String}
//
//...
class function THelperMethods15.ObjectTypeIds_BaseEventType: _UANodeId;
var NodeId: _UANodeId;
begin
NodeId := CoUANodeId.Create;
NodeId.StandardName := 'BaseEventType';
Result := NodeId;
end;
class function THelperMethods15.UAFilterElements_SimpleAttribute(TypeId: _UANodeId; simpleRelativeBrowsePathString: string): _UASimpleAttributeOperand;
var
BrowsePathParser: _UABrowsePathParser;
Operand: _UASimpleAttributeOperand;
begin
BrowsePathParser := CoUABrowsePathParser.Create;
Operand := CoUASimpleAttributeOperand.Create;
Operand.TypeId.NodeId := TypeId;
Operand.QualifiedNames := BrowsePathParser.ParseRelative(simpleRelativeBrowsePathString).ToUAQualifiedNameCollection;
Result := Operand;
end;
class function THelperMethods15.UABaseEventObject_Operands_SourceName: _UASimpleAttributeOperand;
begin
Result := UAFilterElements_SimpleAttribute(ObjectTypeIds_BaseEventType, '/SourceName');
end;
class function THelperMethods15.UABaseEventObject_Operands_Message: _UASimpleAttributeOperand;
begin
Result := UAFilterElements_SimpleAttribute(ObjectTypeIds_BaseEventType, '/Message');
end;
// This example shows how to display all fields of incoming events, or extract specific fields.
class ClientEvents {
function EventNotification($Sender, $E)
{
printf("\n");
// Display the event
if (is_null($E->EventData)) {
printf("%s\n", $E);
return;
}
printf("All fields:\n");
foreach ($E->EventData->FieldResults as $Pair)
{
$AttributeField = $Pair->Key;
$ValueResult = $Pair->Value;
printf(" %s -> %s\n", $AttributeField, $ValueResult);
}
// Extracting specific fields using an event type ID and a simple relative path
printf("Source name: %s\n", $E->EventData->FieldResults->Item(UABaseEventObject_Operands_SourceName()->ToUAAttributeField()));
printf("Message: %s\n", $E->EventData->FieldResults->Item(UABaseEventObject_Operands_Message()->ToUAAttributeField()));
}
}
const UAObjectIds_Server = "nsu=http://opcfoundation.org/UA/;i=2253";
$EndpointDescriptor = "opc.tcp://opcua.demo-this.com:62544/Quickstarts/AlarmConditionServer";
// Instantiate the client object and hook events
$Client = new COM("OpcLabs.EasyOpc.UA.EasyUAClient");
$ClientEvents = new ClientEvents();
com_event_sink($Client, $ClientEvents, "DEasyUAClientEvents");
printf("Subscribing...\n");
$Client->SubscribeEvent($EndpointDescriptor, UAObjectIds_Server, 1000);
printf("Processing event notifications for 30 seconds...\n");
$startTime = time(); do { com_message_pump(1000); } while (time() < $startTime + 30);
printf("Unsubscribing...\n");
$Client->UnsubscribeAllMonitoredItems;
printf("Waiting for 5 seconds...\n");
$startTime = time(); do { com_message_pump(1000); } while (time() < $startTime + 5);
function ObjectTypeIds_BaseEventType() {
$NodeId = new COM("OpcLabs.EasyOpc.UA.AddressSpace.UANodeId");
$NodeId->StandardName = "BaseEventType";
return $NodeId;
}
function UAFilterElements_SimpleAttribute($TypeId, $simpleRelativeBrowsePathString) {
$BrowsePathParser = new COM("OpcLabs.EasyOpc.UA.Navigation.Parsing.UABrowsePathParser");
$Operand = new COM("OpcLabs.EasyOpc.UA.Filtering.UASimpleAttributeOperand");
$Operand->TypeId->NodeId = $TypeId;
$Operand->QualifiedNames = $BrowsePathParser->ParseRelative($simpleRelativeBrowsePathString)->ToUAQualifiedNameCollection;
return $Operand;
}
function UABaseEventObject_Operands_SourceName() {
return UAFilterElements_SimpleAttribute(ObjectTypeIds_BaseEventType(), "/SourceName");
}
function UABaseEventObject_Operands_Message() {
return UAFilterElements_SimpleAttribute(ObjectTypeIds_BaseEventType(), "/Message");
}
// Example output (truncated):
//Subscribing...
//Processing event notifications for 30 seconds...
//
//[] Success
//
//[] Success; Refresh; RefreshInitiated
//
//All fields:
// NodeId="BaseEventType", NodeId -> Success; nsu=http://opcfoundation.org/Quickstarts/AlarmCondition ;ns=2;s=1:Colours/EastTank?OnlineState {OpcLabs.EasyOpc.UA.AddressSpace.UANodeId}
// NodeId="BaseEventType"/EventId -> Success; [16] {95, 68, 22, 205, 114, ...} {System.Byte[]}
// NodeId="BaseEventType"/EventType -> Success; DialogConditionType {OpcLabs.EasyOpc.UA.AddressSpace.UANodeId}
// NodeId="BaseEventType"/SourceNode -> Success; nsu=http://opcfoundation.org/Quickstarts/AlarmCondition ;ns=2;s=1:Colours/EastTank {OpcLabs.EasyOpc.UA.AddressSpace.UANodeId}
// NodeId="BaseEventType"/SourceName -> Success; EastTank {System.String}
// NodeId="BaseEventType"/Time -> Success; 9/10/2019 8:08:23 PM {System.DateTime}
// NodeId="BaseEventType"/ReceiveTime -> Success; 9/10/2019 8:08:23 PM {System.DateTime}
// NodeId="BaseEventType"/LocalTime -> Success; 00:00, DST {OpcLabs.EasyOpc.UA.UATimeZoneData}
// NodeId="BaseEventType"/Message -> Success; The dialog was activated {System.String}
// NodeId="BaseEventType"/Severity -> Success; 100 {System.Int32}
//Source name: Success; EastTank {System.String}
//Message: Success; The dialog was activated {System.String}
//
//All fields:
// NodeId="BaseEventType", NodeId -> Success; nsu=http://opcfoundation.org/Quickstarts/AlarmCondition ;ns=2;s=1:Colours/EastTank?Red {OpcLabs.EasyOpc.UA.AddressSpace.UANodeId}
// NodeId="BaseEventType"/EventId -> Success; [16] {124, 156, 219, 54, 120, ...} {System.Byte[]}
// NodeId="BaseEventType"/EventType -> Success; ExclusiveDeviationAlarmType {OpcLabs.EasyOpc.UA.AddressSpace.UANodeId}
// NodeId="BaseEventType"/SourceNode -> Success; nsu=http://opcfoundation.org/Quickstarts/AlarmCondition ;ns=2;s=1:Colours/EastTank {OpcLabs.EasyOpc.UA.AddressSpace.UANodeId}
// NodeId="BaseEventType"/SourceName -> Success; EastTank {System.String}
// NodeId="BaseEventType"/Time -> Success; 10/14/2019 4:00:13 PM {System.DateTime}
// NodeId="BaseEventType"/ReceiveTime -> Success; 10/14/2019 4:00:13 PM {System.DateTime}
// NodeId="BaseEventType"/LocalTime -> Success; 00:00, DST {OpcLabs.EasyOpc.UA.UATimeZoneData}
// NodeId="BaseEventType"/Message -> Success; The alarm was acknoweledged. {System.String}
// NodeId="BaseEventType"/Severity -> Success; 500 {System.Int32}
//Source name: Success; EastTank {System.String}
//Message: Success; The alarm was acknoweledged. {System.String}
//
//...
Rem This example shows how to display all fields of incoming events, or extract specific fields.
Option Explicit
Const uaObjectIds_Server = "nsu=http://opcfoundation.org/UA/;i=2253"
Dim endpointDescriptor
endpointDescriptor = "opc.tcp://opcua.demo-this.com:62544/Quickstarts/AlarmConditionServer"
' Instantiate the client object and hook events
Dim Client: Set Client = CreateObject("OpcLabs.EasyOpc.UA.EasyUAClient")
WScript.ConnectObject Client, "Client_"
WScript.Echo "Subscribing..."
Client.SubscribeEvent endpointDescriptor, uaObjectIds_Server, 1000
WScript.Echo "Processing event notifications for 30 seconds..."
WScript.Sleep 30*1000
WScript.Echo "Unsubscribing..."
Client.UnsubscribeAllMonitoredItems
WScript.Echo "Waiting for 5 seconds..."
WScript.Sleep 5*1000
Function UAFilterElements_SimpleAttribute(TypeId, simpleRelativeBrowsePathString)
Dim BrowsePathParser: Set BrowsePathParser = CreateObject("OpcLabs.EasyOpc.UA.Navigation.Parsing.UABrowsePathParser")
Dim QualifiedNames: Set QualifiedNames = BrowsePathParser.ParseRelative(simpleRelativeBrowsePathString).ToUAQualifiedNAmeCollection
Dim SimpleAttributeOperand: Set SimpleAttributeOperand = CreateObject("OpcLabs.EasyOpc.UA.Filtering.UASimpleAttributeOperand")
Set SimpleAttributeOperand.TypeId.NodeId = TypeId
Set SimpleAttributeOperand.QualifiedNames = QualifiedNames
Set UAFilterElements_SimpleAttribute = SimpleAttributeOperand
End Function
Function ObjectTypeIds_BaseEventType
Dim NodeId: Set NodeId = CreateObject("OpcLabs.EasyOpc.UA.AddressSpace.UANodeId")
NodeId.StandardName = "BaseEventType"
Set ObjectTypeIds_BaseEventType = NodeId
End Function
Function UABaseEventObject_Operands_Message
Set UABaseEventObject_Operands_Message = UAFilterElements_SimpleAttribute(ObjectTypeIds_BaseEventType, "/Message")
End Function
Function UABaseEventObject_Operands_SourceName
Set UABaseEventObject_Operands_SourceName = UAFilterElements_SimpleAttribute(ObjectTypeIds_BaseEventType, "/SourceName")
End Function
Sub Client_EventNotification(Sender, e)
WScript.Echo
' Display the event
If e.EventData Is Nothing Then
WScript.Echo e
Exit Sub
End If
WScript.Echo "All fields:"
Dim Pair: For Each Pair In e.EventData.FieldResults
Dim AttributeField: Set AttributeField = Pair.Key
Dim ValueResult: Set ValueResult = Pair.Value
WScript.Echo " " & AttributeField & " -> " & ValueResult
Next
' Extracting specific fields using an event type ID and a simple relative path
WScript.Echo "Source name: " & e.EventData.FieldResults.Item(UABaseEventObject_Operands_SourceName.ToUAAttributeField)
WScript.Echo "Message: " & e.EventData.FieldResults.Item(UABaseEventObject_Operands_Message.ToUAAttributeField)
End Sub
' Example output (truncated):
'Subscribing...
'Processing event notifications for 30 seconds...
'
'[] Success
'
'[] Success; Refresh; RefreshInitiated
'
'All fields:
' NodeId="BaseEventType", NodeId -> Success; nsu=http://opcfoundation.org/Quickstarts/AlarmCondition ;ns=2;s=1:Colours/EastTank?OnlineState {OpcLabs.EasyOpc.UA.AddressSpace.UANodeId}
' NodeId="BaseEventType"/EventId -> Success; [16] {95, 68, 22, 205, 114, ...} {System.Byte[]}
' NodeId="BaseEventType"/EventType -> Success; DialogConditionType {OpcLabs.EasyOpc.UA.AddressSpace.UANodeId}
' NodeId="BaseEventType"/SourceNode -> Success; nsu=http://opcfoundation.org/Quickstarts/AlarmCondition ;ns=2;s=1:Colours/EastTank {OpcLabs.EasyOpc.UA.AddressSpace.UANodeId}
' NodeId="BaseEventType"/SourceName -> Success; EastTank {System.String}
' NodeId="BaseEventType"/Time -> Success; 9/10/2019 8:08:23 PM {System.DateTime}
' NodeId="BaseEventType"/ReceiveTime -> Success; 9/10/2019 8:08:23 PM {System.DateTime}
' NodeId="BaseEventType"/LocalTime -> Success; 00:00, DST {OpcLabs.EasyOpc.UA.UATimeZoneData}
' NodeId="BaseEventType"/Message -> Success; The dialog was activated {System.String}
' NodeId="BaseEventType"/Severity -> Success; 100 {System.Int32}
'Source name: Success; EastTank {System.String}
'Message: Success; The dialog was activated {System.String}
'
'All fields:
' NodeId="BaseEventType", NodeId -> Success; nsu=http://opcfoundation.org/Quickstarts/AlarmCondition ;ns=2;s=1:Colours/EastTank?Red {OpcLabs.EasyOpc.UA.AddressSpace.UANodeId}
' NodeId="BaseEventType"/EventId -> Success; [16] {124, 156, 219, 54, 120, ...} {System.Byte[]}
' NodeId="BaseEventType"/EventType -> Success; ExclusiveDeviationAlarmType {OpcLabs.EasyOpc.UA.AddressSpace.UANodeId}
' NodeId="BaseEventType"/SourceNode -> Success; nsu=http://opcfoundation.org/Quickstarts/AlarmCondition ;ns=2;s=1:Colours/EastTank {OpcLabs.EasyOpc.UA.AddressSpace.UANodeId}
' NodeId="BaseEventType"/SourceName -> Success; EastTank {System.String}
' NodeId="BaseEventType"/Time -> Success; 10/14/2019 4:00:13 PM {System.DateTime}
' NodeId="BaseEventType"/ReceiveTime -> Success; 10/14/2019 4:00:13 PM {System.DateTime}
' NodeId="BaseEventType"/LocalTime -> Success; 00:00, DST {OpcLabs.EasyOpc.UA.UATimeZoneData}
' NodeId="BaseEventType"/Message -> Success; The alarm was acknoweledged. {System.String}
' NodeId="BaseEventType"/Severity -> Success; 500 {System.Int32}
'Source name: Success; EastTank {System.String}
'Message: Success; The alarm was acknoweledged. {System.String}
'
'...