AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 24.07.2004, 15:02   #21  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Цитата:
2 Alks
Немного переформулирую вопрос:
Как подключить COM сервер в Axapta и использовать его source интерфейс?
Код обработчика события на X++ я не нашел.
Напиши ActiveX-прослойку между ахаптой и тем твоим COM-сервером. В Active-X сделай все необходимые события, внедри его в ахапту и в ActiveX-Explorer-е поставь на события обработчики.
Старый 19.08.2004, 09:23   #22  
Sirius is offline
Sirius
Участник
 
151 / 10 (1) +
Регистрация: 10.01.2004
Адрес: Новосибирск
Здравствуйте.

Скажите, а какую информацию посылает сканер штрих-кодов на COM-порт.
Это просто набор чисел, соответствующий коду, или есть какие-нибудь специальные стоп-флаги? Может кто знает что-нибудь по этому поводу ?

Я реализовал приведенную в этой теме схему (используя ActiveX), теперь хочу протестировать свою разработку, но сканера под рукой нет
Старый 19.08.2004, 09:45   #23  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
// глюки связи
Старый 19.08.2004, 09:50   #24  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Цитата:
Скажите, а какую информацию посылает сканер штрих-кодов на COM-порт.
Это зависит от модели сканнера штрих-кодов и от режима в котором он работает / как он запрограммирован. У каждого производителя свои форматы протоколов, какого то общего формата нет (да и существующие как правило не публикуются, если есть драйвера). Программе, работающей с штрих-сканнером интересна только информативная составляющая этого протокола - строчка символов, кодирующих штрих-код (обычно как он подписан на этикетке), опционально предваряемая символом(ами) кодирующим тип штрих-кода. Например A2000127090012

Цитата:
Я реализовал приведенную в этой теме схему (используя ActiveX), теперь хочу протестировать свою разработку, но сканера под рукой нет
какую именно схему? с call-back ф-ей из отдельного потока?
Старый 19.08.2004, 10:14   #25  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
На самом деле, любой сканер штрих-кода можно настроить. И префикс, и суффикс. И часть данные можно передавать. И еще много чего... Но стандарт - строчка символов (те, что обычно подписаны под штрих-кодом: вдруг сканер не возьмет и оператору придеться вводить его вручную) + CR (0x0D) (или LF+CR (0x0A 0x0D)) - тоже можно настроить.

с Уважением,
Георгий
Старый 19.08.2004, 10:34   #26  
Sirius is offline
Sirius
Участник
 
151 / 10 (1) +
Регистрация: 10.01.2004
Адрес: Новосибирск
Цитата:
какую именно схему? с call-back ф-ей из отдельного потока? [/B]
Вроде без всяких call-back функций сделал.

Взял ActiveX-компоненту (NetComm) вставил её на форму. Добавил обработчик события OnComm. В обработчике получаю данные с com-порта.

Пару слов о том как тестировал все это дело.

Взял прогу Virtual Serial Port Driver - это прога создает два виртуальных com-порта, соединенных нуль-модемом. Создал два порта COM2 и COM3. Написал на сях прогу, которая пишет что-то в COM2. Из Аксапты обрабатываю то, что приходит на COM3. Вроде все работает нормально. Что посылаю на COM2 то и получаю с COM3.

Цитата:
На самом деле, любой сканер штрих-кода можно настроить. И префикс, и суффикс. И часть данные можно передавать. И еще много чего... Но стандарт - строчка символов (те, что обычно подписаны под штрих-кодом: вдруг сканер не возьмет и оператору придеться вводить его вручную) + CR (0x0D) (или LF+CR (0x0A 0x0D)) - тоже можно настроить.

с Уважением,
Георгий
Спасибо.
Старый 20.08.2004, 08:07   #27  
Sirius is offline
Sirius
Участник
 
151 / 10 (1) +
Регистрация: 10.01.2004
Адрес: Новосибирск
у меня вот еще вопрос какой возник.

я вообще первый раз столкнулся с программированием com-порта.
и так сказать опытным путем вроде вычислил способ извлечения полученных данных.

