Вопрос о работе с ТСД CipherLab 8300 в Vfp. | |
---|---|
i3i Автор Сообщений: 10 Дата регистрации: 11.02.2007 |
Здравствуйте!
Предстоит работа с терминалом ChiphrLab 8300 - подключение к действующей складской программе на fox-e. Есть компонента Olecpt.dll, и библиотека CipherLab.dll. С объектами и работе с внешними DLL сталкиваться ранее не приходилось. Если можно, (как пример для обучения) привести текст программы, где создается объект и обработка методов записи и удаления данных из терминала под VFP. Заранее Спасибо за помощь. |
Re: Вопрос о работе с ТСД CipherLab 8300 в Vfp. | |
---|---|
RenO Сообщений: 42 Откуда: Уфа Дата регистрации: 11.10.2006 |
Привет!Есть опыт работы с ChiphrLab.dll (5,2,2,0).
Правда это было давно. Вот описание основных комманд. extern "C" { // Включите данный файл в Ваш проект // НЕ забудьде указать в установках проекта линк на файл CipherLab.lib // Данная версия будет работать с прошивками начиная с версии ВD01 // Для обмена данными терминал должен находиться в главном меню // Перед использованием функции рекомендуется проверить состояние СОМ - порта // А также либо Ping, либо GetCurrentState (СОМ-порт может быть открыт, а вот // терминал может находиться не в стартовом меню. // Указатель на строковую переменную рекомендуется использовать типа char szData[256]; преобразованный к(LPSTR)szData // Поле не может превышать 256 байт, строка базы данных не может превышать 1024 байт // Баз данных может быть до трех: от 1 до 3. Файлов данных до 10: от 0 до 9. Это зависит от // задачи, сгенерированной в Генераторе Приложений // Функция:Получить номер ошибки и её описание. // Если какая-либо функция возвратила ошибку, эта функия даст её подробное описание // Также Вы можете найти описание ошибок в файле Errors.txt // Параметры: // szData - указатель на строковую переменную, куда будет помещено описание ошибки или NULL, если нужен только номер // Возвращаемое значание: // номер ошибки __declspec(dllimport) int __cdecl GetError(LPSTR szData); // Функция:Открыть СОМ порт // Параметры: // int nCommPort - целое, номер СОМ-порта, 1..16 // int nCommSpeed - целое, скорость СОМ - порта, 1..5 // (1 - 115200, 2 - 57600, 3 - 38400, 4 - 19200, 5 - 9600) // BOOL bIsIrDA - логическое, если обмен будет производиться через Ir адаптер // Возвращаемое значание: // TRUE - если СОМ порт успешно открыт // FALSE - иначе. __declspec(dllimport) BOOL __cdecl OpenComm(int nCommPort, int nCommSpeed, BOOL bIsIrDA); // Функция:проверить состояние СОМ порта // Рекомендуется вызывать для проверки состояния СОМ порта перед вызовом функций. // Параметры: // нет // Возвращаемое значание: // TRUE - если СОМ порт открыт // FALSE - иначе. BOOL __declspec(dllimport) __cdecl CheckComm(); // Функция:закрыть СОМ порт // Рекомендуется вызывать перед выходом из приложения. // СОМ порт при выходе все равно будет закрыт, но лучше не полагаться на систему. // Параметры: // нет // Возвращаемое значание: // нет __declspec(dllimport) void __cdecl CloseComm(); // Функция:проверить наличие терминала на данном СОМ порту. // Терминал должен находиться в главном меню или состоянии загрузки / вынгрузки // Параметры: // нет // Возвращаемое значание: // TRUE - если терминал отозвался // FALSE - иначе. __declspec(dllimport) BOOL __cdecl Ping(); //BOOL Ping(); // Функция:получить кол-во свободной памяти // Параметры: // нет // Возвращаемое значание: // длинное целое, кол-во свободной памяти в байтах // 0 или ниже при возникновении ошибки __declspec(dllimport) long __cdecl GetFreeMemory(); // Функция:получить серийный номер терминала // Терминал должен находиться в главном меню или состоянии загрузки / вынгрузки // Параметры: // szData - указатель на строковую переменную, куда будет помещен номер терминала // Возвращаемое значание: // TRUE - если номер передан // FALSE - иначе. __declspec(dllimport) BOOL __cdecl GetSerialNumber(LPSTR szData); // Функция:получить текущее системное время терминала // Терминал должен находиться в главном меню или состоянии загрузки / вынгрузки // Параметры: // szData - указатель на строковую переменную, куда будет помещено время терминала в формате ГГГГММДДЧЧММСС // Возвращаемое значание: // TRUE - если время получено // FALSE - иначе. __declspec(dllimport) BOOL __cdecl GetTime(LPSTR szData); // Функция:обновить время терминала // В терминал будет переданно системное время // Параметры: // нет // Возвращаемое значание: // TRUE - если время обновленно // FALSE - иначе. __declspec(dllimport) BOOL __cdecl UpdateTime(); // Функция:проверяет - находится ли терминал в стартовом меню (готовность к обмену данными) // Параметры: // нет // Возвращаемое значание: // TRUE - если терминал готов к работе (находится в стартовом меню) // FALSE - иначе. __declspec(dllimport) BOOL __cdecl GetCurrentState(); // Функция:получить кол-во записей в документе номер (0-9) // Параметры: // nDoc - номер документа (0-9) // Возвращаемое значание: // длинное целое, кол-во записей // -1 при возникновении ошибки __declspec(dllimport) long __cdecl GetDataCount(int nDoc); // Функция:получить кол-во записей в Базе Данных номер (1-3) // Параметры: // nBase - номер Базы Данных (1-3) // Возвращаемое значание: // длинное целое, кол-во записей // -1 при возникновении ошибки __declspec(dllimport) long __cdecl GetRecordsCount(int nBase); // Функция:очистить содержимое документа номер (0-9) // Параметры: // nDoc - номер документа (0-9) // Возвращаемое значание: // TRUE - если успешно очищенно // FALSE - иначе. __declspec(dllimport) BOOL __cdecl ClearDoc(int nDoc); // Функция:очистить содержимое Базы Данных номер (1-3) // Параметры: // nBase - номер Базы Данных (1-3) // Возвращаемое значание: // TRUE - если успешно очищенно // FALSE - иначе. __declspec(dllimport) BOOL __cdecl ClearDB(int nBase); // Функция:очистить содержимое конкретного поля (1-8) Базы Данных номер (1-3) // Параметры: // nBase - номер Базы Данных (1-3) // nField - номер поля Базы Данных (1-3) // Возвращаемое значание: // TRUE - если успешно очищенно // FALSE - иначе. // Примечание: // Функция сразу возвращает ответ, даже, если операция незавершена. // Т.е. TRUE вернется, если все параметры удовлетворяют и процесс очистки начался. // Для того, чтобы выяснить, освободился ли ТСД (выполнилась ли команда до конца) // следует использовать команду Ping(). Примерное время выполнения - 10тыс записей в минуту. // Можно узнать число записей в БД и рассчитать примерное время выполнения команды, // чтобы цикл с командой Ping() не делать вечным. __declspec(dllimport) BOOL __cdecl ClearDBField(int nBase, int nField); // Функция:получить очередную запись из документа номер (0-9) // Если терминал находиться в главном меню, он будет переведен в состояние выгрузки // Параметры: // nDoc - номер документа (0-9) // szData1-szData8 - указатели на строковые переменные, куда будут помещены поля документа // Возвращаемое значание: // 1 - успешно! // 0 последняя запись, обмен завершен // -1 при возникновении ошибки __declspec(dllimport) int __cdecl ReadData(int nDoc, LPSTR szData1, LPSTR szData2, LPSTR szData3, LPSTR szData4, LPSTR szData5, LPSTR szData6, LPSTR szData7, LPSTR szData8); // Функция:получить очередную запись из документа (0) или Базы Данных номер (1-3) // Если терминал находиться в главном меню, он будет переведен в состояние выгрузки // Параметры: // nBase - номер Базы данных (1-3) // szData1-szData1 - указатели на строковые переменные, куда будут помещены поля базы данных // Возвращаемое значание: // 1 - успешно! // 0 последняя запись, обмен завершен // -1 при возникновении ошибки __declspec(dllimport) int __cdecl ReadRecord(int nBase, LPSTR szData1, LPSTR szData2, LPSTR szData3, LPSTR szData4, LPSTR szData5, LPSTR szData6, LPSTR szData7, LPSTR szData8); // Функция:загрузить запись в Базу Данных номер (1-3). Самая первая команда автоматически очищает базу. // Если терминал находиться в главном меню, он будет переведен в состояние загрузки дынных // Параметры: // nBase - номер Базы данных (1-3) // szData1-szData1 - указатель на загружаемые поля базы данных // Возвращаемое значание: // TRUE - если запись успешно загружена // FALSE - иначе. __declspec(dllimport) BOOL __cdecl PutRecord(int nBase, LPSTR szData1, LPSTR szData2, LPSTR szData3, LPSTR szData4, LPSTR szData5, LPSTR szData6, LPSTR szData7, LPSTR szData8); // Функция:загрузить запись в Базу Данных номер (1-3). Если запись уже есть, то она обновится. // Если терминал находиться в главном меню, он будет переведен в состояние загрузки дынных // Параметры: // nBase - номер Базы данных (1-3) // szData1-szData8 - указатель на загружаемые поля базы данных // Возвращаемое значание: // TRUE - если запись успешно загружена // FALSE - иначе. __declspec(dllimport) BOOL __cdecl UpdateRecord(int nBase, LPSTR szData1, LPSTR szData2, LPSTR szData3, LPSTR szData4, LPSTR szData5, LPSTR szData6, LPSTR szData7, LPSTR szData8); // Для завершения загрузки и старта индексирования используйте данную функцию // Также применяется для немедленного прерывания чтения из ТСД // Параметры: // нет // Возвращаемое значание: // TRUE - если загрузка успешно завершена // FALSE - иначе. __declspec(dllimport) BOOL __cdecl Finish(); // Показывает сообщение о ходе выполнения передачи данных // Параметры: // nAction - 1 Высвечивается надпись "Осталось получить: %d записей" // - 0 Высвечивается надпись "Осталось передать: %d записей" // nCount - число, которое будет подставляться в надписе. // Возвращаемое значание: // нет __declspec(dllimport) void __cdecl ShowProgress(int nAction, int nCount); // Изменяет значение разделителей в полях базы и документа // Параметры: // Base - разделитель для полей базы, по умолчание код 9 (табуляция) // Doc - разделитель для полей базы, по умолчание код 9 (табуляция) // Возвращаемое значание: // нет __declspec(dllimport) void __cdecl Delimiter(char Base, char Doc); // Загружает данные в базу из файла // Параметры: // nBase - номер Базы данных (1-3) // nPath - указатель на строковую переменную, где передается путь к файлу // Возвращаемое значание: // TRUE - если обмен успешно завершен // FALSE - иначе. __declspec(dllimport) BOOL __cdecl FileToBase(int nBase, LPSTR nPath); // Выгружает из терминала документ и записывает в файл // Параметры: // nDoc - номер документа (0-9) // nPath - указатель на строковую переменную, где передается путь к файлу // Возвращаемое значание: // TRUE - если обмен успешно завершен // FALSE - иначе. __declspec(dllimport) BOOL __cdecl DocToFile(int nDoc, LPSTR nPath); // Выгружает из терминала базу и записывает в файл // Параметры: // nBase - номер Базы данных (1-3) // nPath - указатель на строковую переменную, где передается путь к файлу // Возвращаемое значание: // TRUE - если обмен успешно завершен // FALSE - иначе. __declspec(dllimport) BOOL __cdecl BaseToFile(int nBase, LPSTR nPath); // Возвращает значение задержки для повтора команды в ТСД, // если от ТСД нет ответа. // Параметры: // нет // Возвращаемое значание: // Значение задержки. Если порт не открыт, функция вернет значение // по-умолчанию (50), а GetError вернет ошибку №1 __declspec(dllimport) unsigned int __cdecl GetDelay(void); // Устанавливает значение задержки для повтора команды в ТСД, // если от ТСД нет ответа // Параметры: // Delay - значение задержки (50-10 000) шаг 50. Округляется в меньшую сторону. // Возвращаемое значание: // TRUE - если задержка установлена // FALSE - иначе. GetError вернет ошибку №1 __declspec(dllimport) BOOL __cdecl SetDelay(unsigned int Delay); } Вот ещё старые записи: *LOCAL sMsg,sMsg1,sMsg2,sMsg3,sMsg4,sMsg5,sMsg6,sMsg7,sMsg8 *!* DECLARE LONG GetError IN (m.convpath+'CipherLab.dll') string @szData *!* DECLARE LONG OpenComm IN (m.convpath+'CipherLab.dll') integer,integer,string *!* DECLARE LONG CheckComm IN (m.convpath+'CipherLab.dll') *!* DECLARE LONG CloseComm IN (m.convpath+'CipherLab.dll') *!* DECLARE LONG Ping IN (m.convpath+'CipherLab.dll') *!* DECLARE LONG GetFreeMemory IN (m.convpath+'CipherLab.dll') *!* DECLARE LONG GetSerialNumber IN (m.convpath+'CipherLab.dll') string @szData *!* DECLARE LONG GetTime IN (m.convpath+'CipherLab.dll') string @szData *!* DECLARE LONG UpdateTime IN (m.convpath+'CipherLab.dll') *!* DECLARE LONG GetCurrentState IN (m.convpath+'CipherLab.dll') *!* DECLARE LONG GetDataCount IN (m.convpath+'CipherLab.dll') integer *!* DECLARE LONG GetRecordsCount IN (m.convpath+'CipherLab.dll') integer *!* DECLARE LONG ClearDoc IN (m.convpath+'CipherLab.dll') integer *!* DECLARE LONG ClearDB IN (m.convpath+'CipherLab.dll') integer *!* DECLARE LONG ClearDBField IN (m.convpath+'CipherLab.dll') integer,integer *!* DECLARE LONG ReadData IN (m.convpath+'CipherLab.dll') ; *!* integer,; *!* string @szData1,;string @szData2,;string @szData3,;string @szData4,; *!* string @szData5,;string @szData6,;string @szData7,;string @szData8 *!* DECLARE LONG ReadRecord IN (m.convpath+'CipherLab.dll') ; *!* integer,; *!* string @szData1,;string @szData2,;string @szData3,;string @szData4,; *!* string @szData5,;string @szData6,;string @szData7,;string @szData8 *!* DECLARE LONG PutRecord IN (m.convpath+'CipherLab.dll') ; *!* integer,; *!* string @szData1,;string @szData2,;string @szData3,;string @szData4,; *!* string @szData5,;string @szData6,;string @szData7,;string @szData8 *!* DECLARE LONG UpdateRecord IN (m.convpath+'CipherLab.dll') ; *!* integer,; *!* string @szData1,;string @szData2,;string @szData3,;string @szData4,; *!* string @szData5,;string @szData6,;string @szData7,;string @szData8 *!* DECLARE LONG Finish IN (m.convpath+'CipherLab.dll') *!* DECLARE LONG ShowProgress IN (m.convpath+'CipherLab.dll') integer,integer *!* DECLARE LONG Delimiter IN (m.convpath+'CipherLab.dll') string,string *!* DECLARE LONG FileToBase IN (m.convpath+'CipherLab.dll') integer,string *!* DECLARE LONG DocToFile IN (m.convpath+'CipherLab.dll') integer,string *!* DECLARE LONG BaseToFile IN (m.convpath+'CipherLab.dll') integer,string *!* DECLARE LONG GetDelay IN (m.convpath+'CipherLab.dll') *!* DECLARE LONG SetDelay IN (m.convpath+'CipherLab.dll') *nCommPort=1 && целое, номер СОМ-порта, 1..16 *nCommSpeed=1 && - целое, скорость СОМ - порта, 1..5 (1 - 115200, 2 - 57600, 3 - 38400, 4 - 19200, 5 - 9600) *bIsIrDA='.F.' && - логическое, если обмен будет производиться через Ir адаптер *!* sMsg=SPACE(255) *!* sMsg1=SPACE(255) *!* sMsg2=SPACE(255) *!* sMsg3=SPACE(255) *!* sMsg4=SPACE(255) *!* sMsg5=SPACE(255) *!* sMsg6=SPACE(255) *!* sMsg7=SPACE(255) *!* sMsg8=SPACE(255) *?OpenComm(nCommPort,nCommSpeed,bIsIrDA) ?CheckComm() ?GetFreeMemory(@sMsg) =GetSerialNumber(@sMsg) ?sMsg *!* =GetTime(@sMsg) *!* ?sMsg *!* ?GetDelay() *? GetCurrentState() * ? UpdateTime() *nBase=2 && номер Базы Данных (1-3) *? GetRecordsCount(1) *? GetDataCount(1) *? GetDataCount(2) *? DocToFile(2,'D:\Cipher_Fox\Test.txt') *? GetRecordsCount(nBase) *? ClearDB(nBase) *? FileToBase(nBase,"D:\Cipher_Fox\In.txt") *? GetError() *? GetRecordsCount(nBase) *? BaseToFile(nBase,'D:\Cipher_Fox\Out') *!* nRecCount=GetRecordsCount(1) *!* ? nRecCount *!* FOR i=1 TO nRecCount *!* ?ReadRecord(1,@sMsg1,@sMsg2,@sMsg3,@sMsg4,@sMsg5,@sMsg6,@sMsg7,@sMsg8) *!* ?ALLTRIM(sMsg1) *!* ??ALLTRIM(sMsg2) *!* ??ALLTRIM(sMsg3) *!* ??ALLTRIM(sMsg4) *!* ??ALLTRIM(sMsg5) *!* ??ALLTRIM(sMsg6) *!* ??ALLTRIM(sMsg7) *!* ??ALLTRIM(sMsg8) *!* ?ShowProgress(1,nRecCount-i) *!* ENDFOR GetError(@sMsg) ?sMsg *?CloseComm() Вот пожалуста пользуйся |
Re: Вопрос о работе с ТСД CipherLab 8300 в Vfp. | |
---|---|
i3i Автор Сообщений: 10 Дата регистрации: 11.02.2007 |
Спасибо, RenO!
А есть ли пример как обратиться к из PRG к функциям чтения и выгрузки данных с терминала, обращаясь к методам компоненты. Вот что написано в описании: " В каталоге, где находится компонента OleCpt.dll также должна располагаться библиотека CipherLab.dll. Для начала работы с компонентой необходимо загрузить ее и создать объект "ScCt.Cpt". После этого через созданный объект можно вызывать методы компоненты и получить доступ к ее свойствам. " и приведен пример: Загрузка компоненты Dim CPT As Object Set CPT = CreateObject("ScCt.Cpt") Я перевожу все это на Fox: (правильно ли ?) CPT=createobject("ScCt.Cpt") * Устанвливаем порт=5 * Скорость 115000 * Связь через Ик-подставку * и вызывается метод инициализации порта CPT.Port=5 CPT.BaudRate=1 CPT.ConnectionType=0 ? CPT.InitComm() Выдает 1 Правильно ли на Fox написано обращение к методу. Исправлено 1 раз(а). Последнее : i3i, 24.02.08 19:13 |
Re: Вопрос о работе с ТСД CipherLab 8300 в Vfp. | |
---|---|
RenO Сообщений: 42 Откуда: Уфа Дата регистрации: 11.10.2006 |
Как видно из примера я прямо подключался к CipherLab.dll, без всяких OleCpt.dll
|
Re: Вопрос о работе с ТСД CipherLab 8300 в Vfp. | |
---|---|
RenO Сообщений: 42 Откуда: Уфа Дата регистрации: 11.10.2006 |
вот мой рабочий пример, дальше сам смотри что и как;)
|
Re: Вопрос о работе с ТСД CipherLab 8300 в Vfp. | |
---|---|
i3i Автор Сообщений: 10 Дата регистрации: 11.02.2007 |
Спасибо, Огромное!
Буду разбираться. |
Re: Вопрос о работе с ТСД CipherLab 8300 в Vfp. | |
---|---|
Atlant Сообщений: 204 Откуда: Новосибирск Дата регистрации: 01.09.2005 |
У вас, судя по всему, прошивка от SCanCity, а в отпике решь идет о прошивке от ScanCode. СО второй все действительно проще. Особенно после того, как выбил от разработчиков нормальную версию DLL |
Re: Вопрос о работе с ТСД CipherLab 8300 в Vfp. | |
---|---|
Atlant Сообщений: 204 Откуда: Новосибирск Дата регистрации: 01.09.2005 |
Заодно - вопрос. А как потом освободить библиотеку, занятую этими DECLARE? А то хотелось бы выгрузить ее после использования...
|
Re: Вопрос о работе с ТСД CipherLab 8300 в Vfp. | |
---|---|
ssa Сообщений: 13007 Откуда: Москва Дата регистрации: 23.03.2005 |
Ну если она так мешает, то смотрим в хелпе Clear Dlls ------------------ Лень - это неосознанная мудрость. |
Re: Вопрос о работе с ТСД CipherLab 8300 в Vfp. | |
---|---|
Atlant Сообщений: 204 Откуда: Новосибирск Дата регистрации: 01.09.2005 |
О! Слона-то я и не приметил, спасибо
|
© 2000-2024 Fox Club  |