/// <summary> /// Deletes the history of values for a set of variables at given time. /// </summary> static void HistoryDeleteAtTime(Session session) { // translate browse paths. IList <NodeOfInterest> results = GetNodeIds(session, Opc.Ua.Objects.ObjectsFolder, VariableBrowsePaths.ToArray()); DiagnosticInfoCollection diagnosticInfos; ExtensionObjectCollection eoc = new ExtensionObjectCollection(); for (int ii = 0; ii < results.Count; ii++) { DeleteAtTimeDetails deleteDetails = new DeleteAtTimeDetails(); deleteDetails.ReqTimes = new DateTimeCollection(); for (int jj = 0; jj < 5; jj++) { deleteDetails.ReqTimes.Add(new DateTime(2008, 01, 01, 12, 0, jj * 2)); } deleteDetails.NodeId = results[ii].NodeId; deleteDetails.Processed = false; ExtensionObject eo = new ExtensionObject(deleteDetails.TypeId, deleteDetails); eoc.Add(eo); } HistoryUpdateResultCollection historyUpdateResults; ResponseHeader responseHeader = session.HistoryUpdate(null, eoc, out historyUpdateResults, out diagnosticInfos); // process results. for (int ii = 0; ii < historyUpdateResults.Count; ii++) { HistoryUpdateResult historyUpdateResult = historyUpdateResults[ii]; Console.WriteLine("HistoryUpdate result code for {0}: {1}", VariableBrowsePaths[ii], historyUpdateResult.StatusCode.ToString()); if (StatusCode.IsGood(historyUpdateResult.StatusCode)) { for (int jj = 0; jj < historyUpdateResult.OperationResults.Count; jj++) { Console.WriteLine(" {0}: {1}", jj, historyUpdateResult.OperationResults[jj]); } Console.WriteLine(""); } } }
/// <summary> /// Updates the history of an item. /// </summary> public StatusCode DeleteAtTime(string itemId, DeleteAtTimeDetails details, HistoryUpdateResult result) { // create handles. HdaItem[] items = GetItems(itemId); if (items == null || items[0].Error < 0) { result.StatusCode = StatusCodes.BadNodeIdUnknown; return result.StatusCode; } try { int[] errors = DeleteAtTime(items[0], details.ReqTimes); // update error codes. for (int ii = 0; ii < errors.Length; ii++) { StatusCode statusCode = MapErrorCodeToUpdateStatus(errors[ii]); result.OperationResults.Add(statusCode); } } catch (Exception) { result.StatusCode = StatusCodes.BadUnexpectedError; } finally { // release handles. ReleaseItemHandles(items); } return result.StatusCode; }
/// <summary> /// Deletes the history of values for a set of variables at given time. /// </summary> static void HistoryDeleteAtTime(Session session) { // translate browse paths. IList<NodeOfInterest> results = GetNodeIds(session, Opc.Ua.Objects.ObjectsFolder, VariableBrowsePaths.ToArray()); DiagnosticInfoCollection diagnosticInfos; ExtensionObjectCollection eoc = new ExtensionObjectCollection(); for (int ii = 0; ii < results.Count; ii++) { DeleteAtTimeDetails deleteDetails = new DeleteAtTimeDetails(); deleteDetails.ReqTimes = new DateTimeCollection(); for (int jj = 0; jj < 5; jj++) { deleteDetails.ReqTimes.Add(new DateTime(2008, 01, 01, 12, 0, jj * 2)); } deleteDetails.NodeId = results[ii].NodeId; deleteDetails.Processed = false; ExtensionObject eo = new ExtensionObject(deleteDetails.TypeId, deleteDetails); eoc.Add(eo); } HistoryUpdateResultCollection historyUpdateResults; ResponseHeader responseHeader = session.HistoryUpdate(null, eoc, out historyUpdateResults, out diagnosticInfos); // process results. for (int ii = 0; ii < historyUpdateResults.Count; ii++) { HistoryUpdateResult historyUpdateResult = historyUpdateResults[ii]; Console.WriteLine("HistoryUpdate result code for {0}: {1}", VariableBrowsePaths[ii], historyUpdateResult.StatusCode.ToString()); if (StatusCode.IsGood(historyUpdateResult.StatusCode)) { for (int jj = 0; jj < historyUpdateResult.OperationResults.Count; jj++) { Console.WriteLine(" {0}: {1}", jj, historyUpdateResult.OperationResults[jj]); } Console.WriteLine(""); } } }
/// <summary> /// Validates the nodes and updates the history. /// </summary> protected virtual void HistoryUpdate( ServerSystemContext context, Type detailsType, IList<HistoryUpdateDetails> nodesToUpdate, IList<HistoryUpdateResult> results, IList<ServiceResult> errors, List<NodeHandle> nodesToProcess, IDictionary<NodeId, NodeState> cache) { // handle update data request. if (detailsType == typeof(UpdateDataDetails)) { UpdateDataDetails[] details = new UpdateDataDetails[nodesToUpdate.Count]; for (int ii = 0; ii < details.Length; ii++) { details[ii] = (UpdateDataDetails)nodesToUpdate[ii]; } HistoryUpdateData( context, details, results, errors, nodesToProcess, cache); return; } // handle update structure data request. if (detailsType == typeof(UpdateStructureDataDetails)) { UpdateStructureDataDetails[] details = new UpdateStructureDataDetails[nodesToUpdate.Count]; for (int ii = 0; ii < details.Length; ii++) { details[ii] = (UpdateStructureDataDetails)nodesToUpdate[ii]; } HistoryUpdateStructureData( context, details, results, errors, nodesToProcess, cache); return; } // handle update events request. if (detailsType == typeof(UpdateEventDetails)) { UpdateEventDetails[] details = new UpdateEventDetails[nodesToUpdate.Count]; for (int ii = 0; ii < details.Length; ii++) { details[ii] = (UpdateEventDetails)nodesToUpdate[ii]; } HistoryUpdateEvents( context, details, results, errors, nodesToProcess, cache); return; } // handle delete raw data request. if (detailsType == typeof(DeleteRawModifiedDetails)) { DeleteRawModifiedDetails[] details = new DeleteRawModifiedDetails[nodesToUpdate.Count]; for (int ii = 0; ii < details.Length; ii++) { details[ii] = (DeleteRawModifiedDetails)nodesToUpdate[ii]; } HistoryDeleteRawModified( context, details, results, errors, nodesToProcess, cache); return; } // handle delete at time request. if (detailsType == typeof(DeleteAtTimeDetails)) { DeleteAtTimeDetails[] details = new DeleteAtTimeDetails[nodesToUpdate.Count]; for (int ii = 0; ii < details.Length; ii++) { details[ii] = (DeleteAtTimeDetails)nodesToUpdate[ii]; } HistoryDeleteAtTime( context, details, results, errors, nodesToProcess, cache); return; } // handle delete at time request. if (detailsType == typeof(DeleteEventDetails)) { DeleteEventDetails[] details = new DeleteEventDetails[nodesToUpdate.Count]; for (int ii = 0; ii < details.Length; ii++) { details[ii] = (DeleteEventDetails)nodesToUpdate[ii]; } HistoryDeleteEvents( context, details, results, errors, nodesToProcess, cache); return; } }
/// <summary> /// Creates the update requests. /// </summary> private List<HdaUpdateRequest> CreateUpdateRequests( Session session, DateTime[] timestamps, int[] serverHandles) { List<HdaUpdateRequest> requests = new List<HdaUpdateRequest>(); for (int ii = 0; ii < serverHandles.Length; ii++) { HdaUpdateRequest request = new HdaUpdateRequest(); requests.Add(request); // find handle. request.Handle = m_itemManager.LookupHandle(serverHandles[ii]); if (request.Handle == null) { request.Error = ResultIds.E_INVALIDHANDLE; continue; } request.ClientHandle = request.Handle.ClientHandle; // specify the parameters for the request. DeleteAtTimeDetails details = new DeleteAtTimeDetails(); details.NodeId = request.Handle.NodeId; details.ReqTimes.AddRange(timestamps); request.Details = new ExtensionObject(details); } return requests; }
/// <summary> /// Deletes the history. /// </summary> private void DeleteAtTime() { DeleteAtTimeDetails details = new DeleteAtTimeDetails(); details.NodeId = m_nodeId; foreach (DataRowView row in m_dataset.Tables[0].DefaultView) { DateTime value = (DateTime)row.Row[1]; details.ReqTimes.Add(value); } ExtensionObjectCollection nodesToUpdate = new ExtensionObjectCollection(); nodesToUpdate.Add(new ExtensionObject(details)); HistoryUpdateResultCollection results = null; DiagnosticInfoCollection diagnosticInfos = null; m_session.HistoryUpdate( null, nodesToUpdate, out results, out diagnosticInfos); ClientBase.ValidateResponse(results, nodesToUpdate); ClientBase.ValidateDiagnosticInfos(diagnosticInfos, nodesToUpdate); if (StatusCode.IsBad(results[0].StatusCode)) { throw new ServiceResultException(results[0].StatusCode); } ResultsDV.Columns[ResultsDV.Columns.Count-1].Visible = true; for (int ii = 0; ii < m_dataset.Tables[0].DefaultView.Count; ii++) { m_dataset.Tables[0].DefaultView[ii].Row[10] = results[0].OperationResults[ii]; } m_dataset.AcceptChanges(); }