/// <summary> /// Updates a result list based on the request options and sets the handles for use by the client. /// </summary> public ItemIdentifier[] ApplyFilters(int filters, ItemIdentifier[] results) { if (results == null) { return(null); } foreach (ItemIdentifier result in results) { ItemIdentifier itemID = this[result.ClientHandle]; if (itemID != null) { result.ItemName = ((filters & (int)ResultFilter.ItemName) != 0) ? itemID.ItemName : null; result.ItemPath = ((filters & (int)ResultFilter.ItemPath) != 0) ? itemID.ItemPath : null; result.ServerHandle = result.ClientHandle; result.ClientHandle = ((filters & (int)ResultFilter.ClientHandle) != 0) ? itemID.ClientHandle : null; } if ((filters & (int)ResultFilter.ItemTime) == 0) { if (result.GetType() == typeof(ItemValueResult)) { ((ItemValueResult)result).Timestamp = DateTime.MinValue; ((ItemValueResult)result).TimestampSpecified = false; } } } return(results); }
public ItemIdentifier[] GetItemIDs(object[] itemClientHandles) { // create an invalid server handle. int invalidHandle = GetInvalidHandle(); // copy the items. ItemIdentifier[] itemIDs = new ItemIdentifier[itemClientHandles.Length]; for (int ii = 0; ii < itemClientHandles.Length; ii++) { // lookup server handle. ItemIdentifier itemID = this[itemClientHandles[ii].GetHashCode()]; // copy the item id. if (itemID != null) { itemIDs[ii] = (ItemIdentifier)itemID.Clone(); } // create an invalid item id. else { itemIDs[ii] = new ItemIdentifier(); itemIDs[ii].ServerHandle = invalidHandle; } // store the internal handle as the client handle. //itemIDs[ii].ClientHandle = items[ii].ServerHandle; } // return the item copies. return(itemIDs); }
/// <summary> /// Initializes object with the specified ItemIdentifier object. /// </summary> public OpcItem(ItemIdentifier item) { if (item != null) { ItemName = item.ItemName; ItemPath = item.ItemPath; ClientHandle = item.ClientHandle; ServerHandle = item.ServerHandle; } }
/// <summary> /// Initializes the object with the specified item identifier. /// </summary> public ItemIdentifier(ItemIdentifier itemID) { if (itemID != null) { ItemPath = itemID.ItemPath; ItemName = itemID.ItemName; ClientHandle = itemID.ClientHandle; ServerHandle = itemID.ServerHandle; } }
/// <summary> /// Creates a item result list from a set of items and sets the handles for use by the server. /// </summary> public ItemResult[] CreateItems(OpcItem[] items) { if (items == null) { return(null); } ItemResult[] results = new ItemResult[items.Length]; for (int ii = 0; ii < items.Length; ii++) { // initialize result with the item results[ii] = new ItemResult((OpcItem)items[ii]); // lookup the cached identifier. ItemIdentifier itemID = this[items[ii].ServerHandle]; if (itemID != null) { results[ii].ItemName = itemID.ItemName; results[ii].ItemPath = itemID.ItemName; results[ii].ServerHandle = itemID.ServerHandle; // update the client handle. itemID.ClientHandle = items[ii].ClientHandle; } // check if handle not found. if (results[ii].ServerHandle == null) { results[ii].ResultID = ResultID.Da.E_INVALIDHANDLE; results[ii].DiagnosticInfo = null; continue; } // replace client handle with internal handle. results[ii].ClientHandle = items[ii].ServerHandle; } return(results); }
/// <summary> /// Creates an array of item value result objects from the callback data. /// </summary> private ItemValueResult[] UnmarshalValues( int dwCount, int[] phClientItems, object[] pvValues, short[] pwQualities, OpcRcw.Da.FILETIME[] pftTimeStamps, int[] pErrors) { // contruct the item value results. ItemValueResult[] values = new ItemValueResult[dwCount]; for (int ii = 0; ii < values.Length; ii++) { // lookup the external client handle. ItemIdentifier itemID = (ItemIdentifier)m_group.Items[phClientItems[ii]]; values[ii] = new ItemValueResult(itemID); //values[ii].ClientHandle = phClientItems[ii]; values[ii].Value = pvValues[ii]; values[ii].Quality = new Quality(pwQualities[ii]); values[ii].QualitySpecified = true; FILETIME output = new FILETIME(); output.dwLowDateTime = pftTimeStamps[ii].dwLowDateTime; output.dwHighDateTime = pftTimeStamps[ii].dwHighDateTime; values[ii].Timestamp = OpcDa.Client.Com.Interop.GetFILETIME(output); values[ii].TimestampSpecified = values[ii].Timestamp != DateTime.MinValue; values[ii].ResultID = OpcDa.Client.Com.Interop.GetResultID(pErrors[ii]); values[ii].DiagnosticInfo = null; // convert COM code to unified DA code. if (pErrors[ii] == ResultIDs.E_BADRIGHTS) { values[ii].ResultID = new ResultID(ResultID.Da.E_WRITEONLY, ResultIDs.E_BADRIGHTS); } } // return results return(values); }
/// <summary> /// Initialize object with the specified ItemIdentifier, result code and diagnostic info. /// </summary> public IdentifiedResult(ItemIdentifier item, ResultID resultID, string diagnosticInfo) : base(item) { ResultID = resultID; DiagnosticInfo = diagnosticInfo; }
/// <summary> /// Initialize object with the specified ItemIdentifier and result code. /// </summary> public IdentifiedResult(ItemIdentifier item, ResultID resultID) : base(item) { ResultID = resultID; }
/// <summary> /// Initialize object with the specified ItemIdentifier object. /// </summary> public IdentifiedResult(ItemIdentifier item) : base(item) { }
/// <summary> /// Initializes the object with an ItemIdentifier object. /// </summary> public ItemValueResult(ItemIdentifier item) : base(item) { }
// handles asynchronous write complete events. public void OnWriteComplete( int dwTransid, int hGroup, int hrMastererror, int dwCount, int[] phClientItems, int[] pErrors) { try { OpcRequest request = null; IdentifiedResult[] results = null; lock (this) { // do nothing if no outstanding requests. request = (OpcRequest)m_requests[dwTransid]; if (request == null) { return; } // remove the request. m_requests.Remove(dwTransid); // contruct the item results. results = new IdentifiedResult[dwCount]; for (int ii = 0; ii < results.Length; ii++) { // lookup the external client handle. ItemIdentifier itemID = (ItemIdentifier)m_group.Items[phClientItems[ii]]; results[ii] = new IdentifiedResult(itemID); results[ii].ClientHandle = phClientItems[ii]; results[ii].ResultID = OpcDa.Client.Com.Interop.GetResultID(pErrors[ii]); results[ii].DiagnosticInfo = null; // convert COM code to unified DA code. if (pErrors[ii] == ResultIDs.E_BADRIGHTS) { results[ii].ResultID = new ResultID(ResultID.Da.E_READONLY, ResultIDs.E_BADRIGHTS); } } // apply request options. lock (m_group.Items) { m_group.Items.ApplyFilters(m_filters | (int)ResultFilter.ClientHandle, results); } } // end the request. lock (request) { request.EndRequest(results); } } catch (Exception e) { string stack = e.StackTrace; } }