static void HistoryUpdate(Session session) { DiagnosticInfoCollection diagnosticInfos; // translate browse paths. IList <NodeOfInterest> nodeIds; nodeIds = GetNodeIds(session, Opc.Ua.Objects.ObjectsFolder, VariableBrowsePaths.ToArray()); ExtensionObjectCollection eoc = new ExtensionObjectCollection(); for (int ii = 0; ii < nodeIds.Count; ii++) { UpdateDataDetails updateDetails = new UpdateDataDetails(); updateDetails.NodeId = nodeIds[ii].NodeId; updateDetails.PerformInsertReplace = PerformUpdateType.Update; updateDetails.UpdateValues = new DataValueCollection(); for (int jj = 0; jj <= 5; jj++) { DataValue dv = new DataValue(new Variant(jj * 10), StatusCodes.Good, new DateTime(2008, 01, 01, 12, 0, jj * 2)); updateDetails.UpdateValues.Add(dv); } ExtensionObject eo = new ExtensionObject(updateDetails.TypeId, updateDetails); 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 UpdateData(string itemId, UpdateDataDetails details, HistoryUpdateResult result) { // create handles. HdaItem[] items = GetItems(itemId); if (items == null || items[0].Error < 0) { result.StatusCode = StatusCodes.BadNodeIdUnknown; return result.StatusCode; } int[] errors = null; try { // update data. result.StatusCode = UpdateData( items[0], details.PerformInsertReplace, details.UpdateValues, out errors); // 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 { // reelase handles. ReleaseItemHandles(items); } return result.StatusCode; }
static void HistoryUpdate(Session session) { DiagnosticInfoCollection diagnosticInfos; // translate browse paths. IList<NodeOfInterest> nodeIds; nodeIds = GetNodeIds(session, Opc.Ua.Objects.ObjectsFolder, VariableBrowsePaths.ToArray()); ExtensionObjectCollection eoc = new ExtensionObjectCollection(); for (int ii = 0; ii < nodeIds.Count; ii++) { UpdateDataDetails updateDetails = new UpdateDataDetails(); updateDetails.NodeId = nodeIds[ii].NodeId; updateDetails.PerformInsertReplace = PerformUpdateType.Update; updateDetails.UpdateValues = new DataValueCollection(); for (int jj = 0; jj <= 5; jj++) { DataValue dv = new DataValue(new Variant(jj*10), StatusCodes.Good, new DateTime(2008, 01, 01, 12, 0, jj*2)); updateDetails.UpdateValues.Add(dv); } ExtensionObject eo = new ExtensionObject(updateDetails.TypeId, updateDetails); 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, int[] serverHandles, DateTime[] timestamps, Annotation[][] annotations) { 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; // check if nothing to do. Annotation[] list = annotations[ii]; if (list == null || list.Length == 0) { request.Error = ResultIds.S_OK; continue; } // get the annotations proprerty. NodeId annotationsId = m_itemManager.GetAnnotationsPropertyNodeId(session, request.Handle); if (NodeId.IsNull(annotationsId)) { request.Error = ResultIds.E_FAIL; continue; } // specify the parameters for the request. UpdateDataDetails details = new UpdateDataDetails(); details.NodeId = annotationsId; details.PerformInsertReplace = PerformUpdateType.Insert; for (int jj = 0; jj < list.Length; jj++) { DataValue value = new DataValue(); value.WrappedValue = new ExtensionObject(list[jj]); value.SourceTimestamp = timestamps[ii]; details.UpdateValues.Add(value); } request.Details = new ExtensionObject(details); } return requests; }
/// <summary> /// Creates the update requests. /// </summary> private List<HdaUpdateRequest> CreateUpdateRequests( Session session, PerformUpdateType updateType, int[] serverHandles, DaValue[] values) { 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; // check if nothing to do. DaValue value = values[ii]; if (value == null) { request.Error = ResultIds.E_FAIL; continue; } // specify the parameters for the request. UpdateDataDetails details = new UpdateDataDetails(); details.NodeId = request.Handle.NodeId; details.PerformInsertReplace = updateType; DataValue value2 = m_mapper.GetRemoteDataValue(value, m_itemManager.GetRemoteDataType(request.Handle)); value2.SourceTimestamp = value.Timestamp; value2.StatusCode = ComUtils.GetHdaQualityCode(value.HdaQuality); details.UpdateValues.Add(value2); request.Details = new ExtensionObject(details); } return requests; }
/// <summary> /// Updates the history. /// </summary> private HistoryUpdateResultCollection InsertReplace(NodeId nodeId, PerformUpdateType updateType, bool isStructure, IList<DataValue> values) { HistoryUpdateDetails details = null; if (isStructure) { UpdateStructureDataDetails details2 = new UpdateStructureDataDetails(); details2.NodeId = nodeId; details2.PerformInsertReplace = updateType; details2.UpdateValues.AddRange(values); details = details2; } else { UpdateDataDetails details2 = new UpdateDataDetails(); details2.NodeId = nodeId; details2.PerformInsertReplace = updateType; details2.UpdateValues.AddRange(values); details = details2; } 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); } return results; }