Kit Server: Alarms and Events test nodes in Data Access

From OPC Labs Knowledge Base

NODE STRUCTURE

In OPC Data Access address space, a simple tracking event is represented by an event branch. A condition state is represented by a condition state branch.

All event branches contain:

Node type Name Canonical data type Access rights Description leaf QualifiedSourceName VT_BSTR readable The source of event notification. leaf Time VT_DATE readable/writeable Time of the event occurrence. leaf Message VT_BSTR readable/writeable Event notification message describing the event. leaf Type VT_UI4 readable Event type. 1 (OPC_SIMPLE_EVENT) for simple event, 2 (OPC_TRACKING_EVENT) for tracking event. leaf CategoryId VT_UI4 readable Event category ID. leaf Severity VT_UI4 readable/writeable Event severity (1..1000). branch AttributeValues Holds vendor-specific event attributes. leaf AttributeValues.eaid attribute type readable/writeable One leaf for each event attribute, where eaid is the attribute Id in decimal.

Event branches for simple events contain in addition to the base:

Node type Name Canonical data type Access rights Description method Generate Generates an event.

Event branches for tracking events contain in addition to the base:

Node type Name Canonical data type Access rights Description leaf ActorId VT_BSTR readable/writeable Actor ID. method Generate Generates an event.

Wherever a “method” node type is listed, it is a shortcut for a following set of nodes:

Node type Name Canonical data type Access rights Description leaf MethodName VT_BOOL readable/writeable Same as MethodName.Invoke. branch MethodName Holds detail nodes of the method. leaf MethodName.Invoke VT_BOOL readable/writeable Writing “true” to this leaf executes the method. The read value remains always “false”. branch MethodName.ArgumentValues Unused. It is meant to contain read/writeable leaves, one for each argument of the method. Currently none of our methods has any arguments.

For simple and tracking events, the OPC-DA client uses the writeable leaves to specify the variable parameters of the event, and then invokes the Generate method (by writing “true” to a corresponding leaf) to generate the OPC-A&E event.

A condition state branch contains:

Node type Name Canonical data type Access rights Description leaf Locked VT_BOOL readable Gives “true” iff the internal lock count is non-zero. See the Lock, Unlock methods. leaf ConditionName VT_BSTR readable The name of the condition. leaf Enabled VT_BOOL readable/writeable Determines whether the condition is enabled. leaf Active VT_BOOL readable Determines whether the condition is active. leaf Acknowledged VT_BOOL readable Determines whether the condition is acknowledged. leaf Quality VT_UI2 readable/writeable Quality associated with the condition leaf ActiveTime VT_DATE readable Time of the most recent transition into the condition. There may be transitions among the sub-conditions which are more recent. leaf SubconditionActiveTime VT_DATE readable Time of the most recent transition into active subcondition. This is the time value which must be specified when acknowledging the condition. leaf InactiveTime VT_DATE readable Time of the most recent transition out of this condition. leaf AcknowledgeTime VT_DATE readable The time of the most recent acknowledgment of this condition (of any sub-condition). leaf AcknowledgerId VT_BSTR readable This is the ID of the client who last acknowledged this condition. leaf Comment VT_BSTR readable The comment string passed in by the client who last acknowledged this condition. leaf ActiveSubcondition VT_BSTR readable Same as ActiveSubcondition.Name. branch ActiveSubcondition Holds detail nodes for the active subcondition. leaf ActiveSubcondition.Name VT_BSTR readable The name of the current sub-condition, for multi-state conditions. For a single-state condition, this contains the condition name. leaf ActiveSubcondition.Definition BSTR readable An expression which defines the sub-state represented by the sub-condition. leaf ActiveSubcondition.Severity VT_UI4 readable The severity of any event notifications generated on behalf of this sub-condition. leaf ActiveSubcondition.Description BSTR readable The text string to be included in any event notification generated on behalf of this sub-condition. branch AttributeValues Holds vendor-specific event attributes. leaf AttributeValues.eaid attribute type readable/writeable One leaf for each event attribute, where eaid is the attribute Id in decimal. method Acknowledge Acknowledges the event condition. method Activate Activate the event condition. method Disacknowledge Disacknowledges the event condition (reverses the effect of acknowledge). method Inactivate Inactivate the event condition. method Lock Increments an internal lock count. When the lock count is non-zero, changes to condition state do not generate an event. method Unlock Decrements an internal lock count. When the lock reaches zero, an event is generated if a condition state has changed since the count became non-zero.

For condition events, the OPC-DA client uses the writeable leaves to specify the variable parameters of the condition state, and invokes appropriate methods to change the condition state. When this is done in an unlocked state, each such change may generate an OPC A&E event. If the client wants to prevent it, it invokes the Lock method, makes the changes, and then it invokes the Unlock method to generate the OPC-A&E event.

Note that there is an issue with converting between DATE (suitable for use in VARIANTs), and FILETIME (used in OPC method calls); a precise roundtrip conversion is not guaranteed. Special precautions need to be made.

EXAMPLES

Set some events to active state

Rem $Header: $
Rem Copyright (c) CODE Consulting and Development, s.r.o., Plzen. All rights reserved.
Rem+++ 
Rem This example shows how to for a refresh for all active conditions and inactive, unacknowledged conditions.

Option Explicit

Dim EasyDAClient: Set EasyDAClient = CreateObject("OPCLabs.EasyDAClient.5.2")
Dim EasyAEClient: Set EasyAEClient = CreateObject("OPCLabs.EasyAEClient.5.2")
WScript.ConnectObject EasyAEClient, "EasyAEClient_"

WScript.Echo "Processing event notifications..."
Dim SubscriptionFilter: Set SubscriptionFilter = EasyAEClient.CreateSubscriptionFilter
SubscriptionFilter.Sources = Array("Simulation.ConditionState1", "Simulation.ConditionState2", "Simulation.ConditionState3")
Dim handle: handle = EasyAEClient.SubscribeEvents("", "OPCLabs.KitEventServer.2", 1000, Nothing, SubscriptionFilter)

Rem The component will perform auto-refresh at this point, give it time to happen
WScript.Echo "Waiting for 10 seconds..."
WScript.Sleep 10*1000

Rem Set some events to active state, which will cause them to appear in refresh
WScript.Echo "Activating conditions and waiting for 10 seconds..."
EasyDAClient.WriteItemValue "", "OPCLabs.KitServer.2", "SimulateEvents.ConditionState1.Activate", True
EasyDAClient.WriteItemValue "", "OPCLabs.KitServer.2", "SimulateEvents.ConditionState2.Activate", True
WScript.Sleep 10*1000

WScript.Echo "Refreshing subscription and waiting for 10 seconds..."
EasyAEClient.RefreshEventSubscription handle
WScript.Sleep 10*1000

EasyAEClient.UnsubscribeEvents handle



Rem Notification event handler
Sub EasyAEClient_Notification(Sender, e)
    WScript.Echo 
    WScript.Echo "Refresh: " & e.Refresh
    WScript.Echo "RefreshComplete: " & e.RefreshComplete

    If Not (e.Event Is Nothing) Then
        With e.Event
    	    WScript.Echo "Event.QualifiedSourceName: " & .QualifiedSourceName
    	    WScript.Echo "Event.Message: " & .Message
    	    WScript.Echo "Event.Active: " & .Active
    	    WScript.Echo "Event.Acknowledged: " & .Acknowledged
        End With
    End If
End Sub
Rem---