示例#1
0
        /// <summary>
        /// Reads the data for an item at the specified times.
        /// </summary>
        private StatusCode ReadAtTime(HdaHistoryReadAtTimeRequest request)
        {
            string methodName = "IOPCHDA_SyncRead.ReadAtTime";

            IntPtr ppItemValues;
            IntPtr ppErrors;

            System.Runtime.InteropServices.ComTypes.FILETIME[] pTimestamps = new System.Runtime.InteropServices.ComTypes.FILETIME[request.ReqTimes.Count];

            for (int ii = 0; ii < pTimestamps.Length; ii++)
            {
                pTimestamps[ii] = ComUtils.GetFILETIME(request.ReqTimes[ii]);
            }

            try
            {
                IOPCHDA_SyncRead server = BeginComCall<IOPCHDA_SyncRead>(methodName, true);

                server.ReadAtTime(
                    pTimestamps.Length,
                    pTimestamps,
                    1,
                    new int[] { request.ServerHandle },
                    out ppItemValues,
                    out ppErrors);
            }
            catch (Exception e)
            {
                ComCallError(methodName, e);
                return StatusCodes.BadUnexpectedError;
            }
            finally
            {
                EndComCall(methodName);
            }

            // check for error.
            int[] errors = ComUtils.GetInt32s(ref ppErrors, 1, true);

            if (errors[0] < 0)
            {
                return StatusCodes.BadNodeIdUnknown;
            }

            // check if operation halted.
            request.Completed = true;

            // unmarshal the results.
            OPCHDA_ITEM result = (OPCHDA_ITEM)Marshal.PtrToStructure(ppItemValues, typeof(OPCHDA_ITEM));

            if (result.dwCount > 0)
            {
                object[] values = ComUtils.GetVARIANTs(ref result.pvDataValues, result.dwCount, true);
                int[] qualities = ComUtils.GetInt32s(ref result.pdwQualities, result.dwCount, true);
                DateTime[] timestamps = ComUtils.GetDateTimes(ref result.pftTimeStamps, result.dwCount, true);

                request.Results = new DataValueCollection(result.dwCount);

                for (int ii = 0; ii < result.dwCount; ii++)
                {
                    DataValue value = new DataValue();
                    value.Value = ComUtils.ProcessComValue(values[ii]);
                    value.StatusCode = ComUtils.GetHdaQualityCode(Utils.ToUInt32(qualities[ii]));
                    value.SourceTimestamp = timestamps[ii];
                    request.Results.Add(value);
                }
            }

            Marshal.FreeCoTaskMem(ppItemValues);

            if (result.dwCount == 0)
            {
                return StatusCodes.GoodNoData;
            }

            return StatusCodes.Good;
        }
示例#2
0
        /// <summary>
        /// Reads the data history at specified times.
        /// </summary>
        public StatusCode ReadHistory(HdaHistoryReadAtTimeRequest request)
        {
            if (request == null)
            {
                return StatusCodes.BadNothingToDo;
            }

            HdaItem[] items = GetItems(request.ItemId);

            if (items == null || items[0].Error < 0)
            {
                return StatusCodes.BadNodeIdUnknown;
            }

            request.ServerHandle = items[0].ServerHandle;

            try
            {
                return ReadAtTime(request);
            }
            catch (Exception)
            {
                return StatusCodes.BadUnexpectedError;
            }
            finally
            {
                ReleaseItemHandles(request.ServerHandle);
                request.ServerHandle = 0;
            }
        }
        /// <summary>
        /// Reads the history of an HDA item.
        /// </summary>
        private ServiceResult HistoryReadAtTime(
            ServerSystemContext context,
            ComHdaClient client,
            ReadAtTimeDetails details,
            TimestampsToReturn timestampsToReturn,
            HistoryReadValueId nodeToRead,
            HdaParsedNodeId parsedNodeId,
            HistoryReadResult result)
        {
            // create the request or load it from a continuation point.
            HdaHistoryReadAtTimeRequest request = null;

            if (nodeToRead.ContinuationPoint == null)
            {
                request = new HdaHistoryReadAtTimeRequest(parsedNodeId.RootId, details, nodeToRead);
            }
            else
            {
                request = LoadContinuationPoint(context, nodeToRead.ContinuationPoint) as HdaHistoryReadAtTimeRequest;

                if (request == null)
                {
                    return StatusCodes.BadContinuationPointInvalid;
                }
            }

            // fetch the data.
            result.StatusCode = client.ReadHistory(request);

            // fill in the results.
            if (request.Results != null)
            {
                HistoryData data = new HistoryData();
                data.DataValues = request.Results;
                result.HistoryData = new ExtensionObject(data);
            }

            // create a new continuation point.
            if (!request.Completed)
            {
                result.ContinuationPoint = SaveContinuationPoint(context, request);
            }

            return result.StatusCode;
        }