Привет, Хабр! Это Сергей Банников, эксперт К2тех по цифровому производству. Знаете эту классическую фразу от бизнеса: «Там простенькая задача, нужно сделать пару элементарных интеграций»? Обычно именно после этих слов начинается самый суровый инженерный хардкор.
Хочу поделиться одной такой историей, как элементарная маркировка паллет превратилась в технологический квест с блуждающими COM‑портами под Astra Linux, переписыванием экранной клавиатуры с нуля и пробросом туннелей сквозь матрешку из виртуальных машин.
Завязка: «там простенькая задача, две формочки»
Всё началось с того, что коллега между делом предложил оценить задачу для одного завода, который занимается фасовкой сыпучих кормов. Производство мы увидели не целиком, только четыре упаковочные линии, часть из которых еще строилась. Смысл проекта был простой: при расширении производства люди перестали успевать вручную маркировать продукцию. Заводу требовалась автоматизация, которую мы должны были обеспечить.
Нужно было сканировать штрих‑код товара на конвейере, печатать упаковочный лист и наклеивать его принтером‑аппликатором. Мы прикинули: пара экранных форм, пара интеграций с 1С, никаких сложных отчётов — всё просто, компактно и дешево. Набросали оценку и приступили к работе.
Мешки‑анархисты, неполные паллеты и смена всей архитектуры
Первоначальная идея выглядела красиво: едет товар по конвейеру, стационарный сканер считывает штрих‑код, принтер‑аппликатор наклеивает этикетку. С коробками так и работает — штрих‑код на боку, всегда в одном месте, всегда читаемый. Но в нашем случае на двух из четырёх линий ехали мягкие мешки, и здесь нас ждал первый сюрприз.
Заказчик фасует корма для разных брендов, и упаковку ему привозят клиенты. На мешке штрих‑код может быть снизу, может быть сверху, а может не быть вообще — это не зона ответственности завода. Его задача: насыпать корм по весу. Где именно на мешке нанесена маркировка — это история партнёра. Соответственно, сканировать сами мешки в движении нереально. А чуть дальше по конвейеру все четыре линии сходятся в одном месте перед финальной обмоткой стрейч‑худом, и там уже вообще невозможно понять, что именно едет.
Решение пришло быстро: идентифицировать не каждый мешок, а сразу всю паллету по номеру производственной линии. Мы решили клеить штрих‑код с номером линии на поддон — система понимает, с какого конвейера пришла партия, а из 1С получает всю нужную информацию об этой линии: что производится, с каким весом, какие реквизиты идут на этикетку.
Параллельно выяснился ещё один нюанс. Роботы‑упаковщики умеют собирать полные паллеты. Если коробок на линии ровно кратное число — всё хорошо. Но если партия заканчивается раньше, последняя паллета остается неполной, и робот просто останавливается: своё дело сделал, но количество коробок знает только он. Её вручную выкатывают на отдельный участок. Для ввода фактического количества нужно отдельное рабочее место оператора. Плюс ещё один нюанс производства: замотчик иногда ошибается — коробка упала, паллета ушла в брак. Камера уже успела считать её в очередь, а значит, оператор должен вручную ее оттуда удалить. Итого: один АРМ для ввода количества на неполных паллетах, один контрольный АРМ у замотчика — это уже совсем не «две формочки».
Планшет без клавиатуры, ОС без Windows и кастомный UI для суровых условий
Когда дело дошло до автоматизированных рабочих мест, мы даже не рассматривали классические ПК с мышкой и клавиатурой. Офисный подход на заводе не живет: там пыль, постоянная вибрация, а люди работают в плотных перчатках. Обычный ноут в таких условиях отправится в утиль через неделю. Поэтому мы пошли по проверенному пути: посмотрели на парк оборудования заказчика и подобрали суровые промышленные безвентиляторные моноблоки с тачскрином. Железо неубиваемое, как раз для цеха.
С операционкой всё тоже было понятно на старте. Добыть сейчас промышленную Windows‑панель — тот еще квест, поэтому мы изначально закладывали в архитектуру Astra Linux. Само решение у нас кроссплатформенное, так что драйвер сканера под Linux мы спокойно написали и обкатали заранее, обошлось без пожаров и героических спасений.
А вот с интерфейсом решили заморочиться дополнительно, когда потестили его на реальном железе. Дело в том, что штатная экранная клавиатура «Астры» при вызове радостно перекрывала половину рабочего окна. В теории работать можно, но на практике оператору нужно просто вбить количество коробок на неполной паллете — и всё. Заставлять человека на конвейере каждый раз целиться в мелкие системные кнопки было бы издевательством.
Вместо этого наш фронтендер довольно быстро собрал кастомную цифровую панель. Сделали ее по принципу банкомата: огромные кнопки, только цифры и ничего лишнего. Заодно вынесли на видное место кнопку полноэкранного режима, потому что искать аналог F11 на тачскрине без физической клавиатуры — та еще боль. В итоге у человека перед глазами ровно одна функция, а шанс промахнуться мимо нужной кнопки практически сведен к нулю.
Блуждающий COM‑порт, альбом с секретными кодами и динамический поиск устройства
Промышленный USB‑сканер, который читал штрих‑коды на ручном АРМе, тоже был с небольшим сюрпризом. По умолчанию он работал в режиме виртуальной клавиатуры, нам‑то надо было читать его программой. Поэтому надо было переключить его в режим последовательного порта. Но на нем не оказалось никаких кнопок для этого! Оказалось, что переключение осуществляется считыванием специального системного конфигурационного штрих‑кода. Открытый вопрос — что будет, если кто‑то покажет такой код сканеру, введенному в эксплуатацию…

