Поверители в ходе поверки делают проливы определенного количества воды через счетчик - volume
(показания счетчика) - и фиксируют какой объем пролитой воды измерил счетчик - measurement
(показания эталона). Разнича между volume и measurement, вычисляемая в процентах, называется погрешнойстью delta
.
У счетчиков есть условно три режима работы:
min
- минимальный поток, который фиксирует счетчикtransition
- переходных режимmax
- максимальный поток
Измерения производятся в каждом из трех режимов. Для каждого из трех режимов допустимая погрешность отличается. У разных счетчиков количество воды, которое необходимо пролить, различается.
Формула расчета погрешности
PRECISION = 6
delta = (((volume - measurement) / measurement) * 100).round(PRECISION)
Поверитель в форме указывает паспортные значения счетчика в полях Расход (consumption
). Значения consumption_1
(min) и consumption_2
(transition) выбираются из предустановленных:
min : [0.03, 0.05, 0.06, 0.1]
transition : [0.13, 0.16, 0.22, 0.275]
Значение consumption_3
(max) указывается пользователем самостоятельно, допустимый диапазон: 0.35-1.56 (позже будет понятно откуда он берется)
Допустимые диапазоны погрешности
delta_1 (min) : (-4.9)..(4.9)
delta_2 (transition) : (-1.9)..(1.9)
delta_3 (max) : (-1.8)..(1.8)
Таблицы, в соответствии с которой, выбирается значение volume
min: [
{ range: (0.003)..(0.033), volume: 0.008 },
{ range: (0.050)..(0.055), volume: 0.012 },
{ range: (0.060)..(0.066), volume: 0.014 },
{ range: (0.100)..(0.120), volume: 0.02 },
]
transition: [
{ range: (0.117)..(0.143), volume: 0.014 },
{ range: (0.144)..(0.176), volume: 0.017 },
{ range: (0.198)..(0.242), volume: 0.023 },
{ range: (0.247)..(0.302), volume: 0.03 },
]
max: [
{ range: (0.35)..(0.56), volume: 0.019 },
{ range: (0.56)..(0.76), volume: 0.026 },
{ range: (0.76)..(0.86), volume: 0.029 },
{ range: (0.86)..(1.01), volume: 0.034 },
{ range: (1.01)..(1.56), volume: 0.050 },
]
Пример:
значение `consumption_2` равно 0.22,
consumption_2 соответствует таблице transition
находим в ней сточку с диапазоном, в который попадает 0.22 - это треться строчка
значит `volume` равен 0.023
Чтобы избежать ошибок с десятичными долями, не используйте для вычислений числа с плавающей точкой (real, float), используйте Decimal.
Ниже пример как работает округление Decimal на сервере. Обратите внимание на 4-5 строчки. Убедитесь, пожалуйста, что с вашей стороны округление Decimal работает в том же режиме.
BigDecimal('0.123456789').round(0) == 0.0
BigDecimal('0.123456789').round(1) == 0.1
BigDecimal('0.123456789').round(2) == 0.12
BigDecimal('0.123456789').round(3) == 0.123
BigDecimal('0.123456789').round(4) == 0.1235
BigDecimal('0.123456789').round(5) == 0.12346
BigDecimal('0.123456789').round(6) == 0.123457
BigDecimal('0.123456789').round(7) == 0.1234568
BigDecimal('0.123456789').round(8) == 0.12345679
BigDecimal('0.123456789').round(9) == 0.123456789