/// <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; } }
/// <summary> /// Returns true is an asynchrounous request can be cancelled. /// </summary> public bool CancelRequest(OpcRequest request) { lock (this) { return(m_requests.ContainsKey(request.RequestID)); } }
/// <summary> /// Remvoes an asynchrounous request. /// </summary> public void EndRequest(OpcRequest request) { lock (this) { m_requests.Remove(request.RequestID); } }
/// <summary> /// Adds an asynchrounous request. /// </summary> public void BeginRequest(OpcRequest request) { lock (this) { m_requests[request.RequestID] = request; } }
// 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; } }
// 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; } }
// 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; } }
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); } }