BVSoft

Программное обеспечение для торговых предприятий

Настройка сканеров штрихкодов в программе "bvsoft-Склад (Solaris)":

Сканер штри...
Сканер штрихкодов - COM-порт Сканер штрихкодов - COM-порт
Настройки с...
Настройки сканера - клавиатурный Настройки сканера - клавиатурный

Программа поддерживает 2 вида сканеров: режим клавиатурного, когда сканер присоединяется к компьютеру через клавиатурный разъем, и его работа ничем не отличается от ручного ввода штрихкода с клавиатуры, либо режим COM-порта, когда сканер втыкается в разъем COM-порта. Также существуют (и все более популярны) USB-сканеры, которые работают либо в режиме эмуляции клавиатуры (обычно эта настройка у них стоит по-умолчанию), либо в режиме эмуляции COM-порта. Переводятся такие сканеры из режима в режим программированием специальных штрихкодов, которые описаны в мануалах, прилагаемых к устройству. Для работы в режиме эмуляции клавиатуры сканеру как правило не требуется в операционной системе никаких драйверов. Для работы в режиме эмуляции COM-порта требуется установка драйвера, разработанного производителем сканера, скачиваемого с сайта производителя. Режимы эмуляции для USB-сканеров настраиваются в программе точно так же, как и "настоящие" клавиатурные или COM-портовые сканеры. С точки зрения работы программе удобнее работать с COM-портом, так как поток поступающих данных отделен от потока данных с клавиатуры, однако нужно уметь этот режим включить, плюс нужно ставить драйверы, плюс COM-порты в некоторых режимах, например, в режимах терминального доступа, могут работать нестабильно (отваливаться и глючить). Режим клавиатурный хорош тем, что он обычно программируется в аппарате по-умолчанию, то есть не надо устройство перепрограммировать, плюс операционной системе не требуется, как правило, дополнительных драйверов. Самым большим плюсом является объединение потока данных со сканера с клавиатурным, то есть сканер работает даже в блокноте. Самым большим недостатком драйвера является объединение потока данных со сканера с клавиатурным, что приводит к усложнению логики работы драйвера, от которого требуется разделение этих данных.

Все настройки драйвера сканера производятся в меню "Администратор/Установки", на закладке "Штрих-код". В программе много настроек, касающихся логической обработки полученного штрихкода, такие как префисы контрагентов, настройки автоматического сохранения штрихкодов и так далее, но нас в данный момент интересует непосредственно работа драйвера, что устанавливается опциями "тип сканера", "таймаут", "заголовок", "окончание" ,"COM-порт", "Скорость". Остальные настройки относятся к логическим. Для проверки работы драйвера используется кнопка "Проверка", открывающая окно "Проверка работы сканера", которое выводит данные в 3 поля: поле "Получены данные" показывает непосредственно полученные данные (в случае COM-порта - это все, что поступает на данный порт, а в случае клавиатурного режима - все, что поступает с клавиатуры), поле "HEX" показывает полученные данные в 16-разрядном формате (HEX-формат). На эти окна информация должна поступать в любом случае, независимо от того, понял ли сканер эту информацию или нет. В более старых версиях программы эта информация могла не выводиться, и проверяющий не мог понять, действительно ли что-то поступило на драйвер и лишь не было им правильно интерпретировано, или данных и вовсе не было, и искать проблемы надо где-то еще. Сейчас если данные на драйвер поступают, то он их обязательно покажет в 1 и во 2 окнах. Третье окно "код" показывает полученный результат. Если драйвер не справляется с данными, то полученный результат будет либо пустым, либо неудовлетворительным, иначе мы увидим правильный код. К тому же на выдаваемый код могут вляить опции "гасить 13-й символ" и "гасить впереди стоящие нули", которые не влияют напрямую на работу драйвера, но испоьзуются им непосредственно и влияют на выдаваемый им результат. К слову, опция "гасить 13-й символ" считается нами сейчас устаревшей и даже неполезной, ибо часто приходится возвращать этот 13-й символ в отчетах, в файлах экспорта или при сравнении данных с внешними данными, такими, как реестры цен, к примеру. Он не несет информации, он по сути контрольный символ, вычисляемый по специальной формуле, и он используется сканером для проверки корректности полученного кода и может быть в любой момент рассчитан программой, конечно, однако практика показывает, что проще его принимать сразу. Опять же, к слову, имеются скрипты, позволяющие перевести базу из старого варианта, где все штрихкоды порезаны до 12 знаков, в новый, с восстановленным 13 знаком. Опция "гасить впереди стоящие символы" также устарела и используется крайне мало, обычно коды программируются так, чтобы ситуация с впереди стоящими нулями и необходимостью их гашения не возникала. Для этого в программе настраиваются специальные префиксы на разные типы штрихкодов (на штрихкоды для контрагентов и их личных карточек, на собственные штрихкоды для товаров, на штрихкоды для накладных, на активацию определенных событий, и так далее). Впереди же стоящие нули зачастую автоматически удаляются сканером при их считывании, что приводит к ошибкам и необходимости настройки такого сканера. В итоге проще работать со специальными префиксами на разные виды штрихкодов.

