Российский производитель и разработчик сертифицированного измерительного оборудования с 1987 года

Возникает ошибка при написании собственного ПО в delphi

Вы не вошли.

 Поиск | Регистрация | Вход 

19.10.2016 09:53:26
#1

Участник
Здесь с 16.12.2015
Сообщений: 10

Возникает ошибка при написании собственного ПО в delphi

Здравствуйте!
При написании программы для работы с модулем LTR22 в LTR-EU-8 взял пример по ссылке http://www.lcard.ru/download/examples/l … hi2006.zip.
Но почему то в примере программа получает Res = -6007 и заканчивает свою работу после строки:
Res:=LTR22_Open(@module,module.ltr.saddr,module.ltr.sport,@module.ltr.csn,module.ltr.cc);

Значения в module после строки вроде обновляются.

С модулем работал через LGraph, через UTSpro появляются ошибки.

Прошу подсказать в чем может быть причина.

19.10.2016 10:12:42
#2

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,290

Re: Возникает ошибка при написании собственного ПО в delphi

Библиотеки используете последние? Если нет --- можете обновить из http://www.lcard.ru/download/ltrdll.exe. А то что-то из последних библиотек не вижу, как они могут возвращать -6007 из LTR22_Open()...

Правильно ли я понял, что он не работает и в LGraph и в UTSPro? Что пишет UTS Pro и в какой момент?

19.10.2016 13:02:18
#3

Участник
Здесь с 16.12.2015
Сообщений: 10

Re: Возникает ошибка при написании собственного ПО в delphi

в LGraph работает. в UTSPro появляется ошибка при запуске теста если нажать вкладку меню RUN (внутри тесты есть).

19.10.2016 14:51:34
#4

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,290

Re: Возникает ошибка при написании собственного ПО в delphi

Ну вообще в UTSPro набор тестов он не предназначен для пользователей и в общем-то они не должны проходить без специального оборудования/подключения.
Для пользователя в UTS нужны только Module->Configure для настройки модуля, а дальше Service - и один из вариантов инструмента сбора.


Что касается примере, то пример действительно странный..... Видимо остался какой-то старый со старой библиотекой и объявлениями.....

