Помните, я обещал рассказать про датасет, на котором можно сойти с ума? Ну вот, однажды пришли к нам инженеры производства и говорят, что надо помочь с отладкой. Цеха.
В одном из рулонов стали на 325-м метре образовалась продольная трещина, и теперь все в цеху хотят знать, где что случилось и почему. То есть надо проследить, что конкретно происходило с этим кусочком стали на протяжении всей его биографии.
Задача понятная: берём архитектора, берём данные со всех датчиков, архитектор совершает какую-то магию — и вот у нас готовый датасет для анализа.
И вот на «берём данные с датчиков» мы споткнулись в первый раз. Архитектор, умный адекватный мужик, привыкший работать с синтетическими данными и чистой математикой, чуть не сошёл с ума на нашем реальном производстве.
И уволился посреди проекта со словами, что его психика этого больше не выдержит.
Потому что в теории всё немного не так, как на практике — например, есть много случаев, когда последовательность, которая по определению должна быть монотонно возрастающей, может быть:
- Невозрастающей.
- Немонотонной.
В смысле, что это в принципе физически невозможно, но часто происходит. Ещё могут быть скачки во времени и другие нарушения причинно-следственной связи.
Знакомьтесь: цех! Цех, знакомься: хабрачитатели!
Дано: огромное литейно-прокатное производство, самая главная установка на котором — МНЛЗ (машина непрерывного литья заготовок). Сначала мы плавим металлолом, потом доводим жидкую сталь до кондиции и начинаем разливать. Ковш расплавленной стали выливают в МНЛЗ, которая подаёт жидкий металл в кристаллизатор, спускает по установке розлива стали, и на выходе получается мягкий, как пластилин, стальной брусок — сляб — длиной в среднем 25 метров и температурой около 900 градусов. Потом его катают через кучу оборудования и получают рулоны стали длиной до 1500 метров.
Та часть производства, с которой мы работали, принципиально выглядит так:
1) Льём жидкую сталь в машину слева. Оттуда она вытекает и попадает в кристаллизатор, где сначала получает твёрдую корочку на поверхности, а потом становится тем самым «бруском пластилина», только больше и другим.
2) Этот брусок едет в длинную печку выравнивать температуру, потом попадает в ролики черновой клети, из него делается условно сто метров толстого листа.
3) Дальше он подрезается, попадает в чистовую группу, где плющится до нужной толщины по ГОСТу и заказу, и в зависимости от этой самой толщины получается лист длиной от 300 до 1 000 метров.
4) Охлаждение, моталка — и вот у вас рулон стали, который так нужен клиентам.
Теперь, если на 325-м метре результирующего рулона — раковина, продольная трещина или ещё какой-то дефект, то это значит, что раньше в процессе что-то пошло не так. Например, это могут быть забившиеся форсунки в контуре охлаждения, и тогда получилась неравномерная корочка, и сляб слегка «повело». Или не тот режим охлаждения, и тогда сляб могло покрыть трещинами или в нём могли образоваться внутренние раковины. Или автоматике сказали, как охлаждать, а она не так охладила. Или человек, который выбрал уставку, зачем-то выбрал её от стали чуть другой марки. Или технолог придумал классную оптимизацию — всё просто летает, но есть нюанс.
Нам нужно создать универсальный инструмент, который подходил бы для анализа: всегда нужно докапываться до сути. Без данных в быстрой доступности поиск проблемы похож на отладку без отладчика, подсказок компилятора или брекпоинтов, а просто методом внимательного созерцания кода и попыток проиграть его в голове.
И вот тут как раз нас и позвали доработать датасет этого литейно-прокатного комплекса — детализировать информацию вплоть до уровня конкретных багов.
Зачем ловить конкретные баги
Представьте, что вы стоите в конце линии и наблюдаете дефект на рулоне. Можно просто взять и вырезать кусок с дефектом, это будет стоить какого-то количества времени и денег. А можно попробовать понять, почему он произошёл. И сравнить, например, стоимость какого-то текущего ремонта и выкидывания куска с дефектом в переплавку.
В результате нужно быстро сделать вывод, что и какую проблему вызывает, и из этого понять две важные вещи:
- Оптимальные режимы для разных сталей и изделий.
- Оптимальные действия, например, — останавливать разливку и чинить форсунки сразу или ремонтировать только после смены.
Словом, технологам это просто надо. Они верят, что, получив данные отладки, можно разговаривать друг с другом на одном языке. В смысле они и так на одном языке, но теперь ещё и с конкретной аргументацией, и с числами, и с вещдоками.
А нам надо собрать датасет. Очень просто.
Собираем датасет
Утрируя, на каждой машине есть контроллер, который непосредственно управляет автоматикой узла. Над контроллером — АСУТП, которая снимает с него данные и говорит ему, что делать.
Над АСУТП — уже MES, т. е. планирование производства, из которой АСУТП узнаёт заказы.
На производстве в режиме нон-стоп происходит двухсторонняя интеграция по цепочке: MES говорит, что нужно делать, АСУТП говорит, как это делать, а контроллер говорит: «Есть!» — и идёт исполнять приказанное. Затем докладывает о результатах АСУТП, а та, в свою очередь, упаковывает эту информацию и отправляет MES усреднённые данные о единице продукта.
Нам нужна телеметрия с узла.
Сам контроллер не хранит историю, просто регулярно перезаписывает во внутренней памяти текущие значения всех своих параметров (сигналов). Эти данные оттуда вычитывает АСУТП, которая хранит их буквально пару циклов в оперативке, потом строит по ним какой-то агрегат, а сам временной ряд удаляет (или вообще никуда не записывает). MES получает ещё более абстрактные данные уровня «Изделие № 882 готово».
Средние показатели нас не интересуют, нам надо искать конкретный сантиметр сляба, на котором что-то случилось, что вызвало дефект на 325-м метре листа. И что, собственно, было на узле, когда этот сантиметр его проезжал. То есть нам нужна та самая телеметрия со станка, которую генерит контроллер.
К счастью, такая детальная информация нужна не только технологам, но ещё и ремонтникам, которые озаботились вопросом заранее и подключили к контроллеру ещё одну систему, которая раз в 20 миллисекунд читает память контроллера и, как чёрный ящик в самолёте, записывает всё, что видит. С какими плясками с бубном мы учились читать с неё данные, долгосрочно хранить и обеспечивать доступ для анализа, можно почитать вот в этом посте, просто скажу, что это было не так чтобы совсем легко и быстро. В общем, для нужд анализа мы умеем читать память контроллера и собирать с него временные ряды сигналов телеметрии.
Телеметрия — это, скажем, тысяча датчиков по узлу, которые дают аналоговый сигнал, соединяются проводами с коробкой контроллера, а он каждый аналоговый сигнал дискретизирует и записывает с какой-то периодичностью в ячейку памяти, соответствующую тому или иному датчику.
До этого момента всё выглядит логично и совсем-совсем непсиходелично.
Всё, что нам нужно, — это поджойнить ряды.
Сама задача
- Итак, дефект на 325-м метре результирующего рулона.
- Поскольку его раскатали из полосы после черновых клетей, это 60-й метр первой полосы.
- Поскольку полосу сделали из сляба, это примерно 20-й метр искомого сляба.
- Теперь мы берём этот метр сляба и хотим посмотреть все события производства, связанные именно с ним. И поискать отклонения.
Именно в этот момент мы заподозрили, что с архитектором что-то не так.
Джойн не получается. Все события есть, временные ряды друг другу однозначно соответствуют.
Всё хорошо. И тут вдруг вылезает дичь. Например, решая простейшую задачу вроде «А когда же на оборудовании началась новая единица продукции?», достаточно посмотреть на действия делительных ножниц. После их срабатывания обычно сразу и начинается новая единица: у неё просто нет выбора. Примитивно? Да. Лезем в базу АСУТП. А в базе — всё те же данные, но со сдвигом на семь секунд.
ОК, делаем джойн со сдвигом. Но хитрая железяка ускользает от нас, уже в соседнем сэмпле она сдвинулась на полсекунды.
Начинаем искать закономерность и понимаем, что её нет. Точнее, мы не видим. Все данные правильные, читаются нормально, датчики работают, но последовательности гуляют одна относительно другой. Причём ошибка в районе пяти–семи секунд — плавающая, а как именно и куда она плавает, предсказать нельзя. Собственно, в этом месте архитектор, привыкший к тому, что математика — строгая наука, потерял спокойствие, сон и попытался сделать коррекцию.
Джойн с толерансом тоже не прокатил: железяка уж больно часто уворачивалась от нас во временных рядах.
Мы до сих пор не знаем точной причины сдвигов, но есть гипотеза, что это время на вычитывание с датчика, затем — запись в ячейку памяти, а потом — на чтение нашей системой, которая по приоритету ниже АСУТП. То есть мало того, что контроллер имеет свою задержку — ведь когда мы читаем данные с датчика, мы читаем не датчик, а делаем запрос на чтение в ячейку памяти, ему соответствующую, — так ещё мы находимся в очереди с командами и запросами АСУТП и вынуждены ждать, пока среди них не образуется окно. Возможно, дело в этом.
Мы пришли к разработчикам этого контура и предложили поковыряться, на что они очень резонно заметили:
— Так это, оно же работает.
— И?
— Ну и НЕ ТРОГАЙТЕ! Работает же!
Логика в их словах есть, потому что цена нашего проекта — десятки миллионов экономии, а цена косяка в очередях АСУТП — остановка производства. А это — всё непроизведённое за это время (то есть несколько сотен тонн стали) плюс у нас много машин с буквами «н» в названии, а это значит — «непрерывного». И это не значит, что они могут работать непрерывно, а значит, что они должны всегда работать непрерывно, потому что если их остановить, то изнутри придётся, например, доставать застывшую сталь. И не всегда это в принципе возможно без замены существенной части узла.
В итоге знаете что мы сделали? Перестали даже пытаться что бы то ни было заджойнить чётко по времени. То есть начали работать с массивом данных так, как есть, и решили, что разберёмся с тем, что мы произвели, уже на постобработке.
Окончательно архитектор решил завязать с заводом в тот момент, когда узнал, что не только математика, но и физика — это некая условность. Потому что не могут части железяки ползти с разной скоростью или не в том порядке.
Но, судя по данным, у нас ползут.
Полиция времени
Представьте, что у вас есть некий объект, который может двигаться по производственной линии только в одном направлении. Его катят по роликам, а он, соответственно, катится без остановки.
И вот в какой-то момент вдруг наступает некое событие, в ходе которого объект прыгает по стану на несколько метров вперёд или назад. В целом, если он прыгает вперёд, это совершенно рядовая ситуация, за которой следует коррекция трекинга. А вот если назад — это уже неприятно.
Потому что, во-первых, там уже находятся другие части этого же объекта. А во-вторых, потому что создаётся впечатление, будто один и тот же объект проходит одну и ту же координату дважды.
Короче, в коде АСУТП есть коррекции датчиков. Когда система по некоторому набору датчиков думает одно, а ещё один датчик показывает другое, АСУТП выбирает более надёжный датчик и считает его показания более приоритетными. Трекинг измеряется косвенно, например, МНЛЗ корректируется по пирометру. Когда реальный металл доезжает до датчика, это точно понятно по температуре, которую показывает прибор. Ну почти точно, потому что по факту воздух начинает греться чуть раньше, чем к датчику подходит сама железяка. Параллельно мы проверяем информацию по другим датчикам и вводим поправку на погрешность измерения.
Собственно, дальше в АСУТП срабатывает алгоритм из десятка-двух IF, который корректирует всё вокруг. С точки зрения более верхнеуровневых систем (в том числе нашей) это и означает прыжки во времени.
Так код оброс неким набором IF, но мы уже хорошо знаем, что с этими погрешностями нужно просто жить.
Разрезов 20, а кусков — 10
Следующий взрыв мозга случился в тот момент, когда мы начали считать изделия. Ножницы сработали 20 раз — значит, на линии должно быть 20 изделий. Логично? Логично. Но АСУТП почему-то учла только 10 из них. Там сляб режется на куски, и каждый кусок отделяется от другого ударом огромных ножниц. Если считать удары — у вас 20 кусков. Если считать куски — у вас 10 единиц продукции в АСУТП. Причём данным АСУТП, как показывает вся 15-летняя история существования цеха, вполне можно доверять. Получается, где-то по пути потеряли 10 слябов?!
Идём к технологам, они смотрят на данные, потом — на нас, потом — на данные и говорят:
— Так это, обрезь целиком в загрузочный лоток металлоприёмника не лезет.
Короче, как отправить большой кусок металла обратно в переплавку? Правильно, поделить его на куски, чтобы можно было удобнее его транспортировать. А где проще всего порезать металл?
Правильно, там, где есть ножницы и где этот металл горячий и пластичный. Ну они и нашинковали один из кусков в стружку, просто запустив ножницы с десяток раз на один кусок.
Это так и задумано.
Что мы сделали? Добавили виртуальный датчик ножниц, который собирал данные с обычного датчика ножниц, но, когда ножницы стучали слишком часто, превращал N подряд идущих ударов в один большой. То есть собрали детекцию шинковки — когда началась, когда закончилась: если там — шлёп-шлёп-шлёп-шлёп и слябы получаются по нескольку десятков сантиметров, то это шинковка. Нашинкованный кусок забирают технологи, это и есть примерно 70-сантиметровая линия отреза. И в данных, и в АСУТП дальше едет одинаковое количество кусков.
Аномалии трекинга и ножницы Шрёдингера
Разные датчики собирают данные с разной частотой: одни — чаще, другие — реже. Поэтому может получиться абсурдная ситуация, в которой для одного и того же значения трекинга мы получим несколько разных показателей, например, сигналов ножниц и в придачу — сложный вопрос, которому из них верить. Эдакие ножницы Шрёдингера, которые сработали и не сработали одновременно. Сначала мы можем получить фрейм FALSE, потом — два фрейма TRUE, а в трекинге все три значения будут одинаковыми.
Это особенности дискретизации аналогового сигнала датчиков. Что делать? Решать аномалии.
Если есть фрейм с TRUE для трекинга, то надо принудительно выставить флаг в TRUE для всех отсчётов сигнала с этим значением трекинга, тогда это не помешает дальнейшим преобразованиям. Ну просто срабатывание ножниц заняло три фрейма, а не один, так бывает.
Потом начали пропадать куски партии
В какой-то момент мы выяснили, что посреди стана пропадает ещё кусок сляба. Просто между черновыми и чистовыми клетями технолог может вырезать сантиметров двадцать, чтобы кусок лучше зашёл в приёмные валки. Не вопрос, это довольно простая коррекция, добавили ещё IF и пересчётов пропорций.
Следующий прикол был интереснее. Пакеты сигналов в разных системах состоят из отдельных файлов. Эти куски данных пронумерованы. Каждый кусок содержит два часа сигналов. У них есть последовательные идентификаторы. Мы думали, что можно читать последовательно.
Оказалось, что нет: чтобы понять логику нумерации, надо мыслить, как ковш стали.
Поскольку литейно-прокатный комплекс проектировался как единый объект, в коде это тоже отразилось, и учётной единицей стал именно ковш. То есть плавка определяет, какие из неё получаются слябы, а дальше они катятся и режутся на листы.
Так вот, если вы думаете, что плавка на машине непрерывной разливки стали — это непрерывное явление, то вы прогуливали логику. Работу самого ковша можно прерывать, если рядом есть второй ковш над буфером. То есть можно прекратить лить из одного ковша, подогнать другой, лить из него, а потом долить из первого ковша. Не самая стандартная ситуация, да, но причины так делать всё же бывают.
Пришлось переделывать движок сборки данных, но это было просто по сравнению с прошлыми доработками.
Итог
В условиях, когда есть только сырые данные узлов без координатной привязки, мы выделили ключевые события и построили виртуальную модель проката, которая позволяет ответить на вопрос, что было с 325-м метром полосы на всех предыдущих переделах вплоть до момента, пока этот метр даже ещё не знал, что он полоса, а был жидкостью.
Кодовая база инструмента примерно на 30 % состоит из алгоритма приведения датасета в приемлемое состояние. 70 % алгоритма — это IF для разных случаев жизни, когда на производстве нарушаются физические законы и искривляются пространство и время. Потому что в реальной жизни в данных всё далеко не так, как на бумаге. Монотонное инкрементное поле подвергается постоянной коррекции со стороны реального мира плюс возможны перекрытия данных и их потери.
Точность — до 10 сантиметров по финальной полосе в зависимости от длины и толщины рулона.
Технологи счастливы, теперь они пишут друг другу огромные письма с обоснованиями и всячески меняют процессы, пользуясь точным пониманием, где и что могло вызвать дефект.
А нам нужен новый архитектор. Желательно не перфекционист.
Данные на заводе как коробка шоколадных конфет: никогда не знаешь, какие законы физики, времени и пространства они нарушат сегодня. У нас весело, приходите!
Вакансии — тут.
За помощь в подготовке поста спасибо Филиппу Зорину.
Комментарии (28)
VladimirFarshatov
16.11.2023 07:09+6Пасибки. Напомнили мне построение мат. модели авто на треке при подготовке к соревнованиям сына Робофест-217, где он занял первое место в квалификационных заездах с большим отрывом и третье в финале. Просто не повезло, никто не ожидал, но .. физика там тоже продемонстрировала Шредингера и даже дважды.
Также .. вроде бы трение шины о полотно выражается вот такой формулой в повороте .. ззамеряем и .. получаем что резина от Лего по рекламному баннеру имеем к-т трения .. больше единицы! Но, ведь так не бывает, верно? не всегда, не всегда.. бывают нюансы.
Или ПИД-регулятор мотора колеса .. в общем, пасибки. Напомнили. Читал как детектив, хорошо написано.
vesper-bot
16.11.2023 07:09Коэффициент трения, кстати, бывает больше единицы. ЕМНИП резина по асфальту в справочнике имела разброс от чего-то вроде 0.6 до трех, что ли, было это лет 30 назад. Но этот коэффициент есть соотношение сил, а не передача энергии, поэтому ему ничто не мешает быть больше единицы.
ksbes
16.11.2023 07:09Если коэффициент равен единице, то шины можно хранить на вертикальной стене без крепежа. Если больше - то на потолке.
В реальности, для рекордов, примерно так и поступают - мажут разгонную полосу специальным клейким составом и/или прогревают резину до состояния когда она липнет. Так и получают время разгона до 100 меньше 100/(3.6 *9.8) = 2.8ctenzink
16.11.2023 07:09+1На стене ни при каком коэффициенте хранить не получится. Можно легко посчитать при каком угле наклона деталь начнёт соскальзывать. Получается, что тангенс угла наклона, когда трение перестаёт держать равен коэффициенту трения. То есть при коэффициенте mu=1 угол соскальзывания окажется 45 градусов
slopestyler
16.11.2023 07:09Вроде как даже обычная резина может липнуть при определённой нагрузке, просто делает это плохо, поэтому для замеров используют специальную, равно как и разгонную полосу)
А так, школьная формула сухого трения просто имеет ограничения – объекты не деформируются, не липнут, не подскакивают и околоидеально гладкие, что в реальном мире сложно выполнимо
propell-ant
16.11.2023 07:09+470 % алгоритма — это IF для разных случаев жизни
Это одна из лучших иллюстраций закона Конвея:
Любая организация, проектирующая систему (трактуется здесь шире, чем просто информационная система), неизбежно создаст такую модель, которая будет повторять коммуникационную структуру самой организации.
Код, состоящий из IF, как правило признак костыльности.
При всей моей любви к суровому производству, скажу, что архитектор со стороны к вам после этой статьи не придет. Потому что невозможно построить архитектуру из костылей. Строить можно, а построить нельзя.
Растите архитектора внутри коллектива.
mikerosoft Автор
16.11.2023 07:09+1Про архитектора — в самую точку. Так и поступаем.
А вот про костыли — тут вопрос философский. Что считать костылем, а что элегантным архитектурным решением? Это настолько тонкая грань, что можно различить только по запаху: где сильнее всего пахнет — там костыль ))
Как мерило можно использовать отношение: финальный результат (принесенная бизнесу польза) деленный на сложность доработок и поддержки.
Могу сказать, большая часть этих самых IF'ов описываются в конфигах и добавлялись без жестоких страданий. Хотя были и тяжелые случаи )) Куда же без них.
А если в целом — какие данные на входе, такие и решения в логике обработки.
propell-ant
16.11.2023 07:09Есть еще один аспект, который мне однажды подсказали:
"перед началом работы спроси себя, кому я смогу это продать?"Понимать нужно в самом широком смысле, но в случае ИТ-специалиста это значит "перед вхождением в долгий проект спросите себя, насколько полезна будет в вашем резюме эта запись, увеличит ли она вашу ценность в глазах следующего работодателя"
И вот у костылей есть одно важное отличие - они уникальны для каждой системы. Опыт, полученный на проекте, состоящем из костылей, довольно сложно потом применить "по специальности". Там, конечно, будет прокачана целеустремленность, вера в светлое будущее и стрессоустойчивость, но это типа софт-скиллы. А по основному роду деятельности - костыли, непригодные для других компаний.
domix32
16.11.2023 07:09+7Это как те приколы с робототехникой.
В идеальном мире: повернул щуп кватернионами по узлам и свел клешню, чтобы взять что-нибудь, снова повернул кватернионами чтобы переставить в другое место, разжал клешню.D В реальном мире: механические узлы оказались не настолько точными, как математика, в итоге поворот произошёл с различными скоростями по разным осям и оказался на пол сантиметра в стороне от ожидаемой позиции из-за инерциальности системы, а обратный поворот заставляет гнуться узлы на неадекватные углы, в итоге после десятка попыток перетащить объект один из локтей или выходит из строя или начинает клинить, при этом продолжая регистрировать, что происходит движение. Как итог начинают появляться "костыли" для компенсации и тюнинга под конкретные железки в системе.
MountainGoat
16.11.2023 07:09+5Или, коротко: физические системы без обратной связи не дают практической надёжности.
domix32
16.11.2023 07:09Дык в пример она была, просто паршивого уровня, но сопоставимо со своей ценой.
vilox
16.11.2023 07:09Здесь другая история. Абстрактная модель технологического процесса оказалась слишком упрощённой для решения поставленной задачи. Модель приходится дорабатывать.
E_BEREZIN
16.11.2023 07:09Архитектор, умный адекватный мужик, привыкший работать с синтетическими данными и чистой математикой, чуть не сошёл с ума на нашем реальном производстве.
И уволился посреди проекта со словами, что его психика этого больше не выдержит.
Анализ данных и производственных процессов, где табличные данные являются лишь частью анализа - не одно и тоже. Без походов в гемба здесь не обойтись.
philippzorin
16.11.2023 07:09Сколько различных ветвлений в алгоритмах ПЛК для обработки специфичных ситуаций — столько и нам нужно расставить if'ов для обнаружения и обработки этих ветвлений (к примеру включение шинкования обрези), в этом и особенность данных из «живого» мира.
E_BEREZIN
16.11.2023 07:09Да, сценарии ИТ-системы должны повторять сценарии в жизни. Из вышеописанного я понял, что психика архитектора не выдержала, так как цифры/логика не сходилась с процессами. А не из-за количесва IF.
VladimirFarshatov
16.11.2023 07:09+1Этим отличается работа в ИТ в промке от сферически кровавого энтерпрайза:
"Смотри, ничего понять не могу, третий день бьюсь: вот этот столик (микроскопа на моторчике) двигаю вперед-назад, и .. он уезжает вбок на 0.5микрона .. да не, там есть и прижим, и температурная компенсация и катается всё на прецезионных подшипниках, и атмосфера чиста - 5 пылинок на кубометр.. просто туда-сюда и ушел в сторону. Ладно бы в одну.."
и сравните с "Надо сделать фабрику хелперов для драйверов СУБД. И что, что у нас один Мускуль? А вдруг мы завтра решим поменять Мускуль на Постгрес или даже MSSQL? По нашим требованиям, драйвер обязан(!) поставляться фабрикой в сервис".. а ничо, что это "микросервис" ровно для одного запроса: получить агрегат из БД в стиле EAV, при том, что проектировано с мощными костылями внутри БД? 15 лет пашет, и "мы не можем перейти с Мускуля 5.6 на 8-ю версию, у нас очень много старого кода" .. (делается легко, есть доки)
Ощутите разницу.
Cayp
16.11.2023 07:09+1Стойкое ощущение что для поставленной задачи используются данные с датчиков, которые для этой задачи не содержат истинных данных, поэтому всё так больно.
Датчик срабатывания ножниц говорит правду только о ножницах, но не говорит ничего о том что они резали или не резали.
Чтобы получать данные о результате разрезов надо смотреть на результат разрезов. Возможно, это могут быть камеры+алгоритмы машинного зрения или оптоэлектронные датчики, установленные в правильных местах.
Я понимаю, что приходится использовать то, что есть.
titan_pc
16.11.2023 07:09Во, тоже так подумал. Сам часто работал раньше с датчиками и микроконтроллерами. Они реально иногда чушь несут, просто из-за того что могут быть дикие электромагнитные помехи и зашумленный радиочастотный фон. Вот и появляются всякие костыли в логике обработки, которые не костыли а целая методика.
Не так давно я прикручивал датчик открытия двери в homeassistant. Так вот эта дурнина шлёт несколько событий подряд открыто, закрыто, открыто на одно физическое открытие. Там для этого придумали замечательные вещи "Ваше устройство открыто сколько по времени?". То есть фактически игнорировать события в последовательности на временной шкале. Так как они могут быть ложными.
Итого любой физический датчик рано или поздно начинает врать, причём всегда с определенной частотой. Именно поэтому стоит посмотреть в сторону камер и компьютерного зрения. Настроить её на подозрительные вещи и она будет делать их фото самостоятельно.
Ну а если жить на датчиках - просто надо принять что они иногда чушь несут просто потому что это микрухи и где то рядом с ними в момент чуши электромагнитная волна пролетела, которая может даже возникать из за неочевидных вещей - трение ножниц о металл. Ну а если датчики дешёвые - и производители no-name. Не исключено что там просто баги в коде самих датчиков.
stalker_316
16.11.2023 07:09+1Чем-то напомнило анекдот, где "ну так садитесь на воздушный шар и сваливайте с этого острова"))))
SSukharev
16.11.2023 07:09+1Прежде чем соваться что то делать данные нужно изучить, рыться в данных ваш горе Аархитектор не захотел. Вот и весь фокус.
andi123
16.11.2023 07:09+2Подержите мой коньяк.
Перекресток. 6 распознающих камер, еще 6 обзорок. Надо чтобы все камеры щелкали картинки с точностью 1мс. Что бы любое событие можно было зафиксировать с разных камер.
Решается элементарно. Все обмазываем навигационными приемниками, нтп серверами. А потом начинаются приключения, то гпс не ловит, то сеть лагает, то пакеты теряются, обзорка может устать и не отдавать нормальные метки времени в кадрах. И еще тысячи нюансов. Одно радует. У нас нет непрерывного розлива стали.
Добро пожаловать в реальный мир.
barloc
16.11.2023 07:09Все так. Любая реальность усеяна костылями. Работаем с платежными системами - кодовая база костылей все растет и растет.
klirichek
16.11.2023 07:09Мне кажется, если к каждому датчику приделать элементарные часы реального времени, с ходом хотя бы 3с/сутки - то и с законами физики, и с законами логики всё будет ок. Кейс очень сильно не "бигдата"; архитектор, кажется, был чуть ленив, чтобы хотя бы на метр зайти в кроличью нору (про ныряние туда вообще речи нет).
Но для сравнения с кейсом совсем не настолько "провального в случае фейла" производства - выглядит круто. Были бы все кейсы именно такими - работа бы вдохновляла. А когда "у нас впервые за полгода случился креш... Вот вам 2 гига логов в текстовом виде, разберитесь, что там не так" - скорее перманентно удручают. И даже 200М, и даже всего 2М...
myswordishatred
Но ведь 21, разве нет? Или изделием считается, условно, только правый отрезанный кусок, а всё что слева ещё нет?
mikerosoft Автор
Да, мы считаем те куски, что уже отрезаны. Как колбасу на бутерброд режем — сколько раз отрезали, столько кусков и получилось. Понятно, что в конце серии останется еще кусок, но это немного другая история с точки зрения алгоритма.
vesper-bot
МНЛЗ в идеале льет непрерывную полосу (сляб), и тот кусок, который остался слева, ещё привязан к МНЛЗ, поэтому не является отдельным и не учитывается. Грубо, слева от ножниц всегда есть сталь, которую МНЛЗ подает вперед, поэтому каждое срабатывание ножниц на выходе - один отрезанный кусок, а остатку взяться неоткуда - нет второго конца.