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

Модератор: Денис Кашин

Stas_SPb
Сообщения: 46
Зарегистрирован: 04 апр 2008, 13:35

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

Сообщение 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);

В чем может быть ошибка?
Дмитрий Ряполов
СКБИС
СКБИС
Сообщения: 272
Зарегистрирован: 07 фев 2008, 09:52

Сообщение Дмитрий Ряполов »

Здравствуйте, Stas.
Пример, о котором Вы говорите был написан на Delphi 7. Какая версия у Вас? Может быть, это конфликт версий?
Stas_SPb
Сообщения: 46
Зарегистрирован: 04 апр 2008, 13:35

Сообщение 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.
Как быть с этой проблемой?
Дмитрий Ряполов
СКБИС
СКБИС
Сообщения: 272
Зарегистрирован: 07 фев 2008, 09:52

Сообщение Дмитрий Ряполов »

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

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


[/url]
Дмитрий Ряполов
СКБИС
СКБИС
Сообщения: 272
Зарегистрирован: 07 фев 2008, 09:52

Сообщение Дмитрий Ряполов »

Мы на Delphi 7 сейчас попробовали в функции SI_Open указать, что переменная Handle имеет тип Pointer. Функция SI_Flush_Buffers возвращает Sucсess. Какой все-таки версией Delphi Вы пользуетесь?
Stas_SPb
Сообщения: 46
Зарегистрирован: 04 апр 2008, 13:35

Сообщение Stas_SPb »

Пятой версией.
SI_Open с типом pointer у Вас работает? Уточните, пожалуйста, где Вы указываете этот тип - в описании функции, как я приводил выше, или где-то еще?
SI_Flush_Buffers - это Вы имеете в виду SI_FlushBuffers?
Дмитрий Ряполов
СКБИС
СКБИС
Сообщения: 272
Зарегистрирован: 07 фев 2008, 09:52

Сообщение Дмитрий Ряполов »

Здравствуйте, Stas.
Мы поставили у себя Delphi5 и написали под ней рабочий пример. Файл лежит по этой ссылке. Похоже, был конфликт между типами данных в разных версиях Delphi.
Дмитрий Ряполов
СКБИС
СКБИС
Сообщения: 272
Зарегистрирован: 07 фев 2008, 09:52

Сообщение Дмитрий Ряполов »

P.S. Delphi 5 не знает типа Thandle. Мы объявили его в библиотеке как
как LongWord. Файл SIUSBXP.pas обновлен.
Stas_SPb
Сообщения: 46
Зарегистрирован: 04 апр 2008, 13:35

Сообщение Stas_SPb »

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

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

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

В чем может быть дело?
Stas_SPb
Сообщения: 46
Зарегистрирован: 04 апр 2008, 13:35

Сообщение Stas_SPb »

Добавлю: неудачные повторные запуски программы сопровождаются ошибками ф-й:
SI_Open - SI_DEVICE_NOT_FOUND
SI_FlushBuffers - SI_INVALID_HANDLE
SI_CheckRXQueue - SI_INVALID_HANDLE
Дмитрий Ряполов
СКБИС
СКБИС
Сообщения: 272
Зарегистрирован: 07 фев 2008, 09:52

Сообщение Дмитрий Ряполов »

Stas, а в программе с диска кнопка обнуления работает если выскакивает число?

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

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

Сообщение Stas_SPb »

Когда выскакивают большие числа - обнуление не работает.
С таймером - попробовал, не помогает.
Обновление драйвера не меняет ситуации
Дмитрий Ряполов
СКБИС
СКБИС
Сообщения: 272
Зарегистрирован: 07 фев 2008, 09:52

Сообщение Дмитрий Ряполов »

Интересно. У нас на всех компьютерах работает нормально. Похоже, что функция SI_Close что-то не то делает с драйвером при закрытии программы.
Дмитрий Ряполов
СКБИС
СКБИС
Сообщения: 272
Зарегистрирован: 07 фев 2008, 09:52

Сообщение Дмитрий Ряполов »

Можете попробовать закомментировать SI_Close?
Stas_SPb
Сообщения: 46
Зарегистрирован: 04 апр 2008, 13:35

Сообщение Stas_SPb »

Похоже дело было в использовании провода-удлинителя. У меня USB выкидыш. Правда ранее с ним не было вопросов. Напрямую подключил - вроде бы таких ошибок не выдает!
Ответить