/// <summary> /// Read historian data from server. /// </summary> /// <param name="instanceName">Historian instance name.</param> /// <param name="startTime">Start time of query.</param> /// <param name="stopTime">Stop time of query.</param> /// <param name="measurementIDs">Measurement IDs to query - or <c>null</c> for all available points.</param> /// <param name="resolution">Resolution for data query.</param> /// <param name="seriesLimit">Maximum number of points per series.</param> /// <param name="forceLimit">Flag that determines if series limit should be strictly enforced.</param> /// <param name="timestampType">Type of timestamps.</param> /// <returns>Enumeration of <see cref="TrendValue"/> instances read for time range.</returns> public IEnumerable <TrendValue> GetHistorianData(string instanceName, DateTime startTime, DateTime stopTime, ulong[] measurementIDs, Resolution resolution, int seriesLimit, bool forceLimit, TimestampType timestampType = TimestampType.UnixMilliseconds) { // Cancel any running operation CancellationToken cancellationToken = new CancellationToken(); Interlocked.Exchange(ref m_readCancellationToken, cancellationToken)?.Cancel(); SnapServer server = GetServer(instanceName)?.Host; IEnumerable <TrendValue> values = TrendValueAPI.GetHistorianData(server, instanceName, startTime, stopTime, measurementIDs, resolution, seriesLimit, forceLimit, cancellationToken); switch (timestampType) { case TimestampType.Ticks: return(values.Select(value => { value.Timestamp = value.Timestamp * 10000.0D + 621355968000000000.0D; return value; })); case TimestampType.UnixSeconds: return(values.Select(value => { value.Timestamp = value.Timestamp / 1000.0D; return value; })); default: return(values); } }
/// <summary> /// Gets loaded historian adapter instance names. /// </summary> /// <returns>Historian adapter instance names.</returns> public IEnumerable <string> GetInstanceNames() => TrendValueAPI.GetInstanceNames();