コード例 #1
0
        public VariationPoint(int percentRange, ICheckPoint checkPointUpward, ICheckPoint checkPointTopdown, double rangeMin, double rangeMax, double classPrecision,
                              double marginCoefficient = 0.8F)
        {
            PercentRange = percentRange;
            PressureUnitsEnum units = checkPointUpward.PressureUnits;

            // Вычисление вариации
            if (checkPointUpward is CurrentCheckPoint && checkPointTopdown is CurrentCheckPoint)
            {
                const double СurrentMin     = 4;
                const double СurrentMax     = 20;
                double       currentUpwards = (checkPointUpward as CurrentCheckPoint).MeasuredCurrent;
                double       currentTopdown = (checkPointTopdown as CurrentCheckPoint).MeasuredCurrent;
                Value = Math.Round(Math.Abs(100 * (currentUpwards - currentTopdown) / (СurrentMax - СurrentMin)), CalcPrecision, MidpointRounding.AwayFromZero);
            }
            else
            {
                Pressure pressureMax = new Pressure(rangeMax, units);
                Pressure pressureMin = new Pressure(rangeMin, units);
                Value = Math.Round(100 * (checkPointUpward.Pressure.PressureByUnits - checkPointTopdown.Pressure.PressureByUnits) / (pressureMax.PressureByUnits - pressureMin.PressureByUnits),
                                   CalcPrecision, MidpointRounding.AwayFromZero);
            }

            // Тест в точке пройден, если вариация меньше половины класса точности с учетом коэффициента запаса
            Resume = Math.Abs(Value) < classPrecision * marginCoefficient / 2;
        }
コード例 #2
0
        // Диапазон принимается всегда в Па, в результатах давление будет в переданных единицах измерения
        public void RunProcess(double rangeMin_Pa, double rangeMax_Pa, PressureUnitsEnum pressureUnits, double classPrecision,
                               bool absoluteType, CancellationToken cancellationToken, IProgress <int> progress)
        {
            this.absoluteType   = absoluteType;
            this.rangeMin_Pa    = rangeMin_Pa;
            this.rangeMax_Pa    = rangeMax_Pa;
            this.pressureUnits  = pressureUnits;
            this.classPrecision = classPrecision;


            measurmentTools.Init();

            CreateProgram(cancellationToken, progress);
            UpdResultsEvent?.Invoke(this, new EventArgs());

            foreach (var step in program)
            {
                step.Action?.Invoke();
            }


            progress.Report(100);
            UpdResultsEvent?.Invoke(this, new EventArgs());

            measurmentTools.Dispose();
        }
コード例 #3
0
 public TestResults(double rangeMin, double rangeMax, PressureUnitsEnum pressureUnits, double classPrecision, double marginCoefficient = 0.8)
 {
     RangeMin              = rangeMin;
     RangeMax              = rangeMax;
     PressureUnits         = pressureUnits;
     ClassPrecision        = classPrecision;
     MarginCoefficient     = marginCoefficient;
     MeasureResultsUpwards = new MeasureResults();
     MeasureResultsTopdown = new MeasureResults();
 }
コード例 #4
0
 public CurrentCheckPoint(int percentRange, double rangeMin_Pa, double rangeMax_Pa, double referencePressure_Pa, double measuredCurrent,
                          double classPrecision, PressureUnitsEnum pressureUnits, double marginCoefficient = 0.8F)
 {
     PercentRange      = percentRange;
     PressureUnits     = pressureUnits;
     ReferencePressure = new Pressure(referencePressure_Pa, pressureUnits);
     MeasuredCurrent   = Math.Round(measuredCurrent, Precision, MidpointRounding.AwayFromZero);
     CalcError(rangeMin_Pa, rangeMax_Pa);
     // Тест пройден, если погрешность меньше класса с учетом коэффициента запаса
     Resume = Math.Abs(ErrorMeasure) < classPrecision * marginCoefficient;
 }
コード例 #5
0
 public RelayTestPointUpDown(RelayTestPointSettings settings, PressureUnitsEnum pressureUnits, double marginCoefficient = 1)
 {
     PercentRange      = (int)settings.TestPoint * 100;
     RangeMin_Pa       = settings.RangeMin;
     RangeMax_Pa       = settings.RangeMax;
     ClassPrecision    = settings.ClassPrecision;
     Units             = pressureUnits;
     MarginCoefficient = marginCoefficient;
     SP         = new Pressure(settings.DeviceSP, pressureUnits);
     Hysteresis = new Pressure(settings.Hysteresis, pressureUnits);
 }
コード例 #6
0
        public override ICheckPoint GetCheckPoint(double testPoint, double rangeMin, double rangeMax, bool absolutePressure,
                                                  PressureUnitsEnum pressureUnits, double classPrecision, double marginCoefficient, CancellationToken cancellationToken)
        {
            SetPressure(testPoint, rangeMin, rangeMax, absolutePressure, cancellationToken);

            bool zeroPressure = ((int)((rangeMax - rangeMin) * testPoint - rangeMin) == 0) && !absolutePressure;

            Measures(zeroPressure, out double referencePressure, out double pressure, absolutePressure, cancellationToken);

            ICheckPoint point = new DigitalCheckPoint((int)(testPoint * 100), rangeMin, rangeMax, referencePressure, pressure, classPrecision,
                                                      pressureUnits, marginCoefficient);

            return(point);
        }
