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

Проблема со считыванием данных с ЛИР-940Р

Добавлено: 03 июн 2009, 09:19
Илья
Добрый день.
Мы купили линейки ЛИР-7 и интерфейсную плату ЛИР-940Р.
Используя команду UpdateData_LIR для первого и второго канала, получаю такие данные: по первому каналу выдаётся постоянное значение, вне зависимости от реального положения датчика; по второму каналу данные изменяются, но их величина непонятным образом связана с реальным перемещением.
При этом программа СКИФ работает нормально.
Отсюда возникают вопросы:
1) Почему неверно опрашивается первый канал?
2) Как преобразовать получаемые значения в реальные миллиметры, т.е. каким образом производится калибровка?
3) Описание процедуры закрытия драйвера под дельфи будет выглядеть примерно так:
procedure Close_Driver_LIR(hFile:THANDLE);stdcall;external 'lir940pci.dll' name 'Close_Driver_LIR';
Я правильно понял?

Добавлено: 03 июн 2009, 13:09
Михаил Поляков
Добрый день !
1) Проверьте правильно ли Вы подсоединили преобразователь к плате.
Скачайте пример для работы с платой ЛИР940Р
http://www.skbis.ru/soft/code_examples/lir940p/
2) Для получения реального перемещения необходимо домножить получаемое значение на дискретность преобразователя. Например, если дискретность вашего преобразователя 1мкм, то для получения перемещения в миллиметрах необходимо домножить на 0.001.
Также следует учесть, что счетчик в плате - беззнаковый, то есть при переходе через 0 счетчик будет равен значению, близкому к 16777215 (2^24-1).
3) Да, правильно. Даже если не вызывать эту процедуру, то при закрытии программы она вызовется автоматически.

Добавлено: 03 июн 2009, 13:28
Илья
Если бы всё было так просто, то я бы и не спрашивал. То, что вы мне рекомендуете, я уже обдумывал и пробовал.
Значение первого канала считывается как примерно 4,5 миллиона, значение второго канала - примерно 6 миллионов. Перемещение датчика на 1 мм вызывает изменение считываемого значения на примерно 0,5 миллиона. Поэтому если получаемые значения нормировать на это значение, то получаемые перемещения будут кратны примерно 140 микронам. Т.е. деление на такое большое число загрубляет измерения с 0,5 микрона (дискретность линеек) до 140 микрон. Так что этот вариант не приемлем.
У меня объяснение сложившейся ситуации только одно: считываются совсем не те данные, что нужно. Может быть контроллер платы перед этим нужно каким-то образом конфигурировать, либо как-то сбрасывать ноль.
СКИФ же выдаёт правильные координаты и по обеим осям. Спрашивается: как ему это удаётся с использованием того же драйвера, тех же линеек и той же платы?

Добавлено: 03 июн 2009, 15:37
Михаил Поляков
А тестовый пример отсюда http://www.skbis.ru/soft/code_examples/lir940p/
работает ?
Там исходники и exe-шник.
Если не получится - присылайте код.

Добавлено: 04 июн 2009, 09:09
Илья
Всё, разобрался. Когда сказали, что счётчик контроллера EP1K10 24-разрядный, всё сразу стало ясно. Он считает до 2^24=16777216, этого хватает на перемещение в 32 мм. Следовательно, чтобы отнормироваться, нужно делить на 16777216/32=524288. После перемещения на очередные 32 мм, вторая переменная (ident) получает смещение на 1. Сразу бы так и сказали.
Просто надо бы вам уже перейти на другой контроллер, имеющий 32-разрядные счётчики, и тогда вообще никаких проблем не будет: тогда можно будет пользоваться линейками длиной до 8192 мм, т.е. более 8 метров.

Добавлено: 04 июн 2009, 09:29
Михаил Поляков
24-х разрядного счетчика хватает на 16777216*0,0005 (дискретность преобразователя в миллиметрах) = 8388,608 мм. То есть как раз на 8 метров.
Переменна ident позволяет судить о приходе референтной метки или внешнего сигнала на плату.
0 - нет референтной метки и внешнего сигнала
1 - внешний сигнал
2 - референтная метка