при получении информации на com-порт ActiveX-компонента NetComm (кстати, как я понял - она полный аналог MSComm) генерирует события в следующем порядке:

comEvDSR (изменение в Data Set Ready. DSR=true)

потом одно или несколько событий:

comEvReceive (здесь все также DSR=true)

а после них опять:

comEvDSR (DSR=false).

Так вот, во время первого события comEvDSR и при каждом comEvReceive, я считываю данные, которые находятся в буфере приемки ActiveX'а. После того, как отловлено второе событие comEvDSR считываение данных заканчиваю, и то, что собрал в предыдущих событиях, объявляю результатом.

Вроде бы все работает нормально, но иногда проскакивает следующий глюк:

Обычно, когда срабатывает второе событие comEvDSR, буфер ActiveX с данными пуст. Но, иногда (я не могу понять закономерность) там оказываются данные... :-/

Вообщем, что я не правильно делаю? Может не учитываю какую-нибудь особенность?

PS. Если знаете где сколь-нибудь толково описано как работать с com-портом, дайте пожалуйста ссылочку.
Старый 20.08.2004, 09:17   #28  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Цитата:
Изначально опубликовано George Nordic
На самом деле, любой сканер штрих-кода можно настроить. И префикс, и суффикс. И часть данные можно передавать. И еще много чего... Но стандарт - строчка символов (те, что обычно подписаны под штрих-кодом: вдруг сканер не возьмет и оператору придеться вводить его вручную) + CR (0x0D) (или LF+CR (0x0A 0x0D)) - тоже можно настроить.

с Уважением,
Георгий
На самом деле это речь идет уже об информативной составляющей получаемых от штрих-сканнера данных. А вот протокол по которому эти данные передаются в копьютер почти наверняка изобилует дополнительными двоичными или текстовыми заголовками команд / терминаторами и т.п. Хороший сканнер обеспечивает достаточно сложную двусторонюю связь с компьютером - опрос состояния и т.п., следоательно передача собственно отсканированных данных как то отличается заголовком от передачи того же состояния. Пока с конкретной моделью не столкнёшся - предполагать что либо невозможно.
Это не так только для сканнеров, вставляемых в разьем клавиатуры - там данные передаются (по определению) as is.
Старый 20.08.2004, 09:29   #29  
Sirius is offline
Sirius
Участник
 
151 / 10 (1) +
Регистрация: 10.01.2004
Адрес: Новосибирск
Интересно, если протокол у разных сканеров отличается, тогда выходит что невозможно написать универсальное решение.

Тем не менее, например, АТОЛ предлагает универсальный драйвер для сканера штрих-кодов (и не только) (описание) Платный только к сожалению. Работает с аксаптой, события все отлавливает, только прочитанные данные не читает, говорит ключ вставьте
Старый 20.08.2004, 10:31   #30  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Цитата:
Изначально опубликовано Alks
А вот протокол по которому эти данные передаются в копьютер почти наверняка изобилует дополнительными двоичными или текстовыми заголовками команд / терминаторами и т.п.
Абсолютно неверно! Т.е., да, на физическом уровне, там есть +5V - +13V (1) / -5V- -13V (0)... передача по 7 или по 8 бит, + бит четности, 1 или 2 стоповых... Ве же не UART разрабатывете это физический уровень, он от вас инкапсулирован... Единственное, что Вам приходеться сделать - это выставить (желательно, одинаковые ) параметра у откраваемого СОМ-порта и у сканера.. обычно -9600 -8-N-1. Сканер штих-кода - довольно "тупая" машинка, у него может быть всего 2 выхода: Tx / GND.. т.е. ему совершенно по фигу, дошли данные до компа или нет, верны они или нет.. Попробуйте не втыкать его в сом-порт - думаете, он вам пропищит, что данные не дошли?

