Ejemplo n.º 1
0
        private Result <DataResponse>[] SubscribeDataValues(Session session, IDataValueSubscription dataValueSubscription, OpcUAQuery[] queries, NamespaceTable nsTable)
        {
            var responses   = new Result <DataResponse> [queries.Length];
            var browsePaths = queries.Select(a => ResolveRelativePath(a, nsTable)).ToArray();

            Result <NodeId>[] nodeIdsResult = GetNodeIds(session, browsePaths, nsTable);

            var nodeIds = nodeIdsResult.Where(a => a.Success).Select(a => a.Value).ToArray();

            var dataValues = dataValueSubscription.GetValues(nodeIds);
            var results    = new Result <DataResponse> [nodeIds.Length];

            for (int i = 0, j = 0; i < nodeIdsResult.Length; i++)
            {
                if (nodeIdsResult[i].Success)
                {
                    if (dataValues[j].Success)
                    {
                        results[i] = ValueDataResponse.GetDataResponseForDataValue(_log, dataValues[j].Value, nodeIds[j], queries[i], browsePaths[i]);
                    }
                    else
                    {
                        results[i] = new Result <DataResponse>(dataValues[j].StatusCode, dataValues[j].Error);
                    }
                    j++;
                }
                else
                {
                    results[i] = new Result <DataResponse>(nodeIdsResult[i].StatusCode, nodeIdsResult[i].Error);
                }
            }
            return(results);
        }
Ejemplo n.º 2
0
        private Result <DataResponse>[] ReadHistoryRaw(Session session, OpcUAQuery[] queries, NamespaceTable namespaceTable)
        {
            var indexMap = new Dictionary <ReadRawKey, List <int> >();
            var queryMap = new Dictionary <ReadRawKey, List <NodeId> >();

            var relativePaths = queries.Select(a => ResolveRelativePath(a, namespaceTable)).ToArray();

            Result <NodeId>[] nodeIdsResult = GetNodeIds(session, relativePaths, namespaceTable);
            //Result<UaMetaData>[] metaData = GetMetaData(session, nodeIdsResult, namespaceTable);


            var result = new Result <DataResponse> [queries.Length];

            for (int i = 0; i < queries.Length; i++)
            {
                var nodeIdResult = nodeIdsResult[i];
                if (nodeIdResult.Success)
                {
                    var      query     = queries[i];
                    var      maxValues = query.maxValuesPerNode > 0 ? query.maxValuesPerNode : 0;
                    var      tr        = query.timeRange;
                    DateTime fromTime  = DateTimeOffset.FromUnixTimeMilliseconds(tr.FromEpochMS).UtcDateTime;
                    DateTime toTime    = DateTimeOffset.FromUnixTimeMilliseconds(tr.ToEpochMS).UtcDateTime;
                    var      key       = new ReadRawKey(fromTime, toTime, Convert.ToInt32(maxValues));
                    AddDict(indexMap, key, i);
                    AddDict(queryMap, key, nodeIdResult.Value);
                }
                else
                {
                    result[i] = new Result <DataResponse>(nodeIdResult.StatusCode, nodeIdResult.Error);
                }
            }

            foreach (var querygroup in queryMap)
            {
                var key           = querygroup.Key;
                var nodes         = querygroup.Value.ToArray();
                var historyValues = session.ReadHistoryRaw(key.StartTime, key.EndTime, key.MaxValues, nodes);
                var indices       = indexMap[key];
                for (int i = 0; i < indices.Count; i++)
                {
                    var idx = indices[i];
                    result[idx] = ValueDataResponse.CreateHistoryDataResponse(historyValues[i], queries[idx], relativePaths[idx]);
                }
            }
            return(result);
        }
Ejemplo n.º 3
0
        //private Result<UaMetaData>[] GetMetaData(Session session, Result<NodeId>[] nodeIdsResult, NamespaceTable namespaceTable)
        //{

        //}

        private Result <DataResponse>[] ReadHistoryProcessed(Session session, OpcUAQuery[] queries, NamespaceTable namespaceTable)
        {
            var indexMap = new Dictionary <ReadProcessedKey, List <int> >();
            var queryMap = new Dictionary <ReadProcessedKey, List <NodeId> >();

            var browsePaths = queries.Select(a => ResolveRelativePath(a, namespaceTable)).ToArray();

            Result <NodeId>[] nodeIdsResult = GetNodeIds(session, browsePaths, namespaceTable);
            var result = new Result <DataResponse> [queries.Length];


            for (int i = 0; i < queries.Length; i++)
            {
                var query = queries[i];
                OpcUaNodeDefinition aggregate = null;
                var nodeIdResult = nodeIdsResult[i];
                try
                {
                    aggregate = JsonSerializer.Deserialize <OpcUaNodeDefinition>(query.aggregate.ToString());
                }
                catch (Exception e)
                {
                    _log.LogError(e, "Error getting aggregate. ");
                }

                if (aggregate?.nodeId == null)
                {
                    _log.LogError("Aggregate is not set");
                    result[i] = new Result <DataResponse>(StatusCodes.BadNodeIdInvalid, "Aggregate is not set");
                }
                else if (nodeIdResult.Success)
                {
                    var      resampleInterval = query.resampleInterval > 0 ? (double)(query.resampleInterval * 1000.0) : (double)query.intervalMs;
                    var      tr = query.timeRange;
                    var      aggregateNodeId = Converter.GetNodeId(aggregate.nodeId, namespaceTable);
                    DateTime fromTime        = DateTimeOffset.FromUnixTimeMilliseconds(tr.FromEpochMS).UtcDateTime;
                    DateTime toTime          = DateTimeOffset.FromUnixTimeMilliseconds(tr.ToEpochMS).UtcDateTime;
                    var      key             = new ReadProcessedKey(fromTime, toTime, aggregateNodeId, resampleInterval);
                    AddDict(indexMap, key, i);
                    AddDict(queryMap, key, nodeIdResult.Value);
                }
                else
                {
                    result[i] = new Result <DataResponse>(nodeIdResult.StatusCode, nodeIdResult.Error);
                }
            }

            foreach (var querygroup in queryMap)
            {
                var key           = querygroup.Key;
                var nodes         = querygroup.Value.ToArray();
                var historyValues = session.ReadHistoryProcessed(key.StartTime, key.EndTime, key.Aggregate, key.ResampleInterval, nodes);
                var indices       = indexMap[key];
                for (int i = 0; i < indices.Count; i++)
                {
                    var idx          = indices[i];
                    var valuesResult = historyValues[i];
                    result[idx] = ValueDataResponse.CreateHistoryDataResponse(historyValues[i], queries[idx], browsePaths[idx]);
                }
            }
            return(result);
        }