/// <summary> /// Converts a UA Aggregate ID to a HDA aggregate ID /// </summary> /// <param name="nodeId">The node id.</param> /// <param name="namespaceIndex">Index of the namespace.</param> /// <returns></returns> public static uint HdaAggregateToUaAggregate(NodeId nodeId, ushort namespaceIndex) { // check for valid node. if (nodeId == null) { return(0); } // check for built in aggregate. uint aggregateId = ComUtils.GetHdaAggregateId(nodeId); if (aggregateId != 0) { return(aggregateId); } // parse the node id. HdaParsedNodeId parsedNodeId = HdaParsedNodeId.Parse(nodeId); if (parsedNodeId == null || namespaceIndex != parsedNodeId.NamespaceIndex || parsedNodeId.RootType != HdaModelUtils.HdaAggregate) { return(0); } return(parsedNodeId.AggregateId); }
/// <summary> /// Gets the item annotations node. /// </summary> /// <param name="itemId">The item id.</param> /// <param name="namespaceIndex">Index of the namespace.</param> /// <returns></returns> public static PropertyState GetItemAnnotationsNode(string itemId, ushort namespaceIndex) { if (itemId == null) { return(null); } PropertyState component = new PropertyState(null); component.NodeId = HdaParsedNodeId.Construct(HdaModelUtils.HdaItemAnnotations, itemId, null, namespaceIndex); component.SymbolicName = Opc.Ua.BrowseNames.Annotations; component.BrowseName = new QualifiedName(component.SymbolicName); component.DisplayName = component.BrowseName.Name; component.DataType = DataTypeIds.Annotation; component.ValueRank = ValueRanks.Scalar; component.MinimumSamplingInterval = MinimumSamplingIntervals.Indeterminate; component.Historizing = false; component.AccessLevel = AccessLevels.HistoryRead; component.UserAccessLevel = AccessLevels.HistoryRead; component.ReferenceTypeId = Opc.Ua.ReferenceTypeIds.HasProperty; component.TypeDefinitionId = Opc.Ua.VariableTypeIds.PropertyType; component.AddReference(ReferenceTypeIds.HasProperty, true, HdaModelUtils.ConstructIdForHdaItem(itemId, namespaceIndex)); return(component); }
/// <summary> /// Converts a HDA Aggregate ID to a UA aggregate ID /// </summary> /// <param name="aggregateId">The aggregate id.</param> /// <param name="namespaceIndex">Index of the namespace.</param> /// <returns></returns> public static NodeId HdaAggregateToUaAggregate(uint aggregateId, ushort namespaceIndex) { NodeId nodeId = ComUtils.GetHdaAggregateId(aggregateId); if (nodeId != null) { return(nodeId); } return(HdaParsedNodeId.Construct(HdaAggregate, aggregateId.ToString(), null, namespaceIndex)); }
/// <summary> /// Gets the item configuration node. /// </summary> /// <param name="itemId">The item id.</param> /// <param name="namespaceIndex">Index of the namespace.</param> /// <returns></returns> public static BaseInstanceState GetItemConfigurationNode(string itemId, ushort namespaceIndex) { if (itemId == null) { return(null); } FolderState component = new FolderState(null); component.NodeId = HdaParsedNodeId.Construct(HdaModelUtils.HdaItemConfiguration, itemId, null, namespaceIndex); component.SymbolicName = Opc.Ua.BrowseNames.HAConfiguration; component.BrowseName = new QualifiedName(component.SymbolicName); component.DisplayName = component.BrowseName.Name; component.ReferenceTypeId = Opc.Ua.ReferenceTypeIds.HasComponent; component.TypeDefinitionId = Opc.Ua.ObjectTypeIds.HistoricalDataConfigurationType; component.EventNotifier = EventNotifiers.None; component.AddReference(ReferenceTypeIds.HasHistoricalConfiguration, true, HdaModelUtils.ConstructIdForHdaItem(itemId, namespaceIndex)); component.AddReference(ReferenceTypeIds.HasComponent, false, HdaModelUtils.ConstructIdForInternalNode(Opc.Ua.BrowseNames.AggregateConfiguration, namespaceIndex)); return(component); }
/// <summary> /// Reads the history of an HDA item annotations. /// </summary> private ServiceResult HistoryReadAnnotations( ServerSystemContext context, ComHdaClient client, ReadRawModifiedDetails details, TimestampsToReturn timestampsToReturn, HistoryReadValueId nodeToRead, HdaParsedNodeId parsedNodeId, HistoryReadResult result) { // create the request or load it from a continuation point. HdaHistoryReadAnnotationRequest request = null; if (nodeToRead.ContinuationPoint == null) { // create a new request. request = new HdaHistoryReadAnnotationRequest(parsedNodeId.RootId, details, nodeToRead); // fetch all of the data at once. result.StatusCode = client.ReadAnnotationHistory(request); } else { request = LoadContinuationPoint(context, nodeToRead.ContinuationPoint) as HdaHistoryReadAnnotationRequest; if (request == null) { return StatusCodes.BadContinuationPointInvalid; } } // select a subset of the results. if (StatusCode.IsGood(result.StatusCode)) { request.Results = new DataValueCollection(); request.GetHistoryResults(context, nodeToRead, request.Results); } // fill in the results. if (request.Results != null) { HistoryData data = new HistoryData(); data.DataValues = request.Results; result.HistoryData = new ExtensionObject(data); } // create a new continuation point. if (!request.Completed) { result.ContinuationPoint = SaveContinuationPoint(context, request); } return result.StatusCode; }
/// <summary> /// Reads the history of an HDA item. /// </summary> private ServiceResult HistoryReadItem( ServerSystemContext context, ComHdaClient client, ReadRawModifiedDetails details, TimestampsToReturn timestampsToReturn, HistoryReadValueId nodeToRead, HdaParsedNodeId parsedNodeId, HistoryReadResult result) { // create the request or load it from a continuation point. HdaHistoryReadRawModifiedRequest request = null; if (nodeToRead.ContinuationPoint == null) { request = new HdaHistoryReadRawModifiedRequest(parsedNodeId.RootId, details, nodeToRead); } else { request = LoadContinuationPoint(context, nodeToRead.ContinuationPoint) as HdaHistoryReadRawModifiedRequest; if (request == null) { return StatusCodes.BadContinuationPointInvalid; } } // fetch the data. result.StatusCode = client.ReadHistory(request); // fill in the results. if (request.Results != null) { HistoryData data = (request.IsReadModified)?new HistoryModifiedData():new HistoryData(); if (request.IsReadModified) { ((HistoryModifiedData)data).ModificationInfos = request.ModificationInfos; } data.DataValues = request.Results; result.HistoryData = new ExtensionObject(data); } // create a new continuation point. if (!request.Completed) { result.ContinuationPoint = SaveContinuationPoint(context, request); } return result.StatusCode; }
/// <summary> /// Parses the specified node identifier. /// </summary> /// <param name="nodeId">The node identifier.</param> /// <returns>The parsed node identifier. Null if the identifier cannot be parsed.</returns> public static new HdaParsedNodeId Parse(NodeId nodeId) { // can only parse non-null string node identifiers. if (NodeId.IsNull(nodeId)) { return null; } string identifier = nodeId.Identifier as string; if (String.IsNullOrEmpty(identifier)) { return null; } HdaParsedNodeId parsedNodeId = new HdaParsedNodeId(); parsedNodeId.NamespaceIndex = nodeId.NamespaceIndex; int start = 0; // extract the type of identifier. parsedNodeId.RootType = (int)ExtractNumber(identifier, ref start); if (start >= identifier.Length || identifier[start] != ':') { return null; } // extract any component path. StringBuilder buffer = new StringBuilder(); int index = start+1; parsedNodeId.RootId = ExtractAndUnescapeString(identifier, ref index, '&', '?'); // extract any component. int end = index+1; parsedNodeId.ComponentPath = null; // extract the component path. if (end < identifier.Length) { parsedNodeId.ComponentPath = identifier.Substring(end); } // extract the category and condition name. start = 0; identifier = parsedNodeId.RootId; switch (parsedNodeId.RootType) { case HdaModelUtils.HdaAggregate: { parsedNodeId.AggregateId = ExtractNumber(identifier, ref start); if (start < identifier.Length) { return null; } break; } } // extract the attribute id. if (!String.IsNullOrEmpty(parsedNodeId.ComponentPath)) { start = 0; identifier = parsedNodeId.ComponentPath; switch (parsedNodeId.RootType) { case HdaModelUtils.HdaItemAttribute: { parsedNodeId.AttributeId = ExtractNumber(identifier, ref start); if (start < identifier.Length) { return null; } break; } } } return parsedNodeId; }
/// <summary> /// Initializes a new instance of the <see cref="DaItemState"/> class. /// </summary> /// <param name="configuration">The configuration.</param> /// <param name="itemId">The item id.</param> /// <param name="attribute">The attribute.</param> /// <param name="namespaceIndex">Index of the namespace.</param> public HdaAttributeState( ComHdaClientConfiguration configuration, string itemId, HdaAttribute attribute, ushort namespaceIndex) : base(null) { m_itemId = itemId; m_attribute = attribute; this.NodeId = HdaModelUtils.ConstructIdForHdaItemAttribute(itemId, attribute.Id, namespaceIndex); this.SymbolicName = attribute.Id.ToString(); this.Description = attribute.Description; this.AccessLevel = AccessLevels.CurrentRead; this.UserAccessLevel = AccessLevels.CurrentRead; this.MinimumSamplingInterval = MinimumSamplingIntervals.Indeterminate; this.Historizing = false; this.ReferenceTypeId = Opc.Ua.ReferenceTypeIds.HasProperty; this.TypeDefinitionId = Opc.Ua.VariableTypeIds.PropertyType; this.Value = null; this.StatusCode = StatusCodes.BadWaitingForInitialData; bool isConfigItem = false; // handle built-in properties. switch (attribute.Id) { default: { bool isArray = false; this.BrowseName = new QualifiedName(this.SymbolicName, namespaceIndex); this.DisplayName = attribute.Name; this.DataType = ComUtils.GetDataTypeId(attribute.DataType, out isArray); this.ValueRank = (isArray)?ValueRanks.OneDimension:ValueRanks.Scalar; break; } case Constants.OPCHDA_ENG_UNITS: { this.BrowseName = Opc.Ua.BrowseNames.EngineeringUnits; this.DisplayName = this.BrowseName.Name; this.DataType = Opc.Ua.DataTypeIds.EUInformation; this.ValueRank = ValueRanks.Scalar; break; } case Constants.OPCHDA_NORMAL_MAXIMUM: { this.BrowseName = Opc.Ua.BrowseNames.EURange; this.DisplayName = this.BrowseName.Name; this.DataType = Opc.Ua.DataTypeIds.Range; this.ValueRank = ValueRanks.Scalar; break; } case Constants.OPCHDA_HIGH_ENTRY_LIMIT: { this.BrowseName = Opc.Ua.BrowseNames.InstrumentRange; this.DisplayName = this.BrowseName.Name; this.DataType = Opc.Ua.DataTypeIds.Range; this.ValueRank = ValueRanks.Scalar; break; } case Constants.OPCHDA_STEPPED: { this.BrowseName = Opc.Ua.BrowseNames.Stepped; this.DisplayName = this.BrowseName.Name; this.DataType = Opc.Ua.DataTypeIds.Boolean; this.ValueRank = ValueRanks.Scalar; isConfigItem = true; break; } case Constants.OPCHDA_DERIVE_EQUATION: { this.BrowseName = Opc.Ua.BrowseNames.Definition; this.DisplayName = this.BrowseName.Name; this.DataType = Opc.Ua.DataTypeIds.String; this.ValueRank = ValueRanks.Scalar; isConfigItem = true; break; } case Constants.OPCHDA_MIN_TIME_INT: { this.BrowseName = Opc.Ua.BrowseNames.MinTimeInterval; this.DisplayName = this.BrowseName.Name; this.DataType = Opc.Ua.DataTypeIds.Duration; this.ValueRank = ValueRanks.Scalar; isConfigItem = true; break; } case Constants.OPCHDA_MAX_TIME_INT: { this.BrowseName = Opc.Ua.BrowseNames.MaxTimeInterval; this.DisplayName = this.BrowseName.Name; this.DataType = Opc.Ua.DataTypeIds.Duration; this.ValueRank = ValueRanks.Scalar; isConfigItem = true; break; } case Constants.OPCHDA_EXCEPTION_DEV: { this.BrowseName = Opc.Ua.BrowseNames.ExceptionDeviation; this.DisplayName = this.BrowseName.Name; this.DataType = Opc.Ua.DataTypeIds.Double; this.ValueRank = ValueRanks.Scalar; isConfigItem = true; break; } case Constants.OPCHDA_EXCEPTION_DEV_TYPE: { this.BrowseName = Opc.Ua.BrowseNames.ExceptionDeviationFormat; this.DisplayName = this.BrowseName.Name; this.DataType = Opc.Ua.DataTypeIds.ExceptionDeviationFormat; this.ValueRank = ValueRanks.Scalar; isConfigItem = true; break; } } // set the parent id. NodeId parentId = null; if (isConfigItem) { parentId = HdaParsedNodeId.Construct(HdaModelUtils.HdaItemConfiguration, itemId, null, namespaceIndex); } else { parentId = HdaModelUtils.ConstructIdForHdaItem(itemId, namespaceIndex); } this.AddReference(ReferenceTypeIds.HasProperty, true, parentId); }
/// <summary> /// Parses the specified node identifier. /// </summary> /// <param name="nodeId">The node identifier.</param> /// <returns>The parsed node identifier. Null if the identifier cannot be parsed.</returns> public static new HdaParsedNodeId Parse(NodeId nodeId) { // can only parse non-null string node identifiers. if (NodeId.IsNull(nodeId)) { return(null); } string identifier = nodeId.Identifier as string; if (String.IsNullOrEmpty(identifier)) { return(null); } HdaParsedNodeId parsedNodeId = new HdaParsedNodeId(); parsedNodeId.NamespaceIndex = nodeId.NamespaceIndex; int start = 0; // extract the type of identifier. parsedNodeId.RootType = (int)ExtractNumber(identifier, ref start); if (start >= identifier.Length || identifier[start] != ':') { return(null); } // extract any component path. StringBuilder buffer = new StringBuilder(); int index = start + 1; parsedNodeId.RootId = ExtractAndUnescapeString(identifier, ref index, '&', '?'); // extract any component. int end = index + 1; parsedNodeId.ComponentPath = null; // extract the component path. if (end < identifier.Length) { parsedNodeId.ComponentPath = identifier.Substring(end); } // extract the category and condition name. start = 0; identifier = parsedNodeId.RootId; switch (parsedNodeId.RootType) { case HdaModelUtils.HdaAggregate: { parsedNodeId.AggregateId = ExtractNumber(identifier, ref start); if (start < identifier.Length) { return(null); } break; } } // extract the attribute id. if (!String.IsNullOrEmpty(parsedNodeId.ComponentPath)) { start = 0; identifier = parsedNodeId.ComponentPath; switch (parsedNodeId.RootType) { case HdaModelUtils.HdaItemAttribute: { parsedNodeId.AttributeId = ExtractNumber(identifier, ref start); if (start < identifier.Length) { return(null); } break; } } } return(parsedNodeId); }