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); }
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); }
//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); }