示例#1
0
        /// <summary>
        /// Adds a DataValue to a list of values to return.
        /// </summary>
        private void AddValue(
            TimestampsToReturn timestampsToReturn,
            NumericRange indexRange,
            QualifiedName dataEncoding,
            DataValueCollection values,
            DataValue value)
        {
            // ignore invalid case.
            if (value == null)
            {
                return;
            }

            // save the last timestamp returned.
            m_lastTime = value.ServerTimestamp;

            // check if the index range or data encoding can be applied.
            if (StatusCode.IsGood(value.StatusCode))
            {
                object valueToReturn = value.Value;

                // apply the index range.
                if (indexRange != NumericRange.Empty)
                {
                    StatusCode error = indexRange.ApplyRange(ref valueToReturn);

                    if (StatusCode.IsBad(error))
                    {
                        value.Value      = null;
                        value.StatusCode = error;
                    }
                    else
                    {
                        value.Value = valueToReturn;
                    }
                }

                // apply the data encoding.
                if (!QualifiedName.IsNull(dataEncoding))
                {
                    value.Value      = null;
                    value.StatusCode = StatusCodes.BadDataEncodingUnsupported;
                }
            }

            // apply the timestamps filter.
            if (timestampsToReturn == TimestampsToReturn.Neither || timestampsToReturn == TimestampsToReturn.Server)
            {
                value.SourceTimestamp = DateTime.MinValue;
            }

            if (timestampsToReturn == TimestampsToReturn.Neither || timestampsToReturn == TimestampsToReturn.Source)
            {
                value.ServerTimestamp = DateTime.MinValue;
            }

            // add result.
            values.Add(value);
        }
示例#2
0
        /// <summary>
        /// Adds index ranges to the collection.
        /// </summary>
        private void AddWriteValues(
            Node node,
            WriteValueCollection nodesToWrite,
            params uint[] attributeIds)
        {
            if (attributeIds != null)
            {
                for (int ii = 0; ii < attributeIds.Length; ii++)
                {
                    WriteValue nodeToWrite = new WriteValue();

                    nodeToWrite.NodeId      = node.NodeId;
                    nodeToWrite.AttributeId = attributeIds[ii];

                    DataValue value = new DataValue();

                    ServiceResult result = node.Read(
                        null,
                        attributeIds[ii],
                        value);

                    value.StatusCode      = StatusCodes.Good;
                    value.ServerTimestamp = DateTime.MinValue;
                    value.SourceTimestamp = DateTime.MinValue;

                    if (ServiceResult.IsBad(result))
                    {
                        value.Value = null;
                    }

                    nodeToWrite.Value  = value;
                    nodeToWrite.Handle = node;

                    nodesToWrite.Add(nodeToWrite);

                    Array array = value.Value as Array;

                    if (array != null)
                    {
                        NumericRange range = new NumericRange(0, 1);

                        object subarray = array;
                        range.ApplyRange(ref subarray);

                        nodeToWrite = new WriteValue();

                        nodeToWrite.Value                 = new DataValue();
                        nodeToWrite.Value.Value           = subarray;
                        nodeToWrite.Value.StatusCode      = StatusCodes.Good;
                        nodeToWrite.Value.ServerTimestamp = DateTime.MinValue;
                        nodeToWrite.Value.SourceTimestamp = DateTime.MinValue;
                        nodeToWrite.NodeId                = node.NodeId;
                        nodeToWrite.AttributeId           = attributeIds[ii];
                        nodeToWrite.IndexRange            = "0";
                        nodeToWrite.Handle                = node;

                        nodesToWrite.Add(nodeToWrite);
                    }

                    nodeToWrite = new WriteValue();

                    nodeToWrite.Value                 = new DataValue();
                    nodeToWrite.Value.Value           = value.Value;
                    nodeToWrite.Value.StatusCode      = StatusCodes.Uncertain;
                    nodeToWrite.Value.ServerTimestamp = DateTime.MinValue;
                    nodeToWrite.Value.SourceTimestamp = DateTime.MinValue;
                    nodeToWrite.NodeId                = node.NodeId;
                    nodeToWrite.AttributeId           = attributeIds[ii];
                    nodeToWrite.Handle                = node;

                    nodesToWrite.Add(nodeToWrite);

                    nodeToWrite = new WriteValue();

                    nodeToWrite.Value                 = new DataValue();
                    nodeToWrite.Value.Value           = value.Value;
                    nodeToWrite.Value.StatusCode      = StatusCodes.Good;
                    nodeToWrite.Value.ServerTimestamp = DateTime.UtcNow;
                    nodeToWrite.Value.SourceTimestamp = DateTime.MinValue;
                    nodeToWrite.NodeId                = node.NodeId;
                    nodeToWrite.AttributeId           = attributeIds[ii];
                    nodeToWrite.Handle                = node;

                    nodesToWrite.Add(nodeToWrite);

                    nodeToWrite = new WriteValue();

                    nodeToWrite.Value                 = new DataValue();
                    nodeToWrite.Value.Value           = value.Value;
                    nodeToWrite.Value.StatusCode      = StatusCodes.Good;
                    nodeToWrite.Value.ServerTimestamp = DateTime.MinValue;
                    nodeToWrite.Value.SourceTimestamp = DateTime.UtcNow;
                    nodeToWrite.NodeId                = node.NodeId;
                    nodeToWrite.AttributeId           = attributeIds[ii];
                    nodeToWrite.Handle                = node;

                    nodesToWrite.Add(nodeToWrite);
                }
            }
        }
        /// <summary>
        /// Reads the value for an attribute of a node.
        /// </summary>
        public DataValue ReadAttributeValue(
            IOperationContext    context, 
            ExpandedNodeId       typeDefinitionId,
            IList<QualifiedName> relativePath,
            uint                 attributeId,
            NumericRange         indexRange)
        {           
            lock (DataLock)
            {         
                // check for match on the event type being searched. 
                if (!Server.TypeTree.IsTypeOf(TypeDefinitionId, typeDefinitionId))
                {
                    return new DataValue(StatusCodes.BadNotSupported);
                }

                // find the target.
                NodeSource target = this;

                if (relativePath != null && relativePath.Count > 0)
                {                     
                    target = Find(relativePath, 0);

                    if (target == null)
                    {
                        return new DataValue(StatusCodes.BadNotSupported);
                    }
                }
                    
                // read the attribute value.
                DataValue dataValue = new DataValue();
                
                ServiceResult result = target.Read(context, attributeId, dataValue);

                if (ServiceResult.IsBad(result))
                {
                    return new DataValue(result.StatusCode);
                }

                // apply any index range.
                object value = dataValue.Value;

                result = indexRange.ApplyRange(ref value);

                if (ServiceResult.IsBad(result))
                {
                    return new DataValue(result.StatusCode);
                }

                dataValue.Value = value;

                // return the value.
                return dataValue;                
            }
        }