С Уважением,
Георгий
Старый 20.08.2004, 11:48   #31  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Цитата:
Изначально опубликовано George Nordic
Абсолютно неверно!
Если бы это абсолютно неверно, то почему OPOS-драйвер сканнера Symbol LS2208 не может с ним "общаться", если параметр сканнера HOST TYPE не находится в режиме OPOS/JPOS, а например в режиме NORMAL? Единственный ответ - разные протоколы общения.
Нет буду спорить с тем что скорее всего один из этих протоколов "вырожден" в простое посылание сканнером отсканированных штрих-кодов AS IS с каким нибудь символом-разделителем, но меня такой вариант не привлекает хотя бы, потому что:

Цитата:
Попробуйте не втыкать его в сом-порт - думаете, он вам пропищит, что данные не дошли?
LS2208 пищит даже если воткнут в ком-порт, но его данные примерно 10 секунд никто не принял на том конце. (видимо ждет респонза-подтверждения от хоста, что данные успешно приняты). Один из хинтов этого сканнера заключается в том что он отключается после сканирования, до тех пор пока хост не пришлет команду о том что успешно обработал данные - тогда можно снова сканировать. Кроме того хост может отключить и включить сканнер "насильно". Такая система уже требует какого-никакого, но протокола общения / опроса статуса и т.п.
для справки: LS2208 поддерживает следующие виды протоколов общения с хостом:
STANDAD RS-232
ICL RS-232
NIXDORF RS-232 MODE A
NIXDORF RS-232 MODE B
FUJITSU RS-232
OPOS/JPOS
Старый 20.08.2004, 12:17   #32  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Вот ради любопытства потестил этот самый LS2208 в некоторых режимах:

NORMAL:
просто посылает штрих-код AS IS не без постфиксов и префиксов (т.е. настраиваем их вручную)
ICL:
непосредственно после сканирования ничего не посылает в ком-порт, ждет 10 секунд и не дождавшись подтверждения (т.к. я не знаю чем подтверждать ) недовольно пищит и сбрасывается
NIXDORF MODE A:
предваряет сосканированное префиксом штрих-кода и дополняет сзади переводом строки
NIXDORF MODE B:
после сканирования ничего не послал в ком-порт и... отключился навечно, в бесконечном цикле ожидая какой то команды от хоста. пришлось перегрузить сканер
FUJITSU:
выводит штрих-код AS IS дополняя сзади переводом строки
OPOS/JPOS:
в общем действует как NORMAL, но после сканирования отключается как NIXDORF MODE B
Старый 20.08.2004, 12:51   #33  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Ну, батенька, на то он и Symbol! Конечно, сканер за несколько сотен баксов будет пищать (хотя попробуйте настроить его на Rs-232) - он поведет себя как обычный сканер... (за 40 баков)

Остальные "протоколы" - это типы кассовых терминалов, к которому они цепляются...

Да, согласен, бывают сканера, что ждут DSR или типа того... бывает, матери ASUS вешались после включения сканера, т.к. у них на 9 ноге был высокий уровень.. я еще очень много примеров привести могу Но, чаще всего, это тоже программно отключается. Иначе бы тот же Symbol не смог бы работать с обычной терминалкой - все ждал бы какого-нибудь таинственного ответа

Удачи!
Георгий.
Старый 20.08.2004, 13:03   #34  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
George, самое интересное что я перестал понимать о чём именно мы с вами спорим. Ведь говорим на самом деле одно и то же с самого начала. Мои изначальные слова "Это зависит от модели сканнера штрих-кодов и от режима в котором он работает / как он запрограммирован. ". Может быть я погорячился сказав что общего формата не существует - но опять же не факт что всё множество произведенных сканнеров в мире все умеют работать в том же "NORMAL" режиме.
Старый 20.08.2004, 13:20   #35  
George Nordic is offline
George Nordic
Модератор
Аватар для George Nordic
Злыдни
 
4,479 / 1250 (50) ++++++++
Регистрация: 17.12.2003
Адрес: Moscow
Записей в блоге: 9
Согласен! Хотя, по идее, должны
Что-то мы, действительно, увлеклись спором, хотя согласны практически во всем Я аж изначальную тему забыл

Да, Alks, а не подилитесь ли кодиком, как Вам удалось подключить сканер к Axapte? На будущее, для следующих так сказать поколений