Чтобы сделать его рабочим нужно:
1. поставить последнюю версию библиотек из http://www.lcard.ru/download/ltrdll.exe (если еще не поставили)
2. удалить из директории примера ltr22api.dll (и ltr34api.dll).
3. удалить из проекта примера и из директории с примером файл ltr22api.pas.
4. в проекте с примером указать путь к файлам ltrapi.pas, ltrapidefine.pas,
ltrapitypes.pas, ltr22api.pas установленной последней версии бибилитек (<путь установки ltrdll>/include/pascal2) (в меню "Project->Options->Directories/Conditionals->Search path" или для Delphi XE   - "Project->Options->Delphi Compiler->Search path"). Либо можно эти файлы скопировать в директорию с проектом.
5. Добавить в начале проекта в используемые модули ltrapi, ltrapidefine и ltr22api (т.е. чтобы стало так uses SysUtils, Windows, ltr22api, ltrapi, ltrapidefine;
6. После begin в начале проекта удалить все до Open, включая Open, и заменить на

LTR22_Init(@module);

  Res:=LTR22_Open(@module,LTRD_ADDR_DEFAULT,LTRD_PORT_DEFAULT,
                  @module.Channel.csn, 9);

где вместо 9 указать номер слота, в котором реально у Вас стоит модуль


P.S.: Пример, конечно, по возможности заменим....

20.10.2016 10:04:46
#5

Участник
Здесь с 16.12.2015
Сообщений: 10

Re: Возникает ошибка при написании собственного ПО в delphi

Здравствуйте!
В примере исчезли ошибки. Но у меня не получается получить данные.

в основной процедуре я добавил:

...
if Res=LTR_OK 
then begin
   Res:=LTR22_GetConfig(@module);
   if (Res<>LTR_OK) then Writeln('Error Reading module Configuration ',Res);

   while True do  TestADCStartStop(module); ///<--- !!!ДОБАВИЛ цикл!!!

   Res:=LTR22_GetModuleDescription(@module);
   if (Res<>LTR_OK) then Writeln('Error Reading module Description ',Res);

в  TestADCStartStop добавил вывод полученных значений

...
             Res:=LTR22_StopADC(@module);
             if (Res=LTR_OK) then
             begin
                 Res:=LTR22_ClearBuffer(@module, true);
                 if (Res=LTR_OK) then
                 begin
                Res:=LTR22_ProcessData(@module,@ValuesSource,@Values,4,true,true,@module.ChannelEnabled);
                         for I := 0 to length(Values) - 1
                         do begin
                         Writeln(IntToStr(I)+' = '+FormatFloat('0.000#',Values[I]));
                         end;
                        if (Res<>LTR_OK) then
                         Writeln('Error Processing Data ',Res);
                 end
                 else Writeln('Error Clearing Buffers ',Res);


             end
             else Writeln('Error Stopping ADC ',Res);
...

Длину массива сделал меньше с 1000 (было в примере) до 4.
Ошибок не возникало.
Но полученные значения не меняются если воздействовать на датчик вибрации.

Датчик проверял с помощью в LGraph (да и в принципе он рабочий), если его потрясти то на диаграмме видны возмущения.

В примере такого достигнуть не получается.
Прошу подсказать в чем может быть причина.

20.10.2016 12:45:51
#6

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,290

Re: Возникает ошибка при написании собственного ПО в delphi

У Вас может быть включен режим измерения нуля.
Перед SetConfig() нужно его отключить:
module.MeasureADCZero:= false;

Также проверить остальные настройки (отсечку постоянной составляющей, диапазоны каналов и т.п.), соответствуют ли Вашей задаче

11.11.2016 10:14:46
#7

Участник
Здесь с 16.12.2015
Сообщений: 10

Re: Возникает ошибка при написании собственного ПО в delphi

Здравствуйте еще раз.
Вопрос (может я не внимательно прочитал документацию, но у меня возникло её недопонимание):
1. Данные с модуля вроде получил, но меня интересует в какие единицы преобразуются данные при переводе их в пользовательский формат в процедуре  LTR22_ProcessData. Не могу найти где все же задаются пользовательские калибровочные коэффициенты (см. http://www.lcard.ru/download/ltr22api.pdf)?

2. Можете еще пояснить фразу в документе: На выходе данные сортируются по каналам, по порядку, то есть если включены каналы 0,2,3, и получены по 100 результатов на канал, то выходной: ....

В чем недопонимание: Если я заполняю массив длиной 512, то данные с канала 0 я получаю с метода for I:=0 to 32 do MASSIVKANALA0(I) := OBSHIIMASSIV(I)
В общем я не понял как происходит сортировка.

3 Длина массива куда записывается информация должна чем то регламентироваться?

4 В документации есть расхождения http://www.lcard.ru/download/ltr22api.pdf см. стр 13 и http://www.lcard.ru/download/ltr.pdf см. стр 185 Сетка частот АЦП. По массивам частот. Это так и должно быть? Просто пояснений я не увидел, а различия есть.

11.11.2016 10:17:30
#8

Участник
Здесь с 16.12.2015
Сообщений: 10

Re: Возникает ошибка при написании собственного ПО в delphi

P.S. Сформулировал грамотнее вопрос 3

3 Должна ли длина массива в который записывается информация чем то регламентироваться?

11.11.2016 11:35:04
#9

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,290

Re: Возникает ошибка при написании собственного ПО в delphi

1. Перевод в величины осуществляется по формуле
y= x*hnd.ADCCalibration[ch_num][hnd.FreqDiscretizationIndex].UserCalibScale[range])                      + hnd.ADCCalibration[ch_num][hnd.FreqDiscretizationIndex].UserCalibOffset[range];,

где x - значение после применения фабричных коэффициентов (как описано в описании ProcessData), y - значение после перевода в величины, ch_num - номер канала (от 0 до 3), hnd - структура TLTR22 для данного модуля, range - номер диапазона для этого канала (т.е. на каждый канал, диапазон и частоту модуля задаются свои коэффициенты). Изначально, после вызова LTR22_Init() коэффициенты эти устанавливаются в значения, чтобы перевести именно в Вольты (т.е. например для 2 Вольтового диапазона UserCalibScale = 2/65536, UserCalibOffset = 0. Соответственно при желании пользователь может заменить их на какие-то свои.

2. Если честно я не до конца понял, что именно Вы получили. Если у Вас например разрешено 4 канала и вы приняли через Recv() 512 слов и передали их в ProcessData() (и ProcessData() вернула тот же размер 512), то на выходе должно быть первые 128 элементов - отсчеты канала 1, следующие 128 - канала 2 и т.д.

3. Ну главное что массив должен быть размером, достаточным для сохранения того количества слов, которое вы передаете параметром в Recv() или ProcessData(). В ProcessData() размер массива также должен быть кратен количеству разрешенных каналов. В остальном явного ограничения нет.

4. Я нашел различия на 1 в последней цифре некоторых частот. Вы это имеете ввиду? Это по видимому связано просто с тем, что по разному округлены частоты до целого числа Гц, в ltr.pdf округление до ближайшего, а в ltr22api.pdf отброшена дробная часть. Точное значение частот можно получить по формуле, которая приведена в ltr.pdf

11.11.2016 12:27:47
#10

Участник
Здесь с 16.12.2015
Сообщений: 10

Re: Возникает ошибка при написании собственного ПО в delphi

по 1, 2 и 4 п. все понятно. По 3-ему есть все же непонимание. Если у меня массив 512 слов и я его отправляю в Recv() длина массива не будет влиять на качество полученных данных, например некоторые будут повторяться или если заложу короткий массив из 4х слов я например потеряю чувствительность. Если предположить что при записи каждого слова в массив требуется время и, например частота обновления данных может не согласоваться с частотой необходимой для обновления данных. Короче: Размер массива может повлиять на качество получаемых данных?

11.11.2016 12:57:31
#11

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,290

Re: Возникает ошибка при написании собственного ПО в delphi

Тут несколько другой принцип. Количество отсчетов, передаваемых модулем в секунду, определяется заданной частотой АЦП и количеством разрешенных каналов. Т.е. условно говоря если частота 78125 и 4 разрешенных каналов, то модуль передает 4*78125 слов в секунду, которые складываются в очередь на ПК.
Соответственно Recv() берет указанное число слов из начала этой очереди (при этом если за указанное время нужного кол-ва слов не появилось в очереди, то он вернет меньше слов).

Соответственно если Вы приняли 512 слов (по 128 на канал), то время, когда были выполнены измерения, в результате которых были получены два соседних отсчета, будет всегда 1./частоту АЦП.

При этом Вы должны всегда откачивать данные из очереди, если Вы будете принимать из очереди с меньшей скоростью, чем данные приходят от модуля, то в конце концов очередь переполнится (в этом случае на месте разрыва данных Recv() вернет ошибку).

Вариантов как это реализовать может быть несколько. Например, можно в отдельном потоке принимать данные заданными порциями с большим взятым таймаутом с запасом и их обрабатывать блоком. В качестве примера можно посмотреть например пример на Delphi для LTR24.

Контакты

Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4, стр. 2

Многоканальный телефон:
+7 (495) 785-95-25

Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru

Время работы: с 9-00 до 19-00 мск