Страница 1 из 4

Программирование ЛИР-917

Добавлено: 29 июл 2008, 15:25
Stas_SPb
Добрый день!
Пытаюсь управлять работой ЛИР-917 из Дельфи.
1. Инициализация проходит успешно (SI_SUCCESS):
if uHandle<>0 then
status := SI_Close(uHandle);
if status=SI_SUCCESS then
MessageDlg('Close: SI_SUCCESS',mtInformation,[mbYes],0)
else if status=SI_INVALID_HANDLE then
MessageDlg('SI_INVALID_HANDLE',mtInformation,[mbYes],0);
2. Количество устройств определяется верно (1):
status := SI_GetNumDevices(NumDevices);
s:=IntToStr(NumDevices);
MessageDlg('Количество устройств:'+s,mtInformation,[mbYes],0);
3. Выбираю последнее устройство, как описано в примере на диске ЛИР-917:
DeviceNum := NumDevices - 1; // подключаемся к последнему устройству
4. Пытаюсь открыть устройство - ошибка "SI_INVALID_PARAMETER":
status := SI_Open(DeviceNum, uHandle);
s:=IntToStr(status);
MessageDlg('Результат открытия:'+s,mtInformation,[mbYes],0);
if status=SI_SUCCESS then
MessageDlg('SI_SUCCESS',mtInformation,[mbYes],0)
else if status=SI_DEVICE_NOT_FOUND then
MessageDlg('SI_DEVICE_NOT_FOUND',mtInformation,[mbYes],0)
else if status=SI_INVALID_HANDLE then
MessageDlg('SI_INVALID_HANDLE',mtInformation,[mbYes],0)
else if status=SI_INVALID_PARAMETER then
MessageDlg('SI_INVALID_PARAMETER',mtInformation,[mbYes],0)
else if status=SI_READ_ERROR then
MessageDlg('SI_READ_ERROR',mtInformation,[mbYes],0)
else if status=SI_RX_QUEUE_NOT_READY then
MessageDlg('SI_RX_QUEUE_NOT_READY',mtInformation,[mbYes],0)
else if status=SI_WRITE_ERROR then
MessageDlg('SI_WRITE_ERROR',mtInformation,[mbYes],0)
else if status=SI_RESET_ERROR then
MessageDlg('SI_RESET_ERROR',mtInformation,[mbYes],0)
else if status=SI_INVALID_PARAMETER then
MessageDlg('SI_INVALID_PARAMETER',mtInformation,[mbYes],0)
else if status=SI_INVALID_REQUEST_LENGTH then
MessageDlg('SI_INVALID_REQUEST_LENGTH',mtInformation,[mbYes],0)
else if status=SI_DEVICE_IO_FAILED then
MessageDlg('SI_DEVICE_IO_FAILED',mtInformation,[mbYes],0)
else if status=SI_INVALID_BAUDRATE then
MessageDlg('SI_INVALID_BAUDRATE',mtInformation,[mbYes],0)
else if status=SI_FUNCTION_NOT_SUPPORTED then
MessageDlg('SI_FUNCTION_NOT_SUPPORTED',mtInformation,[mbYes],0)
else if status=SI_GLOBAL_DATA_ERROR then
MessageDlg('SI_GLOBAL_DATA_ERROR',mtInformation,[mbYes],0)
else
MessageDlg('Результат неясен:'+s,mtInformation,[mbYes],0);

В чем может быть ошибка?

Добавлено: 29 июл 2008, 16:25
Дмитрий Ряполов
Здравствуйте, Stas.
Пример, о котором Вы говорите был написан на Delphi 7. Какая версия у Вас? Может быть, это конфликт версий?

Добавлено: 29 июл 2008, 16:37
Stas_SPb
Все может быть.
После замены описания в файле SiUSBXp на
function SI_Open(
DeviceNum: DWORD;
Handle: pointer
): SI_STATUS; stdcall; external 'SiUSBXp.dll';
(Thandle заменен на pointer)
и вызове ф-ии
status := SI_Open(DeviceNum, @uHandle);
результат открытия - SI_SUCCESS.

Проблема теперь со сбросом буфера:
status := SI_FlushBuffers(uHandle, 1, 1);
ответ - SI_INVALID_HANDLE.
Как быть с этой проблемой?

