:: Visual Foxpro, Foxpro for DOS
Вопрос о работе с ТСД CipherLab 8300 в Vfp.
i3i
Автор

Сообщений: 10
Дата регистрации: 11.02.2007
Здравствуйте!
Предстоит работа с терминалом ChiphrLab 8300 - подключение к действующей складской программе на fox-e. Есть компонента Olecpt.dll, и библиотека CipherLab.dll.

С объектами и работе с внешними DLL сталкиваться ранее не приходилось.

Если можно, (как пример для обучения) привести текст программы,
где создается объект и обработка методов записи и удаления данных
из терминала под VFP.

Заранее Спасибо за помощь.
Ratings: 0 negative/0 positive
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()

Вот пожалуста пользуйся
Ratings: 0 negative/0 positive
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
Ratings: 0 negative/0 positive
Re: Вопрос о работе с ТСД CipherLab 8300 в Vfp.
RenO

Сообщений: 42
Откуда: Уфа
Дата регистрации: 11.10.2006
Как видно из примера я прямо подключался к CipherLab.dll, без всяких OleCpt.dll
Ratings: 0 negative/0 positive
Re: Вопрос о работе с ТСД CipherLab 8300 в Vfp.
RenO

Сообщений: 42
Откуда: Уфа
Дата регистрации: 11.10.2006
вот мой рабочий пример, дальше сам смотри что и как;)
Ratings: 0 negative/0 positive
Re: Вопрос о работе с ТСД CipherLab 8300 в Vfp.
i3i
Автор

Сообщений: 10
Дата регистрации: 11.02.2007
Спасибо, Огромное!
Буду разбираться.
Ratings: 0 negative/0 positive
Re: Вопрос о работе с ТСД CipherLab 8300 в Vfp.
Atlant

Сообщений: 204
Откуда: Новосибирск
Дата регистрации: 01.09.2005
i3i
Спасибо, 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 написано обращение к методу.

У вас, судя по всему, прошивка от SCanCity, а в отпике решь идет о прошивке от ScanCode. СО второй все действительно проще. Особенно после того, как выбил от разработчиков нормальную версию DLL
Ratings: 0 negative/0 positive
Re: Вопрос о работе с ТСД CipherLab 8300 в Vfp.
Atlant

Сообщений: 204
Откуда: Новосибирск
Дата регистрации: 01.09.2005
Заодно - вопрос. А как потом освободить библиотеку, занятую этими DECLARE? А то хотелось бы выгрузить ее после использования...
Ratings: 0 negative/0 positive
Re: Вопрос о работе с ТСД CipherLab 8300 в Vfp.
ssa

Сообщений: 13007
Откуда: Москва
Дата регистрации: 23.03.2005
Atlant
Заодно - вопрос. А как потом освободить библиотеку, занятую этими DECLARE? А то хотелось бы выгрузить ее после использования...
Ну если она так мешает, то смотрим в хелпе Clear Dlls


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: Вопрос о работе с ТСД CipherLab 8300 в Vfp.
Atlant

Сообщений: 204
Откуда: Новосибирск
Дата регистрации: 01.09.2005
О! Слона-то я и не приметил, спасибо
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 32 leonid  (Гостей: 31)

© 2000-2024 Fox Club 
Яндекс.Метрика