PDA

Просмотр полной версии : Постоянный прием данных с клавиатуры. Работа с USB сканером-штрих кода.



Pijone
01.12.2019, 13:39
Доброго времени суток.
Есть USB сканер штрих кодов, по сути подключается как клавиатура (USB HID) присылает считанный штрих-код код и ввод (Enter).
Как с него можно нормально получать и обрабатывать данные? (работает только в таком режиме)

Сейчас на верхнем уровне создал текстовое поле/невидимый ввод, настроил "конфигурацию ввода" на OnMouseClick.
Но после ввода символов+Enter поле становится неактивным и для следующего ввода (как и для первого) на области необходимо клацнуть "мышью".
Сейчас аппаратно клацая мышью, подпаялся к кнопке и клацаю выходом (релейным). Программного решения не нашел.
Пробовал использовать горячие клавиши (тоже аппаратно нажимать), но в эмуляции все работает, а вот в реальности на ПЛК107 [М01] клавиша срабатывает только один раз (вызывая поле ввода), пока не поймает активность мыши/тача.(рабочие горячие клавиши мне бы немного упростили жизнь, но аппаратно эмулировать клаву не сильно далеко ушло эмуляции мыши)
Само собой мне не обязательно получать данные через верхний уровень, если это возможно. Задача получить данные любым путем и обработать.


45888

45889

Pijone
01.12.2019, 13:56
Данные СПК + софт

45890

45891

45892

45893

Евгений Кислов
02.12.2019, 09:27
Добрый день.
Опишите, пожалуйста, наиболее удобный на ваш взгляд способ использования данного функционала (с точки зрения оператора и с точки зрения обработки данных).

Pijone
03.12.2019, 08:36
Для работы с простыми USB сканерами штрих-кода было бы удобно работать с функцией/фб которая возвращает буфер клавиатуры после вода конца строки (Enter) ввиде строки, работая при активном бите и так же указывает(возвращает) битом (один цикл) о получении данных(ввода конца строки) что бы отдельно не сравнивать строки / проверять изменение штрих-кодов.

Что-то наподобие:

Евгений Кислов
03.12.2019, 10:24
Мы подумаем о реализации подобного функционала.
Сейчас простых вариантов lдля решения данной задачи нет.
У сканера нет интерфейса RS-232?

Pijone
04.12.2019, 10:11
RS-232 нет. Он из новых, RS-232 в нем реализуется через драйвер под Win (для приложений написанных для работы с RS-232), они почти всегда в наличии и недорогие (±300$).
В данном случаи это Zebex Z-5652 Plus и что у него USB узнали только достав из коробки (а RS-232 оказывается только через виндовый драйвер), притом что производитель позиционировал его как для пром. применения.
Для недорогих систем такие штуки интересны ценой, для примерного понимания приложил скрин (склад германия, каталог староват), но у симёна цена конечно завышена и не лучшая в своем классе.

Скажите я могу как получить состояние строки ввода? Для понимания в программе активно сейчас поле для ввода или нет, сейчас клацаю можно сказать в слепую и если поле не активно то само собой не получаю штрих код. Благо панель по сути автономна от оператора, но если в холостую кто то клацнет где не нужно, ввод уйдет, так как не нашел реализации обратной связи от поля ввода.

melky
04.12.2019, 11:01
Устройство HID, а в Windows драйвер, реализующий COM порт на это устройство ?

Pijone
04.12.2019, 14:05
Устройство HID, а в Windows драйвер, реализующий COM порт на это устройство ?
Да, драйвер поднимает виртуальный COM порт. В каком виде этот виртуальный порт дает данные не знаю, проверить не могу, оборудование уже стоит.

Евгений Кислов
04.12.2019, 15:17
Скажите я могу как получить состояние строки ввода? Для понимания в программе активно сейчас поле для ввода или нет

Попробуйте использовать элемент Текстовое поле - у него есть параметр Позиция каретки.
Если он = 0, то поле ввода неактивно, при любых других значениях - активно.
Значением параметра надо управлять из кода программы.

Pijone
05.12.2019, 05:45
Попробуйте использовать элемент Текстовое поле - у него есть параметр Позиция каретки.
Если он = 0, то поле ввода неактивно, при любых других значениях - активно.
Значением параметра надо управлять из кода программы.

