/// <summary> /// Gets the property values for a single item. /// </summary> /// <param name="session">The session.</param> /// <param name="itemId">The item id.</param> /// <param name="propertyIds">The property ids.</param> /// <returns>The list of properities.</returns> public DaValue[] GetPropertyValues(Session session, string itemId, params int[] propertyIds) { TraceState("GetPropertyValues", itemId); ComDaReadPropertiesRequest request = new ComDaReadPropertiesRequest(); request.ItemId = itemId; GetPropertyValues(session, new ComDaReadPropertiesRequest[] { request }, propertyIds); return(request.Values); }
/// <summary> /// Gets the properties. /// </summary> /// <param name="requests">The requests.</param> /// <param name="propertyIds">The property ids.</param> /// <returns>The list of properities.</returns> public IList<DaProperty> GetProperties(ComDaReadPropertiesRequest[] requests, params int[] propertyIds) { Session session = Session; if (session == null) { throw ComUtils.CreateComException(ResultIds.E_FAIL); } return m_browseManager.GetPropertyValues(session, requests, propertyIds); }
/// <summary> /// Writes the values for the specified item ids. /// </summary> /// <param name="itemIds">The item ids.</param> /// <param name="values">The values.</param> /// <returns>The results.</returns> public int[] Write(string[] itemIds, DaValue[] values) { int[] results = new int[itemIds.Length]; WriteValueCollection valuesToWrite = new WriteValueCollection(); ComDaReadPropertiesRequest[] requests = new ComDaReadPropertiesRequest[values.Length]; // prepare request. for (int ii = 0; ii < itemIds.Length; ii++) { ComDaReadPropertiesRequest request = requests[ii] = new ComDaReadPropertiesRequest(); request.ItemId = itemIds[ii]; } // need to get the data type of the remote node. m_browseManager.GetPropertyValues(Session, requests, PropertyIds.UaBuiltInType, PropertyIds.UaValueRank); // validate items. for (int ii = 0; ii < requests.Length; ii++) { ComDaReadPropertiesRequest request = requests[ii]; if (request.Error < 0) { results[ii] = request.Error; continue; } int? builtInType = request.Values[0].Value as int?; int? valueRank = request.Values[1].Value as int?; if (builtInType == null || valueRank == null) { results[ii] = ResultIds.E_UNKNOWNITEMID; continue; } // convert value to UA data type. WriteValue valueToWrite = new WriteValue(); valueToWrite.NodeId = m_mapper.GetRemoteNodeId(itemIds[ii]); valueToWrite.AttributeId = Attributes.Value; valueToWrite.Handle = ii; // convert value to UA data type. try { TypeInfo remoteType = new TypeInfo((BuiltInType)builtInType.Value, valueRank.Value); valueToWrite.Value = m_mapper.GetRemoteDataValue(values[ii], remoteType); } catch (Exception e) { results[ii] = ComUtils.GetErrorCode(e, ResultIds.E_BADTYPE); continue; } valuesToWrite.Add(valueToWrite); } // check if nothing to do. if (valuesToWrite.Count == 0) { return results; } // write the values to the server. int[] remoteResults = m_groupManager.Write(valuesToWrite); // copy results. for (int ii = 0; ii < valuesToWrite.Count; ii++) { results[(int)valuesToWrite[ii].Handle] = remoteResults[ii]; } return results; }
/// <summary> /// Writes the values for the specified item ids. /// </summary> /// <param name="itemIds">The item ids.</param> /// <param name="values">The values.</param> /// <returns>The results.</returns> public int[] Write(string[] itemIds, DaValue[] values) { int[] results = new int[itemIds.Length]; WriteValueCollection valuesToWrite = new WriteValueCollection(); ComDaReadPropertiesRequest[] requests = new ComDaReadPropertiesRequest[values.Length]; // prepare request. for (int ii = 0; ii < itemIds.Length; ii++) { ComDaReadPropertiesRequest request = requests[ii] = new ComDaReadPropertiesRequest(); request.ItemId = itemIds[ii]; } // need to get the data type of the remote node. m_browseManager.GetPropertyValues(Session, requests, PropertyIds.UaBuiltInType, PropertyIds.UaValueRank); // validate items. for (int ii = 0; ii < requests.Length; ii++) { ComDaReadPropertiesRequest request = requests[ii]; if (request.Error < 0) { results[ii] = request.Error; continue; } int?builtInType = request.Values[0].Value as int?; int?valueRank = request.Values[1].Value as int?; if (builtInType == null || valueRank == null) { results[ii] = ResultIds.E_UNKNOWNITEMID; continue; } // convert value to UA data type. WriteValue valueToWrite = new WriteValue(); valueToWrite.NodeId = m_mapper.GetRemoteNodeId(itemIds[ii]); valueToWrite.AttributeId = Attributes.Value; valueToWrite.Handle = ii; // convert value to UA data type. try { TypeInfo remoteType = new TypeInfo((BuiltInType)builtInType.Value, valueRank.Value); valueToWrite.Value = m_mapper.GetRemoteDataValue(values[ii], remoteType); } catch (Exception e) { results[ii] = ComUtils.GetErrorCode(e, ResultIds.E_BADTYPE); continue; } valuesToWrite.Add(valueToWrite); } // check if nothing to do. if (valuesToWrite.Count == 0) { return(results); } // write the values to the server. int[] remoteResults = m_groupManager.Write(valuesToWrite); // copy results. for (int ii = 0; ii < valuesToWrite.Count; ii++) { results[(int)valuesToWrite[ii].Handle] = remoteResults[ii]; } return(results); }
/// <summary> /// Gets the property values for a single item. /// </summary> /// <param name="session">The session.</param> /// <param name="itemId">The item id.</param> /// <param name="propertyIds">The property ids.</param> /// <returns>The list of properities.</returns> public DaValue[] GetPropertyValues(Session session, string itemId, params int[] propertyIds) { TraceState("GetPropertyValues", itemId); ComDaReadPropertiesRequest request = new ComDaReadPropertiesRequest(); request.ItemId = itemId; GetPropertyValues(session, new ComDaReadPropertiesRequest[] { request }, propertyIds); return request.Values; }
/// <summary> /// Gets the properties for list of items. /// </summary> /// <param name="session">The session.</param> /// <param name="requests">The requests.</param> /// <param name="propertyIds">The property ids.</param> /// <returns>The list of properities.</returns> public IList<DaProperty> GetPropertyValues(Session session, ComDaReadPropertiesRequest[] requests, params int[] propertyIds) { return m_cache.GetPropertyValues(session, requests, propertyIds); }
/// <summary> /// Updates the read property request with the property values. /// </summary> /// <param name="request">The request.</param> /// <param name="element">The element.</param> /// <param name="propertyIds">The property ids.</param> private void UpdateReadPropertyRequest(ComDaReadPropertiesRequest request, BrowseElement element, int[] propertyIds) { if (element == null) { request.Error = ResultIds.E_UNKNOWNITEMID; return; } request.Values = new DaValue[propertyIds.Length]; for (int ii = 0; ii < propertyIds.Length; ii++) { request.Values[ii] = GetPropertyValue(element, propertyIds[ii]); } }
/// <summary> /// Gets the properties. /// </summary> /// <param name="session">The session.</param> /// <param name="requests">The requests.</param> /// <param name="propertyIds">The property ids.</param> /// <returns>The list of properities.</returns> public IList<DaProperty> GetPropertyValues(Session session, ComDaReadPropertiesRequest[] requests, params int[] propertyIds) { TraceState("GetPropertyValues", requests.Length); // select all supported properties if none provided IList<DaProperty> properties = s_SupportedProperties; if (propertyIds == null || propertyIds.Length == 0) { propertyIds = new int[s_SupportedProperties.Length]; for (int ii = 0; ii < propertyIds.Length; ii++) { propertyIds[ii] = s_SupportedProperties[ii].PropertyId; } } // return the descriptions that match the requested properties. else { properties = new DaProperty[propertyIds.Length]; for (int ii = 0; ii < propertyIds.Length; ii++) { for (int jj = 0; jj < s_SupportedProperties.Length; jj++) { if (propertyIds[ii] == s_SupportedProperties[jj].PropertyId) { properties[ii] = s_SupportedProperties[jj]; break; } } } } // build a list of elements to create. BrowseElement[] elements = new BrowseElement[requests.Length]; int[] indexes = new int[requests.Length]; BrowseDescriptionCollection nodesToBrowse = new BrowseDescriptionCollection(); for (int ii = 0; ii < requests.Length; ii++) { BrowseElement element = null; // lookup element in cache. lock (m_lock) { string itemId = requests[ii].ItemId; if (String.IsNullOrEmpty(itemId)) { requests[ii].Error = ResultIds.E_INVALIDITEMID; elements[ii] = null; continue; } // if (m_cache.TryGetValue(itemId, out element)) // { // UpdateReadPropertyRequest(requests[ii], element, propertyIds); // continue; // } // create a new element. elements[ii] = element = new BrowseElement(); } element.ItemId = requests[ii].ItemId; element.NodeId = m_mapper.GetRemoteNodeId(element.ItemId); // prepare a request to browse the children. indexes[ii] = PrepareBrowseElementBrowseRequest(element.NodeId, nodesToBrowse); } // check if nothing more to do. if (nodesToBrowse.Count == 0) { return properties; } // browse all elements at once. BrowseResultCollection results = Browse(session, nodesToBrowse); // validate results and prepare read requests. ReadValueIdCollection nodesToRead = new ReadValueIdCollection(); for (int ii = 0; ii < elements.Length; ii++) { BrowseElement element = elements[ii]; if (element == null) { continue; } // update the element with the children found. if (!UpdateBrowseElement(element, nodesToBrowse, results, indexes[ii])) { requests[ii].Error = ResultIds.E_UNKNOWNITEMID; elements[ii] = null; continue; } // prepare to read the properties from the server. indexes[ii] = PrepareBrowseElementReadRequest( element.NodeId, element.ReferencesByName, nodesToRead, NodeClass.Unspecified, false); } // check if nothing to do. if (nodesToRead.Count == 0) { return properties; } // read all child properties at once. DataValueCollection values = Read(session, nodesToRead); // process results and build final table. for (int ii = 0; ii < elements.Length; ii++) { BrowseElement element = elements[ii]; if (element == null) { continue; } // update the browse element with the property values. if (!UpdateBrowseElement(session.TypeTree, element, nodesToRead, values, NodeClass.Unspecified, false, indexes[ii])) { requests[ii].Error = ResultIds.E_UNKNOWNITEMID; continue; } UpdateReadPropertyRequest(requests[ii], element, propertyIds); // save element in cache. lock (m_lock) { element.CacheTimestamp = DateTime.UtcNow; m_cache[element.ItemId] = element; } } // return the descriptions. return properties; }