// This example shows how to subscribe to multiple events.
type
THelperMethods19 = class
class function ObjectTypeIds_BaseEventType: _UANodeId; static;
class function UAFilterElements_SimpleAttribute(TypeId: _UANodeId; simpleRelativeBrowsePathString: string): _UASimpleAttributeOperand; static;
class function UABaseEventObject_Operands_NodeId: _UASimpleAttributeOperand; static;
class function UABaseEventObject_Operands_EventId: _UASimpleAttributeOperand; static;
class function UABaseEventObject_Operands_EventType: _UASimpleAttributeOperand; static;
class function UABaseEventObject_Operands_SourceNode: _UASimpleAttributeOperand; static;
class function UABaseEventObject_Operands_SourceName: _UASimpleAttributeOperand; static;
class function UABaseEventObject_Operands_Time: _UASimpleAttributeOperand; static;
class function UABaseEventObject_Operands_ReceiveTime: _UASimpleAttributeOperand; static;
class function UABaseEventObject_Operands_LocalTime: _UASimpleAttributeOperand; static;
class function UABaseEventObject_Operands_Message: _UASimpleAttributeOperand; static;
class function UABaseEventObject_Operands_Severity: _UASimpleAttributeOperand; static;
class function UABaseEventObject_AllFields: _UAAttributeFieldCollection; static;
end;
type
TClientEventHandlers19 = class
procedure Client_EventNotification(
ASender: TObject;
sender: OleVariant;
const eventArgs: _EasyUAEventNotificationEventArgs);
end;
procedure TClientEventHandlers19.Client_EventNotification(
ASender: TObject;
sender: OleVariant;
const eventArgs: _EasyUAEventNotificationEventArgs);
begin
// Display the event
WriteLn(eventArgs.ToString);
end;
class procedure SubscribeMultipleMonitoredItems.Events;
var
Arguments: OleVariant;
Client: TEasyUAClient;
ClientEventHandlers: TClientEventHandlers19;
EndpointDescriptor: string;
EventFilter1, EventFilter2: _UAEventFilter;
MonitoredItemArguments1, MonitoredItemArguments2: _EasyUAMonitoredItemArguments;
MonitoringParameters1, MonitoringParameters2: _UAMonitoringParameters;
Operand11, Operand21: _UASimpleAttributeOperand;
Operand12, Operand22: _UALiteralOperand;
ServerNodeId1, ServerNodeId2: _UANodeId;
SourceNodeId: _UANodeId;
WhereClause1, WhereClause2: _UAContentFilterElement;
begin
EndpointDescriptor := 'opc.tcp://opcua.demo-this.com:62544/Quickstarts/AlarmConditionServer';
// set MonitoredItemArguments1
// Event filter: The severity is >= 500.
Operand11 := THelperMethods19.UABaseEventObject_Operands_Severity;
Operand12 := CoUALiteralOperand.Create;
Operand12.Value := 500;
WhereClause1 := CoUAContentFilterElement.Create;
WhereClause1.FilterOperator := UAFilterOperator_GreaterThanOrEqual;
WhereClause1.FilterOperands.Add(Operand11);
WhereClause1.FilterOperands.Add(Operand12);
EventFilter1 := CoUAEventFilter.Create;
EventFilter1.SelectClauses := THelperMethods19.UABaseEventObject_AllFields;
EventFilter1.WhereClause := WhereClause1;
ServerNodeId1 := CoUANodeId.Create;
ServerNodeId1.StandardName := 'Server';
MonitoringParameters1 := CoUAMonitoringParameters.Create;
MonitoringParameters1.EventFilter := EventFilter1;
MonitoringParameters1.QueueSize := 1000;
MonitoringParameters1.SamplingInterval := 1000;
MonitoredItemArguments1 := CoEasyUAMonitoredItemArguments.Create;
MonitoredItemArguments1.AttributeId := UAAttributeId_EventNotifier;
MonitoredItemArguments1.EndpointDescriptor.UrlString := EndpointDescriptor;
MonitoredItemArguments1.MonitoringParameters := MonitoringParameters1;
MonitoredItemArguments1.NodeDescriptor.NodeId := ServerNodeId1;
MonitoredItemArguments1.State := 'firstState';
// set MonitoredItemArguments2
// Event filter: The event comes from a specified source node.
Operand21 := THelperMethods19.UABaseEventObject_Operands_SourceNode;
SourceNodeId := CoUANodeId.Create;
SourceNodeId.ExpandedText := 'nsu=http://opcfoundation.org/Quickstarts/AlarmCondition ;ns=2;s=1:Metals/SouthMotor';
Operand22 := CoUALiteralOperand.Create;
Operand22.Value := SourceNodeId;
WhereClause2 := CoUAContentFilterElement.Create;
WhereClause2.FilterOperator := UAFilterOperator_Equals;
WhereClause2.FilterOperands.Add(Operand21);
WhereClause2.FilterOperands.Add(Operand22);
EventFilter2 := CoUAEventFilter.Create;
EventFilter2.SelectClauses := THelperMethods19.UABaseEventObject_AllFields;
EventFilter2.WhereClause := WhereClause2;
ServerNodeId2 := CoUANodeId.Create;
ServerNodeId2.StandardName := 'Server';
MonitoringParameters2 := CoUAMonitoringParameters.Create;
MonitoringParameters2.EventFilter := EventFilter2;
MonitoringParameters2.QueueSize := 1000;
MonitoringParameters2.SamplingInterval := 2000;
MonitoredItemArguments2 := CoEasyUAMonitoredItemArguments.Create;
MonitoredItemArguments2.AttributeId := UAAttributeId_EventNotifier;
MonitoredItemArguments2.EndpointDescriptor.UrlString := EndpointDescriptor;
MonitoredItemArguments2.MonitoringParameters := MonitoringParameters2;
MonitoredItemArguments2.NodeDescriptor.NodeId := ServerNodeId2;
MonitoredItemArguments2.State := 'secondState';
// Instantiate the client object and hook events
Client := TEasyUAClient.Create(nil);
ClientEventHandlers := TClientEventHandlers19.Create;
Client.OnEventNotification := ClientEventHandlers.Client_EventNotification;
Arguments := VarArrayCreate([0, 1], varVariant);
Arguments[0] := MonitoredItemArguments1;
Arguments[1] := MonitoredItemArguments2;
WriteLn('Subscribing...');
Client.SubscribeMultipleMonitoredItems(Arguments);
WriteLn('Processing monitored item changed events for 30 seconds...');
PumpSleep(30*1000);
WriteLn('Unsubscribing...');
Client.UnsubscribeAllMonitoredItems;
WriteLn('Waiting for 5 seconds...');
Sleep(5*1000);
WriteLn('Finished.');
VarClear(Arguments);
FreeAndNil(Client);
FreeAndNil(ClientEventHandlers);
end;
class function THelperMethods19.ObjectTypeIds_BaseEventType: _UANodeId;
var NodeId: _UANodeId;
begin
NodeId := CoUANodeId.Create;
NodeId.StandardName := 'BaseEventType';
Result := NodeId;
end;
class function THelperMethods19.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 THelperMethods19.UABaseEventObject_Operands_NodeId: _UASimpleAttributeOperand;
var
Operand: _UASimpleAttributeOperand;
begin
Operand := CoUASimpleAttributeOperand.Create;
Operand.TypeId.NodeId.StandardName := 'BaseEventType';
Operand.AttributeId := UAAttributeId_NodeId;
Result := Operand;
end;
class function THelperMethods19.UABaseEventObject_Operands_EventId: _UASimpleAttributeOperand;
begin
Result := UAFilterElements_SimpleAttribute(ObjectTypeIds_BaseEventType, '/EventId');
end;
class function THelperMethods19.UABaseEventObject_Operands_EventType: _UASimpleAttributeOperand;
begin
Result := UAFilterElements_SimpleAttribute(ObjectTypeIds_BaseEventType, '/EventType');
end;
class function THelperMethods19.UABaseEventObject_Operands_SourceNode: _UASimpleAttributeOperand;
begin
Result := UAFilterElements_SimpleAttribute(ObjectTypeIds_BaseEventType, '/SourceNode');
end;
class function THelperMethods19.UABaseEventObject_Operands_SourceName: _UASimpleAttributeOperand;
begin
Result := UAFilterElements_SimpleAttribute(ObjectTypeIds_BaseEventType, '/SourceName');
end;
class function THelperMethods19.UABaseEventObject_Operands_Time: _UASimpleAttributeOperand;
begin
Result := UAFilterElements_SimpleAttribute(ObjectTypeIds_BaseEventType, '/Time');
end;
class function THelperMethods19.UABaseEventObject_Operands_ReceiveTime: _UASimpleAttributeOperand;
begin
Result := UAFilterElements_SimpleAttribute(ObjectTypeIds_BaseEventType, '/ReceiveTime');
end;
class function THelperMethods19.UABaseEventObject_Operands_LocalTime: _UASimpleAttributeOperand;
begin
Result := UAFilterElements_SimpleAttribute(ObjectTypeIds_BaseEventType, '/LocalTime');
end;
class function THelperMethods19.UABaseEventObject_Operands_Message: _UASimpleAttributeOperand;
begin
Result := UAFilterElements_SimpleAttribute(ObjectTypeIds_BaseEventType, '/Message');
end;
class function THelperMethods19.UABaseEventObject_Operands_Severity: _UASimpleAttributeOperand;
begin
Result := UAFilterElements_SimpleAttribute(ObjectTypeIds_BaseEventType, '/Severity');
end;
class function THelperMethods19.UABaseEventObject_AllFields: _UAAttributeFieldCollection;
var
Fields: _UAAttributeFieldCollection;
begin
Fields := CoUAAttributeFieldCollection.Create;
Fields.Add(UABaseEventObject_Operands_NodeId.ToUAAttributeField);
Fields.Add(UABaseEventObject_Operands_EventId.ToUAAttributeField);
Fields.Add(UABaseEventObject_Operands_EventType.ToUAAttributeField);
Fields.Add(UABaseEventObject_Operands_SourceNode.ToUAAttributeField);
Fields.Add(UABaseEventObject_Operands_SourceName.ToUAAttributeField);
Fields.Add(UABaseEventObject_Operands_Time.ToUAAttributeField);
Fields.Add(UABaseEventObject_Operands_ReceiveTime.ToUAAttributeField);
Fields.Add(UABaseEventObject_Operands_LocalTime.ToUAAttributeField);
Fields.Add(UABaseEventObject_Operands_Message.ToUAAttributeField);
Fields.Add(UABaseEventObject_Operands_Severity.ToUAAttributeField);
Result := Fields;
end;
// This example shows how to subscribe to multiple events.
const UAAttributeId_NodeId = 1;
const UAAttributeId_EventNotifier = 12;
const UAFilterOperator_Equals = 1;
const UAFilterOperator_GreaterThanOrEqual = 5;
class ClientEvents {
function EventNotification($Sender, $E)
{
// Display the event
printf("%s\n", $E);
}
}
$EndpointDescriptor = "opc.tcp://opcua.demo-this.com:62544/Quickstarts/AlarmConditionServer";
// set MonitoredItemArguments1
// Event filter: The severity is >= 500.
$Operand11 = UABaseEventObject_Operands_Severity();
$Operand12 = new COM("OpcLabs.EasyOpc.UA.Filtering.UALiteralOperand");
$Operand12->Value = 500;
$WhereClause1 = new COM("OpcLabs.EasyOpc.UA.Filtering.UAContentFilterElement");
$WhereClause1->FilterOperator = UAFilterOperator_GreaterThanOrEqual;
$WhereClause1->FilterOperands->Add($Operand11);
$WhereClause1->FilterOperands->Add($Operand12);
$EventFilter1 = new COM("OpcLabs.EasyOpc.UA.UAEventFilter");
$EventFilter1->SelectClauses = UABaseEventObject_AllFields();
$EventFilter1->WhereClause = $WhereClause1;
$ServerNodeId1 = new COM("OpcLabs.EasyOpc.UA.AddressSpace.UANodeId");
$ServerNodeId1->StandardName = "Server";
$MonitoringParameters1 = new COM("OpcLabs.EasyOpc.UA.UAMonitoringParameters");
$MonitoringParameters1->EventFilter = $EventFilter1;
$MonitoringParameters1->QueueSize = 1000;
$MonitoringParameters1->SamplingInterval = 1000;
$MonitoredItemArguments1 = new COM("OpcLabs.EasyOpc.UA.OperationModel.EasyUAMonitoredItemArguments");
$MonitoredItemArguments1->AttributeId = UAAttributeId_EventNotifier;
$MonitoredItemArguments1->EndpointDescriptor->UrlString = $EndpointDescriptor;
$MonitoredItemArguments1->MonitoringParameters = $MonitoringParameters1;
$MonitoredItemArguments1->NodeDescriptor->NodeId = $ServerNodeId1;
$MonitoredItemArguments1->State = "firstState";
// set MonitoredItemArguments2
// Event filter: The event comes from a specified source node.
$Operand21 = UABaseEventObject_Operands_SourceNode();
$SourceNodeId = new COM("OpcLabs.EasyOpc.UA.AddressSpace.UANodeId");
$SourceNodeId->ExpandedText = "nsu=http://opcfoundation.org/Quickstarts/AlarmCondition ;ns=2;s=1:Metals/SouthMotor";
$Operand22 = new COM("OpcLabs.EasyOpc.UA.Filtering.UALiteralOperand");
$Operand22->Value = $SourceNodeId;
$WhereClause2 = new COM("OpcLabs.EasyOpc.UA.Filtering.UAContentFilterElement");
$WhereClause2->FilterOperator = UAFilterOperator_Equals;
$WhereClause2->FilterOperands->Add($Operand21);
$WhereClause2->FilterOperands->Add($Operand22);
$EventFilter2 = new COM("OpcLabs.EasyOpc.UA.UAEventFilter");
$EventFilter2->SelectClauses = UABaseEventObject_AllFields();
$EventFilter2->WhereClause = $WhereClause2;
$ServerNodeId2 = new COM("OpcLabs.EasyOpc.UA.AddressSpace.UANodeId");
$ServerNodeId2->StandardName = "Server";
$MonitoringParameters2 = new COM("OpcLabs.EasyOpc.UA.UAMonitoringParameters");
$MonitoringParameters2->EventFilter = $EventFilter2;
$MonitoringParameters2->QueueSize = 1000;
$MonitoringParameters2->SamplingInterval = 2000;
$MonitoredItemArguments2 = new COM("OpcLabs.EasyOpc.UA.OperationModel.EasyUAMonitoredItemArguments");
$MonitoredItemArguments2->AttributeId = UAAttributeId_EventNotifier;
$MonitoredItemArguments2->EndpointDescriptor->UrlString = $EndpointDescriptor;
$MonitoredItemArguments2->MonitoringParameters = $MonitoringParameters2;
$MonitoredItemArguments2->NodeDescriptor->NodeId = $ServerNodeId2;
$MonitoredItemArguments2->State = "secondState";
// Instantiate the client object and hook events
$Client = new COM("OpcLabs.EasyOpc.UA.EasyUAClient");
$ClientEvents = new ClientEvents();
com_event_sink($Client, $ClientEvents, "DEasyUAClientEvents");
$arguments[0] = $MonitoredItemArguments1;
$arguments[1] = $MonitoredItemArguments2;
printf("Subscribing...\n");
$Client->SubscribeMultipleMonitoredItems($arguments);
printf("Processing monitored item changed events 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_NodeId() {
$Operand = new COM("OpcLabs.EasyOpc.UA.Filtering.UASimpleAttributeOperand");
$Operand->TypeId->NodeId->StandardName = "BaseEventType";
$Operand->AttributeId = UAAttributeId_NodeId;
return $Operand;
}
function UABaseEventObject_Operands_EventId() {
return UAFilterElements_SimpleAttribute(ObjectTypeIds_BaseEventType(), "/EventId");
}
function UABaseEventObject_Operands_EventType() {
return UAFilterElements_SimpleAttribute(ObjectTypeIds_BaseEventType(), "/EventType");
}
function UABaseEventObject_Operands_SourceNode() {
return UAFilterElements_SimpleAttribute(ObjectTypeIds_BaseEventType(), "/SourceNode");
}
function UABaseEventObject_Operands_SourceName() {
return UAFilterElements_SimpleAttribute(ObjectTypeIds_BaseEventType(), "/SourceName");
}
function UABaseEventObject_Operands_Time() {
return UAFilterElements_SimpleAttribute(ObjectTypeIds_BaseEventType(), "/Time");
}
function UABaseEventObject_Operands_ReceiveTime() {
return UAFilterElements_SimpleAttribute(ObjectTypeIds_BaseEventType(), "/ReceiveTime");
}
function UABaseEventObject_Operands_LocalTime() {
return UAFilterElements_SimpleAttribute(ObjectTypeIds_BaseEventType(), "/LocalTime");
}
function UABaseEventObject_Operands_Message() {
return UAFilterElements_SimpleAttribute(ObjectTypeIds_BaseEventType(), "/Message");
}
function UABaseEventObject_Operands_Severity() {
return UAFilterElements_SimpleAttribute(ObjectTypeIds_BaseEventType(), "/Severity");
}
function UABaseEventObject_AllFields() {
$Fields = new COM("OpcLabs.EasyOpc.UA.UAAttributeFieldCollection");
$Fields->Add(UABaseEventObject_Operands_NodeId()->ToUAAttributeField);
$Fields->Add(UABaseEventObject_Operands_EventId()->ToUAAttributeField);
$Fields->Add(UABaseEventObject_Operands_EventType()->ToUAAttributeField);
$Fields->Add(UABaseEventObject_Operands_SourceNode()->ToUAAttributeField);
$Fields->Add(UABaseEventObject_Operands_SourceName()->ToUAAttributeField);
$Fields->Add(UABaseEventObject_Operands_Time()->ToUAAttributeField);
$Fields->Add(UABaseEventObject_Operands_ReceiveTime()->ToUAAttributeField);
$Fields->Add(UABaseEventObject_Operands_LocalTime()->ToUAAttributeField);
$Fields->Add(UABaseEventObject_Operands_Message()->ToUAAttributeField);
$Fields->Add(UABaseEventObject_Operands_Severity()->ToUAAttributeField);
return $Fields;
}
// Example output (truncated):
//Subscribing...
//Processing monitored item changed events for 30 seconds...
//[firstState] Success
//[secondState] Success
//[firstState] Success; Refresh; RefreshInitiated
//[firstState] Success; Refresh; (10 field results) [EastTank] 500! "The alarm was acknoweledged." @10/14/2019 4:00:13 PM
//[firstState] Success; Refresh; (10 field results) [EastTank] 500! "The alarm was acknoweledged." @10/14/2019 4:00:17 PM
//[firstState] Success; Refresh; (10 field results) [NorthMotor] 500! "The alarm was acknoweledged." @10/14/2019 4:00:02 PM
//[firstState] Success; Refresh; (10 field results) [NorthMotor] 500! "The alarm was acknoweledged." @10/14/2019 4:00:16 PM
//[firstState] Success; Refresh; (10 field results) [SouthMotor] 700! "The alarm was acknoweledged." @10/14/2019 4:00:21 PM
//[firstState] Success; Refresh; (10 field results) [SouthMotor] 500! "The alarm was acknoweledged." @10/14/2019 4:00:03 PM
//[firstState] Success; Refresh; RefreshComplete
//[firstState] Success; (10 field results) [Internal] 500! "Raising Events" @11/8/2019 7:48:08 PM
//[firstState] Success; (10 field results) [Internal] 500! "Events Raised" @11/8/2019 7:48:08 PM
//[secondState] Success; Refresh; RefreshInitiated
//[secondState] Success; Refresh; (10 field results) [SouthMotor] 100! "The dialog was activated" @9/10/2019 8:08:25 PM
//[secondState] Success; Refresh; (10 field results) [SouthMotor] 100! "The alarm is active." @11/8/2019 7:48:07 PM
//[secondState] Success; Refresh; (10 field results) [SouthMotor] 700! "The alarm was acknoweledged." @10/14/2019 4:00:21 PM
//[secondState] Success; Refresh; (10 field results) [SouthMotor] 500! "The alarm was acknoweledged." @10/14/2019 4:00:03 PM
//[secondState] Success; Refresh; (10 field results) [SouthMotor] 100! "The alarm severity has increased." @9/10/2019 8:09:02 PM
//[secondState] Success; Refresh; (10 field results) [SouthMotor] 100! "The alarm severity has increased." @9/10/2019 8:09:59 PM
//[secondState] Success; Refresh; RefreshComplete
//[firstState] Success; (10 field results) [Internal] 500! "Raising Events" @11/8/2019 7:48:09 PM
//[firstState] Success; (10 field results) [Internal] 500! "Events Raised" @11/8/2019 7:48:09 PM
//[firstState] Success; (10 field results) [Internal] 500! "Raising Events" @11/8/2019 7:48:10 PM
//[firstState] Success; (10 field results) [Internal] 500! "Events Raised" @11/8/2019 7:48:10 PM
//[firstState] Success; (10 field results) [Internal] 500! "Raising Events" @11/8/2019 7:48:11 PM
//[firstState] Success; (10 field results) [Internal] 500! "Events Raised" @11/8/2019 7:48:11 PM
//[firstState] Success; (10 field results) [Internal] 500! "Raising Events" @11/8/2019 7:48:12 PM
//[firstState] Success; (10 field results) [Internal] 500! "Events Raised" @11/8/2019 7:48:12 PM
//[firstState] Success; (10 field results) [EastTank] 500! "The alarm severity has increased." @11/8/2019 7:48:13 PM
//[firstState] Success; (10 field results) [Internal] 500! "Raising Events" @11/8/2019 7:48:13 PM
//[firstState] Success; (10 field results) [Internal] 500! "Events Raised" @11/8/2019 7:48:13 PM
//[firstState] Success; (10 field results) [Internal] 500! "Raising Events" @11/8/2019 7:48:14 PM
//[firstState] Success; (10 field results) [Internal] 500! "Events Raised" @11/8/2019 7:48:14 PM
//[firstState] Success; (10 field results) [Internal] 500! "Raising Events" @11/8/2019 7:48:15 PM
//[firstState] Success; (10 field results) [Internal] 500! "Events Raised" @11/8/2019 7:48:15 PM
//[firstState] Success; (10 field results) [Internal] 500! "Raising Events" @11/8/2019 7:48:16 PM
//[firstState] Success; (10 field results) [Internal] 500! "Events Raised" @11/8/2019 7:48:16 PM
//[firstState] Success; (10 field results) [Internal] 500! "Raising Events" @11/8/2019 7:48:17 PM
//[firstState] Success; (10 field results) [Internal] 500! "Events Raised" @11/8/2019 7:48:17 PM
//[firstState] Success; (10 field results) [Internal] 500! "Raising Events" @11/8/2019 7:48:18 PM
//[firstState] Success; (10 field results) [Internal] 500! "Events Raised" @11/8/2019 7:48:18 PM
//[secondState] Success; (10 field results) [SouthMotor] 300! "The alarm severity has increased." @11/8/2019 7:48:18 PM
//...
Rem This example shows how to subscribe to multiple events.
Option Explicit
Const UAAttributeId_NodeId = 1
Const UAAttributeId_EventNotifier = 12
Const UAFilterOperator_Equals = 1
Const UAFilterOperator_GreaterThanOrEqual = 5
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_"
Dim arguments(1)
Set arguments(0) = CreateMonitoredItemArguments1
Set arguments(1) = CreateMonitoredItemArguments2
WScript.Echo "Subscribing..."
Client.SubscribeMultipleMonitoredItems arguments
WScript.Echo "Processing monitored item changed events for 30 seconds..."
WScript.Sleep 30 * 1000
WScript.Echo "Unsubscribing..."
Client.UnsubscribeAllMonitoredItems
WScript.Echo "Waiting for 5 seconds..."
WScript.Sleep 5 * 1000
Function ObjectTypeIds_BaseEventType
Dim NodeId: Set NodeId = CreateObject("OpcLabs.EasyOpc.UA.AddressSpace.UANodeId")
NodeId.StandardName = "BaseEventType"
Set ObjectTypeIds_BaseEventType = NodeId
End Function
Function UAFilterElements_SimpleAttribute(TypeId, simpleRelativeBrowsePathString)
Dim BrowsePathParser: Set BrowsePathParser = CreateObject("OpcLabs.EasyOpc.UA.Navigation.Parsing.UABrowsePathParser")
Dim Operand: Set Operand = CreateObject("OpcLabs.EasyOpc.UA.Filtering.UASimpleAttributeOperand")
Set Operand.TypeId.NodeId = TypeId
Set Operand.QualifiedNames = BrowsePathParser.ParseRelative(simpleRelativeBrowsePathString).ToUAQualifiedNameCollection
Set UAFilterElements_SimpleAttribute = Operand
End Function
Function UABaseEventObject_Operands_NodeId
Dim Operand: Set Operand = CreateObject("OpcLabs.EasyOpc.UA.Filtering.UASimpleAttributeOperand")
Operand.TypeId.NodeId.StandardName = "BaseEventType"
Operand.AttributeId = UAAttributeId_NodeId
Set UABaseEventObject_Operands_NodeId = Operand
End Function
Function UABaseEventObject_Operands_EventId
Set UABaseEventObject_Operands_EventId = UAFilterElements_SimpleAttribute(ObjectTypeIds_BaseEventType, "/EventId")
End Function
Function UABaseEventObject_Operands_EventType
Set UABaseEventObject_Operands_EventType = UAFilterElements_SimpleAttribute(ObjectTypeIds_BaseEventType, "/EventType")
End Function
Function UABaseEventObject_Operands_SourceNode
Set UABaseEventObject_Operands_SourceNode = UAFilterElements_SimpleAttribute(ObjectTypeIds_BaseEventType, "/SourceNode")
End Function
Function UABaseEventObject_Operands_SourceName
Set UABaseEventObject_Operands_SourceName = UAFilterElements_SimpleAttribute(ObjectTypeIds_BaseEventType, "/SourceName")
End Function
Function UABaseEventObject_Operands_Time
Set UABaseEventObject_Operands_Time = UAFilterElements_SimpleAttribute(ObjectTypeIds_BaseEventType, "/Time")
End Function
Function UABaseEventObject_Operands_ReceiveTime
Set UABaseEventObject_Operands_ReceiveTime = UAFilterElements_SimpleAttribute(ObjectTypeIds_BaseEventType, "/ReceiveTime")
End Function
Function UABaseEventObject_Operands_LocalTime
Set UABaseEventObject_Operands_LocalTime = UAFilterElements_SimpleAttribute(ObjectTypeIds_BaseEventType, "/LocalTime")
End Function
Function UABaseEventObject_Operands_Message
Set UABaseEventObject_Operands_Message = UAFilterElements_SimpleAttribute(ObjectTypeIds_BaseEventType, "/Message")
End Function
Function UABaseEventObject_Operands_Severity
Set UABaseEventObject_Operands_Severity = UAFilterElements_SimpleAttribute(ObjectTypeIds_BaseEventType, "/Severity")
End Function
Function UABaseEventObject_AllFields
Dim Fields: Set Fields = CreateObject("OpcLabs.EasyOpc.UA.UAAttributeFieldCollection")
Fields.Add UABaseEventObject_Operands_NodeId.ToUAAttributeField
Fields.Add UABaseEventObject_Operands_EventId.ToUAAttributeField
Fields.Add UABaseEventObject_Operands_EventType.ToUAAttributeField
Fields.Add UABaseEventObject_Operands_SourceNode.ToUAAttributeField
Fields.Add UABaseEventObject_Operands_SourceName.ToUAAttributeField
Fields.Add UABaseEventObject_Operands_Time.ToUAAttributeField
Fields.Add UABaseEventObject_Operands_ReceiveTime.ToUAAttributeField
Fields.Add UABaseEventObject_Operands_LocalTime.ToUAAttributeField
Fields.Add UABaseEventObject_Operands_Message.ToUAAttributeField
Fields.Add UABaseEventObject_Operands_Severity.ToUAAttributeField
Set UABaseEventObject_AllFields = Fields
End Function
Function CreateMonitoredItemArguments1
' Event filter: The severity is >= 500.
Dim Operand1: Set Operand1 = UABaseEventObject_Operands_Severity
Dim Operand2: Set Operand2 = CreateObject("OpcLabs.EasyOpc.UA.Filtering.UALiteralOperand")
Operand2.Value = 500
Dim WhereClause: Set WhereClause = CreateObject("OpcLabs.EasyOpc.UA.Filtering.UAContentFilterElement")
WhereClause.FilterOperator = UAFilterOperator_GreaterThanOrEqual
WhereClause.FilterOperands.Add Operand1
WhereClause.FilterOperands.Add Operand2
Dim EventFilter: Set EventFilter = CreateObject("OpcLabs.EasyOpc.UA.UAEventFilter")
Set EventFilter.SelectClauses = UABaseEventObject_AllFields
Set EventFilter.WhereClause = WhereClause
Dim ServerNodeId: Set ServerNodeId = CreateObject("OpcLabs.EasyOpc.UA.AddressSpace.UANodeId")
ServerNodeId.StandardName = "Server"
Dim MonitoringParameters: Set MonitoringParameters = CreateObject("OpcLabs.EasyOpc.UA.UAMonitoringParameters")
Set MonitoringParameters.EventFilter = EventFilter
MonitoringParameters.QueueSize = 1000
MonitoringParameters.SamplingInterval = 1000
Dim MonitoredItemArguments: Set MonitoredItemArguments = CreateObject("OpcLabs.EasyOpc.UA.OperationModel.EasyUAMonitoredItemArguments")
MonitoredItemArguments.AttributeId = UAAttributeId_EventNotifier
MonitoredItemArguments.EndpointDescriptor.UrlString = endpointDescriptor
Set MonitoredItemArguments.MonitoringParameters = MonitoringParameters
Set MonitoredItemArguments.NodeDescriptor.NodeId = ServerNodeId
MonitoredItemArguments.State = "firstState"
Set CreateMonitoredItemArguments1 = MonitoredItemArguments
End Function
Function CreateMonitoredItemArguments2
' Event filter: The event comes from a specified source node.
Dim Operand1: Set Operand1 = UABaseEventObject_Operands_SourceNode
Dim SourceNodeId: Set SourceNodeId = CreateObject("OpcLabs.EasyOpc.UA.AddressSpace.UANodeId")
SourceNodeId.ExpandedText = "nsu=http://opcfoundation.org/Quickstarts/AlarmCondition ;ns=2;s=1:Metals/SouthMotor"
Dim Operand2: Set Operand2 = CreateObject("OpcLabs.EasyOpc.UA.Filtering.UALiteralOperand")
Set Operand2.Value = SourceNodeId
Dim WhereClause: Set WhereClause = CreateObject("OpcLabs.EasyOpc.UA.Filtering.UAContentFilterElement")
WhereClause.FilterOperator = UAFilterOperator_Equals
WhereClause.FilterOperands.Add Operand1
WhereClause.FilterOperands.Add Operand2
Dim EventFilter: Set EventFilter = CreateObject("OpcLabs.EasyOpc.UA.UAEventFilter")
Set EventFilter.SelectClauses = UABaseEventObject_AllFields
Set EventFilter.WhereClause = WhereClause
Dim ServerNodeId: Set ServerNodeId = CreateObject("OpcLabs.EasyOpc.UA.AddressSpace.UANodeId")
ServerNodeId.StandardName = "Server"
Dim MonitoringParameters: Set MonitoringParameters = CreateObject("OpcLabs.EasyOpc.UA.UAMonitoringParameters")
Set MonitoringParameters.EventFilter = EventFilter
MonitoringParameters.QueueSize = 1000
MonitoringParameters.SamplingInterval = 2000
Dim MonitoredItemArguments: Set MonitoredItemArguments = CreateObject("OpcLabs.EasyOpc.UA.OperationModel.EasyUAMonitoredItemArguments")
MonitoredItemArguments.AttributeId = UAAttributeId_EventNotifier
MonitoredItemArguments.EndpointDescriptor.UrlString = endpointDescriptor
Set MonitoredItemArguments.MonitoringParameters = MonitoringParameters
Set MonitoredItemArguments.NodeDescriptor.NodeId = ServerNodeId
MonitoredItemArguments.State = "secondState"
Set CreateMonitoredItemArguments2 = MonitoredItemArguments
End Function
Sub Client_EventNotification(Sender, e)
' Display the event
WScript.Echo e
End Sub
' Example output (truncated):
'Subscribing...
'Processing monitored item changed events for 30 seconds...
'[firstState] Success
'[secondState] Success
'[firstState] Success; Refresh; RefreshInitiated
'[firstState] Success; Refresh; (10 field results) [EastTank] 500! "The alarm was acknoweledged." @10/14/2019 4:00:13 PM
'[firstState] Success; Refresh; (10 field results) [EastTank] 500! "The alarm was acknoweledged." @10/14/2019 4:00:17 PM
'[firstState] Success; Refresh; (10 field results) [NorthMotor] 500! "The alarm was acknoweledged." @10/14/2019 4:00:02 PM
'[firstState] Success; Refresh; (10 field results) [NorthMotor] 500! "The alarm was acknoweledged." @10/14/2019 4:00:16 PM
'[firstState] Success; Refresh; (10 field results) [SouthMotor] 700! "The alarm was acknoweledged." @10/14/2019 4:00:21 PM
'[firstState] Success; Refresh; (10 field results) [SouthMotor] 500! "The alarm was acknoweledged." @10/14/2019 4:00:03 PM
'[firstState] Success; Refresh; RefreshComplete
'[firstState] Success; (10 field results) [Internal] 500! "Raising Events" @11/8/2019 7:48:08 PM
'[firstState] Success; (10 field results) [Internal] 500! "Events Raised" @11/8/2019 7:48:08 PM
'[secondState] Success; Refresh; RefreshInitiated
'[secondState] Success; Refresh; (10 field results) [SouthMotor] 100! "The dialog was activated" @9/10/2019 8:08:25 PM
'[secondState] Success; Refresh; (10 field results) [SouthMotor] 100! "The alarm is active." @11/8/2019 7:48:07 PM
'[secondState] Success; Refresh; (10 field results) [SouthMotor] 700! "The alarm was acknoweledged." @10/14/2019 4:00:21 PM
'[secondState] Success; Refresh; (10 field results) [SouthMotor] 500! "The alarm was acknoweledged." @10/14/2019 4:00:03 PM
'[secondState] Success; Refresh; (10 field results) [SouthMotor] 100! "The alarm severity has increased." @9/10/2019 8:09:02 PM
'[secondState] Success; Refresh; (10 field results) [SouthMotor] 100! "The alarm severity has increased." @9/10/2019 8:09:59 PM
'[secondState] Success; Refresh; RefreshComplete
'[firstState] Success; (10 field results) [Internal] 500! "Raising Events" @11/8/2019 7:48:09 PM
'[firstState] Success; (10 field results) [Internal] 500! "Events Raised" @11/8/2019 7:48:09 PM
'[firstState] Success; (10 field results) [Internal] 500! "Raising Events" @11/8/2019 7:48:10 PM
'[firstState] Success; (10 field results) [Internal] 500! "Events Raised" @11/8/2019 7:48:10 PM
'[firstState] Success; (10 field results) [Internal] 500! "Raising Events" @11/8/2019 7:48:11 PM
'[firstState] Success; (10 field results) [Internal] 500! "Events Raised" @11/8/2019 7:48:11 PM
'[firstState] Success; (10 field results) [Internal] 500! "Raising Events" @11/8/2019 7:48:12 PM
'[firstState] Success; (10 field results) [Internal] 500! "Events Raised" @11/8/2019 7:48:12 PM
'[firstState] Success; (10 field results) [EastTank] 500! "The alarm severity has increased." @11/8/2019 7:48:13 PM
'[firstState] Success; (10 field results) [Internal] 500! "Raising Events" @11/8/2019 7:48:13 PM
'[firstState] Success; (10 field results) [Internal] 500! "Events Raised" @11/8/2019 7:48:13 PM
'[firstState] Success; (10 field results) [Internal] 500! "Raising Events" @11/8/2019 7:48:14 PM
'[firstState] Success; (10 field results) [Internal] 500! "Events Raised" @11/8/2019 7:48:14 PM
'[firstState] Success; (10 field results) [Internal] 500! "Raising Events" @11/8/2019 7:48:15 PM
'[firstState] Success; (10 field results) [Internal] 500! "Events Raised" @11/8/2019 7:48:15 PM
'[firstState] Success; (10 field results) [Internal] 500! "Raising Events" @11/8/2019 7:48:16 PM
'[firstState] Success; (10 field results) [Internal] 500! "Events Raised" @11/8/2019 7:48:16 PM
'[firstState] Success; (10 field results) [Internal] 500! "Raising Events" @11/8/2019 7:48:17 PM
'[firstState] Success; (10 field results) [Internal] 500! "Events Raised" @11/8/2019 7:48:17 PM
'[firstState] Success; (10 field results) [Internal] 500! "Raising Events" @11/8/2019 7:48:18 PM
'[firstState] Success; (10 field results) [Internal] 500! "Events Raised" @11/8/2019 7:48:18 PM
'[secondState] Success; (10 field results) [SouthMotor] 300! "The alarm severity has increased." @11/8/2019 7:48:18 PM
'...