Параметр нашел, но не знаю как правильно с него забирать данные. В описании сказано что переменная доступна для записи и чтения.
К сожалению не знаю как с этим работать, как как получать от нее данный (как из передавать, как обозначить переменную(обращение)) положения каретки?
Если это через редактор интерфейсов... не знаю как с ним правильно работать, как переменную потом в программе забирать.

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

Евгений Кислов
05.12.2019, 06:29
Если просто вбиваю в поле обращение к INT в программе или к глобальной переменной, то значение при запуски эмуляции и манипуляциях с полем ввода неизменен.

Переменная используется для управления активностью ввода для элемента - и она блокирует управление элементом с экрана.
Когда нужно "активировать" ввод (чтобы появился мигающий курсор) - записываете в переменную значение 1.
Когда нужно "завершить" ввод (проэмулировать нажатие на Enter) - записываете 0.

Это как раз должно решить проблему с


Сейчас аппаратно клацая мышью, подпаялся к кнопке и клацаю выходом (релейным). Программного решения не нашел.

Pijone
05.12.2019, 13:34
Нужно попробовать. В принципе мышка на практике не всегда подхватывается панелью (при перезагрузке).
Но проблема понимания активно ли поле остаётся. У меня нету датчика или какого либо условия которое укажет что скоро будет считывание, что бы делать активным поле перед считыванием. После активации с поля легко "уйти" (сделать его не активных) клацнув в любую часть панели. Указатели на положение мышки (OnMouseLeave и подобные) не спасают на практике, пробовал по разному (у меня еще нумпад вызывается для ручного ввода штрих-кода или работает один раз или спорит с диалоговым окном цифрового ввода или все вместе).

Но я сейчас попробую что было описано, как минимум если что можно отказаться от мышки.
А если поле после активацией 1-й (как понимаю INT) пропадет, я могу каким либо образом назад ноль получить, признак что поле в данный момент времени неактивно?

Евгений Кислов
05.12.2019, 13:36
А если поле после активацией 1-й (как понимаю INT) пропадет, я могу каким либо образом назад ноль получить, признак что поле в данный момент времени неактивно?

На мой взгляд - если поле активировано через переменную, то сделать его неактивным можно только с помощью переменной.
Соответственно, оно не может стать неактивным само по себе.

Pijone
08.12.2019, 13:42
http://www.youtube.com/watch?v=txEZ163bXJo

Евгений Кислов
09.12.2019, 10:45
Спасибо за подробное объяснение задачи.
К сожалению, я не вижу вариантов, как программно определить, активен ли ввод в Текстовом поле.
Мы уточним у разработчиков CODESYS, нет ли каких-то вариантов для решения подобной задачи.

Евгений Кислов
11.12.2019, 10:32
3S предоставили информацию, которая помогла решить описанную задачу.
Прикладываю пример.

46116

Архив проекта: https://dropmefiles.com/46UjT

Pijone
13.12.2019, 07:51
Евгений Кислов, спасибо. Сегодня скачаю попробую в живую.

Pijone
13.12.2019, 23:38
В живую попробовал, работает (не только с текстовым полем)
Спрашивали 3S по поводу получения данных прямо с клавиатуры (USB HID)? Может чего обещали по поводу реализации?

Евгений Кислов
14.12.2019, 10:55
Каких-то планов по разработке блоков для работы с USB сканнерами - у 3S нет (по крайней мере, на следующий год).
Некоторые производители сами разрабатывают соответствующие библиотеки.
Я добавил ваше пожелание в список возможных задач для одной из следующих прошивок СПК.

Boris_R
24.03.2020, 07:04
Коллеги, доброе утро!
А можно ли как-то программно активировать поле для ввода со сканера?

Евгений Кислов
24.03.2020, 07:55
Коллеги, доброе утро!
А можно ли как-то программно активировать поле для ввода со сканера?

Добрый день.
Насколько я знаю, такой возможности нет.

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

Boris_R
24.03.2020, 18:29
Попробуйте использовать элемент Текстовое поле - у него есть параметр Позиция каретки.
Если он = 0, то поле ввода неактивно, при любых других значениях - активно.
Значением параметра надо управлять из кода программы.

Попробовал этот вариант с тем примером, что тут выложен.
При записи 1 в поле появляется курсор, но на сканирование поле не реагирует. Надо именно навести курсор и щелкнуть по полю на экране или мышью. Только после этого туда принимается информация со сканера.

И если в примере для включения "индикатора активности" используется какой-то признак соседнего поля, то может и программно можно изобразить щелчок мыши по этому полю?