Добавлено: 04 июн 2009, 14:02
Илья
В-общем, совсем запутался. Моё первоначальное предположение о том, что переполнение счётчика происходит на 32 мм, оказалось не верным. Переполнение происходит на 31,24 мм. Внутри диапазонов в 125 микрон значение счётчика смасштабировано относительно реальной величины в 256 раз. И, при каждом переходе через очередные 125 микрон, происходит скачкообразное изменение значения до нужного. Так и должно быть, или линейки испорчены?
По опросу каналов: когда позавчера я включал компьютер, считывался только второй канал, вчера - оба, а сегодня - только первый.
Тестовая программа и программа СКИФ показывают те же результаты, что и получаются у меня. Т.е. один из каналов не работает (или, соответственно, работают оба); данные при выборе миллиметров миллиметрами совершенно не являются; считываемые значения скачкообразно изменяются через каждые 125 микрон.

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

Добавлено: 04 июн 2009, 15:49
Михаил Поляков
Илья, пришлите пожалуйста номер платы.
Скорее всего ваша плата - это специальная разработка для фирмы, которая вам ее продала.

Добавлено: 05 июн 2009, 09:28
Илья
Да, скорее всего, это так.
Номер платы (может быть версия прошивки; то, что написано на наклейке): 09.2850.
Как-то можно туда записать обычную прошивку, или для этого требуется специальный программатор?
Думаю, смена прошивки должна решить проблему.
Или проще купить новую плату с нормальной прошивкой? Надеюсь, линейки у нас стандартные, а не тоже спец, как прошивка платы, и они заработают как должны работать в штатном режиме.

Добавлено: 05 июн 2009, 12:02
Михаил Поляков
Вы можете прислать нам плату, и мы поменяем прошивку или купить у нас новую.
Линейки у вас точно стандартные.

Добавлено: 05 июн 2009, 13:25
Илья
Спасибо. Понял.
Будем думать, как лучше поступить.

Добавлено: 14 мар 2011, 07:58
roach
Михаил Поляков писал(а):Добрый день !
1) Для получения реального перемещения необходимо домножить получаемое значение на дискретность преобразователя. Например, если дискретность вашего преобразователя 1мкм, то для получения перемещения в миллиметрах необходимо домножить на 0.001.
Также следует учесть, что счетчик в плате - беззнаковый, то есть при переходе через 0 счетчик будет равен значению, близкому к 16777215 (2^24-1).
не получается перевести данные получаемые от UpdateData_LIR в миллиметры:

данные из программы примера: 0 байт, из программы СКИФ: 11130.0 мкм
-/- 10 байт; -/- 11160,0 мкм
-/- 150 байт; -/- 11280,0 мкм
-/- 500 байт; -/- 11631,0 мкм
-/- 16766076 байт; -/- -10,0 мкм
-/- 16766086 байт; -/- 0,0 мкм
-/- 16765986 байт; -/- -100,0 мкм

Подскажите пожалуйста.

Добавлено: 14 мар 2011, 13:50
Дмитрий Ряполов
Смотрите http://www.skbis.ru/pdf/interfaces/Lir940P.pdf главу "Квадратурный счетчик"

Добавлено: 14 мар 2011, 15:05
roach
Дмитрий Ряполов писал(а):Смотрите http://www.skbis.ru/pdf/interfaces/Lir940P.pdf главу "Квадратурный счетчик"
Пожалуйста, поделитесь примером алгоритма считывания на языке программирования

Добавлено: 14 мар 2011, 15:44
Михаил Поляков
hardCounter - текущее значение data = UpdateData_LIR

prevHardCounter - предыдущее значение data


int d = (int)hardCounter - (int)prevHardCounter;
prevHardCounter = hardCounter;
if (Math.Abs(d) > 1 << 23) // math.abs - модуль
{
d -= Math.Sign(d) * (1 << 24); // math.sign -
сигнум

}


relativeCounter += d; // программно-аппаратный счетчик