slagbyte

рабочий дневник инженера по данным · телеметрия печей и разливки

[ userinfo: kudinov_at · журнал с 11.2024 ]

ЛентаАрхивПоискО журналеИнструментывы: гостьВойтиПрофиль

Инструменты и подход

Набор у меня скромный и почти не меняется с 2021 года. Менялись только правила - вот их я и переписывал после каждой истории из журнала.

Откуда берутся данные

Источник один: архив историка технологических параметров. Его цифры стоит держать в голове, потому что половина моих ошибок - это ошибки масштаба, а не логики.

Аналоговых тегов в архиве
около 11 400; примерно каждый девятый реально используется в отчётах
Период опроса
1 Гц для аналоговых каналов, события - по изменению состояния
Глубина хранения
3 года в полном разрешении, дальше только суточные агрегаты
Суточный объём
1,1–1,4 ГБ после дельта-сжатия - то есть на один разбор почти всегда можно взять сырой ряд, и отговорка «слишком много данных» у меня не работает

Как устроен архив и его сжатие

Архив хранит не всё подряд. Каждый канал пишется со своей мёртвой зоной сжатия: новая точка попадает в базу, только когда значение ушло от предыдущей записанной больше, чем на эту зону. Это экономит место, но решает за меня, что считать неважным, и на медленных величинах стирает форму - полку в баке я потерял именно так.

Настройки, которые держу в голове, прежде чем судить о форме сигнала, а не только о его значении. Апертура - в процентах от шкалы канала.
Тип каналаЕдиницыОпросАпертураВосстановление
Температура, медленная°C1 Гц0,1 %линейное
Уровень, расход%, м³/ч1 Гц0,1 %линейное
Давление коллектораМПа1 Гц0,25 %удержание
Прочие аналоговые-1 Гц0,5 %удержание
События и алармы-по изменению-ступень

Отсюда моё единственное правило про сжатие: на каналах, где важна форма, апертура прижата до 0,1 %, и знать это надо до того, как объяснять ступеньку в тренде работой оборудования.

Чем работаю

Набор на октябрь 2026. Ничего из этого не требует согласования со службой ИТ, и это было главным критерием выбора.
ИнструментДля чегоПочему именно так
Python 3.11выгрузки, пересчёты, сборка отчётовна нём же написаны проверки самих отчётов, данные не приходится носить между средами
NumPy, pandasряды, агрегаты, сверки по идентификатору плавкидостаточно для рядов в десятки миллионов точек, а большего мне не нужно
DuckDBсуточные выгрузки, запросы по сохранённым файламодин файл и никакого сервера: кладу выгрузку в общую папку, SQL работает оттуда же
Свой пакет чтения архиваотдать массив значений по тегу и окнуоколо 300 строк, умеет ровно одно; чем меньше он умеет, тем реже я лезу его править
Статический HTMLдашборды для себя и для мастеровстраница живёт без сервера и не ломается, когда ломается сеть участка
Блокнот в клеткучерновик замера до его запускапока не нарисована ось и не записано ожидаемое значение, выгрузка не запускается

Десять правил замера

Каждое правило куплено конкретной историей, и ссылка ведёт на разбор, где я его нарушил.

  1. Одиночная проба - не вердикт. Серия минимум из пяти и медиана, иначе вы меряете шум и свою удачу. Разброс между пробами сам по себе полезная величина: он говорит, можно ли вообще что-то утверждать.
  2. У пробы «ничего нет» обязан быть контроль. Нужен канал или точка, где заведомо есть сигнал. Если контроль тоже пуст - виноват прибор, а не объект.
  3. Проверяй прибор там, где ответ известен заранее. Нуль, остановленный агрегат, пустая труба, выходные. Расходомер я поймал именно так, а не калибровкой.
  4. Мерить дельтами, а не накопленными счётчиками. Счётчик ошибок за 400 дней работы не значит ничего; значит прирост за последний час.
  5. Агрегат обязан печатать состав, а не итог. Среднее за выпуск скрывает ровно то, за что бракуют плавку, - это тема декабрьского разбора.
  6. Мерить там, куда смотрит оператор. Мой стенд и экран в операторской - это два разных набора данных, и расходятся они всегда не в мою пользу.
  7. Прореживать только после фильтра. Прореживание не знает, какой у вас процесс, и честно выбрасывает полосу вместе с шумом (как это было).
  8. Две неудачи подряд - остановиться. Не третья правка, а перечитать условие задачи и выписать версии заново. Третья правка подряд у меня ни разу не сработала.
  9. Поверка не ловит дрейф между поверками. В день поверки прибор верен в её точках, а медленный взаимный уход виден только инварианту процесса - паре каналов, обязанной совпасть в известный момент (резервная пара на остановке).
  10. Ровная линия на аналоговом канале - это смерть канала, а не покой. Живое измерение всегда шумит младшим разрядом; сторож на замирание - возраст последнего изменения плюс дисперсия за окно, а не само значение (как это выглядело).

Чего стараюсь не делать

Не объяснять остаток после правки, которую уже внёс: объяснение подгонится, я это за собой ловил. Не сверять суммы, когда можно сверить один объект целиком - расхождение в одну плавку нашлось только после того, как я перестал складывать и взял единственный идентификатор. Не верить, что «сырой ряд из архива» - это все точки: сжатие уже решило, что выбросить, и форму это портит раньше меня. И не трогать железо раньше, чем исключён весь путь сигнала: первая запись журнала как раз о том, сколько стоит нетерпение.

Короткий словарь

Термины, которые в разборах я употребляю не всегда поясняя их на месте.

Апертура сжатия (мёртвая зона)
порог, на который значение должно уйти от последней записанной точки, чтобы попасть в архив; меньший уход не сохраняется.
Удержание последнего значения
восстановление между архивными точками горизонтальной линией до следующей точки; из плавного ухода делает ступень.
Инвариант процесса
величина, обязанная принять известное значение в известный момент; по ней проверяют канал, не имея эталона.
Скользящая дисперсия
разброс значений канала в движущемся окне; у живого измерения он строго положителен, у замершего равен нулю.
Возраст последнего изменения
время с момента, когда значение канала в последний раз реально сменилось; большой возраст при качестве «годен» выдаёт зависание.
Резервная пара
рабочий и горячий резерв на одной точке; их разница - готовый инвариант для контроля взаимного дрейфа.
Найквист
половина частоты опроса; быстрее неё процесс в данных достоверно не виден, а попытка его усреднить даёт ложную низкую частоту.
Квитирование
подтверждение оператором принятого сообщения; поток неквитированных алармов разбирается отдельной записью.