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; }
// Диапазон принимается всегда в Па, в результатах давление будет в переданных единицах измерения 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(); }
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(); }
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; }
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); }
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); }
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); }
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); }
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]); } }
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; } }
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)); }
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); }
public Pressure(double pressure_Pa) { Pressure_Pa = pressure_Pa; PressureByUnits = pressure_Pa; Units = PressureUnitsEnum.Pa; }
public abstract ICheckPoint GetCheckPoint(double testPoint, double rangeMin, double rangeMax, bool absolutePressure, PressureUnitsEnum pressureUnits, double classPrecision, double marginCoefficient, CancellationToken cancellationToken);