[{"url":"/post-frozen-tag.html","title":"Канал, который замер и не сознавался","date":"2026-10-13","tags":["датчики","диагностика"],"summary":"Температура подшипника дымососа держала ровно 47,0 °C пять часов подряд, без единого колебания. Ночная смена увидела в этом подозрительную стабильность и спросила, не клинит ли подшипник. Вопрос был правильный, только наоборот: стабильным был не подшипник, а мёртвый канал.","text":"Температура подшипника дымососа держала ровно 47,0 °C пять часов подряд, без единого колебания. Ночная смена увидела в этом подозрительную стабильность и спросила, не клинит ли подшипник. Вопрос был правильный, только наоборот: стабильным был не подшипник, а мёртвый канал. Задача Оператор ночной смены обратил внимание на температуру подшипника Б: обычно она дышит на пару десятых, а тут встала как вкопанная на 47,0 и не двигается с начала смены. Логика была такая: если значение перестало меняться, значит что-то заклинило и трения больше нет - не предвестник ли это аварии. Мне прислали тренд, и на нём действительно была идеальная горизонталь. Насторожило меня ровно то же, что и оператора, но я прочитал это иначе. Исправный тепловой канал не бывает идеально ровным: у подшипника всегда есть микроколебания нагрузки, у преобразователя - шум последнего разряда. Ноль колебаний - это не очень хорошая стабильность, это отсутствие новых измерений. Как мерил Я поднял сырой ряд по каналу Б за смену: 47,0 - и больше ни одной другой цифры, даже в сотых. Рядом поднял канал А того же агрегата: тот же уровень 47, но живой, ±0,3 °C, с нормальным дыханием. Два соседних подшипника не могут вести себя так по-разному, если оба живы. Дальше я не стал смотреть глазами, а посчитал по всем 11 400 аналоговым тегам две простые величины: возраст последнего изменения значения и дисперсию за последний час. Замерший канал обязан выделиться в обеих - давно не менялся и имеет нулевую дисперсию. Оба канала держат один уровень 47 °C. Живой постоянно шумит на уровне младшего разряда; замерший лежит идеальной прямой. По значению они неотличимы, по дисперсии - противоположны. Пять каналов из выборки. Замерший выделяется не значением, а давним последним изменением при нулевой дисперсии. Канал С последнего изменения Дисперсия за 1 ч Вердикт Подшипник дымососа Б 5 ч 12 мин 0,00 замер Подшипник дымососа А 3 с 0,09 живой Температура масла 7 с 0,04 живой Уставка защиты 38 сут 0,00 не измерение Расход воздуха 1 с 2,7 живой Что оказалось неправдой: «ровно - значит стабильно» Допущение, на котором стоял вопрос смены: раз значение не меняется, процесс устойчив, и ровная линия - это хорошо. Для аналогового измерения всё наоборот. Живой канал обязан шуметь хотя бы младшим разрядом, потому что мир шумит, и АЦП тоже. Абсолютно гладкая линия означает, что новые измерения не приходят вовсе, а на экран повторяется последнее. Почему канал замер, выяснилось отдельно: подвис опрос по этому тегу, а слой сбора данных продолжал отдавать последнее значение со старой меткой времени, но с признаком качества «годен». Этот признак и обманывал: он говорит, что значение корректное, а не что оно свежее. Чем разделил Разделяющая величина - дисперсия за окно, а порог - по возрасту последнего изменения, а не по самому значению. У живого канала дисперсия за час строго больше нуля при любой стабильности процесса; у замершего она ровно ноль, и последнее изменение где-то в прошлом. Нулевая дисперсия сама по себе ещё не приговор: у меня в выборке так же выглядела уставка защиты, которую никто не трогал 38 суток. Но уставка - не измерение, а конфигурационный тег, ему стоять на месте положено. Разделяет их тип канала: сторож на замирание надо вешать только на измеряемые величины, а дискретные и конфигурационные из него исключать, иначе он будет кричать на каждую неизменную уставку. Вывод Живое измерение всегда чуть шумит. Идеально ровная линия на аналоговом канале - это не образцовая стабильность, а умерший канал, и чем правдоподобнее застрявшее значение, тем дольше его не замечают. Сторож простой: возраст последнего изменения плюс дисперсия за окно, порог по возрасту, список только из измеряемых тегов. Признак качества от слоя сбора данных сюда не годится - он про корректность значения, а не про его свежесть. Этот разбор - родня истории о дрейфе : там канал был живой, но тихо уезжал, и ловил его наклон разницы; здесь канал стоял мёртвый, и ловила его эта самая неподвижность. В обоих случаях один вывод по одной пробе был бы неверным, и в обоих спас не прибор, а форма ряда во времени."},{"url":"/post-flowmeter.html","title":"Расходомер, который считал воздух","date":"2026-09-29","tags":["приборы учёта","балансы"],"summary":"Два месяца я искал прибор, который ошибается на проценты. Нашёл прибор, который ошибается на нуле, и на это понадобилась одна ночная остановка участка.","text":"Два месяца я искал прибор, который ошибается на проценты. Нашёл прибор, который ошибается на нуле, и на это понадобилась одна ночная остановка участка. Задача На участке охлаждения стоит головной расходомер на подаче и четыре прибора по ветвям. Сумма ветвей не сходилась с головным: по суткам недобор 6,8 %, из месяца в месяц. Для технического учёта это некритично, но тот же баланс идёт в расчёт удельного расхода воды на тонну, и шесть процентов там уже заметны. Запрос звучал привычно: «один из расходомеров врёт, найди какой». Версию я принял и начал перебирать приборы - сравнивал наклоны, искал дрейф, поднимал даты последней поверки. Два месяца, ноль результата. Как мерил сначала и почему это не работало Моя методика была такой: взять часовые суммы за месяц и посмотреть, на каком режиме расхождение растёт. Идея верная, исполнение бессмысленное. Участок работает почти всё время в одном диапазоне, 280–320 м³/ч, и разных режимов, которые можно было бы сравнить, просто нет. Я мерил одну точку и каждый раз получал те же 6–8 %. Остановился я на правиле, которое сам же записал годом раньше: две неудачи подряд - не третья попытка, а смена условия задачи. Условие было в том, что я ищу процент. А процент нельзя быстро проверить: любая версия про калибровку требует эталона, поверочной установки и месяца согласований. Чем разделил На 24 сентября была плановая остановка участка на два часа - промывка фильтров, задвижки закрыты. Это единственная точка, где я заранее знаю правильный ответ: расход обязан быть нулевым. Если прибор врёт на нуле, он врёт измеримо и бесплатно. Головной расходомер показал 11 м³/ч. Все четыре ветвевых - ноль. Сутки 23 сентября и ночная остановка 24 сентября 2026 года. Правая колонка - сутки 27 сентября, после настройки отсечки. Точка учёта Сутки, м³ Остановка, м³/ч После правки, м³ Ветвь 1, кристаллизатор 1 840 0 1 844 Ветвь 2, кристаллизатор 1 795 0 1 802 Ветвь 3, вторичное охлаждение 2 410 0 2 418 Ветвь 4, подпитка бака 690 0 702 Сумма по ветвям 6 735 0 6 766 Головной прибор 7 227 11 6 847 Расхождение 6,8 % - 1,2 % Что оказалось неправдой: ошибка в процентах Неправдой была постановка «врёт на проценты». Головной прибор вихревой, и у него не была задана отсечка малых расходов. На участке трубопровода перед ним горизонтальный пролёт, который после каждой остановки стоит недозаполненным, и вихревой преобразователь честно считает пульсации того, что через него идёт, - а идёт там смесь с воздухом. Отсюда и две составляющие недостающих 492 м³ в сутки. Постоянный «нулевой» вклад даёт 264 м³ - это те самые 11 м³/ч, набегающие круглосуточно, потому что прибор никогда не видит настоящего нуля. Остальное приходится на три пуска в сутки: первые пятнадцать-двадцать минут после пуска прибор завышает расход почти вдвое, пока воздух не вытеснен. Ещё одна неправда была моя личная: я считал, что искать надо среди пяти приборов. Искать надо было среди пяти приборов и одного трубопровода - монтаж оказался частью измерительного тракта ровно так же, как клеммная коробка в ноябрьской истории . Что сделали Задали отсечку 1,5 м³/ч, добавили воздухоотводчик на верхней точке пролёта и внесли в регламент пуска пятиминутную выдержку до начала учёта. Расхождение на сутках 27 сентября - 1,2 %. Дальше я его не трогаю, и это осознанное решение. Класс точности каждого из пяти приборов ±1,5 %; при сложении четырёх ветвей и сравнении с головным суммарная неопределённость баланса около двух процентов. Полтора процента искать внутри двух процентов - это уже не измерение, а подгонка, и остановиться здесь честнее, чем получить красивый ноль. Вывод Прибор надо проверять там, где ответ известен заранее: на нуле, на остановленном агрегате, на закрытой задвижке, в выходные. В этой точке не нужны ни эталон, ни поверка - нужна только возможность подождать. И про формулировки. «Врёт на проценты» - удобная версия именно потому, что её нельзя быстро проверить: с ней можно жить годами, периодически обещая разобраться. «Врёт на нуле» проверяется за одну ночь. Если версия устроена так, что её проверка требует месяца, это повод искать другую версию, а не запрашивать месяц."},{"url":"/post-compression.html","title":"Как апертура сжатия стёрла полку","date":"2026-08-05","tags":["архив","сжатие"],"summary":"В тренде уровень в баке стоял на месте, а потом одним кадром прыгнул на шесть процентов. Выглядело как резкий заброс и вопрос к клапану. На самом деле уровень полз полчаса, и ступеньку нарисовал не процесс, а настройка сжатия архива.","text":"В тренде уровень в баке стоял на месте, а потом одним кадром прыгнул на шесть процентов. Выглядело как резкий заброс и вопрос к клапану. На самом деле уровень полз полчаса, и ступеньку нарисовал не процесс, а настройка сжатия архива. Задача Разбирали ночной эпизод на промежуточном баке. Нужно было понять, когда именно уровень перешёл отметку 55 % - от этого зависело, успел ли включиться откачивающий насос или опоздал. По тренду картина была однозначная: до 14:23 ровные 52 %, в 14:23 мгновенный скачок на 58 %. Из такой картинки следует «залип и сорвался клапан», и акт уже писали в эту сторону. Мне эта ступенька не понравилась одним: мгновенных скачков уровня в баке на несколько процентов не бывает, если не рвётся труба. Вода не телепортируется. Как мерил Я поднял из архива точки именно по этому каналу за окно с 14:05 до 14:40. Их оказалось три: 52 % в начале, 55 % где-то посередине и 58 % в конце. Между ними - ничего, и тренд соединял их удержанием последнего значения, отсюда и ступеньки. Дальше я посмотрел настройку канала в историке. У него стояла мёртвая зона сжатия 0,5 % шкалы: новая точка пишется, только когда значение ушло от записанной больше чем на полпроцента. Для медленно ползущего уровня это и даёт три точки на полчаса - ровно по числу раз, когда он набрал очередные полпроцента сверх мёртвой зоны. Сплошная линия - как уровень шёл на самом деле (восстановлено по соседнему каналу). Пунктир - что отдавал тренд: три сохранённые точки, соединённые удержанием последнего значения. Через эти три точки одинаково ложатся и плавный подъём, и ступенька. Один и тот же получасовой подъём при разной мёртвой зоне сжатия. Чем шире зона, тем меньше точек и тем раньше теряется форма. Мёртвая зона, % шкалы Точек за 35 мин Можно ли по архиву отличить плавный подъём от ступени 0,1 48 да, форма подъёма видна целиком 0,25 19 в основном да, перегибы ещё читаются 0,5 3 нет: подъём и ступень дают те же три точки 1,0 2 нет: остаются только начало и конец Что оказалось неправдой: «в архиве лежит сырой сигнал» Я и сам говорил это в прошлых разборах : подними сырой ряд. Здесь «сырой ряд» уже был результатом решения, какие точки не писать. Сжатие с мёртвой зоной - это не хранение всего подряд, а утверждение «между сохранёнными точками не было ничего, что стоило бы полпроцента». Для уровня в баке это утверждение ложно: самое интересное как раз между точками. Сложилось с удержанием последнего значения на отрисовке. Будь восстановление линейным, три точки нарисовали бы наклонную прямую - тоже не идеал, но хотя бы не ступеньку. А удержание рисует горизонталь до самого скачка, и получается ровно та картинка, из-за которой обвинили клапан. Чем разделил Разделяющий признак очевиден, если его сформулировать: при мёртвой зоне 0,5 % и удержании последнего плавный подъём на 6 % и ступенька на 6 % дают неотличимые три точки. Значит по этому каналу вопрос «подъём или скачок» неразрешим в принципе, и спорить о нём бессмысленно - надо брать другой источник. Я взял соседний канал - расход на входе в бак, у него мёртвая зона 0,1 % и точек много. Приток все тридцать пять минут был ровный, без провалов и забросов. Ровный приток не может дать мгновенный скачок уровня: уровень обязан был ползти. Для контроля нашёл ещё один канал того же бака, который по недосмотру писался вообще без сжатия, - он показал тот же плавный подъём, что я восстановил по расходу. Вывод Сжатие архива не нейтрально. Оно экономит место, выбрасывая то, что настройка считает неинтересным, и широкая мёртвая зона вместе с удержанием последнего превращает плавный уход в ступень. Прежде чем судить о форме сигнала, а не только о его значении, надо знать две настройки канала: мёртвую зону сжатия и способ восстановления между точками. С тех пор у меня есть короткий список каналов, где важна именно форма - уровни, положения регулирующих органов, медленные температуры, - и на них мёртвая зона прижата до 0,1 %. Остальные пусть сжимаются как хотят: там я смотрю на значение, и ступенька в полпроцента мне ничего не испортит."},{"url":"/post-resampling.html","title":"Как я усреднил себе аварию","date":"2026-05-18","tags":["временные ряды","агрегаты"],"summary":"Здесь виноват не прибор, не оператор и не вендор. Здесь виноват я, причём дважды: сначала выбросил нужную полосу частот, а потом сам же придумал объяснение тому, что от неё осталось.","text":"Здесь виноват не прибор, не оператор и не вендор. Здесь виноват я, причём дважды: сначала выбросил нужную полосу частот, а потом сам же придумал объяснение тому, что от неё осталось. Задача Дашборд по приводам вспомогательного оборудования открывался 40 секунд. За эти 40 секунд он тянул сутки секундных данных по сорока каналам - три с половиной миллиона точек, чтобы нарисовать график шириной в тысячу пикселей. Мастера им не пользовались ровно по этой причине. Я сделал предрасчёт: среднее за 10 секунд, одна таблица на сутки. Дашборд стал открываться за 1,2 секунды, им начали пользоваться, и месяц всё было хорошо. Что случилось В середине апреля на дымососе выросла вибрация подшипникового узла. Обнаружил её слесарь по звуку при обходе, а не тренд. После остановки и вскрытия стало понятно, что процесс шёл трое суток. Самое неприятное: я этот тренд видел. На дашборде была медленная волна с периодом около пятидесяти секунд, которой раньше не было, и я объяснил её работой регулятора - у него цикл как раз порядка сорока пяти секунд. Объяснение было правдоподобным, непроверенным и ложным. Как мерил Взял сырой секундный ряд за сутки до остановки - он, к счастью, никуда не делся, предрасчёт лежал рядом с архивом, а не вместо него. Посчитал спектр по сырому ряду и по прореженному. В сыром ряду нашлась пульсация 0,12 Гц, растущая по амплитуде трое суток. В прореженном её не было, зато была та самая волна 0,02 Гц. Это не совпадение, это арифметика: при шаге 10 секунд частота Найквиста равна 0,05 Гц, всё, что выше, отражается вниз, и 0,12 Гц попадает ровно в 0,02 Гц. Отражённая составляющая не выглядит мусором. Она выглядит медленным процессом, который легко приписать регулятору, погоде, смене режима - чему угодно из того, что в цехе действительно происходит с такими периодами. Чем разделил Сравнил четыре способа сжать те же сутки и посмотрел, что каждый делает с пульсацией 0,12 Гц. Разделяющий признак выбрал заранее: способ годится, если по нему виден рост амплитуды за трое суток. Один и тот же суточный ряд по 40 каналам, четыре способа сжатия. Объём - число хранимых чисел. Способ Рост виден? Что стало с 0,12 Гц Объём Каждая десятая точка нет отразилась в 0,02 Гц без потери амплитуды 346 тыс. Среднее за 10 с нет ослаблена втрое и отражена в 0,02 Гц 346 тыс. Фильтр 0,04 Гц, затем прореживание нет удалена честно, ложной волны нет 346 тыс. Минимум, максимум, первое, последнее да видна как рост размаха внутри окна 1,38 млн Третья строка - самая важная и самая неприятная. Правильное прореживание не возвращает потерянную полосу, оно всего лишь перестаёт врать: ложной волны больше нет, но и вибрации не видно. Чтобы увидеть рост, нужна четвёртая строка, где вместо одного числа за окно хранятся четыре и размах сохраняется. Вывод Прореживать ряд можно только после фильтра - иначе вы не удаляете шум, а переносите его на другую частоту, где он притворяется процессом. Это правило знает любой учебник, и ровно поэтому я его не вспомнил: оно было в разделе про обработку сигналов, а я решал задачу про скорость загрузки страницы. Хранить за окно надо минимум, максимум, первое и последнее значение. Это вчетверо больше места и в тридцать раз меньше, чем сырой ряд, - цена, которую я теперь плачу не задумываясь. По сути это та же мысль, что в разборе про брак , только там среднее скрывало провал за десять минут, а здесь - пульсацию за десять секунд. И третье, про себя. Моё «это регулятор» было подгонкой объяснения под уже сделанную правку: я придумал причину, которая не требовала признать, что предрасчёт испортил данные. Такое объяснение всегда находится, и единственная защита от него - проверить его отдельным замером до того, как успокоился."},{"url":"/post-drift.html","title":"Поверка сошлась, а канал уехал","date":"2026-02-24","tags":["поверка","тренды"],"summary":"Обе термопары честно прошли поверку, каждая в своих трёх точках и каждая внутри допуска. А потом я посчитал разницу между ними в момент, когда они обязаны были показать одно и то же, и увидел, что за год они тихо разъехались на два с лишним градуса.","text":"Обе термопары честно прошли поверку, каждая в своих трёх точках и каждая внутри допуска. А потом я посчитал разницу между ними в момент, когда они обязаны были показать одно и то же, и увидел, что за год они тихо разъехались на два с лишним градуса. Задача На ответственном участке стоит резервная пара: два термопреобразователя в одной защитной гильзе, канал А рабочий, канал Б горячий резерв. По регламенту оба поверяются раз в год, и оба последнюю поверку прошли: в точках 0, 300 и 600 °C каждый уложился в свой допуск ±1,5 °C. Бумага чистая у обоих. Пришли с другим вопросом. Автоматика переключилась с А на Б без видимой причины, и при переключении уставка «подпрыгнула» на полтора градуса. Меня спросили, который из двух каналов врёт. Правильный ответ оказался «оба и ни один». Как мерил Абсолютную правду по такой гильзе взять неоткуда: эталона в рабочей точке у меня нет, а поверка уже сказала, что оба в допуске. Поэтому я стал мерить не значение, а разницу Δ = А − Б - величину, для которой эталон не нужен, потому что в правильном мире она равна нулю. Разницу в рабочем режиме смотреть бесполезно: по гильзе идёт градиент, и даже две исправные термопары в сантиметре друг от друга покажут немного разное. Нужен момент, когда градиента нет и обе видят одно и то же тело. Такой момент бывает раз в месяц - длинная остановка участка, когда гильза остывает до цехового воздуха и держит его часами. Я поднял архив за одиннадцать таких остановок, с марта по январь, и в каждой взял Δ на установившемся участке. Δ = А − Б на установившемся участке каждой месячной остановки. Рост почти линейный, около 0,2 °C в месяц, за год - 2,4 °C. Каждая отдельная поверка в своих точках всё это время оставалась в допуске. Шесть остановок из одиннадцати. Абсолютные значения почти совпадают с цеховым воздухом, а их разница ползёт в одну сторону. Остановка Канал А, °C Канал Б, °C Δ = А − Б, °C март 24,3 24,2 0,1 май 21,8 21,3 0,5 июль 27,6 26,7 0,9 сентябрь 23,1 21,6 1,5 ноябрь 19,4 17,3 2,1 январь 18,0 15,6 2,4 Что оказалось неправдой: «поверен - значит верен» Молчаливое допущение было такое: раз оба прибора прошли поверку, их показаниям можно верить, а расхождение при переключении - случайность автоматики. Поверка действительно прошла. Но она отвечает на вопрос «врёт ли прибор в точках 0, 300 и 600 градусов сегодня», а не на вопрос «сколько прибор набрал дрейфа с прошлого раза и куда он уедет к следующему». Между двумя годовыми поверками канал Б медленно терял чувствительность - скорее всего, деградация спая, обычная история для рабочей термопары. В точках поверки это ещё укладывалось в допуск, потому что допуск широкий, а дрейф за год не успел его выбрать. Но взаимная разница копила этот дрейф без всякого допуска, и к январю он стал виден невооружённым глазом. Чем разделил Версий было две: либо уехал один из каналов, либо это нормальный разброс, который я принял за тренд. Разделяет их знак и форма Δ. Разброс дал бы облако вокруг нуля без направления; дрейф одного спая даёт монотонный уход в одну сторону. Одиннадцать точек подряд в одну сторону - это уже не разброс. Который из двух каналов уехал, инвариант сам по себе не говорит: он видит только разницу. Но тут помогла арифметика поверки. У канала А отклонения в точках за два последних цикла почти не менялись, у канала Б в верхней точке подросли с −0,4 до −1,3 °C - в ту же сторону и того же порядка, что и накопленная Δ. Сходятся два независимых признака, и оба показывают на Б. Вывод Поверка проверяет прибор в своих точках и в день поверки. Она честно ловит грубую ошибку, но почти слепа к медленному дрейфу между поверками - именно потому, что допуск шире годового ухода. Этот дрейф ловит не прибор, а инвариант процесса: две величины, которые обязаны совпасть в известный момент, и их разница, снятая серией. С тех пор у каждой резервной пары я веду один служебный тег - Δ в остановках - и смотрю не на его значение, а на наклон. Величина простит, наклон нет. Это тот же приём, которым я потом ловил замерший канал : там признаком жизни был шум, здесь - неподвижность разницы, и оба раза решение принимал не по одной пробе, а по форме ряда."},{"url":"/post-norm-vs-brak.html","title":"Отчёт показывал норму, а плавка была брак","date":"2025-12-09","tags":["отчётность","агрегаты"],"summary":"Отчёт считался без единой ошибки. Все формулы были верны, все данные на месте, ни одного пропуска. И он физически не мог показать то, за что бракуют плавку.","text":"Отчёт считался без единой ошибки. Все формулы были верны, все данные на месте, ни одного пропуска. И он физически не мог показать то, за что бракуют плавку. Задача За декаду отдел контроля забраковал две плавки из сорока семи: затягивание стакана при разливке, вопросы к температуре металла. Сменный отчёт по температуре разливки при этом держал все сорок семь внутри допуска - нижняя граница 1 540 °C, и ни одной плавки ниже. Ко мне пришли с вопросом, который я сначала счёл риторическим: «почему отчёт не видит брак». Разумный ответ был «потому что брак не по температуре», и я его почти дал. Как мерил Отчёт брал из архива одно число на плавку - среднее значение за выпуск. Я поднял сырой ряд 1 Гц по забракованной плавке № 19: 600 точек, десять минут выпуска. Плавка № 19. Минимум 1 528 °C, ниже границы допуска 19 секунд, среднее за весь выпуск 1 564 °C. Отчёт печатал только последнюю из этих трёх величин. Дальше простая арифметика, которую стоило сделать ещё до выгрузки. Провал глубиной 44 °C и длиной 19 секунд сдвигает среднее за 600 секунд на 1,4 °C. Даже если бы он был вдвое глубже, отчёт остался бы в допуске: чтобы среднее ушло ниже 1 540 °C, металл должен просидеть в провале больше пяти минут из десяти. Что оказалось неправдой: «в сводке норма» Утверждение, которое никто не произносил вслух, но на котором стоял весь отчёт: «если в сводке норма, значит процесс был в норме». Сводка отвечала на другой вопрос - какой в среднем была температура. По этой величине решение о браке не принимает никто. Разошлись не данные с реальностью, а вопрос с ответом. Отдел контроля смотрит на кратковременные выходы за границу, потому что именно они дают корку и затягивание. Отчёт считал устойчивость режима. Обе величины законные, но в одной таблице они подменяли друг друга. Чем разделил Пересчитал тот же отчёт за ту же декаду, добавив две колонки: минимум за выпуск и суммарное время ниже границы. Если дело в усреднении, забракованные плавки обязаны выделиться в новых колонках, оставаясь неотличимыми в старой. Так и вышло. Шесть плавок декады из сорока семи. По колонке «среднее» все шесть в допуске; по двум правым - нет. Плавка Среднее, °C Минимум, °C Ниже 1 540 °C, с Вердикт контроля № 11 1 566 1 561 0 принята № 19 1 564 1 528 19 брак № 23 1 561 1 536 7 принята № 31 1 567 1 533 11 принята № 38 1 563 1 526 24 брак № 44 1 559 1 538 4 принята Из сорока семи плавок выход за границу нашёлся у пяти. Обе забракованные оказались в этой пятёрке и обе - с самым длинным временем ниже границы: 19 и 24 секунды против 4–11 у принятых. Соблазнительно объявить порог «пятнадцать секунд», но на пяти случаях это не закономерность, а совпадение, и я так и записал в служебной записке. Вывод Агрегат обязан печатать ту величину, по которой принимают решение. Бракуют не по среднему - значит и в отчёте среднего недостаточно; к нему нужны минимум и время за границей, причём последнее важнее глубины. Общее правило я для себя сформулировал жёстче: усреднение - это утверждение «внутри окна ничего интересного не было». Пока это утверждение не проверено, среднее нельзя отдавать в отчёт. Через полгода я сам же об это и споткнулся, только уже в другом масштабе ."},{"url":"/post-timestamps.html","title":"Три часовых пояса в одной таблице","date":"2025-07-21","tags":["метки времени","сверка"],"summary":"Расхождение было ровно в одну плавку из сорока семи - то есть два процента, то есть именно столько, сколько принято списывать на «особенности выгрузки». Списывал полгода и я.","text":"Расхождение было ровно в одну плавку из сорока семи - то есть два процента, то есть именно столько, сколько принято списывать на «особенности выгрузки». Списывал полгода и я. Задача Суточная сводка по расходу графитированных электродов считается на плавку: расход делится на число плавок. В сводке стояло 46 плавок, в журнале мастера - 47. Удельный расход при этом получался на два процента выше правды, и ровно на эти два процента месяц к месяцу не сходился с нормой. Ко мне пришли со словами «сводка теряет плавки». Я проверил логи выгрузки, увидел нулевое число ошибок и ответил, что ничего не теряется. Это был правильный ответ на неправильно заданный вопрос. Как мерил Поначалу я сравнивал суммы: сумма по сводке против суммы по журналу, день за днём. Так расхождение видно, а причина - нет, и три попытки подряд не дали ничего. После третьей я остановился и сменил приём: взял один идентификатор плавки и выписал про него все метки времени, какие нашёл в трёх системах. Одна и та же плавка № 47 от 30 июня 2025 года в трёх источниках. Сдвиг указан относительно архива историка. Источник Зона метки Чем ставится метка Сдвиг Архив историка UTC, зона указана момент приёма значения сервером 0 Журнал плавок локальная, зона не указана подтверждение оператором вручную +3 ч 0…6 мин Лабораторная выгрузка локальная, зона не указана момент печати протокола +2 ч 53 мин Третья строка выглядела абсурдно: лаборатория отставала от журнала плавок на семь минут при одной и той же локальной зоне. Причина скучная - на сервере лаборатории не был настроен синхронизатор времени, и часы ушли на семь минут за год с лишним. Никто не замечал, потому что лабораторию никто не сверял поминутно. Что оказалось неправдой: «ничего не теряется» Неправдой было моё собственное утверждение «данные не теряются, значит всё в порядке». Данные действительно не терялись ни на одном шаге. Плавка № 47 начиналась в 23:58 локального времени, а сводка за сутки резалась по границе UTC - и эта плавка штатно попадала в предыдущие сутки, где её уже посчитали. В месячной сумме всё сходилось; разъезжались только суточные числа, а по ним и считали удельный расход. Вторая неправда была архитектурной: я считал, что метка времени - это свойство события. На самом деле у каждой из трёх систем метка означает разное. Историк пишет, когда значение дошло до сервера, и на загруженной очереди это до 90 секунд после самого события. Журнал плавок пишет, когда человек нажал кнопку. Лаборатория пишет, когда напечатался протокол. Чем разделил Чтобы не спорить о зонах по справочникам, я сделал синтетический тик: канал, в который раз в минуту пишется значение, равное номеру минуты. Этот канал я прописал во все три системы на двое суток. Дальше сверка стала арифметикой. Тик с номером 1 440 должен лежать в полуночной точке каждого источника; где он лежал на самом деле, там и был сдвиг. Любая версия про «летнее время» или «ошибку выгрузки» этим опытом отсекается сразу: тик не зависит ни от технологии, ни от оператора, ни от нагрузки на сеть. Минутный тик с тех пор живёт в архиве постоянно и стоит мне один тег из одиннадцати тысяч. Два раза за год он ловил расползание часов на других серверах раньше, чем это замечали люди. Вывод В любой выгрузке, где больше одного источника, рядом с временем обязана стоять колонка «откуда метка и в какой зоне». Без неё таблица выглядит согласованной и не является таковой. И второе, более общее: суточная граница - это не факт, а чьё-то решение. Пока не сказано, по какой зоне режутся сутки и какое событие считается началом плавки, любые «на два процента больше нормы» обсуждать бессмысленно. После правки граница в сводке стала локальной, расхождение с журналом мастера ушло в ноль, а подбор ближайшей точки по времени , которым я грешил в ноябре, я переписал на явное окно."},{"url":"/post-false-alarms.html","title":"Шестьсот алармов в смену и ни одного настоящего","date":"2025-03-04","tags":["алармы","уставки"],"summary":"Меня попросили сделать отчёт о том, кто из операторов не квитирует сообщения вовремя. Отчёт я так и не сделал и считаю это лучшим результатом той недели.","text":"Меня попросили сделать отчёт о том, кто из операторов не квитирует сообщения вовремя. Отчёт я так и не сделал и считаю это лучшим результатом той недели. Задача Повод был такой: за смену в журнале событий 612 срабатываний, операторы квитируют их пачками по тридцать штук, не читая, и руководство участка хотело цифру - у кого задержка больше. Логика понятная: если человек не читает сообщения, когда-нибудь он не прочитает важное. Я согласился с выводом и не согласился с направлением. Прежде чем мерить людей, имело смысл померить сам поток: шестьсот сообщений за восемь часов - это сообщение раз в 47 секунд. Человек, который читает каждое, не делает ничего другого. Как мерил Выгрузил журнал событий за 30 суток: 142 318 записей по 1 240 тегам, у которых вообще заведены уставки. Для каждого тега посчитал три величины: сколько раз он сработал, сколько длилось состояние «активно» по медиане и сколько переходов пришлось на один содержательный эпизод. Третья величина и оказалась разделителем. Настоящий аларм живёт минутами: пока оператор идёт смотреть, состояние ещё активно. Дребезг живёт секундами - сигнал болтается вокруг границы, и каждый переход порождает запись. Канал нагрузки привода дымососа, 3,5 минуты из архива. Уставка 85 % стоит внутри обычного рабочего диапазона, сигнал пересекает её 21 раз, и каждое пересечение вверх - это запись в журнале событий. Пять тегов из одиннадцати, давших 83 % записей за 30 суток. Имена каналов изменены, смысл сохранён. Канал Срабатываний Доля Медиана, с Что это на самом деле Нагрузка привода дымососа 38 410 27 % 3 уставка внутри рабочего диапазона Уровень в приёмном зумпфе 24 902 18 % 5 работа насоса по уровню, норма Давление воздуха на горелке 19 365 14 % 2 пульсация после редуктора Расход воды на кристаллизатор 11 044 8 % 4 уставка выставлена «на всякий случай» Температура подшипника № 2 9 740 7 % 6 летний нагрев, уставка не пересмотрена Остальные 1 229 каналов 24 112 17 % 212 в том числе все настоящие события Что оказалось неправдой: износ и халатность Ходовое объяснение звучало как «алармов много, потому что оборудование изношено». Оно неверно арифметически: 83 % записей дали одиннадцать каналов из 1 240, и ни один из этих одиннадцати не относился к неисправности. У всех одиннадцати граница срабатывания стояла внутри диапазона, в котором агрегат работает штатно. И вторая неправда, уже про людей: операторы вели себя разумно. При медианной длительности 3 секунды сообщение гаснет раньше, чем человек дочитает строку. Квитирование пачкой - это не халатность, это единственная рабочая стратегия в такой системе. Чем разделил Взял три канала из таблицы и поставил задержку на включение 20 секунд. Гистерезис был бы честнее, но его нужно согласовывать с технологами, а задержку отображения - нет, и мне важно было получить ответ за неделю, а не за квартал. Семь суток после правки: по этим трём каналам 9 740 записей превратились в 46. Ни одно настоящее событие не потерялось - я сверил по журналу ремонтов, оба зафиксированных за неделю случая остались в списке, потому что длились минуты. Вывод Шестьсот сообщений за смену - это не «много алармов». Это ноль алармов, вместо которых идёт шум, и красный цвет на экране перестаёт означать «подойди посмотри». Мерить надо не число срабатываний, а их длительность: она одна отделяет событие от болтанки вокруг границы. А запрос «посчитай, кто виноват» почти всегда стоит сначала перевести в «посчитай, сколько работы мы создаём сами». В тот раз перевод сработал: через месяц технологи пересмотрели уставки на шести каналах, и отчёт про операторов больше никому не понадобился."},{"url":"/post-cold-junction.html","title":"Термопара не врёт - врёт её холодный спай","date":"2024-11-12","tags":["датчики","термометрия"],"summary":"Эта история стоила мне двух часов работы с архивом и сэкономила полдня простоя участка. Если бы я поступил как собирался, я бы заменил исправный преобразователь, получил ровно то же расхождение и объяснил его «особенностями нового прибора».","text":"Эта история стоила мне двух часов работы с архивом и сэкономила полдня простоя участка. Если бы я поступил как собирался, я бы заменил исправный преобразователь, получил ровно то же расхождение и объяснил его «особенностями нового прибора». Задача В начале ноября мастер участка внепечной обработки принёс распечатку: температура металла в ковше по термопаре подогревателя стабильно ниже лабораторного замера. Не на градус, а на десять-пятнадцать. Лаборатория мерит погружным зондом один раз за обработку, термопара пишет непрерывно, и такая разница - это уже не погрешность, это другой технологический режим. Формулировка заказчика звучала так: «ваш датчик врёт, меняйте». В ней уже была готовая гипотеза, и я, честно говоря, её принял: написал черновик заявки на замену вторичного преобразователя. Остановило меня то, что заявка означала остановку поста на половину смены. Как мерил Взял из архива шесть часов записи с частотой 1 Гц - 21 600 точек по каналу температуры металла. Рядом в архиве лежал второй канал, про который я до того дня не думал: температура внутри клеммной коробки. Его завели на пусконаладке два года назад, и за два года его не открыл никто, включая меня. К каждому лабораторному замеру подобрал ближайшую точку термопары. Тогда я ещё не знал, насколько разъезжаются метки времени в разных системах, и просто брал ближайшую по времени запись; позже выяснилось, что так делать нельзя, но на разнице в десяток градусов это не сказалось. Шесть часов 11 ноября 2024 года. Последняя строка - после двух часов работы с открытыми воротами на подаче ковшей. Время Лаборатория, °C Термопара, °C Δ, °C В коробке, °C 08:40 1 568 1 557 −11 19 10:15 1 572 1 558 −14 14 12:50 1 561 1 549 −12 16 15:05 1 566 1 554 −12 17 17:30 1 570 1 553 −17 9 Что оказалось неправдой: слово «врёт» Неправдой было само слово «врёт». Расхождение не плавало случайно: оно шло за температурой клеммной коробки, и шло так явно, что график можно было не строить - хватило пяти строк таблицы. Чем холоднее коробка, тем больше отставание от лаборатории. Дальше всё сходится по справочнику. Компенсация холодного спая у этого преобразователя делается по его собственному встроенному датчику. Сам преобразователь стоит в коробке на стене в десяти метрах от въездных ворот. В ноябре ворота открывают на каждую подачу, коробку выдувает, встроенный датчик видит одну температуру, а клеммы, где физически находится спай, успевают остыть сильнее. Разница между ними и уезжает прямо в показание. Чем разделил Опыт получился самым дешёвым из всех, что у меня были. Я попросил сорок минут не открывать ворота - попал в перерыв, никого не задержал. Температура в коробке поднялась с 9 до 21 °C. На следующем лабораторном замере расхождение составило 2 °C, при том что ни датчик, ни кабель, ни уставки, ни прошивку никто не трогал. Это и есть разделение: если бы врал датчик, закрытые ворота не изменили бы ничего. Версия «датчик» требует замены железа, версия «компенсация» требует закрыть ворота. Вторую проверять в сорок раз дешевле, и начинать надо было с неё. Что сделали Вторичный преобразователь перенесли в шкаф КИП, где круглый год +22. На стене оставили только клеммник, до шкафа проложили компенсационный кабель той же градуировки. Канал температуры коробки я вывел на свой дашборд рядом с каналом металла - не операторам, им он не нужен, а себе: теперь видно, когда условия снова уедут. Отдельный вывод, который задел меня сильнее технического: нужный канал существовал два года и был бесполезен, потому что не находился ни на одном экране. Данные, которые никто не смотрит, не существуют ровно до того дня, когда кто-то решит их посмотреть. Вывод Датчик - это не точка, это путь: чувствительный элемент, кабель, клеммы, компенсация, преобразователь, канал в архиве, формула в отчёте. Пока весь путь не исключён, «датчик врёт» - не диагноз, а отказ разбираться. И мерить надо не величину, а разность между величиной и своей моделью её измерения: я-то думал, что смотрю на температуру металла, а смотрел на температуру металла минус ошибку компенсации, которая зависела от погоды на улице."}]