Итак, USB‑сканер наконец, заработал в режиме эмуляции последовательного порта. В Windows это не проблема: при первом подключении система даёт ему, скажем, COM8 — и при любом последующем переподключении адрес сохраняется. Можно жестко прописать порт в конфиге и спать спокойно.
Под Linux картина другая. Подключил — получил COM10. Выдернул, воткнул — COM12. Ещё раз — COM5. Адрес каждый раз новый, и система о нём никак не предупреждает, а на заводе выдернуть кабель может кто и когда угодно. Поэтому мы дописали алгоритм динамического сканирования: при каждом старте и при каждом разрыве связи программа обходит все доступные порты и ищет нужное устройство по его Vendor ID и Product ID. Без этого она рисковала принять за сканер что угодно, вплоть до чьей‑нибудь мышки, воткнутой рядом, и начать радостно читать из неё «штрих‑коды».
Матрешка из виртуальных машин и туннель через три слоя
Принтер‑аппликатор — это не просто принтер. У него есть механическая «лапа», которая берет напечатанную этикетку и физически переносит её на паллету. Координаты, усилие, тайминги срабатывания — всё это нужно было отладить заранее, чтобы не ставить эксперименты на живом конвейере заказчика.
К счастью, вендор предоставил официальный эмулятор — виртуальную машину в VirtualBox, которая полностью имитирует логику пульта и аппаратуры, принимая те же команды, что и реальное железо. Оставалось только интегрировать наш код с этой средой. Специфика заключалась в том, что эмулятор сам по себе установлен на виртуальной машине — получается эдакая матрёшка, и наружу его сетевые порты не смотрели.
Настройка сложного проброса трафика сквозь такую «матрёшку» из виртуальных машин — задача больше инфраструктурная, чем девелоперская. Поэтому мы не стали изобретать велосипед, а подключили наших сетевых инженеров: они быстро прорубили стабильный туннель, не нарушив связность тестового контура. В итоге in‑house тестирование прошло штатно. Мы прогнали полный цикл печати, отладили передачу всех реквизитов и приехали к заказчику с уже проверенным решением. На месте оставалось только подключиться к реальному железу и откалибровать физику движения лапы.
Релизы за десять минут прямо в цех
Когда система встала на боевые рельсы, поднялся вопрос поддержки. Традиционный подход на производстве — это обновления с флешки, пересылка архивов по почте или долгая ручная установка через VPN. Всё это плодит задержки, человеческие ошибки и командировки по малейшему поводу.
Мы решили перенести классические IT‑практики CI/CD в промышленный контур. Поскольку для заказчика на этом участке критически важна скорость реакции, нам согласовали доступ, и мы дотянули наш GitLab‑конвейер прямо до серверов завода. Настроили прозрачный пайплайн: ведущий разработчик пушит код в релизную ветку→ он проходит статический анализ в SonarQube → собираются артефакты под Windows и Astra Linux → выполняются тесты → автоматика раскатывает релиз на сервере в цеху. Весь цикл занимает около десяти минут.
Такой подход особенно выручил нас на этапе пусконаладки. Разработчик сидел с ноутбуком прямо у конвейера, смотрел, как система ведет себя в реальной физической среде, вносил корректировки — и через десять минут они уже крутились на живом оборудовании. Работать вслепую по удаленным логам в таких проектах почти невозможно, реальную производственную специфику нужно чувствовать и видеть своими глазами.