示例#4
0
        /// <summary>
        /// Adds index ranges to the collection.
        /// </summary>
        private void AddWriteValues(
            Node node, 
            WriteValueCollection nodesToWrite, 
            params uint[] attributeIds)
        {            
            if (attributeIds != null)
            {
                for (int ii = 0; ii < attributeIds.Length; ii++)
                {
                    WriteValue nodeToWrite = new WriteValue();
                
                    nodeToWrite.NodeId = node.NodeId;
                    nodeToWrite.AttributeId = attributeIds[ii];

                    DataValue value = new DataValue();

                    ServiceResult result = node.Read(
                        null,
                        attributeIds[ii],
                        value);
                
                    value.StatusCode = StatusCodes.Good;
                    value.ServerTimestamp = DateTime.MinValue;
                    value.SourceTimestamp = DateTime.MinValue;

                    if (ServiceResult.IsBad(result))
                    {
                        value.Value = null;
                    }

                    nodeToWrite.Value = value;
                    nodeToWrite.Handle = node;

                    nodesToWrite.Add(nodeToWrite);

                    Array array = value.Value as Array;

                    if (array != null)
                    {
                        NumericRange range = new NumericRange(0, 1);

                        object subarray = array;
                        range.ApplyRange(ref subarray);

                        nodeToWrite = new WriteValue();
                
                        nodeToWrite.Value = new DataValue();
                        nodeToWrite.Value.Value = subarray;
                        nodeToWrite.Value.StatusCode = StatusCodes.Good;
                        nodeToWrite.Value.ServerTimestamp = DateTime.MinValue;
                        nodeToWrite.Value.SourceTimestamp = DateTime.MinValue;
                        nodeToWrite.NodeId = node.NodeId;
                        nodeToWrite.AttributeId = attributeIds[ii];
                        nodeToWrite.IndexRange = "0";
                        nodeToWrite.Handle = node;
                    
                        nodesToWrite.Add(nodeToWrite);
                    }

                    nodeToWrite = new WriteValue();
            
                    nodeToWrite.Value = new DataValue();
                    nodeToWrite.Value.Value = value.Value;
                    nodeToWrite.Value.StatusCode = StatusCodes.Uncertain;
                    nodeToWrite.Value.ServerTimestamp = DateTime.MinValue;
                    nodeToWrite.Value.SourceTimestamp = DateTime.MinValue;
                    nodeToWrite.NodeId = node.NodeId;
                    nodeToWrite.AttributeId = attributeIds[ii];
                    nodeToWrite.Handle = node;
                
                    nodesToWrite.Add(nodeToWrite);

                    nodeToWrite = new WriteValue();
            
                    nodeToWrite.Value = new DataValue();
                    nodeToWrite.Value.Value = value.Value;
                    nodeToWrite.Value.StatusCode = StatusCodes.Good;
                    nodeToWrite.Value.ServerTimestamp = DateTime.UtcNow;
                    nodeToWrite.Value.SourceTimestamp = DateTime.MinValue;
                    nodeToWrite.NodeId = node.NodeId;
                    nodeToWrite.AttributeId = attributeIds[ii];
                    nodeToWrite.Handle = node;
                
                    nodesToWrite.Add(nodeToWrite);

                    nodeToWrite = new WriteValue();
            
                    nodeToWrite.Value = new DataValue();
                    nodeToWrite.Value.Value = value.Value;
                    nodeToWrite.Value.StatusCode = StatusCodes.Good;
                    nodeToWrite.Value.ServerTimestamp = DateTime.MinValue;
                    nodeToWrite.Value.SourceTimestamp = DateTime.UtcNow;
                    nodeToWrite.NodeId = node.NodeId;
                    nodeToWrite.AttributeId = attributeIds[ii];
                    nodeToWrite.Handle = node;
                
                    nodesToWrite.Add(nodeToWrite);
                }
            }
        }