Exemplo n.º 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, ""));
        }
Exemplo n.º 2
0
        internal static Opc.Ua.EventFilter GetEventFilter(OpcUAQuery query, NamespaceTable namespaceTable)
        {
            var eventFilter = new Opc.Ua.EventFilter();

            if (query.eventQuery?.eventColumns != null)
            {
                foreach (var column in query.eventQuery.eventColumns)
                {
                    var bp   = Converter.GetBrowsePath(column.browsePath, namespaceTable);
                    var path = SimpleAttributeOperand.Format(bp);
                    eventFilter.AddSelectClause(ObjectTypes.BaseEventType, path, Attributes.Value);
                }
            }


            if (query.eventQuery?.eventFilters != null)
            {
                for (int i = 0; i < query.eventQuery.eventFilters.Length; i++)
                {
                    var filter = query.eventQuery.eventFilters[i];
                    eventFilter.WhereClause.Push(filter.oper, GetOperands(filter, namespaceTable));
                }
            }
            return(eventFilter);
        }
Exemplo n.º 3
0
 internal EventFilterValues(MonitoredItem monitoredItem, OpcUAQuery query, Opc.Ua.EventFilter filter)
 {
     MonitoredItem = monitoredItem;
     Query         = query;
     Filter        = filter;
     Values        = new Dictionary <SourceAndEventTypeKey, VariantCollection>();
     LastRead      = DateTimeOffset.UtcNow;
 }
Exemplo n.º 4
0
        internal static Dictionary <int, Field> AddEventFields(DataFrame dataFrame, OpcUAQuery query)
        {
            var fields = new Dictionary <int, Field>();

            for (int i = 0; i < query.eventQuery.eventColumns.Length; i++)
            {
                var col   = query.eventQuery.eventColumns[i];
                var type  = GetTypeForField(col.browsePath);
                var field = dataFrame.AddField(string.IsNullOrEmpty(col.alias) ? GetFieldName(col.browsePath) : col.alias, type);
                field.Config.Filterable = true;
                fields.Add(i, field);
            }
            return(fields);
        }
        private List <OpcUAQuery> ParseJSONQueries(DatasourceRequest request)
        {
            List <OpcUAQuery> ret = new List <OpcUAQuery>();

            foreach (Query query in request.Queries)
            {
                try
                {
                    log.Information("Handling {0}", query.ModelJson);
                    OpcUAQuery uaq = JsonSerializer.Deserialize <OpcUAQuery>(query.ModelJson);
                    ret.Add(uaq);
                }
                catch (Exception ex)
                {
                    Log.Information("Caught exception {0}", ex);
                }
            }

            return(ret);
        }
Exemplo n.º 6
0
        private BrowsePath ResolveRelativePath(OpcUAQuery query, NamespaceTable namespaceTable)
        {
            var path = new BrowsePath();

            var nodeId = Converter.GetNodeId(query.nodePath.node.nodeId, namespaceTable);

            path.StartingNode = nodeId;
            if (query.useTemplate && query.relativePath != null && query.relativePath.Length > 0)
            {
                var r = new RelativePath();
                path.RelativePath = r;
                for (int i = 0; i < query.relativePath.Length; i++)
                {
                    r.Elements.Add(new RelativePathElement()
                    {
                        TargetName = Converter.GetQualifiedName(query.relativePath[i], namespaceTable), IncludeSubtypes = true, ReferenceTypeId = Opc.Ua.ReferenceTypes.References, IsInverse = false
                    });
                }
            }
            return(path);
        }
Exemplo n.º 7
0
        internal static string GetFieldName(OpcUAQuery query, BrowsePath relativePath)
        {
            string fieldName = query.alias;

            if (string.IsNullOrEmpty(fieldName))
            {
                fieldName = String.Join(" / ", query.nodePath.browsePath.Select(a => a.name).ToArray());
                if (relativePath?.RelativePath?.Elements?.Count > 0)
                {
                    StringBuilder sb = new StringBuilder();
                    sb.Append(fieldName);
                    var pelemt = relativePath.RelativePath.Elements;
                    for (int i = 0; i < pelemt.Count; i++)
                    {
                        sb.Append(" / ");
                        sb.Append(pelemt[i].TargetName.Name);
                    }
                    fieldName = sb.ToString();
                }
            }
            return(fieldName);
        }
Exemplo n.º 8
0
        public OpcUAQuery(DataQuery dataQuery)
        {
            refId         = dataQuery.RefId;
            maxDataPoints = dataQuery.MaxDataPoints;
            intervalMs    = dataQuery.IntervalMS;
            timeRange     = dataQuery.TimeRange;
            byte[]     byDecoded = Convert.FromBase64String(dataQuery.Json.ToBase64());
            OpcUAQuery query     = JsonSerializer.Deserialize <OpcUAQuery>(byDecoded);

            datasourceId     = query.datasourceId;
            nodePath         = query.nodePath;
            templateVariable = query.templateVariable;
            useTemplate      = query.useTemplate;

            alias            = query.alias;
            readType         = query.readType;
            aggregate        = query.aggregate;
            maxValuesPerNode = query.maxValuesPerNode;
            resampleInterval = query.resampleInterval;
            eventQuery       = query.eventQuery;
            relativePath     = query.relativePath;
        }