Добавлено: 29 июл 2008, 16:41
Дмитрий Ряполов
Дело в том, что некоторым библиотечным функциям нужно передавать не саму переменную, а указатель на нее. Если это не сделать, то функция SI_Open возвращает SI_Invalid_Parameter.

По ссылке лежит архив с драйверами и библиотеками на С++ для ЛИР-917. В папке LIB\VC6 лежит заголовочный файл с комментариями по русски. Они описывают параметры, которые должны быть указаны функции. Эти же параметры нужно указать и в Delphi. Версия 7 переводит переменную в указатель автоматически. В других версиях нужно ставить указатель вручную.


[/url]

Добавлено: 29 июл 2008, 16:58
Дмитрий Ряполов
Мы на Delphi 7 сейчас попробовали в функции SI_Open указать, что переменная Handle имеет тип Pointer. Функция SI_Flush_Buffers возвращает Sucсess. Какой все-таки версией Delphi Вы пользуетесь?

Добавлено: 30 июл 2008, 10:21
Stas_SPb
Пятой версией.
SI_Open с типом pointer у Вас работает? Уточните, пожалуйста, где Вы указываете этот тип - в описании функции, как я приводил выше, или где-то еще?
SI_Flush_Buffers - это Вы имеете в виду SI_FlushBuffers?

Добавлено: 30 июл 2008, 12:47
Дмитрий Ряполов
Здравствуйте, Stas.
Мы поставили у себя Delphi5 и написали под ней рабочий пример. Файл лежит по этой ссылке. Похоже, был конфликт между типами данных в разных версиях Delphi.

Добавлено: 30 июл 2008, 12:55
Дмитрий Ряполов
P.S. Delphi 5 не знает типа Thandle. Мы объявили его в библиотеке как
как LongWord. Файл SIUSBXP.pas обновлен.

Добавлено: 30 июл 2008, 13:37
Stas_SPb
Благодарю за оперативную помощь!
Демонстрационный проект скачал, компилируется и запускается, естественно, без ошибок.
Возник такой вопрос: подключаю ЛИР-917 (без датчика), запускаю программу. Результат - 0 - 2 - 0 - 0. Форма честно реагирует на нажатия клавиш обнуления (две справа).

Закрываю программу, запускаю снова - сначала небольшая пауза, чуть менее секунды, затем - вместо чисел появляются надписи "Panel", а потом - 256-1926832896-372-51. Закрываю программу, запускаю снова - те же числа. На обнуление реакции нет. Форма как будто зависла. Помогает только отключение/включение ЛИР-917.

Примерно то же у меня получается и с программой, идущей в комплекте.
Первый раз после подключения - все нормально, в средней строке - ноль. А при выключении/включении программы вместо нуля появляется 587202560. И перезапуск программы не помогает.

В чем может быть дело?

Добавлено: 30 июл 2008, 13:57
Stas_SPb
Добавлю: неудачные повторные запуски программы сопровождаются ошибками ф-й:
SI_Open - SI_DEVICE_NOT_FOUND
SI_FlushBuffers - SI_INVALID_HANDLE
SI_CheckRXQueue - SI_INVALID_HANDLE

Добавлено: 30 июл 2008, 14:06
Дмитрий Ряполов
Stas, а в программе с диска кнопка обнуления работает если выскакивает число?

По поводу программы под Delphi5 запретите работу таймера в ObjectInspector (Timet1=False). После функции SI_CHECHRXQUEUE Timer1.Enabled:=True;

Еще похоже на то, что вылетает драйвер ЛИР917. Можно попробовать переустановить его с архива, который Вы скачивали вчера с исходниками на C. "архив с драйверами и библиотекой на С++".

Добавлено: 30 июл 2008, 15:30
Stas_SPb
Когда выскакивают большие числа - обнуление не работает.
С таймером - попробовал, не помогает.
Обновление драйвера не меняет ситуации

Добавлено: 30 июл 2008, 15:47
Дмитрий Ряполов
Интересно. У нас на всех компьютерах работает нормально. Похоже, что функция SI_Close что-то не то делает с драйвером при закрытии программы.

Добавлено: 30 июл 2008, 15:48
Дмитрий Ряполов
Можете попробовать закомментировать SI_Close?

Добавлено: 30 июл 2008, 16:21
Stas_SPb
Похоже дело было в использовании провода-удлинителя. У меня USB выкидыш. Правда ранее с ним не было вопросов. Напрямую подключил - вроде бы таких ошибок не выдает!