|
Работа с последовательным (COM, RS-232) портом из 1С:Предприятие 7.7 и 8.0
Последовательный
порт на практике служит для подключения к компьютеру считывателей
штрих-кодов, электронных весов, а также другого внешнего оборудования.
Статья описывает работу с последовательным портом в 1С:Предприятие 7.7 и
8.0. Приведен пример исходного кода внешней компоненты (Delphi 6),
которая заменяет типовую компоненту scanopos.dll, и умеет работать с
двумя или более сканерами. |
| Автор статьи: romix | Редакторы: Волшебник, Vovan58 Последняя редакция №14 от 06.02.07 |
|
|
Ключевые
слова: последовательный порт, COM, RS232, четность, кабель, сканер,
RS-232, асинхронный, USB, ОбработкаВнешнегоСобытия, внешняя компонента,
Delphi, scanopos.dll, TThread, торговое оборудование, связь
Интерфейс
RS-232 был разработан в 1969 году рядом крупных промышленных корпораций
и опубликован Ассоциацией электронной промышленности США (Electronic
Industries Association — EIA). .
Приобретение правильного сканера
Меня очень часто спрашивают: почему не работает сканер штрихкодов в 1С.
Штрихкодовые сканеры различаются интерфейсом подключения. В
частности, сканеры USB могут имитировать клавиатуру (это проявляется
тем, что штрихкод считывается в блокноте), имитировать интерфейс RS-232
или работать по USB без имитации чего-либо. Все три варианта часто
различаются шнуром, который реализует тот или иной интерфейс.
Для 1С наименее всего подходят клавиатурные сканеры: считанный
штрихкод не попадет в процедуру ОбработкаВнешнегоСобытия. Поэтому, если
есть такая возможность, лучше заменить такой сканер на RS-232 или USB
(имитация RS-232). См. также раздел "Поддержка сканеров с клавиатурным
интерфейсом" в конце этой статьи. О подключения сканера штрих-кода
через COM-порт.
Существуют и более старые (не USB) варианты сканеров, которые подключаются "в разрыв клавиатуры".
Напишу еще раз: приобретения клавиатурных или имитирующих клавиатуру сканеров для работы в 1С следует избегать.
Эмуляция COM-порта при наличии USB-соединения
Имеется возможность представить порт USB "под именем" свободного
COM-порта, например, при помощи драйвера (FTDI), и работать с ним как с
новым COM-портом.
Стандартные установки последовательного порта
При экспериментах я устанавливал следующие (стандартные) настройки
порта: скорость 9600 бит/с, 1 стоповый бит, нет контроля четности, 8
бит/байт). Для своих опытов я использовал кабель для соединения портов
COM1 и COM2. Вы можете спаять такой кабель по схеме), или приобрести его
на рынке примерно за 70 рублей.
Чувствительность к "горячему" подключению
Следует отметить, что COM и LPT-порты чувствительны к "горячему"
подключению - соединяя включенные устройства, вы можете спалить порты
(или что-то еще). Поэтому перед подключением устройства я рекомендую
отключать их от сети питания, и только потом их выполнять их
электрическое соединение.
USB этим недостатком не страдает, и дозволяет "горячее" подключение устройств.
Посылка тестовых данных в COM-порт
Имея тестовый кабель, вы уже можете экспериментировать с внешними компонентами для 1С:Предприятие.
Посылку тестовых данных в порт я производил из пакетного (.BAT) файла MS-DOS. Содержимое моего файла test.bat:
mode com2 baud=9600 parity=n data=8 stop=1
type c:\test.txt >com2
В файле c:\test.txt введите несколько символов (например,
1234567890) и завершите - обязательно! - их символом перевода строки
(нажатием Enter).
Программа, подключенная к другому концу кабеля, может быть тестовой
программой TestComPort.exe (скачайте комплект, приведенный в конце
статьи; в программе надо выбрать порт - в данном случае COM1, нажать
Открыть, и уже можно посылать в нее символы при помощи BAT-файла, в
большом окне вы увидите принятые текстовые строки), конфигурацией для
1С:Предприятие, приложенной в этом же архиве, или стандартной
конфигурацией наподобие "1С:Торговля и Склад", где активизирована работа
со сканером, подключенным в последовательный порт (внешняя компонента
scanopos.dll).
Получение внешнего события в 1С:Предприятие
Внешнее событие, например, со сканера, с другого внешнего
оборудования, или просто сгенерированное программно, приходит в 1С (как
7.7, так и 8.0) в предопределенную процедуру
ОбработкаВнешнегоСобытия().
///////////////////////////////////////////////////////////////////////
Процедура ОбработкаВнешнегоСобытия(Источник,Событие,Данные)//Предопределенная процедура 1С
//Глобальный обработчик внешнего события
Сообщить("Внешнее событие: Источник="+Источник+" Событие="+Событие+"
Данные="+Данные);
КонецПроцедуры
Эта процедура может располагаться в глобальном модуле или модуле
формы 1С:Предприятие 7.7 или 8.0. Процедура принимает три входящих
параметра: Источник, Событие и Данные. Это три текстовые строки, которые
могут принимать произвольные значения - в качестве Источника можно
установить имя внешней компоненты, в качестве события -
строку-идентификатор события, например, "BarCodeValue", а в качестве
данных - данные от устройства, например, считанный штрихкод.
Инициализация внешней компоненты
Код процедуры ПриНачалеРаботыСистемы() в тестовой конфигурации выглядит следующим образом:
///////////////////////////////////////////////////////////////////////
Процедура ПриНачалеРаботыСистемы() //Предопределенная процедура 1С
ок=1;
Если глЗагрузитьВнешнююКомпоненту("vk_rs232")=0 Тогда
Сообщить("Внешняя компонента не была загружена!","!");
Иначе
rs232=СоздатьОбъект("AddIn.vk_rs232");
КонецЕсли;
ИмяПорта=""+Константа.ComPort;
Сообщить("Константа.ComPort: "+ИмяПорта);
Сообщить("При считывании кода, который завершается символами #13#10, здесь должны
появляться считанные строки.");
//Начинаем слушать порт
rs232.ОткрытьПорт(ИмяПорта);
КонецПроцедуры
Первый запуск конфигурации необходимо производить под правами
администратора или привилегированного пользователя Windows. Это
необходимо для любых внешних компонент или OLE-объектов, чтобы
компонента (DLL) могла "прописать" себя в системный реестр Windows.
Пример работы с COM-портом
Рассмотренные ниже примеры работы с последовательным (COM-) портом
будут использовать средства Windows API (системные функции CreateFile и
т.д.). Для компиляции примеров потребуется Delphi версии 6 (впрочем, вы
легко сможете переделать примеры под любой язык программирования,
который поддерживает вызовы Windows API).
В конце статьи приведена ссылка, по которой вы можете скачать
работающие примеры кода внешней компоненты (vk_rs232.dll) и упрощенного
тестового примера (TestComPort.exe, который содержит 120 строк тестового
кода). Рассмотренная в качестве примера внешняя компонента для
1С:Предприятие
умеет читать текстовые строки из последовательного порта, и
представлять их как событие считывания штрихкода "BarCodeValue". Поэтому
компоненту можно без изменений использовать, например, в конфигурации
"Торговля и Склад" в качестве замены для штатной компоненты для
считывания штрихкодов. Также компонента умеет записывать "встречные"
данные в последовательный порт, если это необходимо для работы с
устройствами (для сканеров штрих-кодов это не нужно).
Пример расчитан на передачу в устройство или из устройства текстовых
строк, разделенных символами 13,10, что характерно, например, для
сканеров штрихкодов. Я использую фиксированные настройки (скорость -
9600, один стоп-бит, без бита четности, 8 бит в одном байте), а также
фиксированные настройки таймаута (чтение "отваливается" через
относительно короткий промежуток времени, чтобы избежать зависания). Вы
можете переделать эти умолчания под ваше оборудование и требования к
программному обеспечению.
Настройка сканера
Вы можете настроить сканер на те или иные завершающие коды (#13#10 и
другие), а также изменить его настройки при помощи установочных
штрихкодов, которые обычно поставляются в комплекте устройства.
Общая идеология работы с RS-232 в системе Windows
В MS-DOS (и ранних версиях Windows, включая 95 и 98), работа с
последовательными портами часто производилась напрямую через порты
ввода-вывода командами Ассемблера IN и OUT. Этот способ не поддерживают
современные операционные системы, начиная с Windows NT. В них остается
(надо сказать, довольно древняя) возможность работы с этими портами как с
файлами.
Например, достаточно открыть файл с именем "COM1", чтобы можно было
писать в него данные для внешнего устройства, и читать из него данные от
этого устройства (входной и выходной поток данных не пересекаются).
hCom:=CreateFile("COM2", ... );
ok:=WriteFile( //uses Windows
hCom, //Файл
Buff[1], //Буфер откуда пишем
nBytes, //Число байтов для считывания
wr_cnt, //Число записанных байтов
nil
);
ok:=ReadFile( //uses Windows
hCom, //Файл
Buff, //Буфер куда считываем
100, //Число байтов для считывания
rd_cnt, //Число считанных байтов
nil
);
CloseHandle(hCom);
Настройки параметров и таймаутов COM-порта производятся при помощи
функций SetCommState и SetCommTimeOuts соответственно. Ссылка на
работающий пример кода, который показывает эту идею более развернуто,
приведена в конце статьи.
Конечно, есть возможность работать с COM-портом и "более простыми
средствами" - вплоть до открытия файла с именем "COM2", записи строк в
этот файл и чтения встречных данных от устройства из этого же файла.
Внешняя компонента, по сравнению с этим "простым" решением,
добавляет возможность генерировать события считывания данных (например,
штрихкодов со сканера) в асинхронном режиме, когда 1С не "замирает" до
очередного считывания штрихкода, и не "крутится" в бесконечном цикле
чтения, а получает внешние события, и реагирует на них в
предопределенной процедуре ОбработкаВнешнегоСобытия(). Это удобно для
пользователя, и не заставляет его нажимать на клавиатуре лишние клавиши
перед считыванием штрихкода.
MSDN
В качестве официальной справки по различным функциям Windows
используйте MSDN, который можно приобрести на DVD или на 3-х CD. В
качестве "источника и составной части" он входит в комплект средств
разработки от Microsoft, или приобретается отдельно. Кроме того, MSDN
выложен в интернете, и как правило, находится в первых строках запросов в
поисковике Google по контрастному запросу наподобие "SetCommState".
Поддержка двух или более сканеров (08.03.2006)
Компонента теперь использует потоки (объект TThread) вместо таймера.
Компонента содержит тестовый пример для работы с двумя объектами
(например, двумя сканерами).
Настройка конца строки (12.07.2006)
Компонента понимает свойство КонецСтроки (в англоязычном написании - EOL).
По умолчанию - Симв(13)+Симв(10) в качестве последовательности, которая отделяет один штрихкод от другого.
Поддержка сканеров с клавиатурным интерфейсом (20.09.2006)
Компонента поддерживает перехват событий клавиатуры.
rs232.ПерехватКлавиатуры(1);
Это позволяет использовать сканеры с клавиатурным интерфейсом.
Однако, нажатия на клавиши не подавляются. Строка очищается при каждой
паузе между нажатиями на клавиши длительностью более 1 секунды. Событие
генерируется по нажатию на клавишу Enter.
(есть другой способ подключения сканера штрих-кода в разрыв клавиатуры.
Глубина буфера событий
Компонента позволяет выставить глубину буфера событий (свойство ГлубинаБуфераСобытий).
Это значит, что если компьютер занят рассчетами, а в это время
приходят новые события, то они будут накапливаться только в пределах
этого буфера (последующие события будут потеряны).
iEvent := nil;
pConnection.QueryInterface(IID_IAsyncEvent,iEvent);
iEvent.SetEventBufferDepth(300); //глубина буфера событий
Заключение
Мы рассмотрели работу с последовательным портом RS-232 из
1С:Предприятие. Различие между версиями 1С:Предприятие 7.7 и 8.0 в
данном случае несущественно - внешние компоненты совместимы и могут
использоваться в обеих версиях системы. Вы можете посылать данные в порт
или считывать их из порта, чтобы управлять внешним устройством или
принимать данные от него по протоколу RS-232. При помощи тестового
кабеля, который соединяет два COM-порта, вы можете имитировать работу с
оборудованием, даже не имея самого устройства в наличии.
|
21.02.18 | 10:31
|
|
30.11.16 | 20:25
|
|
28.11.16 | 09:22
|
|
26.11.16 | 08:19
|
|
22.11.16 | 20:17
|
|
19.11.16 | 10:14
|
|
18.11.16 | 20:09
|
|
|