/// <summary> /// Called when an asynchronous read operation completes. /// </summary> public void OnReadComplete( int dwTransid, int hGroup, int hrMasterquality, int hrMastererror, int dwCount, int[] phClientItems, object[] pvValues, short[] pwQualities, System.Runtime.InteropServices.ComTypes.FILETIME[] pftTimeStamps, int[] pErrors) { try { // unmarshal item values. DaValue[] values = ComDaGroup.GetItemValues( dwCount, pvValues, pwQualities, pftTimeStamps, pErrors); // invoke the callback. m_group.OnReadComplete(dwTransid, phClientItems, values); } catch (Exception e) { Utils.Trace(e, "Unexpected error processing OnReadComplete callback."); } }
/// <summary> /// Initializes the object with the containing subscription object. /// </summary> public ComDaDataCallback(ComDaGroup group) { // save group. m_group = group; // create connection point. m_connectionPoint = new ConnectionPoint(group.Unknown, typeof(OpcRcw.Da.IOPCDataCallback).GUID); // advise. m_connectionPoint.Advise(this); }
/// <summary> /// Reads the item values and stores the results in the request object. /// </summary> /// <param name="requests">The requests.</param> public void ReadItemValues(List <ReadRequest> requests) { ComDaGroup group = new ComDaGroup(this, false); try { int count1 = 0; GroupItem[] items = new GroupItem[requests.Count]; ReadRequest[] addItemRequests = new ReadRequest[requests.Count]; // create the items in the temporary group. for (int ii = 0; ii < requests.Count; ii++) { ReadRequest request = requests[ii]; if (request == null) { continue; } if (!request.ValueRequired) { continue; } // add the item. items[count1] = group.CreateItem(request.ItemId, 0, 0, true); addItemRequests[count1] = request; count1++; } // create the items on the server. group.ApplyChanges(); // build the list of values to write. int count2 = 0; int[] serverHandles = new int[count1]; ReadRequest[] readRequests = new ReadRequest[count1]; for (int ii = 0; ii < count1; ii++) { // check for error on create. GroupItem item = items[ii]; ReadRequest request = addItemRequests[ii]; if (item.ErrorId < 0) { request.Value.Error = item.ErrorId; continue; } serverHandles[count2] = item.ServerHandle; readRequests[count2] = request; count2++; } // write values to the server. DaValue[] values = group.SyncRead(serverHandles, count2); // read the values. for (int ii = 0; ii < count2; ii++) { readRequests[ii].Value = values[ii]; } } finally { // delete the group and items. group.Delete(); } }
/// <summary> /// Writes the item values to servers. /// </summary> /// <param name="requests">The requests.</param> private void WriteItemValues(List <WriteRequest> requests) { ComDaGroup group = new ComDaGroup(this, false); try { int count1 = 0; GroupItem[] items = new GroupItem[requests.Count]; WriteRequest[] addItemRequests = new WriteRequest[requests.Count]; // create the items in the temporary group. for (int ii = 0; ii < requests.Count; ii++) { WriteRequest request = requests[ii]; if (request == null) { continue; } // status code writes not supported. if (request.Value.StatusCode != StatusCodes.Good) { request.Error = ResultIds.E_NOTSUPPORTED; continue; } // timestamp writes not supported. if (request.Value.SourceTimestamp != DateTime.MinValue) { request.Error = ResultIds.E_NOTSUPPORTED; continue; } // add the item. items[count1] = group.CreateItem(request.ItemId, 0, 0, true); addItemRequests[count1] = request; count1++; } // create the items on the server. group.ApplyChanges(); // build the list of values to write. int count2 = 0; int[] serverHandles = new int[count1]; object[] values = new object[count1]; WriteRequest[] writeRequests = new WriteRequest[count1]; for (int ii = 0; ii < count1; ii++) { // check for error on create. GroupItem item = items[ii]; WriteRequest request = addItemRequests[ii]; if (item.ErrorId < 0) { request.Error = item.ErrorId; continue; } serverHandles[count2] = item.ServerHandle; values[count2] = ComUtils.GetVARIANT(request.Value.Value); writeRequests[count2] = request; count2++; } // write values to the server. int[] errors = group.SyncWrite(serverHandles, values, count2); // read the errors. for (int ii = 0; ii < count2; ii++) { writeRequests[ii].Error = errors[ii]; } } finally { // delete the group and items. group.Delete(); } }