Инструменты и подход
Набор у меня скромный и почти не меняется с 2021 года. Менялись только правила - вот их я и переписывал после каждой истории из журнала.
Откуда берутся данные
Источник один: архив историка технологических параметров. Его цифры стоит держать в голове, потому что половина моих ошибок - это ошибки масштаба, а не логики.
- Аналоговых тегов в архиве
- около 11 400; примерно каждый девятый реально используется в отчётах
- Период опроса
- 1 Гц для аналоговых каналов, события - по изменению состояния
- Глубина хранения
- 3 года в полном разрешении, дальше только суточные агрегаты
- Суточный объём
- 1,1–1,4 ГБ после дельта-сжатия - то есть на один разбор почти всегда можно взять сырой ряд, и отговорка «слишком много данных» у меня не работает
Как устроен архив и его сжатие
Архив хранит не всё подряд. Каждый канал пишется со своей мёртвой зоной сжатия: новая точка попадает в базу, только когда значение ушло от предыдущей записанной больше, чем на эту зону. Это экономит место, но решает за меня, что считать неважным, и на медленных величинах стирает форму - полку в баке я потерял именно так.
| Тип канала | Единицы | Опрос | Апертура | Восстановление |
|---|---|---|---|---|
| Температура, медленная | °C | 1 Гц | 0,1 % | линейное |
| Уровень, расход | %, м³/ч | 1 Гц | 0,1 % | линейное |
| Давление коллектора | МПа | 1 Гц | 0,25 % | удержание |
| Прочие аналоговые | - | 1 Гц | 0,5 % | удержание |
| События и алармы | - | по изменению | - | ступень |
Отсюда моё единственное правило про сжатие: на каналах, где важна форма, апертура прижата до 0,1 %, и знать это надо до того, как объяснять ступеньку в тренде работой оборудования.
Чем работаю
| Инструмент | Для чего | Почему именно так |
|---|---|---|
| Python 3.11 | выгрузки, пересчёты, сборка отчётов | на нём же написаны проверки самих отчётов, данные не приходится носить между средами |
| NumPy, pandas | ряды, агрегаты, сверки по идентификатору плавки | достаточно для рядов в десятки миллионов точек, а большего мне не нужно |
| DuckDB | суточные выгрузки, запросы по сохранённым файлам | один файл и никакого сервера: кладу выгрузку в общую папку, SQL работает оттуда же |
| Свой пакет чтения архива | отдать массив значений по тегу и окну | около 300 строк, умеет ровно одно; чем меньше он умеет, тем реже я лезу его править |
| Статический HTML | дашборды для себя и для мастеров | страница живёт без сервера и не ломается, когда ломается сеть участка |
| Блокнот в клетку | черновик замера до его запуска | пока не нарисована ось и не записано ожидаемое значение, выгрузка не запускается |
Десять правил замера
Каждое правило куплено конкретной историей, и ссылка ведёт на разбор, где я его нарушил.
- Одиночная проба - не вердикт. Серия минимум из пяти и медиана, иначе вы меряете шум и свою удачу. Разброс между пробами сам по себе полезная величина: он говорит, можно ли вообще что-то утверждать.
- У пробы «ничего нет» обязан быть контроль. Нужен канал или точка, где заведомо есть сигнал. Если контроль тоже пуст - виноват прибор, а не объект.
- Проверяй прибор там, где ответ известен заранее. Нуль, остановленный агрегат, пустая труба, выходные. Расходомер я поймал именно так, а не калибровкой.
- Мерить дельтами, а не накопленными счётчиками. Счётчик ошибок за 400 дней работы не значит ничего; значит прирост за последний час.
- Агрегат обязан печатать состав, а не итог. Среднее за выпуск скрывает ровно то, за что бракуют плавку, - это тема декабрьского разбора.
- Мерить там, куда смотрит оператор. Мой стенд и экран в операторской - это два разных набора данных, и расходятся они всегда не в мою пользу.
- Прореживать только после фильтра. Прореживание не знает, какой у вас процесс, и честно выбрасывает полосу вместе с шумом (как это было).
- Две неудачи подряд - остановиться. Не третья правка, а перечитать условие задачи и выписать версии заново. Третья правка подряд у меня ни разу не сработала.
- Поверка не ловит дрейф между поверками. В день поверки прибор верен в её точках, а медленный взаимный уход виден только инварианту процесса - паре каналов, обязанной совпасть в известный момент (резервная пара на остановке).
- Ровная линия на аналоговом канале - это смерть канала, а не покой. Живое измерение всегда шумит младшим разрядом; сторож на замирание - возраст последнего изменения плюс дисперсия за окно, а не само значение (как это выглядело).
Чего стараюсь не делать
Не объяснять остаток после правки, которую уже внёс: объяснение подгонится, я это за собой ловил. Не сверять суммы, когда можно сверить один объект целиком - расхождение в одну плавку нашлось только после того, как я перестал складывать и взял единственный идентификатор. Не верить, что «сырой ряд из архива» - это все точки: сжатие уже решило, что выбросить, и форму это портит раньше меня. И не трогать железо раньше, чем исключён весь путь сигнала: первая запись журнала как раз о том, сколько стоит нетерпение.
Короткий словарь
Термины, которые в разборах я употребляю не всегда поясняя их на месте.
- Апертура сжатия (мёртвая зона)
- порог, на который значение должно уйти от последней записанной точки, чтобы попасть в архив; меньший уход не сохраняется.
- Удержание последнего значения
- восстановление между архивными точками горизонтальной линией до следующей точки; из плавного ухода делает ступень.
- Инвариант процесса
- величина, обязанная принять известное значение в известный момент; по ней проверяют канал, не имея эталона.
- Скользящая дисперсия
- разброс значений канала в движущемся окне; у живого измерения он строго положителен, у замершего равен нулю.
- Возраст последнего изменения
- время с момента, когда значение канала в последний раз реально сменилось; большой возраст при качестве «годен» выдаёт зависание.
- Резервная пара
- рабочий и горячий резерв на одной точке; их разница - готовый инвариант для контроля взаимного дрейфа.
- Найквист
- половина частоты опроса; быстрее неё процесс в данных достоверно не виден, а попытка его усреднить даёт ложную низкую частоту.
- Квитирование
- подтверждение оператором принятого сообщения; поток неквитированных алармов разбирается отдельной записью.