コード例 #7
0
        public override ICheckPoint GetCheckPoint(double testPoint, double rangeMin, double rangeMax, bool absolutePressure,
                                                  PressureUnitsEnum pressureUnits, double classPrecision, double marginCoefficient, CancellationToken cancellationToken)
        {
            SetPressure(testPoint, rangeMin, rangeMax, absolutePressure, cancellationToken);

            bool zeroPressure = ((int)((rangeMax - rangeMin) * testPoint - rangeMin) == 0) && !absolutePressure;

            Measures(zeroPressure, out double pressure, out double current, absolutePressure, cancellationToken);
            // Если уставка равна нулю, то тестируемое изделие связано с атмосферой. Давление считаем равным нулю,
            // кроме случая с абсолютным давлением
            CurrentCheckPoint point = new CurrentCheckPoint((int)(testPoint * 100), rangeMin, rangeMax, pressure, current, classPrecision,
                                                            pressureUnits, marginCoefficient);

            return(point);
        }
コード例 #8
0
        public RelayTestPointUpDown[] GetTestPoints(RelayTestPointSettings settings, bool absolutePressure,
                                                    PressureUnitsEnum pressureUnits, double marginCoefficient, CancellationToken cancellationToken)
        {
            SendsettingsToDevice(settings.DeviceSP, settings.Hysteresis);

            results = new RelayTestPointUpDown[stateRelayReader.StateRelay.Length];
            for (int i = 0; i < results.Length; i++)
            {
                results[i] = new RelayTestPointUpDown(settings, pressureUnits, marginCoefficient);
            }

            GetUpperPointsAsync(settings, absolutePressure, pressureUnits, marginCoefficient, cancellationToken);
            GetDownPointsAsync(settings, absolutePressure, pressureUnits, marginCoefficient, cancellationToken);
            return(results);
        }
コード例 #9
0
        private async void GetDownPointsAsync(RelayTestPointSettings setpoints, bool absolutePressure,
                                              PressureUnitsEnum pressureUnits, double marginCoefficient, CancellationToken cancellationToken)
        {
            // Устанавливаем верхнюю уставку (потом давление будет плавно изменяться от верхней уставки к нижней)
            SetPressure(setpoints.PsysUpwardSP, setpoints.RangeMin, setpoints.RangeMax, absolutePressure, cancellationToken);
            CheckStateRelays(true, cancellationToken);
            // Записываем уставку с ограничением изменения по скорости
            StartSmothSetPressure(setpoints.PsysDownwardSP, setpoints.RangeMin, setpoints.RangeMax, absolutePressure, setpoints.PsysRate,
                                  cancellationToken);
            double?[] pressures = await GetSwitchPressureValuesAsync(true, false, absolutePressure, setpoints.PressureLimitUpward,
                                                                     cancellationToken);

            for (int i = 0; i < pressures.Length; i++)
            {
                results[i].AddPointDown(pressures[i]);
            }
        }
コード例 #10
0
 public RelayTestPoint(double rangeMin_Pa, double rangeMax_Pa, double sp, double?switchPressure,
                       double classPrecision, PressureUnitsEnum pressureUnits, double marginCoefficient = 1)
 {
     PressureUnits = pressureUnits;
     SP            = new Pressure(sp, pressureUnits);
     if (switchPressure != null)
     {
         SwitchPressure = new Pressure(switchPressure.Value, pressureUnits);
         CalcError(rangeMin_Pa, rangeMax_Pa);
         // Тест пройден, если погрешность меньше класса с учетом коэффициента запаса
         Resume = Math.Abs(SwitchError.Value) < classPrecision * marginCoefficient;
     }
     else
     {
         SwitchPressure = null;
         SwitchError    = null;
         Resume         = false;
     }
 }
コード例 #11
0
        public static double GetPressureByUnits(double val, PressureUnitsEnum pressureUnits)
        {
            double result;

            switch (pressureUnits)
            {
            case PressureUnitsEnum.MPa:
                result = val * 1e-6;
                break;

            case PressureUnitsEnum.KPa:
                result = val * 1e-3;
                break;

            default:
                result = val;
                break;
            }
            return(Math.Round(result, Precision, MidpointRounding.AwayFromZero));
        }
コード例 #12
0
        public Pressure(double pressure_Pa, PressureUnitsEnum units)
        {
            Pressure_Pa = pressure_Pa;
            Units       = PressureUnitsEnum.Pa;
            double multipler;

            switch (units)
            {
            case PressureUnitsEnum.MPa:
                multipler = 1e-6;
                break;

            case PressureUnitsEnum.KPa:
                multipler = 1e-3;
                break;

            default:
                multipler = 1;
                break;
            }
            PressureByUnits = Math.Round(Pressure_Pa * multipler, Precision, MidpointRounding.AwayFromZero);
        }
コード例 #13
0
 public Pressure(double pressure_Pa)
 {
     Pressure_Pa     = pressure_Pa;
     PressureByUnits = pressure_Pa;
     Units           = PressureUnitsEnum.Pa;
 }
コード例 #14
0
 public abstract ICheckPoint GetCheckPoint(double testPoint, double rangeMin, double rangeMax, bool absolutePressure,
                                           PressureUnitsEnum pressureUnits, double classPrecision, double marginCoefficient, CancellationToken cancellationToken);