Для корректной работы сканера COM-порта: достаточно

а) указать тип сканера "COM-порт" , правильно установить номер COM-порта и скорость его работы. Увидеть их можно в свойствах компьютера, в разделе "Устройства". Бывает, когда скорость работы приходится вычислять опытным путем.

б) далее нужно указать символы окончания (суффиксы), которые выдает сканер по окончании передачи штрихкода. Обычно в сканерах запрограммированы символы #13#10, либо #13, либо #10. Их нужно указать, чтобы драйвер, во-первых, определял по ним, когда закончился ввод штрихкода, а во-вторых, удалял их из итоговой строки.

б1) Также сканер может вообще не выдавать суффикса, тогда драйвер определяет окончание ввода по таймауту, устанавливаемому в опциях программы. Таймаут указывается в миллисекундах, и когда он превышается, драйвер считает, что штрихкод закончился, и выдает его в программу. Считается интервал ввода между соседними символами, а не всего штрихкода, что позволяет настраивать сканер на работы с разными типами штрихкодов, подразумевающими разную их длину. Если таймаут не указывается (0), то обязательно должны присутствовать символы окончания, иначе драйвер не сможет понять, когда ввод штрихкода закончен, и штрихкод распознан не будет.

Можно указать и таймаут, и окончание, тогда драйвер задействует оба механизма. Если окончание не указать, а оно подается сканером, то драйвер посчитает, что это нужный символ, и выдаст штрихкод в программу вместе с окончанием, поэтому окончание всегда нужно указать, если оно есть. Если окончание указано, а сканер его не выдает, то это не будет ошибкой, драйвер сработает по таймауту, и никаких проблем при интерпретации сканера не будет.

Также можно указывать символы заголовка (префиксы), которые сканер может выдавать в начале штрихкода. Обычно для драйвера COM-порта они не программируются и никакой пользы не несут, ибо программа и так знает, что все, что поступило с COM-порта - это штрихкоды, но если-таки они все-таки присутствуют, то для того, чтобы драйвер их удалял из результата, нужно их указать в настройках.

Настройки режима клавиатуры:

