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