示例#1
0
        /// <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);
        }
示例#2
0
        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);
        }
示例#3
0
 /// <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;
     }
 }
示例#4
0
 /// <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;
     }
 }
示例#5
0
        /// <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);
        }
示例#6
0
        /// <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);
        }
示例#7
0
 /// <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;
 }
示例#8
0
 /// <summary>
 /// Initialize object with the specified ItemIdentifier and result code.
 /// </summary>
 public IdentifiedResult(ItemIdentifier item, ResultID resultID)
     : base(item)
 {
     ResultID = resultID;
 }
示例#9
0
 /// <summary>
 /// Initialize object with the specified ItemIdentifier object.
 /// </summary>
 public IdentifiedResult(ItemIdentifier item)
     : base(item)
 {
 }
示例#10
0
 /// <summary>
 /// Initializes the object with an ItemIdentifier object.
 /// </summary>
 public ItemValueResult(ItemIdentifier item) : base(item)
 {
 }
示例#11
0
        // 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;
            }
        }