Event Filtering

Questions regarding the use of the C++ SDK for Server or Client development or integration into customer products ...

Moderator: uasdkcpp

Post Reply
falko.wiese
Hero Member
Hero Member
Posts: 26
Joined: 04 Oct 2012, 17:56

Event Filtering

Post by falko.wiese »

Hello,
can anyone help me out regarding event filtering on client side and give me an example? I followed the instructions in the client tutorial, but so far without success. On server side, I produce every second a new event from type 'MessageEventType'. In the UaExpert, I can find them under SimpleEvents, just beside SystemEventType, BaseModelChangeEventType and so on. What should I fill in the filter argument:

Code: Select all

...                
                UaEventFilter eventFilter;
                UaSimpleAttributeOperand selectElement;
                UaContentFilter* pContentFilter = NULL;
                UaContentFilterElement* pContentFilterElement = NULL;
                UaFilterOperand* pOperand = NULL;

                requests[0].ItemToMonitor.AttributeId = OpcUa_Attributes_EventNotifier;
                requests[0].ItemToMonitor.NodeId.Identifier.Numeric = OpcUaId_Server;
                requests[0].RequestedParameters.ClientHandle = 0;
                requests[0].RequestedParameters.SamplingInterval = 0;
                requests[0].RequestedParameters.QueueSize = 0;
                requests[0].MonitoringMode = OpcUa_MonitoringMode_Reporting;
                requests[0].RequestedParameters.DiscardOldest = OpcUa_True;

                // Define which eventfields to send with each event
                selectElement.setBrowsePathElement(0, UaQualifiedName("Message", 0), 1);
                eventFilter.setSelectClauseElement(0, selectElement, 3);
                selectElement.setBrowsePathElement(0, UaQualifiedName("SourceName", 0), 1);
                eventFilter.setSelectClauseElement(1, selectElement, 3);
                selectElement.setBrowsePathElement(0, UaQualifiedName("Severity", 0), 1);
                eventFilter.setSelectClauseElement(2, selectElement, 3);

                pContentFilter = new UaContentFilter;
                pContentFilterElement = new UaContentFilterElement;
                // Operator OfType
                pContentFilterElement->setFilterOperator(OpcUa_FilterOperator_OfType);
                // Operand 1 (Literal)
                pOperand = new UaLiteralOperand;
                UaVariant vent_type_filter;
                QtUaConverter().convertQtValue(vent_type_name, vent_type_filter);
                ((UaLiteralOperand*)pOperand)->setLiteralValue(vent_type_filter);
                pContentFilterElement->setFilterOperand(0, pOperand, 1);
                pContentFilter->setContentFilterElement(0, pContentFilterElement, 1);
                eventFilter.setWhereClause(pContentFilter);
                // set filter for monitored items
                eventFilter.detachFilter(requests[0].RequestedParameters.Filter);
...
Last edited by falko.wiese on 19 Mar 2024, 12:06, edited 2 times in total.

falko.wiese
Hero Member
Hero Member
Posts: 26
Joined: 04 Oct 2012, 17:56

Re: Event Filtering

Post by falko.wiese »

Hi everyone,
related to my question before regarding the right filter argument, here my code to catch the filter events:

Code: Select all

...
        void monitored_item_callback::newEvents(OpcUa_UInt32 clientSubscriptionHandle, UaEventFieldLists& eventFieldList)
        {
            OpcUa_UInt32 i = 0;
            logging_handler::warn_stream() << "New Event for type " << action_->path_name().toStdString();
            for (i = 0; i < eventFieldList.length(); i++)
            {
                UaVariant message = eventFieldList[i].EventFields[0];
                UaVariant sourceName = eventFieldList[i].EventFields[1];
                UaVariant severity = eventFieldList[i].EventFields[2];
                logging_handler::warn_stream() << QString("Event[%1] Message = %2 SourceName = %3 Severity = %4")
                                                      .arg(i)
                                                      .arg(message.toString().toUtf8())
                                                      .arg(sourceName.toString().toUtf8())
                                                      .arg(severity.toString().toUtf8())
                                                      .toStdString();
            }
        }
...
I implemented the

Code: Select all

dataChange(..)
method to observe normal data changes from client side in the same handler. And it works without any issues since years.

User avatar
Support Team
Hero Member
Hero Member
Posts: 3072
Joined: 18 Mar 2011, 15:09

Re: Event Filtering

Post by Support Team »

Hi,

the event fildering is explained in "Lesson 6" of the client side tutorial. This includes description how to set the filter.
https://documentation.unified-automation.com/uasdkcpp/1.8.3/html/L3GettingStartedClientLesson06.html

Furthermore there is an example in the "Console Client" that ships with the C++SDK (client_cpp_sdk)

With that information you should be able to filter your events.
Best regards
Unified Automation Support Team

falko.wiese
Hero Member
Hero Member
Posts: 26
Joined: 04 Oct 2012, 17:56

Re: Event Filtering

Post by falko.wiese »

Hello everyone,
the issue on our side was a, how to say, problem on UA server side. It exists the requirement on server side, to trigger every UA event on the Objects/Server node (or sub nodes of it). After this change our event filtering is working properly.

Thanks,
Falko Wiese.

Post Reply