Тарировка (сsv, wlp)

Ссылка: https://tracktools.ru/tools/taring

Краткое описание

Инструмент создан для расчёта тарировочных таблиц и генерации из них csv и wlp файлов.
Создание датчиков происходит посредством разделения тарировочных таблиц на виртуальные датчики:
Такой способ может быть полезен при обработке тарировок баков сложных форм.
Инструмент применим только для систем мониторинга которые поддерживают формулы в датчиках.

Элементы интерфейса: 1 - Имя текущего файла тарировки
2 - Формула текущей тарировки
3 - Визуальное представление разделения датчиков
4 - Выбор файла тарировки (доступно только зарегистрированным пользователям)
5 - Загрузка файла для обработки
6 - Скачать результат в формате wlp (объект wialon)
7 - Скачать результат как отдельные csv/txt файлы (загрузка архива zip)
8 - Графики отдельных датчиков в текущей тарировке
9 - Содержимое файлов (файлов, которые скачиваются при загрузке архива zip)
10 - Исходный текст тарировки (доступен для редактирования зарегистрированным пользователям)
11 - График по формуле - расчёт значений по формуле при возрастающих значениях ДУТ.
12 - Текст файла wlp (загружаемого по кнопке "Скачать wlp")

Файлы с тарировкой загружаются по клику на кнопку Загрузить файл (5).
Незарегистрированным пользователям доступен только этот способ.

Зарегистрированные пользователи могут добавлять тарировки через кнопку Загрузить файл, а также создавать их без загрузки, в кабинете пользователя, во вкладке "Файлы тарировок": Зарегистрированные пользователи также могут редактировать и удалять файлы тарировок.

У незарегистрированных нет такой возможности, и в случае обновления страницы после создания тарировки данные на странице не сохранятся. Однако ссылка на созданную тарировку будет "жить" ещё 60 минут, если её заблаговременно скопировать с кнопки "Скачать wlp" или "Скачать архив".

Структура файла:

формат: csv или txt
разделитель: ";" (точка с запятой)
1-я колонка - литраж тарировки
2-я колонка - первый ДУТ
3-я колонка - второй ДУТ
4-я колонка - третий ДУТ
...и т.д.

Разрешённые символы: 0-9 цифры, . (точка) ; (точка с запятой) и перенос строки.

Пошаговый пример обработки файла

Для примера возьмём файл который видят все незарегистрированные пользователи, переходящие на страницу инструмента:

0;1;1
20;200;1
40;400;1
60;600;1
80;800;1
100;1000;1
120;1200;1
140;1200;1400
160;1200;1600
180;1200;1800
200;1200;2000
220;1200;2200
240;1200;2400
260;2600;2600
280;2800;2800
300;3000;3000
320;3200;3200
340;3400;3400
360;3600;3600
380;3800;3800
400;4000;4000
405;4050;4050

Как видно, это просто csv таблица.
Первая колонка должна быть литражом тарировки, а последующие - тарировками ДУТов, в правильном порядке (2-я колонка таблицы = первый ДУТ и т.д.).

Тарировка для демонстрации, не с реального транспортного средства. Бак в этом примере П-образной формы, и датчики установлены равномерно в обе половины бака.
Поэтому при заполнении бака сначала наполняется одна его часть, и достигнув определённого объёма топливо начинает переливаться в другую половину бака. Из-за этого в тарировке образовываются отрезки где датчики не реагируют на заправляемое или расходуемое топливо, т.к. в данный момент топливо в них находится на одном уровне.

Что происходит при обработке данной тарировки:

В самом начале обработки удалятся все повторяющиеся значения - для расчёта нет смысла их оставлять.

0;1;
20;200;
40;400;
60;600;
80;800;
100;1000;
120;1200;
140;;1400
160;;1600
180;;1800
200;;2000
220;;2200
240;;2400
260;2600;2600
280;2800;2800
300;3000;3000
320;3200;3200
340;3400;3400
360;3600;3600
380;3800;3800
400;4000;4000
405;4050;4050

Если датчик начинается со значения которое в дальнейшем повторяется (единица во втором ДУТе в нашем случае), то эти значения стираются полностью, но если повторяющиеся значения находятся в середине тарировки (как 1200 в этой тарировке), то первое из них остаётся для расчёта, и стираются только все последующие.

Далее перебираются все значения чтобы определить где начинаются и кончаются датчики:

  0  |     1  |  
 20  |   200  |  
 40  |   400  |  
 60  |   600  |  
 80  |   800  |  