Сложность в режиме клавиатуры для драйвера в том, что ему нужно из общего потока символов выбрать то, что является штрихкодом, и выдать его в программу как штрихкод, а остальное - "пустить" дальше, чтобы клавиатура работала корректно в программе. Драйвер в таком режиме можно и вообще не настраивать, и работа будет возможна, хоть и с большими органичениями. Например, для того, чтобы получить штрихкод, нужно будет поставить курсор в специальное, предназначенное для штрихкода поле, иначе, если, например, мы стоим в поле "цена" или "количество", то сканер вобьет туда штрихкод, последствия непредсказуемы как для программы, так и для оператора. Для того, чтобы программа "ловила контекст" и обрабатывала штрихкод именно так, как это задумано программистами (то есть нами), надо настаивать драйвер. В более старых версиях наших программ для того, чтобы драйвер смог распознать символы, вводимые со сканера, нужно было программировать префиксы, то есть заставить сканер выдавать один-два символа перед штрихкодом. Выбирались при этом символы, которые маловероятно, что введут руками, например ) и (, то есть сканер выдает что-то вроде ")(8690506436063", а в конце еще #13 или #13#10. Драйвер, видя символы )(, принимал все остальные знаки до тех пор, пока не получал символы окончания, которые также требовалось указывать в настройках. Если полученные символы не удовлетворяли драйвер, то он просто выкидывал их обратно в стандартный ввод, посчитав, что это не штрихкод. Таким образом работа без префиксов и суффиксов была невозможна. Все, что требуется для настройки клавиатурного штрихкода сейчас - это установить таймаут. Таймаут должен быть как можно меньше, тогда задержка в отклике программы на ввод данных с клавиатурным будет минимальной. Практика показывает, что драйвер корректно работает на величинах от 20 мс. Вполне безопасно можно использовать 50мс. По-умолчанию программа устанавливает 100мс. Префиксы и суффиксы не обязательны, однако они могут упростить работу драйвера, сделав его логику более точной, исключая любые логические ошибки.

Как происходит алгоритм обработки штрихкодов:

Если сканер не запрограммирован на префиксы, но имеет суффикс, например 13-10, либо 13, либо 10, то устанавливаем суффиксы и таймаут, 20-100мс. Драйвер начинает воспринимать любой символ с клавиатуры как начало штрихкода, и будет так думать, пока интервалы между вводимыми символами не превышают этот таймаут. Когда встретится символ окончания (либо, если символов два, как в случае 13-10, то оба символа в правильном порядке), то сканер оформляет введенный код как штрихкод, удаляет из него суффиксы, выдает его программе. Если сканер не дождался символов окончания, то либо если их достаточно много, чтобы считать их штрихкодом, то он оформляет штрихкод, иначе выплевывает в стандартный ввод обратно все захваченные символы. Тут оператор будет видеть задержку реакции программы на клавиатуру, равную таймауту. Именно поэтому важно, чтобы таймаут был как можно меньше, но слишком маленький таймаут может вызывать ошибки при чтении штрихкода: программа начнет выдавать его по частям: вместо одного 13-Значного получим два более мелких. Если вообще не указывать таймаут, то драйвер все равно вернет полученные данные, но с задержкой 2сек, что, конечно, будет корректно, но неприемлемо при нормальной работе, поэтому таймаут в клавиатурном режиме устанавливать очень желательно.

Если же сканер запрограммирован на префиксы и имеет устанавливаемый обычно по-умолчанию суффикс 13 (либо 13-10), то, настраивая эти опции в драйвере, можно обходиться вообще без таймаута, либо ставить его достаточно большим. Драйвер в этом случае ждет символа префикса и начинает работу только с него, и никаких задержек ввода с клавиатуры из-за драйвера не происходит. А если начался прием штрихкода, то драйвер будет принимать их до получения символа окончания. Если при этом-таки таймаут установлен, то он будет проводить дополнительную работу, что никак не помешает, но устанавливать его слишком маленьким не стоит, во избежание сбоев.

Таким образом теперь мы можем подкючать сканеры без какого-либо их перепрограммирования, все это будет корректно обрабатываться. Ключевым параметром в настройках является таймаут, а префиксы и суффиксы являются лишь необязательным дополнением в работе.

Указывать префиксы и суффиксы теперь требуется в программе лишь тогда, когда они уже запрограммированы в сканерах (обычно суффиксы там указаны по-умолчанию, это символы перевода каретки и окончания строки, либо один 13, либо один 10, либо оба, в паре, 13 и 10), чтобы драйвер смог удалить их из результата. Таймаут можно использовать по-умолчанию 100мс, но если наблюдается задержка реакции программы на ввод данных с клавиатуры, то можно его уменьшать до тех пор, пока драйвер корректно считывает данные со сканера. Можно программировать в режиме клавиатурного сканера префиксы, тогда логика упрощается, короткие таймауты не нужны, а задержек ввода с клавиатуры не будет, только в случае с вводом непосредственно символа префикса.