На связи удалённо · офис завтра с 09:00

Автоматизация

Две кассовые программы и один COM-порт: как мы остановили синий экран

В медицинском центре касса АТОЛ подключена к компьютеру по USB и видна системе как COM-порт. С этой кассой должны работать две программы: учётная система и 1С.

В медицинском центре касса АТОЛ подключена к компьютеру по USB и видна системе как COM-порт. С этой кассой должны работать две программы: учётная система и 1С. Чтобы обе «видели» кассу одновременно, кто-то ранее поставил утилиту расшаривания COM-портов. Поначалу работало, потом компьютер начал зависать, а раз в несколько дней — падать в синий экран прямо посреди приёма пациентов.

Что происходило на самом деле

Касса общается по принципу «запрос — ответ»: программа отправила команду, касса ответила, следующая команда. Когда порт расшарен на две программы, обе получают все пакеты — и свои, и чужие. Программа видит ответ на чужой запрос, считает его ошибкой и повторяет свою команду. Вторая программа делает то же самое.

Получается шторм повторов. В статистике драйвера это выглядело так: сотни мегабайт отправлено, ноль принято. Драйвер виртуального порта на таком потоке зависал, а вместе с ним — ядро системы. Отсюда синий экран.

Временное решение: арбитр порта

Перевести обе программы на другой способ подключения сразу было нельзя — требовалось согласование с вендором учётной системы. Поэтому мы написали небольшой арбитр на Python, который сидит между программами и портом и делает три вещи:

  • Разбирает кадры протокола АТОЛ по полю длины — понимает, где заканчивается один пакет и начинается следующий, и отдаёт ответ только тому, кто спрашивал.
  • Сторожевой таймер: если программа не дождалась ответа за разумное время, арбитр освобождает порт, а не копит очередь.
  • Проверка владения портом: арбитр следит, чтобы COM-порт был открыт только им, и при старте отключает ошибочно оставшиеся подключения.

Рядом — конфигурационный файл с параметрами порта и таймаутов, скрипт PowerShell для ежедневного обслуживания (перезапуск арбитра, очистка логов) и README для коллег. Синие экраны прекратились в тот же день.

Правильное долгосрочное решение

Арбитр — заплатка, пусть и надёжная. Правильный путь — отказаться от COM-порта вообще: современные кассы АТОЛ поддерживают подключение по TCP через режим EthernetOverUSB. Тогда у кассы появляется сетевой адрес, и несколько программ могут работать с ней штатно, без расшаривания порта. Этот переход мы включили в план работ с вендором.

Заодно про лицензии

В той же организации всплыл вопрос, почему кассы перестали отключать печать бумажного чека (клиенту достаточно электронного). Оказалось, это отдельная функция, которая входит в подписку АТОЛ Connect ИТС, а не продаётся отдельно. Проверить, какие функции куплены, можно в чеке диагностики кассы в блоке «Введённые лицензии». Мы подготовили руководству короткую записку с расчётом пакетной закупки на все кассы.

Вывод

Если касса «иногда зависает» — почти наверняка за неё борются две программы. Расшаривание COM-порта кажется простым решением, но ломает протокол. Нужно либо переводить кассу в сеть, либо ставить между программами того, кто будет следить за очередью. Подключение касс к 1С, лицензии АТОЛ и такие расследования — часть нашего сопровождения 1С.

\newpage

Ещё проекты

Позвонить

Сайт использует cookie: для работы форм, отзывов с Яндекс.Карт и Яндекс.Метрики — чтобы понимать, что улучшить. Подробнее