четверг, 22 февраля 2024 г.

SQL учет простоев

У нас на работе уже давно сделана такая система учета простоя, и хотелось бы оставить заметку чтобы если придется повторять нечто подобное было проще разобраться. Смысл такой что каждую секунду или две на SQL сервер из контроллера передается сигнал по UDP протоколу, в котором описано состояние агрегата - скорость его, длина и номер рулонов, режим работы механизмов и тд. Данные о состоянии пишутся в SQL таблицу, и обрабатываются триггером каждый раз (раз в секунду или две), где сравнивается предыдущее состояние и текущее, и если видно что агрегат остановился, то начинается отсчет простоя - в другой таблице отбивается время начала простоя. Как только триггер фиксирует обратное изменение, то есть видно что секунду назад агрегат еще стоял, а сейчас уже едет - то в таблице простоя отбивается время окончание простоя. Таблица простоя имеет такую структуру:

При этом данные в таблицу по UDP протоколу пишутся в бинарном формате, и выглядит это примерно так: 

Триггер обрабатывающий бинарную строку состояния агрегата находится в гитхабе моем гитхабе https://github.com/boolkin/scripts/blob/master/SQL/AOM/%D1%82%D1%80%D0%B8%D0%B3%D0%B3%D0%B5%D1%80%20unscale.txt
Там происходит расшифровка данных и как раз та самая логика по проверке предыдущего состояния и нынешнего, и в зависимости от этого строка добавляется или обновляется. 
так же там есть триггер который обрабатывает выведение турбин из работы: аналогично если число показывающее количество турбин в работе изменилось, то если оно уменьшилось то добавляется номер турбины в столбец выведения, а если увеличилось то в столбец введения в работу. плюс затем еще и переименовывается номер в человеческое имя. 
Наиболее интересно было попробовать заюзать цикл: необходимо было посчитать время которое турбина была выведена из работы - алгоритм такой что ищем название этой турбины в столбце выведения, затем ищем его в столбце введения - считаем время этого промежутка, продолжаем поиск по этому же алгоритму и прибавляем ко времени промежутка следующий - это все было добавлено в скалярную функцию и затем получилось выводить в виде таблицы отчета.

Комментариев нет:

Отправить комментарий