100  |  1000  |  
120  |  1200  |  
---------------------
140  |        |  1400
160  |        |  1600
180  |        |  1800
200  |        |  2000
220  |        |  2200
240  |        |  2400
---------------------
260  |  2600  |  2600
280  |  2800  |  2800
300  |  3000  |  3000
320  |  3200  |  3200
340  |  3400  |  3400
360  |  3600  |  3600
380  |  3800  |  3800
400  |  4000  |  4000
405  |  4050  |  4050

В этом моменте мы видим 6 частей данной тарировки, две из которых пустые.

Проходим по всем датчикам, убирая пустые и именуя по порядку все оставшиеся, попутно составляя таблицы "значения ДУТа : литры".
Имена датчиков по умолчанию будут DUT_x для физических и FUEL_x для виртуальных, где x - их порядковый номер.

DUT_1 - FUEL_1
{
    1    : 0
    200  : 20
    400  : 40
    600  : 60
    800  : 80
    1000 : 100
    1200 : 120
}

DUT_1 - FUEL_2
{
    2600 : 260
    2800 : 280
    3000 : 300
    3200 : 320
    3400 : 340
    3600 : 360
    3800 : 380
    4000 : 400
    4050 : 405
}

DUT_2 - FUEL_3
{
    1400 : 140
    1600 : 160
    1800 : 180
    2000 : 200
    2200 : 220
    2400 : 240
}

DUT_2 - FUEL_4
{
    2600 : 260
    2800 : 280
    3000 : 300
    3200 : 320
    3400 : 340
    3600 : 360
    3800 : 380
    4000 : 400
    4050 : 405
}

В процессе этой обработки также создаётся формула, которая складывает все наши FUEL_x подряд, начиная с самого верха, однако если два и более FUEL_x находятся в одном диапазоне литража, (как в этом примере FUEL_2 и FUEL_4) формула склдывает их и делит на их количество, т.е. находит среднее значение:

[FUEL_1]+[FUEL_3]+([FUEL_2]+[FUEL_4])/const2

Так как все датчики FUEL_x складываются, нельзя оставлять полное соответствие данных ДУТа и литража в каждом из них, поэтому необходимо вычесть из каждого датчика максимальное значение предыдущего. В итоге получаем такую картину:

DUT_1 - FUEL_1
{
    1    : 0
    200  : 20
    400  : 40
    600  : 60
    800  : 80
    1000 : 100
    1200 : 120
}

DUT_1 - FUEL_2
{
    2600 : 20
    2800 : 40
    3000 : 60
    3200 : 80
    3400 : 100
    3600 : 120
    3800 : 140
    4000 : 160
    4050 : 165
}

DUT_2 - FUEL_3
{
    1400 : 20
    1600 : 40
    1800 : 60
    2000 : 80
    2200 : 100
    2400 : 120
}

DUT_2 - FUEL_4
{
    2600 : 20
    2800 : 40
    3000 : 60
    3200 : 80
    3400 : 100
    3600 : 120
    3800 : 140
    4000 : 160
    4050 : 165
}

В целом тарировка готова, однако мы оставили возможность системе мониторинга дать датчику значение выше того, которое у него есть по таблице, а также ниже того что имеется. Таким образом, если наш FUEL_3 примет значение 800, при своём минимальном 1400, он попросту уйдёт в минус. Или приняв значение 3200 уйдёт сильно в плюс, т.к. его максимальное значение 2400.

Поэтому вновь проходим по всем виртуальным датчикам и расставляем им лимиты - границы, за которые они не смогут выйти:

DUT_1 - FUEL_1
{
    1    : 0
    200  : 20
    400  : 40
    600  : 60
    800  : 80
    1000 : 100
    1200 : 120
    1201 : 120
}

DUT_1 - FUEL_2
{
    2399 : 0
    2400 : 0
    2600 : 20
    2800 : 40
    3000 : 60
    3200 : 80
    3400 : 100
    3600 : 120
    3800 : 140
    4000 : 160
    4050 : 165
}

DUT_2 - FUEL_3
{
    1199 : 0
    1200 : 0
    1400 : 20
    1600 : 40
    1800 : 60
    2000 : 80
    2200 : 100
    2400 : 120
    2401 : 120
}

DUT_2 - FUEL_4
{
    2399 : 0
    2400 : 0
    2600 : 20
    2800 : 40
    3000 : 60
    3200 : 80
    3400 : 100
    3600 : 120
    3800 : 140
    4000 : 160
    4050 : 165
}

Конечный лимит устанавливается всем датчикам кроме последних датчиков в ДУТе, в нашём случае их получили FUEL_1 и FUEL_3.
Начальный лимит устанавливается все датчикам кроме первых датчиков в ДУТе, в нашём случае их получили FUEL_2, FUEL_3 и FUEL_4.

Далее из получившегося формируется wlp-файл для скачивания и файлы для загрузки в виде zip-архива.