Ejemplo n.º 1
0
        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("");
                }
            }
        }
Ejemplo n.º 2
0
        /// <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;
        }
Ejemplo n.º 3
0
        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("");
                }
            }
        }
Ejemplo n.º 4
0
        /// <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;
            }
        }
Ejemplo n.º 5
0
        /// <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;
        }
Ejemplo n.º 6
0
        /// <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;
        }
Ejemplo n.º 7
0
        /// <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;
        }