Пример #1
0
        public Result <DataResponse> GetEventData(OpcUAQuery query, NodeId startNodeId, Opc.Ua.EventFilter eventFilter)
        {
            var nodeCache = _nodeCacheFactory.Create(_session);

            eventFilter.AddSelectClause(ObjectTypeIds.BaseEventType, "SourceNode");
            eventFilter.AddSelectClause(ObjectTypeIds.BaseEventType, "EventType");

            var eventFilterValues = GetEventFilterValues(startNodeId, eventFilter);

            if (eventFilterValues == null)
            {
                var monitorItem = AddMonitorItem(startNodeId, eventFilter);
                eventFilterValues = new EventFilterValues(monitorItem, query, eventFilter);
                if (!TryAddEventFilterValues(startNodeId, eventFilterValues))
                {
                    RemoveMonitorItem(monitorItem);
                    eventFilterValues = null;
                }
            }

            lock (_eventData)
            {
                if (eventFilterValues == null)
                {
                    eventFilterValues = GetEventFilterValues(startNodeId, eventFilter);
                }
                if (eventFilterValues != null)
                {
                    return(_eventDataResponse.CreateEventSubscriptionDataResponse(eventFilterValues.Values.Values, query, nodeCache));
                }
            }
            return(new Result <DataResponse>(StatusCodes.BadUnexpectedError, ""));
        }
Пример #2
0
 private bool TryAddEventFilterValues(NodeId startNodeId, EventFilterValues eventFilterValues)
 {
     lock (_eventData)
     {
         List <EventFilterValues> l;
         if (!_eventData.TryGetValue(startNodeId, out l))
         {
             l = new List <EventFilterValues>();
             l.Add(eventFilterValues);
             _eventData.Add(startNodeId, l);
             return(true);
         }
         else
         {
             if (!l.Any(a => a.Filter.IsEqual(eventFilterValues.Filter)))
             {
                 l.Add(eventFilterValues);
                 return(true);
             }
         }
     }
     return(false);
 }