Пример #1
0
        /// <summary>
        /// Called when a data changed event is received.
        /// </summary>
        public void OnDataChange(
            int dwTransid,
            int hGroup,
            int hrMasterquality,
            int hrMastererror,
            int dwCount,
            int[] phClientItems,
            object[] pvValues,
            short[] pwQualities,
            OpcRcw.Da.FILETIME[] pftTimeStamps,
            int[] pErrors)
        {
            try
            {
                OpcRequest request = null;

                lock (this)
                {
                    // check for an outstanding request.
                    if (dwTransid != 0)
                    {
                        request = (OpcRequest)m_requests[dwTransid];

                        if (request != null)
                        {
                            // remove the request.
                            m_requests.Remove(dwTransid);
                        }
                    }

                    // do nothing if no connections.
                    if (m_dataChanged == null)
                    {
                        return;
                    }

                    // unmarshal item values.
                    ItemValueResult[] values = UnmarshalValues(
                        dwCount,
                        phClientItems,
                        pvValues,
                        pwQualities,
                        pftTimeStamps,
                        pErrors);

                    // apply request options.
                    //lock (m_group.Items)
                    //{
                    //	m_group.Items.ApplyFilters(m_filters | (int)ResultFilter.ClientHandle, values);
                    //}

                    // invoke the callback.
                    m_dataChanged(m_handle, (request != null) ? request.Handle : null, values);
                }
            }
            catch (Exception e)
            {
                string stack = e.StackTrace;
            }
        }
Пример #2
0
 /// <summary>
 /// Returns true is an asynchrounous request can be cancelled.
 /// </summary>
 public bool CancelRequest(OpcRequest request)
 {
     lock (this)
     {
         return(m_requests.ContainsKey(request.RequestID));
     }
 }
Пример #3
0
 /// <summary>
 /// Remvoes an asynchrounous request.
 /// </summary>
 public void EndRequest(OpcRequest request)
 {
     lock (this)
     {
         m_requests.Remove(request.RequestID);
     }
 }
Пример #4
0
 /// <summary>
 /// Adds an asynchrounous request.
 /// </summary>
 public void BeginRequest(OpcRequest request)
 {
     lock (this)
     {
         m_requests[request.RequestID] = request;
     }
 }
Пример #5
0
        // handles asynchronous request cancel events.
        public void OnCancelComplete(
            int dwTransid,
            int hGroup)
        {
            try
            {
                OpcRequest request = 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);
                }

                // end the request.
                lock (request)
                {
                    request.EndRequest();
                }
            }
            catch (Exception e)
            {
                string stack = e.StackTrace;
            }
        }
Пример #6
0
        // sends read complete notifications.
        public void OnReadComplete(
            int dwTransid,
            int hGroup,
            int hrMasterquality,
            int hrMastererror,
            int dwCount,
            int[] phClientItems,
            object[] pvValues,
            short[] pwQualities,
            OpcRcw.Da.FILETIME[] pftTimeStamps,
            int[] pErrors)
        {
            try
            {
                OpcRequest        request = null;
                ItemValueResult[] values  = 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);

                    // unmarshal item values.
                    values = UnmarshalValues(
                        dwCount,
                        phClientItems,
                        pvValues,
                        pwQualities,
                        pftTimeStamps,
                        pErrors);

                    // apply request options.
                    lock (m_group.Items)
                    {
                        m_group.Items.ApplyFilters(m_filters | (int)ResultFilter.ClientHandle, values);
                    }
                }

                // end the request.
                lock (request)
                {
                    request.EndRequest(values);
                }
            }
            catch (Exception e)
            {
                string stack = e.StackTrace;
            }
        }
Пример #7
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       = HD.OPC.Client.Core.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;
            }
        }
Пример #8
0
        public IdentifiedResult[] AsyncWrite(
            ItemValue[] items,
            object requestHandle,
            WriteCompleteEventHandler callback,
            out IRequest request)
        {
            if (items == null)
            {
                throw new ArgumentNullException("items");
            }
            if (callback == null)
            {
                throw new ArgumentNullException("callback");
            }

            request = null;

            // check if nothing to do.
            if (items.Length == 0)
            {
                return(new IdentifiedResult[0]);
            }

            lock (this)
            {
                if (m_group == null)
                {
                    throw new Exception("The remote server is not currently connected.");
                }

                // ensure a callback connection is established with the server.
                if (m_connection == null)
                {
                    Advise();
                }

                // get item ids.
                ItemIdentifier[] itemIDs = null;

                lock (m_items)
                {
                    itemIDs = m_items.GetItemIDs(items);
                }

                // create request object.
                OpcRequest internalRequest = new OpcRequest(
                    this,
                    requestHandle,
                    m_filters,
                    m_counter++,
                    callback);

                // register request with callback object.
                m_callback.BeginRequest(internalRequest);
                request = internalRequest;

                // begin write request.
                IdentifiedResult[] results = null;
                int cancelID = 0;

                try
                {
                    results = BeginWrite(itemIDs, items, internalRequest.RequestID, out cancelID);
                }
                catch (Exception e)
                {
                    m_callback.EndRequest(internalRequest);
                    throw e;
                }

                // apply request options.
                lock (m_items)
                {
                    m_items.ApplyFilters(m_filters | (int)ResultFilter.ClientHandle, results);
                }

                lock (internalRequest)
                {
                    // check if all results have already arrived - this invokes the callback if this is the case.
                    if (internalRequest.BeginWrite(cancelID, results))
                    {
                        m_callback.EndRequest(internalRequest);
                        request = null;
                    }
                }

                // return initial results.
                return(results);
            }
        }