Автоматизация
Две кассовые программы и один COM-порт: как мы остановили синий экран
В медицинском центре касса АТОЛ подключена к компьютеру по USB и видна системе как COM-порт. С этой кассой должны работать две программы: учётная система и 1С.
В медицинском центре касса АТОЛ подключена к компьютеру по USB и видна системе как COM-порт. С этой кассой должны работать две программы: учётная система и 1С. Чтобы обе «видели» кассу одновременно, кто-то ранее поставил утилиту расшаривания COM-портов. Поначалу работало, потом компьютер начал зависать, а раз в несколько дней — падать в синий экран прямо посреди приёма пациентов.
Что происходило на самом деле
Касса общается по принципу «запрос — ответ»: программа отправила команду, касса ответила, следующая команда. Когда порт расшарен на две программы, обе получают все пакеты — и свои, и чужие. Программа видит ответ на чужой запрос, считает его ошибкой и повторяет свою команду. Вторая программа делает то же самое.
Получается шторм повторов. В статистике драйвера это выглядело так: сотни мегабайт отправлено, ноль принято. Драйвер виртуального порта на таком потоке зависал, а вместе с ним — ядро системы. Отсюда синий экран.
Временное решение: арбитр порта
Перевести обе программы на другой способ подключения сразу было нельзя — требовалось согласование с вендором учётной системы. Поэтому мы написали небольшой арбитр на Python, который сидит между программами и портом и делает три вещи:
- Разбирает кадры протокола АТОЛ по полю длины — понимает, где заканчивается один пакет и начинается следующий, и отдаёт ответ только тому, кто спрашивал.
- Сторожевой таймер: если программа не дождалась ответа за разумное время, арбитр освобождает порт, а не копит очередь.
- Проверка владения портом: арбитр следит, чтобы COM-порт был открыт только им, и при старте отключает ошибочно оставшиеся подключения.
Рядом — конфигурационный файл с параметрами порта и таймаутов, скрипт PowerShell для ежедневного обслуживания (перезапуск арбитра, очистка логов) и README для коллег. Синие экраны прекратились в тот же день.
Правильное долгосрочное решение
Арбитр — заплатка, пусть и надёжная. Правильный путь — отказаться от COM-порта вообще: современные кассы АТОЛ поддерживают подключение по TCP через режим EthernetOverUSB. Тогда у кассы появляется сетевой адрес, и несколько программ могут работать с ней штатно, без расшаривания порта. Этот переход мы включили в план работ с вендором.
Заодно про лицензии
В той же организации всплыл вопрос, почему кассы перестали отключать печать бумажного чека (клиенту достаточно электронного). Оказалось, это отдельная функция, которая входит в подписку АТОЛ Connect ИТС, а не продаётся отдельно. Проверить, какие функции куплены, можно в чеке диагностики кассы в блоке «Введённые лицензии». Мы подготовили руководству короткую записку с расчётом пакетной закупки на все кассы.
Вывод
Если касса «иногда зависает» — почти наверняка за неё борются две программы. Расшаривание COM-порта кажется простым решением, но ломает протокол. Нужно либо переводить кассу в сеть, либо ставить между программами того, кто будет следить за очередью. Подключение касс к 1С, лицензии АТОЛ и такие расследования — часть нашего сопровождения 1С.
\newpage
Ещё проекты
Похожие объекты
Автоматизация
Касса, две программы и 248 мегабайт в никуда
Медицинский центр. На ресепшене касса АТОЛ, подключённая к компьютеру по USB; Windows видит её как COM4.
Автоматизация
Почему маркетплейс не принимает ваш УПД
Наш клиент — разборка автомобилей. Продаёт запчасти, в том числе через крупный маркетплейс автозапчастей.