С Уважением,
Георгий.
Старый 20.08.2004, 13:39   #36  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Цитата:
Изначально опубликовано George Nordic
Согласен! Хотя, по идее, должны
Что-то мы, действительно, увлеклись спором, хотя согласны практически во всем Я аж изначальную тему забыл

Да, Alks, а не подилитесь ли кодиком, как Вам удалось подключить сканер к Axapte? На будущее, для следующих так сказать поколений

С Уважением,
Георгий.
Использован принцип "опроса по таймеру". Каждую секунду у COM-объекта (OPOS-драйвер от Symbol) опрашивается свойство того есть ли в нём новые данные и если есть, то у последней активированной формы ищется метод ActivateBarcode( str BarcodeStr ) и если таковая есть - запускается. Для реализации модификации пришлось "грязными сапогами" залезть в класс Application:


PHP код:
class Application extends xApplication
{
   ...
    
// aa_dav
    
BarcodeScanner BarcodeScanner;

Изменен метод startupPost:

PHP код:
void startupPost()
{
    
WorkplaceParameters WorkplaceParameters// aa_dav
    
...
    
// aa_dav
    
WorkplaceParameters WorkplaceParameters::findOrCreate();
    
BarcodeScanner = new BarcodeScannerWorkplaceParameters );
    ...
    
this.setTimeOut"AppTimeOut"1000 );

Лирическое отступление - таблица WorkplaceParameters это еще одна наша модификация, привязывающая какие либо настройки не к имени пользователя, а к рабочему месту (а именно - имени компьютера на котором запущено приложение). Здесь из неё берется галочка "сканнер штрих-кодов подключен" и на этом её роль ограничивается, поэтому не описываю.

метод setTimeOut() активирует периодический запуск еще одного нового метода в Application:

PHP код:
void AppTimeout()
{
    ;
    
this.setTimeOut"AppTimeOut"1000 );
    
BarcodeScanner.checkDevice();

Теперь собственно всё внимание концентрируется на классе BarcodeScanner, который кстати обязательно должен иметь св-во RunOn установленным в On Client:

PHP код:
public class BarcodeScanner
{
    
COM oposScanner;
}

void new( WorkplaceParameters WorkplaceParameters )
{
    
int regKey;
    
#WinAPI
    
;
    
oposScanner null;
    if ( 
WorkplaceParameters.BarcodeScannerExists == NoYes::Yes )
    {
        try
        {
            
regKey WinAPI::regOpenKey#HKEY_CLASSES_ROOT,
                                
"AxaptaOposScannerLib.AxaptaOposScanner"#KEY_READ );
            
if ( regKey )
            {
                
oposScanner = new COM"AxaptaOposScannerLib.AxaptaOposScanner" );
                
oposScanner.Open();
                if ( 
oposScanner.ErrorMsg() != "" )
                {
                    print( 
"Ошибка инициализации сканнера штрих-кодов: " oposScanner.ErrorMsg() );
                }
                
// Release registry resource
                
WinAPI::closeRegistryregKey );
            }
            else
            {
                print( 
"Не зарегистрирован COM-объект сканнера штрих-кодов!" );
            }
        }
        catch
        {
            
// Ignore errors
            
oposScanner null;
        }
    }
}

void checkDevice()
{
    
//FormRun form;
    
Object o;
    
ObjectIdent oi;
    
DictClass dictClass;
    
TreeNode tnrtn;
    
TreeNodeIterator it;
    
xInfo xInfo = new xInfo();
    
int i;
    ;
    if ( 
oposScanner != null )
    {
        if ( 
oposScanner.DeviceEnabled() == false )
        {
            
// Reactivate scanner
            
oposScanner.DeviceEnabledtrue );
            
oposScanner.DataEventEnabledtrue );
            
// Proceed with attention...
            
oi infolog.parmLastActivatedForm();
            if ( 
oi )
            {
                
oi.object();
                if ( 
)
                {
                    
//dictClass = new dictClass( classidget( o ) );
                    //if ( dictClass.name() == "SysSetupFormRun" )
                    //{
                        
tn o.form();
                        
rtn xInfo.findNode"\\Forms\\" );
                        
rtn rtn.AOTfindChildtn.AOTname() );
                        
tn rtn;
                        if ( 
tn )
                        {
                            
tn tn.AOTfindChild"Methods" );
                            if ( 
tn )
                            {
                                
tn tn.AOTfindChild"ActivateBarcode" );
                                if ( 
tn )
                                {
                                    try
                                    {
                                        
o.ActivateBarcoderemoveLRSpacesoposScanner.ScanData() ) );
                                    }
                                    catch
                                    { }
                                }
                            }
                        }
                    
