/// <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; }
/// <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; }