/// <summary>
 /// Read node
 /// </summary>
 /// <param name="nodeId"></param>
 /// <param name="ct"></param>
 /// <returns></returns>
 private async Task <BaseNodeModel> ReadNodeAsync(NodeId nodeId, CancellationToken ct)
 {
     try {
         // Read node with value
         return(await _client.ExecuteServiceAsync(_endpoint, _elevation,
                                                  _priority, ct, async session => {
             _encoder.Context.UpdateFromSession(session);
             var node = await RawNodeModel.ReadAsync(session, _diagnostics.ToStackModel(),
                                                     nodeId, false, Diagnostics, false);
             // Determine whether to read events or historic data later
             if (node.IsHistorizedNode)
             {
                 _history.Add(node.LocalId, node.NodeId.AsString(
                                  session.MessageContext));
             }
             else
             {
                 // Otherwise mark as visited so we do not browse again.
                 _visited.Add(nodeId);
             }
             var isProperty =
                 (node.NodeClass == Opc.Ua.NodeClass.Variable ||
                  node.NodeClass == Opc.Ua.NodeClass.VariableType) &&
                 session.TypeTree.IsTypeOf(node.NodeId, VariableTypeIds.PropertyType);
             return node.ToNodeModel(isProperty);
         }));
     }
     catch (Exception ex) {
         _logger.Error(ex, "Failed reading node object for node {nodeId}.", nodeId);
         _visited.Add(nodeId);
         return(null);
     }
 }
예제 #2
0
        /// <inheritdoc/>
        public async Task EncodeAsync(CancellationToken ct)
        {
            if (_count > 0)
            {
                throw new InvalidOperationException("Encoding already performed.");
            }
            bool eventSource;

            try {
                var node = await _client.ExecuteServiceAsync(_endpoint, _elevation,
                                                             _priority, ct, async session => {
                    _encoder.Context.UpdateFromSession(session);
                    var nodeId = _nodeId.ToNodeId(session.MessageContext);
                    return(await RawNodeModel.ReadAsync(session, null,
                                                        nodeId, true, _diagnostics, false));
                });

                if (node.EventNotifier.HasValue &&
                    (node.EventNotifier.Value &
                     EventNotifiers.HistoryRead) != 0)
                {
                    eventSource = true;
                }
                else if (node.AccessLevel.HasValue &&
                         ((AccessLevelType)node.AccessLevel.Value &
                          AccessLevelType.HistoryRead) != 0)
                {
                    eventSource = false;
                }
                else
                {
                    _logger.Error("{nodeId} has no history.", _nodeId);
                    return;
                }
            }
            catch (Exception ex) {
                _logger.Error(ex, "Failed to retrieve node info for {nodeId}", _nodeId);
                return;
            }

            _logger.Verbose("Writing history for {nodeId}...", _nodeId);
            var sw = System.Diagnostics.Stopwatch.StartNew();

            if (eventSource)
            {
                await EncodeHistoricEventsAsync(ct);
            }
            else
            {
                await EncodeHistoricValuesAsync(ct);
            }
            _logger.Debug("Wrote {count} items for {nodeId} in {elapsed}.",
                          _count, _nodeId, sw.Elapsed);
        }