//}
                
}
            }
        }
    }

Замечу что в методе new возня с реестром проводится исключительно для того чтобы предупредить надоедливую ошибку при некорректном удалении OPOS-драйвера.
WorkplaceParameters.BarcodeScannerExists == NoYes::Yes думаю очевидно в свете вышесказанного.

В методе checkDevice пользуюсь тем свойством LS2208 сканнера что он отключается после успешного сканирования - по этому признаку извлекаю новые данные и реактивирую сканнер. Далее по замечательному совету полученному из этого форума использую infolog.parmLastActivatedForm() для получения последней активированной формы и через TreeNode ищу есть ли у неё метод ActivateBarcode, который и вызываю.
Ф-я removeLRSpaces описана мной в одном топике здесь - удаляет пробелы слева и справа на всякий случай.
Старый 20.08.2004, 13:52   #37  
Sirius is offline
Sirius
Участник
 
151 / 10 (1) +
Регистрация: 10.01.2004
Адрес: Новосибирск
Хм.. интересная реализация.

А чем плох принцип помещения на форму, где необходим сканер, соответствующего ActiveX'а ?
Старый 20.08.2004, 13:55   #38  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Ах да, забыл - я не обращаюсь непосредственно к OPOS-драйверу (хотя по идее должен мочь!), а написал на Delphi прослойку между ним и аксаптой в виде еще одного COM-объекта "AxaptaOposScannerLib.AxaptaOposScanner". Дело в том что при попытке обратится к методам OPOS-драйвера из самой аксапты вылезала непонятная совершенно ошибка, которая исчезла когда я "обернул" его в свой COM-объект (причём не сразу!). Впрочем это несущественно.
Старый 20.08.2004, 14:02   #39  
Alks is offline
Alks
Участник
 
336 / 41 (2) +++
Регистрация: 23.07.2004
Адрес: г. Новокузнецк
Цитата:
Изначально опубликовано Sirius
Хм.. интересная реализация.

А чем плох принцип помещения на форму, где необходим сканер, соответствующего ActiveX'а ?
Тут есть 2 плюса:
1. Обработка событий от сканнера осуществляется ЦЕНТРАЛИЗОВАННО из одного места через класс Application в связке BarcodeScanner.
2. Данные от сканнера поступают на последнюю открытую форму.

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

Возможно реально создать ActiveX тоже глобальным экземпляром, не помещая его на конкретные формы? Если да, то такой вариант преимущественнее, но я лично не знаю можно ли динамически в рантайме связать его event-ы с кодом на X++.
Старый 20.08.2004, 14:14   #40  
Sirius is offline
Sirius
Участник
 
151 / 10 (1) +
Регистрация: 10.01.2004
Адрес: Новосибирск
некоторве размышления насчет открытия двух форм.

на самом деле одновременно держать несколько activex'ов, которые ждут событий от ком-порта вообще не получается. т.к. порт одновременно может открыть только один activex и соответсвенно одна форма получит данные от сканера.

таким образом нужно чтобы форма закрывала порт, когда она становится неактивной.
 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
«Обрезание» длинных штрих-кодов gl00mie DAX: Программирование 7 17.10.2008 18:16
Подвисает сканер штрих-кодов KingPeas DAX: Программирование 0 10.10.2008 09:01
AX 4.0 + сканеры штрих кодов Vitals DAX: Прочие вопросы 11 20.06.2008 17:35
Еще раз про сканеры штрих кодов doo DAX: Программирование 14 22.12.2006 15:47
Нужен совет по сканеру штрих-кодов slava09 DAX: Программирование 5 27.01.2005 03:11
Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 04:28.