/// <summary> /// Releases the handles for the items. /// </summary> public void ReleaseItemHandles(HdaItem[] items) { if (items == null) { return; } int[] serverHandles = new int[items.Length]; for (int ii = 0; ii < items.Length; ii++) { serverHandles[ii] = items[ii].ServerHandle; } int[] errors = ReleaseItemHandles(serverHandles); for (int ii = 0; ii < items.Length; ii++) { items[ii].ServerHandle = 0; items[ii].Error = ResultIds.E_FAIL; if (errors != null) { items[ii].Error = errors[ii]; } } }
/// <summary> /// Reads the values for all available attributes. /// </summary> /// <param name="item">The item.</param> /// <returns>The list of attribute values for the item.</returns> public HdaAttributeValue[] ReadAvailableAttributes(HdaItem item) { if (item == null) { return null; } // get the supported attributes. if (m_supportedAttributes == null) { UpdateServerMetadata(); } HdaAttribute[] supportedAttributes = m_supportedAttributes; if (supportedAttributes == null || supportedAttributes.Length == 0) { return null; } // read the attribute values. int[] attributeIds = new int[supportedAttributes.Length]; for (int ii = 0; ii < supportedAttributes.Length; ii++) { attributeIds[ii] = Utils.ToInt32(supportedAttributes[ii].Id); } return ReadAttributeValues(item.ServerHandle, attributeIds); }
/// <summary> /// Get handles for the specified items. /// </summary> public HdaItem[] GetItems(params string[] itemIds) { string methodName = "IOPCHDA_Server.GetItemHandles"; if (itemIds == null) { return null; } IntPtr pphServer; IntPtr ppErrors; try { IOPCHDA_Server server = BeginComCall<IOPCHDA_Server>(methodName, true); server.GetItemHandles( itemIds.Length, itemIds, new int[itemIds.Length], out pphServer, out ppErrors); } catch (Exception e) { ComCallError(methodName, e); return null; } finally { EndComCall(methodName); } int[] serverHandles = ComUtils.GetInt32s(ref pphServer, itemIds.Length, true); int[] errors = ComUtils.GetInt32s(ref ppErrors, itemIds.Length, true); HdaItem[] results = new HdaItem[itemIds.Length]; for (int ii = 0; ii < results.Length; ii++) { HdaItem result = results[ii] = new HdaItem(); result.ItemId = itemIds[ii]; result.ServerHandle = serverHandles[ii]; result.Error = errors[ii]; } return results; }
/// <summary> /// Deletes the raw data for an item. /// </summary> private int[] DeleteAtTime(HdaItem item, DateTimeCollection timestamps) { string methodName = "IOPCHDA_SyncUpdate.DeleteAtTime"; int count = timestamps.Count; int[] serverHandles = new int[count]; System.Runtime.InteropServices.ComTypes.FILETIME[] pTimestamps = new System.Runtime.InteropServices.ComTypes.FILETIME[count]; for (int ii = 0; ii < count; ii++) { serverHandles[ii] = item.ServerHandle; pTimestamps[ii] = ComUtils.GetFILETIME(timestamps[ii]); } IntPtr ppErrors; try { IOPCHDA_SyncUpdate server = BeginComCall<IOPCHDA_SyncUpdate>(methodName, true); server.DeleteAtTime( count, serverHandles, pTimestamps, out ppErrors); } catch (Exception e) { ComCallError(methodName, e); int[] errors = new int[count]; for (int ii = 0; ii < count; ii++) { errors[ii] = ResultIds.E_FAIL; } return errors; } finally { EndComCall(methodName); } return ComUtils.GetInt32s(ref ppErrors, count, true); }
/// <summary> /// Deletes the raw data for an item. /// </summary> private StatusCode DeleteRaw(HdaItem item, DateTime startTime, DateTime endTime) { string methodName = "IOPCHDA_SyncUpdate.DeleteRaw"; OPCHDA_TIME htStartTime = ConvertTime(startTime); OPCHDA_TIME htEndTime = ConvertTime(endTime); IntPtr ppErrors; try { IOPCHDA_SyncUpdate server = BeginComCall<IOPCHDA_SyncUpdate>(methodName, true); server.DeleteRaw( ref htStartTime, ref htEndTime, 1, new int[] { item.ServerHandle }, out ppErrors); } catch (Exception e) { ComCallError(methodName, e); return StatusCodes.BadUnexpectedError; } finally { EndComCall(methodName); } int[] errors = ComUtils.GetInt32s(ref ppErrors, 1, true); return MapErrorCodeToUpdateStatus(errors[0]); }
/// <summary> /// Insert annotations. /// </summary> private StatusCode InsertAnnotations( HdaItem item, DataValueCollection values, out int[] errors) { errors = null; string methodName = "IOPCHDA_SyncAnnotations.Insert"; int dwNumItems = values.Count; int[] phServer = new int[dwNumItems]; System.Runtime.InteropServices.ComTypes.FILETIME[] ftTimeStamps = new System.Runtime.InteropServices.ComTypes.FILETIME[dwNumItems]; OPCHDA_ANNOTATION[] pAnnotationValues = new OPCHDA_ANNOTATION[dwNumItems]; IntPtr ppErrors; try { for (int ii = 0; ii < dwNumItems; ii++) { DataValue value = values[ii]; phServer[ii] = item.ServerHandle; ftTimeStamps[ii] = ComUtils.GetFILETIME(value.SourceTimestamp); pAnnotationValues[ii] = new OPCHDA_ANNOTATION(); // pass an empty structure if the annotation is not valid. pAnnotationValues[ii].dwNumValues = 0; Annotation annotation = value.GetValue<Annotation>(null); if (annotation != null && !String.IsNullOrEmpty(annotation.Message)) { pAnnotationValues[ii].dwNumValues = 1; pAnnotationValues[ii].ftAnnotationTime = ComUtils.GetFILETIMEs(new DateTime[] { annotation.AnnotationTime }); pAnnotationValues[ii].ftTimeStamps = ComUtils.GetFILETIMEs(new DateTime[] { value.SourceTimestamp }); pAnnotationValues[ii].szAnnotation = ComUtils.GetUnicodeStrings(new string[] { annotation.Message }); pAnnotationValues[ii].szUser = ComUtils.GetUnicodeStrings(new string[] { annotation.UserName }); } } IOPCHDA_SyncAnnotations server = BeginComCall<IOPCHDA_SyncAnnotations>(methodName, true); server.Insert( dwNumItems, phServer, ftTimeStamps, pAnnotationValues, out ppErrors); // check for error. errors = ComUtils.GetInt32s(ref ppErrors, dwNumItems, true); // set bad type error for invalid annotations. for (int ii = 0; ii < dwNumItems; ii++) { if (pAnnotationValues[ii].dwNumValues == 0) { errors[ii] = ResultIds.E_BADTYPE; } } } catch (Exception e) { ComCallError(methodName, e); return StatusCodes.BadUnexpectedError; } finally { EndComCall(methodName); // free allocated memory. for (int ii = 0; ii < dwNumItems; ii++) { if (pAnnotationValues[ii].dwNumValues == 0) { continue; } IntPtr[] pointers = new IntPtr[1]; Marshal.Copy(pAnnotationValues[ii].szUser, pointers, 0, 1); Marshal.FreeCoTaskMem(pointers[0]); Marshal.Copy(pAnnotationValues[ii].szAnnotation, pointers, 0, 1); Marshal.FreeCoTaskMem(pointers[0]); Marshal.FreeCoTaskMem(pAnnotationValues[ii].ftAnnotationTime); Marshal.FreeCoTaskMem(pAnnotationValues[ii].ftTimeStamps); Marshal.FreeCoTaskMem(pAnnotationValues[ii].szUser); Marshal.FreeCoTaskMem(pAnnotationValues[ii].szAnnotation); } } return StatusCodes.Good; }
/// <summary> /// Update data /// </summary> private StatusCode UpdateData( HdaItem item, PerformUpdateType updateType, DataValueCollection values, out int[] errors) { errors = null; string methodName = "IOPCHDA_SyncUpdate.Insert"; int dwNumItems = values.Count; int[] phServer = new int[dwNumItems]; System.Runtime.InteropServices.ComTypes.FILETIME[] ftTimeStamps = new System.Runtime.InteropServices.ComTypes.FILETIME[dwNumItems]; object[] vDataValues = new object[dwNumItems]; int[] pdwQualities = new int[dwNumItems]; for (int ii = 0; ii < dwNumItems; ii++) { DataValue value = values[ii]; phServer[ii] = item.ServerHandle; vDataValues[ii] = ComUtils.GetVARIANT(value.WrappedValue); pdwQualities[ii] = Utils.ToInt32(ComUtils.GetHdaQualityCode(value.StatusCode)); ftTimeStamps[ii] = ComUtils.GetFILETIME(value.SourceTimestamp); } IntPtr ppErrors = IntPtr.Zero; try { IOPCHDA_SyncUpdate server = BeginComCall<IOPCHDA_SyncUpdate>(methodName, true); switch (updateType) { case PerformUpdateType.Insert: { server.Insert( dwNumItems, phServer, ftTimeStamps, vDataValues, pdwQualities, out ppErrors); break; } case PerformUpdateType.Update: { server.InsertReplace( dwNumItems, phServer, ftTimeStamps, vDataValues, pdwQualities, out ppErrors); break; } case PerformUpdateType.Replace: { server.Replace( dwNumItems, phServer, ftTimeStamps, vDataValues, pdwQualities, out ppErrors); break; } } // check for error. errors = ComUtils.GetInt32s(ref ppErrors, dwNumItems, true); } catch (Exception e) { ComCallError(methodName, e); return StatusCodes.BadUnexpectedError; } finally { EndComCall(methodName); } return StatusCodes.Good; }