Exemplo n.º 9
0
        internal static Result <DataResponse> GetDataResponseForDataValue(ILogger log, DataValue dataValue, NodeId nodeId, OpcUAQuery query, BrowsePath relativePath)
        {
            try
            {
                if (Opc.Ua.StatusCode.IsGood(dataValue.StatusCode))
                {
                    DataResponse dataResponse = new DataResponse();
                    DataFrame    dataFrame    = new DataFrame(query.refId);

                    var   timeField  = dataFrame.AddField("Time", typeof(DateTime));
                    var   fieldName  = GetFieldName(query, relativePath);
                    Field valueField = dataFrame.AddField(fieldName, dataValue?.Value != null ? dataValue.Value.GetType() : typeof(string));
                    timeField.Append(LimitDateTime(dataValue.SourceTimestamp));
                    valueField.Append(dataValue?.Value != null ? dataValue?.Value : "");
                    dataResponse.Frames.Add(dataFrame.ToGprcArrowFrame());
                    return(new Result <DataResponse>(dataResponse));
                }
                else
                {
                    return(new Result <DataResponse>(dataValue.StatusCode, string.Format("Error reading node with id {0}", nodeId.ToString())));
                }
            }
            catch (Exception e)
            {
                log.LogError(e.Message);
                return(new Result <DataResponse>(dataValue.StatusCode, string.Format("Error reading node with id {0}: {1}", nodeId.ToString(), e.Message)));
            }
        }
Exemplo n.º 10
0
        internal static Result <DataResponse> CreateHistoryDataResponse(Result <HistoryData> valuesResult, OpcUAQuery query, BrowsePath relativePath)
        {
            if (valuesResult.Success)
            {
                var   dataResponse = new DataResponse();
                var   dataFrame    = new DataFrame(query.refId);
                var   timeField    = dataFrame.AddField("Time", typeof(DateTime));
                Field valueField   = null;
                foreach (DataValue entry in valuesResult.Value.DataValues)
                {
                    if (valueField == null && entry.Value != null)
                    {
                        var fieldName = GetFieldName(query, relativePath);
                        valueField = dataFrame.AddField(fieldName, entry.Value.GetType());
                    }

                    if (valueField != null)
                    {
                        valueField.Append(entry.Value);
                        timeField.Append(entry.SourceTimestamp);
                    }
                }
                dataResponse.Frames.Add(dataFrame.ToGprcArrowFrame());
                return(new Result <DataResponse>(dataResponse));
            }
            else
            {
                return(new Result <DataResponse>(valuesResult.StatusCode, valuesResult.Error));
            }
        }
Exemplo n.º 11
0
 public Result <DataResponse> CreateEventDataResponse(Result <HistoryEvent> historyEventResult, OpcUAQuery query, INodeCache nodeCache)
 {
     if (historyEventResult.Success)
     {
         var historyEvent = historyEventResult.Value;
         var dataResponse = new DataResponse();
         var dataFrame    = new DataFrame(query.refId);
         var fields       = AddEventFields(dataFrame, query);
         if (historyEvent.Events.Count > 0)
         {
             foreach (var e in historyEvent.Events)
             {
                 FillEventDataFrame(fields, e.EventFields, query, nodeCache);
             }
         }
         dataResponse.Frames.Add(dataFrame.ToGprcArrowFrame());
         return(new Result <DataResponse>(dataResponse));
     }
     else
     {
         return(new Result <DataResponse>(historyEventResult.StatusCode, historyEventResult.Error));
     }
 }
Exemplo n.º 12
0
        public Result <DataResponse> CreateEventSubscriptionDataResponse(ICollection <VariantCollection> events, OpcUAQuery query, INodeCache nodeCache)
        {
            var dataResponse = new DataResponse();
            var dataFrame    = new DataFrame(query.refId);
            var fields       = AddEventFields(dataFrame, query);

            foreach (var ev in events)
            {
                FillEventDataFrame(fields, ev, query, nodeCache);
            }
            dataResponse.Frames.Add(dataFrame.ToGprcArrowFrame());
            return(new Result <DataResponse>(dataResponse));
        }
Exemplo n.º 13
0
 internal static void FillEventDataFrame(Dictionary <int, Field> fields, VariantCollection eventFields, OpcUAQuery query, INodeCache nodeCache)
 {
     for (int k = 0; k < eventFields.Count; k++)
     {
         var field = eventFields[k];
         if (fields.TryGetValue(k, out Field dataField))
         {
             var path = query.eventQuery.eventColumns[k].browsePath;
             dataField.Append(GetDataFieldValue(dataField, GetValueForField(path, nodeCache, field.Value)));
         }
     }
 }