Вот такой путь от «двух формочек» до многослойной системы с кастомным UI, динамической идентификацией сканера, матрешкой из виртуальных машин и CI/CD‑пайплайном прямо в производственный цех.
А вы сталкивались с подобными «простыми задачами», которые оборачивались чередой сюрпризов? Расскажите в комментариях.
Комментарии (27)

ASenchenko
18.05.2026 13:36Если кто-то покажет сканеру любой штрихкод из методички по программированию (а не только коды для перевода в режим эмуляции клавиатуры и обратно в Com), то хорошо проинструктированный суровый начальник смены оторвёт ему руки.
Так - работает. Многократно проверено.
В сторону ТСД вообще не смотрели? Любопытно зачем оставили моноблоки, если по-любому софт допилиливали?

Orioner Автор
18.05.2026 13:36Про начальника смены понятно, а вот интересно - в супермаркетах на кассах аналогичное оборудование? Это же прямо вектор атаки...
ТСД мы используем, когда людям надо ходить по территории. А тут - стационарное рабочее место, и заказчик хотел именно АРМ. И сканер - привязан проводом к моноблоку, никто не утащит случайно и не забудет.

ASenchenko
18.05.2026 13:36Про сканера - да, разумеется. Подавляющее большинство моделей настраиваются служебными штрихкодами.
Насчёт вектора атаки - я реально в ступоре. Можете придумать кейс? Ну допустим Вы на кассе самообслуживания в условной Пятерочке отсканировали 3 штрихкода (кстати, для этого модель их сканера нужно знать). Режим программирования - запрет чтения датаматрикс - сохранение настроек. Ну перестала касса на некоторое время пробивать кефир и прочий Честный знак. Пока поддержка руками директора магазина не сбросила сканер в дефолт и не вернула настройки. Дел на 10 минут.
Ну а дальше идёт вызов наряда, съём данных с камер и привет минимум административка за хулиганство. Причём не отвертишься никак. Штрихкоды специальные, умысел докажет любой первокурсник с юрфака.

Wesha
18.05.2026 13:36Пока поддержка руками директора магазина не сбросила сканер в дефолт и не вернула настройки.
Для этого надо понимать, что решение проблемы — это «сбросить сканер в дефолт и т.д.»

ASenchenko
18.05.2026 13:36Да, разумеется.
И 1-я линия ТП на трубе с персоналом магазина скорее всего не дойдут до этого.
Но инциденты с кассами - это по дефолту высокий приоритет, а значит до 3-й линии инцидент долетит очень быстро. И там пришлют штрихкоды, сбросят и настроят заново.
Ну ок. За 10 минут я конечно слишком оптимистично заявил :)))))

Orioner Автор
18.05.2026 13:36Кейс я могу наверное даже придумать, но нет ли за такие придумки тоже какой-нибудь административки? :-)
Я могу лучше вспомнить, как покупал какой-то сыр, и на упаковке была реклама в стиле "отсканируй код и выиграй приз". И код был - datamatrix. Сканер кассы самообслуживания его считал и выпал в осадок - некорректный продукт, красная лампочка, все дела. Ну, минут пять я ждал "к вам спешащего специалиста". Дизайнер перемудрил с дизайном, что скажешь

ASenchenko
18.05.2026 13:36Странный CJM, что завернули на приглашение персонала. Достаточно сигнала + 5-секундной плашки и/или кнопки сброса покупателем.
Но в чужую голову не влезу, не знаю что там "так бизнес хотел".
Я бы, столкнувшись с таким, не поленился написать цветастое дадзыбао куда-нибудь в "обратную связь"

