/// <summary> /// Добавить элемент в буфер /// </summary> /// <param name="Element">Добавляемый элемент</param> public void Append(Slice Element) { if (slim.TryEnterWriteLock(555)) { try { if (Element.slice != null) { CalculateIndexes(); array[last] = Element; array[last].index = last; } } finally { slim.ExitWriteLock(); } } }
/// <summary> /// получить среднее значение параметра на этапе /// </summary> /// <param name="slice"></param> /// <param name="index"></param> /// <returns></returns> private float GetMiddle(Slice[] slice, int index) { try { if (slice != null && index > -1) { double mean = 0.0f; for (int i = 1; i < slice.Length; i++) { if (slice[i].slice != null && slice[i - 1].slice != null) { if (index <= slice[i].slice.Length && index <= slice[i - 1].slice.Length) { double p = (slice[i].slice[index] + slice[i - 1].slice[index]) / 2.0f; double t = (double)(slice[i]._date.Ticks - slice[i - 1]._date.Ticks); if (double.IsNaN(p) == false && double.IsNaN(t) == false) { mean += p * t; } } } } double startTime = slice[0]._date.Ticks; double finishTime = slice[slice.Length - 1]._date.Ticks; double result = mean / (finishTime - startTime); return (float)result; } } catch { } return float.NaN; }
/// <summary> /// максимальное значение /// </summary> /// <param name="slices"></param> /// <param name="index"></param> /// <returns></returns> private float FindMin(Slice[] slices, int index) { try { float min = float.MaxValue; foreach (Slice slice in slices) { if (slice.slice != null) { if (index > -1 && index <= slice.slice.Length) { if (slice.slice[index] < min) { min = slice.slice[index]; } } } } return min; } catch { } return float.NaN; }
/// <summary> /// Минимальное значение /// </summary> /// <param name="slices"></param> /// <param name="index"></param> /// <returns></returns> private float FindMax(Slice[] slices, int index) { try { float max = float.MinValue; foreach (Slice slice in slices) { if (slice.slice != null) { if (index > -1 && index <= slice.slice.Length) { if (slice.slice[index] > max) { max = slice.slice[index]; } } } } return max; } catch { } return float.NaN; }
/// <summary> /// Получить параметры за указанный период времени с конца массива /// </summary> /// <param name="start">Время начало выборки данных</param> /// <param name="finish">Время конца выборки данных</param> /// <param name="p1, p2, p3, p4, p5">Номера параметров от 0 до №-1</param> /// <returns>Список данных из указанного диапазона</returns> public Slice[] FindFromEnd(DateTime start, DateTime finish, int p1, int p2, int p3, int p4, int p5) { if (slim.TryEnterReadLock(300)) { try { int[] Prms = { p1, p2, p3, p4, p5 }; if (last >= 0) { if (array[last]._date < start) return null; if (array[first]._date > finish) return null; int ind1 = -1; { int ind = last; for (int j = 0; j < c_size; j++) { if (array[ind]._date > finish) { if (ind == first) break; ind = ind - 1; if (ind < 0) ind = size - 1; } else { ind1 = ind; break; } } } if (ind1 != -1) { List<Slice> result = new List<Slice>(5); if (result != null) { int ind = ind1; for (int j = 0; j < c_size; j++) { if (array[ind]._date < start) { break; } // добавить элемент к result if (array[ind].slice != null) { Slice buff = new Slice(5); buff._date = array[ind]._date; for (int jPrms = 0; jPrms < Prms.Length; jPrms++) { if (Prms[jPrms] >= 0) { buff.slice[jPrms] = array[ind].slice[Prms[jPrms]]; } else { buff.slice[jPrms] = float.NaN; } } result.Add(buff); // result.Add(array[ind]); } if (ind == first) break; ind = ind - 1; if (ind < 0) ind = size - 1; } } result.Reverse(); return result.ToArray(); } } } finally { slim.ExitReadLock(); } } return null; }