/// <summary> /// Конструктор для класса Channel /// </summary> /// <param name="id">Новый ID канала /// Должен быть уникальным, иначе выробатывается исключение</param> /// <param name="calibration">Набор калибровочные данных для канала /// Если калибровочных данных нет, передаем null</param> /// <param name="averageLevel">Уровен усреднения значения - от 0 (не усредняем) до 10 (максимально по 10 значениям)</param> public Channel(uint id, CalibrationValues calibration, uint averageLevel) { _uiId = id; if (averageLevel > MAX_AVERAGE_LEVEL) { ADCException exc = new ADCException("Ошибка: заданный уровень усреднения " + averageLevel + " не должен превышать " + MAX_AVERAGE_LEVEL); throw exc; } if (averageLevel == 0) averageLevel = 1; _listDatas = new List<float>(); for (int i = 0; i < averageLevel; i++) _listDatas.Add(0); _clbrtValues = calibration; NegativeValuesIsCorrect = false; }
/// <summary> /// Метод получения значения для канала, с учетом среднего значения и /// калибровочных данных. /// Если в канале только одно значение - генерируется исключение /// </summary> /// <returns>Значение для канала</returns> public float GetValue() { float fMidle = 0; if (_btCurPoint == 0) { ADCException exc = new ADCException("Ошибка: канал с ID " + _uiId + " не имеет данных!"); throw exc; } /* foreach (float fval in _listDatas) fMidle += fval; */ fMidle = _listDatas.Sum() / _uiDataCnt; //fMidle /= _uiDataCnt; if (_clbrtValues == null) return fMidle; return _clbrtValues.Get(fMidle, NegativeValuesIsCorrect); }
/// <summary> /// Метод получения калибровочного значения по калибровочным данным /// </summary> /// <param name="xValue">Входящее калибровочное значение</param> /// <returns>Калибровочное значение YVal</returns> public float Get(float xValue, bool NegativeIsOk) { float value = 0; if (_listValues.Count == 1) { ADCException exc = new ADCException("Ошибка: мало калибровочных данных!"); throw exc; } Sort(); if (xValue <= _listValues[0].XVal) { if ((_listValues[1].XVal - _listValues[0].XVal) == 0) { ADCException exc = new ADCException("Ошибка: деление на 0! Значения: " + _listValues[1].XVal); throw exc; } value = (_listValues[0].YVal - (_listValues[1].YVal - _listValues[0].YVal) * (_listValues[0].XVal - xValue) / (_listValues[1].XVal - _listValues[0].XVal)); if ((NegativeIsOk == false) && (value < 0)) { value = 0; } return value; } else if (xValue >= _listValues[_listValues.Count - 1].XVal) { if ((_listValues[_listValues.Count - 1].XVal - _listValues[_listValues.Count - 2].XVal) == 0) { ADCException exc = new ADCException("Ошибка: деление на 0! Значения: " + _listValues[_listValues.Count - 1].XVal); throw exc; } value = (_listValues[_listValues.Count - 2].YVal + (_listValues[_listValues.Count - 1].YVal - _listValues[_listValues.Count - 2].YVal) * (xValue - _listValues[_listValues.Count - 2].XVal) / (_listValues[_listValues.Count - 1].XVal - _listValues[_listValues.Count - 2].XVal)); if ((NegativeIsOk == false) && (value < 0)) { value = 0; } return value; } else for (int i = 0; i < _listValues.Count; i++) if (xValue <= _listValues[i].XVal) { if ((_listValues[i].XVal - _listValues[i - 1].XVal) == 0) { ADCException exc = new ADCException("Ошибка: деление на 0! Значения: " + _listValues[i].XVal); throw exc; } value = (_listValues[i - 1].YVal + (_listValues[i].YVal - _listValues[i - 1].YVal) * (xValue - _listValues[i - 1].XVal) / (_listValues[i].XVal - _listValues[i - 1].XVal)); if ((NegativeIsOk == false) && (value < 0)) { value = 0; } return value; } return 0; }
/// <summary> /// Метод добавляет новые калибровочные данные /// </summary> /// <param name="cValue">Калибровочные данные</param> public void Add(CValue cValue) { if (_listValues == null) _listValues.Add(cValue); else { if (_listValues.Contains(cValue)) { ADCException exc = new ADCException("Ошибка: значение " + "(" + cValue.XVal + ", " + cValue.YVal + ")" + " с полем х = " + cValue.XVal + " уже существует!"); throw exc; } _listValues.Add(cValue); } }
/// <summary> /// Конструктор /// </summary> /// <param name="cValues">Массив калибровочных данных</param> public CalibrationValues(CValue[] cValues) { _listValues = new List<CValue>(); foreach (CValue cv in cValues) { if (_listValues.Contains(cv)) { ADCException exc = new ADCException("Ошибка: значение " + "(" + cv.XVal + "; " + cv.YVal + ")" + " с полем х = " + cv.XVal + " уже существует!"); throw exc; } _listValues.Add(cv); } }
/// <summary> /// Метод определяет индекс канала в List по заданному ID /// Если заданный ID не существует - генерируется исключение /// </summary> /// <param name="chId">Заданный ID</param> /// <returns>Индекс канала в List</returns> private int SearchChannel(uint chId) { for (int i = 0; i < _listChannel.Count; i++) if (_listChannel[i].IsThisId(chId)) return i; ADCException exc = new ADCException("Ошибка: канал с ID " + chId + " не найден!"); throw exc; }
/// <summary> /// Добавляем канал рассчета данных /// </summary> /// <param name="chId">Уникальный Id канала. Если такой Id уже есть в классе, генерируем исключение</param> /// <param name="calibration">Набор калибровочных значений для данного канала. Если калибровочных значений нет, передаем null</param> /// <param name="averageLevel">Уровен усреднения значения - от 0 (не усредняем) до 10 (максимально по 10 значениям)</param> public void AddChannel(uint chId, CalibrationValues calibration, uint averageLevel) { if (_listChannel.Count != 0) foreach (Channel chnl in _listChannel) if (chnl.IsThisId(chId)) { ADCException exc = new ADCException("Ошибка: канал с ID " + chId + " уже существует!"); throw exc; } _listChannel.Add(new Channel(chId, calibration, averageLevel)); }