KN_Dima
18.05.2026 13:36Кстати, да - на некоторых товарах ажно по три кода на одной стороне упаковки - попробуй, угадай, который нужен , а какие надо пальцами закрыть.

ASenchenko
18.05.2026 13:36Про ТСД.
Да, привычка - дело реально серьёзное. Просто интересно стало. Я бы покурил с заказчиком этот вопрос, попадись мне такая задача. Дело тут даже не в мобильности рабочего места. На ТСД сам UI нативнее для таких задач.
Там другие минусы типа интеграции с Эской в недрах склада, глухие зоны wifi, обрывы коннекта и прочие неприятности

Orioner Автор
18.05.2026 13:36Так как мы UI делали на базе уже имеющейся системы, то это правда было быстрее, чем отдельно всю эту историю с ТСД реализовывать. А для того, чтобы была проблема "глухие зоны WiFi" необходимо, чтобы WiFi как минимум присутствовал. А есть предприятия, где WiFi пока вот не развёрнут. И ради одного ТСД его точно делать никто не будет.

Bunyaz39
18.05.2026 13:36Эти сервисные коды надо прятать в сейф сразу после пусконаладки, иначе человеческий фактор рано или поздно выстрелит)

Orioner Автор
18.05.2026 13:36Конечно, надо. Просто - с моей точки зрения - проблему бы легко снимал один маленький переключатель под крышкой на винте под пломбой. Но такие технологии, кажется, утеряны :-)

kaverdo
18.05.2026 13:36# Universal rule for USB devices with ttyACM port (eg. /dev/usbSVab10Pcd23 for device with Vendor ID ab10 and Product ID cd23) SUBSYSTEMS=="usb", KERNEL=="ttyACM[0-9]*", SYMLINK+="usbSV%E{ID_VENDOR_ID}P%E{ID_MODEL_ID}"Можно добавить такое правило в udev и убрать логику поиска сканера из приложения. На каждом подключении на актуальный ACMx будет ссылаться симлинк с фиксированным именем.

Orioner Автор
18.05.2026 13:36О, большое спасибо, мы посмотрим. Времени как обычно было не очень много - одна из проблем подобных проектов в том, что оборудование сразу едет к заказчику, и на то, чтобы собрать стенд и всё досконально протестировать, есть буквально несколько дней....

DungeonLords
18.05.2026 13:36Как перестать гадать, что сегодня /dev/ttyUSB0: стабильная работа с USB в Linux

ru4pae
18.05.2026 13:36Я один вспомнил историю с Realtek 8168? Драйверов под линукс нет, написал сам.
В целом интересная статья.

Bunyaz39
18.05.2026 13:36Раскатывать релизы прямо на боевой конвейер за 10 минут - звучит как план, надежный как швейцарские часы)) Главное чтобы пайплайн не лег вместе с роботом-упаковщиком где-нибудь в ночную смену

Orioner Автор
18.05.2026 13:36На этапе первичной настройки системы - это вполне приемлимо. После ввода в эксплуатацию подобные вещи делаем в согласованное технологическое окно. И, естественно, для этого выделяется отдельная релизная ветка в git. Обычный конвейер просто собирает версию, автотесты и всё такое.

lazarus_net
18.05.2026 13:36Как выше писали - надежность level god. Тут на днях вроде писали как взломали pupeline одного из AI разработчиков и зарелизили вирусняка людям. Запасаемся покорном.

Tomasina
18.05.2026 13:36На первом фото UI с полосой прокрутки - это боль оператора. Неужто сложно сделать динамический размер кнопок (ну или фиксированные чуть меньше размером)?

Orioner Автор
18.05.2026 13:36Это рабочий прототип, потом поджали. К сожалению, пока проект делают, очень редко хватает времени, чтобы фотокорреспондент успел всё заснять :-)
feyd12
Интересно. Пишите еще, плюсик в карму и статье.
Orioner Автор
Спасибо, буду стараться :-)
feyd12
Можете мою оценить, тоже на днях решил поделиться опытом :)