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


Ошибка -1002 при вызове LTR11_SetADC()

Вы не вошли.

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

Виталий
25.02.2013 11:49:02
#1

Гость

Ошибка -1002 при вызове LTR11_SetADC()

Ниже приведен отрывок из программы - инициализация LTR11 (АЦП). При вызове LTR11_SetADC возникает ошибка -1002 (недопустимое количество логических каналов). В чем может быть дело?:

  Err := LTR11_Init(@LTR11);
  PrintError(Err);
  Err := LTR11_Open(@LTR11, LTR.saddr, LTR.sport, @LTR.csn, i + 1);
  PrintError(Err);

  LTR11.StartADCMode := LTR11_STARTADCMODE_INT;
  LTR11.InpMode := LTR11_INPMODE_INT;
  LTR11.LChQnt := 1;
  LTR11.ADCMode := LTR11_ADCMODE_ACQ;
  LTR11.ADCRate.divider := 1;
  LTR11.ADCRate.prescaler := 1;
  for i := 0 to LTR11.LChQnt - 1 do begin
    LTR11.LChTbl[i] := (0 shl 6) or (0 shl 4) or i;
  end;
  Err := LTR11_SetADC(@LTR11);

25.02.2013 16:02:34
#2

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

Re: Ошибка -1002 при вызове LTR11_SetADC()

Возможно проблема в выравнивании структур.
Выравнивание должно быть на 4 (а в delphi по-умолчанию 8). Это можно установить либо в настройках среды, либо добавить в ltr11api.pas и ltrapi.pas перед определением структур {$A4}, а после определения {$A+}

Виталий
26.02.2013 10:22:55
#3

Гость

Re: Ошибка -1002 при вызове LTR11_SetADC()

Сделал ка вы сказали. Не помогло.

В ltr11api.pas
Добавил {$A4} перед определением TLTR=record
Добавил {$A+} после определения TLTR_CONFIG=record

В ltrapi.pas
Добавил {$A4} перед определением LTR11_GainSet=packed record
Добавил {$A+} после определения TINFO_LTR11=packed record

Только по моему если структура определена как packed record, эти директивы не работают.

Я использую Delphi 2012. В настройках проекта
Options->Delphi Compiler->Compiling->Code Generation->Record filed alignment
вообще указано Quad word (по моему - это 16 байт).

Пример с вашего сайта
http://www.lcard.ru/download/ltr_sources.zip для LTR11
(/LTR_SOURCES/ltr-11/examples/Delphi_7) тоже выдает эту ошибку.
Но примеры для LTR42 и LTR43 все работают.

26.02.2013 10:50:48
#4

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

Re: Ошибка -1002 при вызове LTR11_SetADC()

packed по хорошему быть у записей не должно, их можно убрать. Странно, что даже пример не работает... сегодня попробую его собрать и проверю. А Delphi 2012 и XE3 - это та же среда?

Виталий
26.02.2013 11:02:35
#5

Гость

Re: Ошибка -1002 при вызове LTR11_SetADC()

Delphi 2012 и XE2

Виталий
26.02.2013 11:07:49
#6

Гость

Re: Ошибка -1002 при вызове LTR11_SetADC()

Я использую Delphi XE2.

Я экспериментировал с различными комбинациями из без packed и различные выравнивания. Все равно ошибка.

26.02.2013 15:39:11
#7

Сотрудник "Л Кард"
Здесь с 18.04.2014
Сообщений: 810

Re: Ошибка -1002 при вызове LTR11_SetADC()

>Добавил {$A4} перед определением LTR11_GainSet=packed record
>Добавил {$A+} после определения TINFO_LTR11=packed record

Почему только эти? Это на все record/'ы распространяется.
Если делать через {$A...}, то всю секцию type есть смысл туда засунуть.
Или глобально в среде поставьте alignment dword.

>Quad word (по моему - это 16 байт).
Восемь. word = uint16_t, dword = uint32_t, qword = uint64_t

26.02.2013 18:38:40
#8

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

Re: Ошибка -1002 при вызове LTR11_SetADC()

Еще необходимо char заменить на AnsiChar (в структурах для LTR11 и главное в ltrapitypes.pas в SERNUMtext), т.к. в XE тип char стал unicode и занимать больше байта.

После того как я это сделал и добавил  {$A4} перед началом обявлений структур и {$A-} после завершения объявления и убрал все слова packed в ltrapitypes.pas, ltrapi.pas и ltr11api.pas, подключив эти файлы к проекту (там пример еще использовал напрямую как-то .lib файлы - их я убрал), то в XE2 у меня все заработало.

Виталий
27.02.2013 11:24:07
#9

Гость

Re: Ошибка -1002 при вызове LTR11_SetADC()

>После того как я это сделал и добавил {$A4} ..., >то в XE2 у меня все заработало.

Спасибо, помогло.

Все дело было в том, чтобы заменить char на AnsiChar.
И еще чтобы не использовать директивы компилятора {$A4}, можно все
записи в ltrapitypes.pas, ltrapi.pas и ltr11api.pas
определить как packed record. У меня так заработала LTR11_SetADC.

Но появилась другая проблема.
Я пытаюсь связать
1-ый логический канал с 1-ым физическим и
2-ой логический канал с 1-ой физическим.

На 1-ый канал подаем 5 вольт на 2-ой - 3 вольта.

И так получается, что 1-ый канал считывается правильно.
А на 2-ом все время скачут значения. Опять я не могу понять в чем дело.

Вот отрывок из инициализации:

  LTR11.StartADCMode := LTR11_STARTADCMODE_INT;
  LTR11.InpMode := LTR11_INPMODE_INT;
  LTR11.LChQnt := 2;//всего два канала
  LTR11.ADCMode := LTR11_ADCMODE_ACQ;
  LTR11.ADCRate.divider := 36;//74;
  LTR11.ADCRate.prescaler := 1;//64;
  for i := 0 to LTR11.LChQnt - 1 do begin
// каждый канал логический привязывается к
// соответсвующему физическому
    LTR11.LChTbl[i] := (0 shl 6) or (0 shl 4) + (i);
  end;
  Err := LTR11_SetADC(@LTR11);

По таймеру читаем значения 1-го и 2-го каналов:

procedure TForm1.Timer1Timer(Sender: TObject);
var
// т.к. каналов всего 2
  Data: array[0..1] of Cardinal;
  Volts: array[0..1] of Double;
  Size: Cardinal;
  Err: Integer;
begin
  Err := LTR11_GetFrame(@LTR11, @Data);
  if Err < 0 then
    PrintError(Err);
  //lbValue1.Caption := IntToStr(Data[0]);
  // вот здесь уже значение прыгают
  //lbValue2.Caption := IntToStr(Data[1]);

  Size := LTR11.LChQnt;
  Err := LTR11_ProcessData(@LTR11, @Data, @Volts, @Size, True, True);
  PrintError(Err);

  lbValue1.Caption := FloatToStr(Volts[0]);
// и соответсвенно здесь значения прыгают
  lbValue2.Caption := FloatToStr(Volts[1]);
end;


Может быть проблема в этих строках при инициализации, но кажется все по инструкции сделано?
  for i := 0 to LTR11.LChQnt - 1 do begin
    LTR11.LChTbl[i] := (0 shl 6) or (0 shl 4) + (i);
  end;

27.02.2013 11:53:50
#10

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

Re: Ошибка -1002 при вызове LTR11_SetADC()

Все же packed record соответствует размеру выравнивания 1 ({$A1}, #pragma pack(1)), а в библиотеках LTR все структуры объявлены с выравниванием 4. Хотя в ряде случаев выравнивание на 1 и 4 дает одинаковый результат, в общем случае это будет верно не для всех структур. Поэтому {$A4} все наиболее правильный вариант.

По поводу Вашего случая, если вы имели ввиду "2-ой логический канал со 2-ым физическим" и Вас интересует именно дифференциальное подключение (первый сигнал подается на X1/Y1, второй X2/Y2), то настройки правильные. Тогда чтобы понять, проблема в программе или в подключении, стоит посмотреть как это будет работать в UTS или LGraph2.

Виталий
27.02.2013 12:05:41
#11

Гость

Re: Ошибка -1002 при вызове LTR11_SetADC()

С директивами компилятора все понял.

Да правильно так:
1-ый логический канал со 1-ым физическим
2-ой логический канал со 2-ым физическим
Дифференциальное подключение

Через UTS все правильно показывает и для 1-го и для 2-го канала.

Но ваш пример из http://www.lcard.ru/download/ltr_sources.zip для LTR11
(/LTR_SOURCES/ltr-11/examples/Delphi_7) выдает такие же скачки значений.

27.02.2013 15:30:36
#12

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

Re: Ошибка -1002 при вызове LTR11_SetADC()

А что подразумевается под "все время скачут значения": они меняются вообще по всему диапазону произвольно или в некой окрестности установленных трех вольт? Если подать другое значение на второй канал (например 0), то показания изменятся?

Виталий
27.02.2013 16:12:41
#13

Гость

Re: Ошибка -1002 при вызове LTR11_SetADC()

Значение скачут от примерно от 1 Вольта до 6 Вольт. И очень хаотично. Я завтра точнее напишу диапазон, доступ к аппаратуре у меня сегодня закончился. Но все же это трудно назвать окрестностью около 3 Вольт.

27.02.2013 17:19:12
#14

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

Re: Ошибка -1002 при вызове LTR11_SetADC()

Можно еще попробовать поменять каналы местами. То есть 1-ый настроить на 2-ой физический, а 2-ой - на 1-ый физический. Если скачки будут на том же физическом (на 1-ом логическом), то библиотека работает нормально и видимо дело в подключении, иначе - точно дело именно в программе.

Следует также учесть, что по-умолчанию мультиметр UTS показывает среднее значение по заданному числу точек, а не мгновенное. Там есть различные режимы в мультиметре (можно установить например Peak-to-Peak, чтобы посмотреть разброс значений)

Виталий
01.03.2013 15:34:03
#15

Гость

Re: Ошибка -1002 при вызове LTR11_SetADC()

Я выше писал, что Ваш пример из http://www.lcard.ru/download/ltr_sources.zip для LTR11
(/LTR_SOURCES/ltr-11/examples/Delphi_7) показывает неправильные значения. Это не так.
Пример работает нормально.

Но все же проблема осталась.

Вот что удалось выяснить.

Я переделал свою программу, как у Вас в примере. Чтение ацп произвожу функцией
LTR_Recv(), а не LTR11_GetFrame() (как раньше делал). Вот как выглядит сейчас
обработчик таймера:

procedure TForm1.Timer1Timer(Sender: TObject);
var
  Size: Cardinal;
  Err: Integer;
begin
  Size := 2;// т.к. два канала

  Size := LTR_Recv(@LTR11.Channel, @Data[0], @Time[0], Size, 10000);
  Err := LTR11_Processdata(@LTR11, @Data[0], @Volts[0], @Size, True, True);

  lbValue1.Caption := FloatToStr(Volts[0]);
  lbValue2.Caption := FloatToStr(Volts[1]);
end;

На процесс оцифровки надо когда-то запустить (т.е. вызвать LTR11_Start(@LTR11)),
ну и остановить конечно (LTR11_Stop(@LTR11)). Я это делаю по кнопке. Обработчик
нажатия кнопки слишком длинный, я его приводить не буду.

Вообщем получается так, что если запускать (LTR11_Start) в самом начале обработчика таймера
Timer1Timer() и останавливать (LTR11_Stop) в самом конце обработчика, то в этом
случае и происходит считывание (при первом считывании) какое-то непонятное значение.
Но это происходит только на 2-ом канале, на 1-ом канале проблем нет.
А функция LTR11_GetFrame() как раз это и делает
(я это из исходников понял /LTR_SOURCES/ltr-11/ltr11api-win).

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

01.03.2013 16:06:35
#16

Инженер-электронщик
Откуда: "Л Кард"
Здесь с 21.04.2014
Сообщений: 4,597

Re: Ошибка -1002 при вызове LTR11_SetADC()

Виталий, поскольку программные проблемы, как мы полагаем, были разрешены, то, вероятно, остались аппаратные, связанные с корректностью подключения и настроек. Итак, Вы работаете с LTR11 в 2-х канальном дифференциальном режиме на поддиапазоне "10V" при частоте АЦП 400 кГц. Ответьте, пожалуйста, на вопросы.
- С какими источниками сигналов работаете? Какие у них выходные электрические характеристики?
- Кабелем какой длины подключены эти источники сигналов?
- К какому контакту LTR11 какая цепь подключена, и какие контакты остались неподключёнными?

Виталий
04.03.2013 15:00:08
#17

Гость

Re: Ошибка -1002 при вызове LTR11_SetADC()

Было неправильное подключение контактов.
Тему можно закрывать.
Спасибо!

04.03.2013 22:12:01
#18

Инженер-электронщик
Откуда: "Л Кард"
Здесь с 21.04.2014
Сообщений: 4,597

Re: Ошибка -1002 при вызове LTR11_SetADC()

Виталий, при необходимости, мы консультируем  по вопросам правильного, оптимального подключения для конкретного случая. Обращайтесь.

Артём Андреевич
06.06.2013 14:38:39
#19

Гость

Re: Ошибка -1002 при вызове LTR11_SetADC()

я тут видимо не много опоздал, но Алексей не могли бы вы выложить исправленные заголовочные файлы чтобы  в XE2 заработало.

06.06.2013 16:01:28
#20

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

Re: Ошибка -1002 при вызове LTR11_SetADC()

Выслал по почте

Артём Андреевич
07.06.2013 07:51:14
#21

Гость

Re: Ошибка -1002 при вызове LTR11_SetADC()

большое спасибо

18.06.2013 17:18:06
#22

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

Re: Ошибка -1002 при вызове LTR11_SetADC()

Исправленные файлы для XE2, которые я отсылал, теперь включены и в обновленный стандартный установщик библиотек (http://www.lcard.ru/download/ltrdll.exe). Новые файлы устанавливаются в директорию include/pascal2.

Так как там есть небольшие изменения в совместимости (в первую очередь из-за замены Char/String на AnsiChar/AnsiString), то старые файлы из include/pascal останутся без изменений, чтобы старые проекты пользователей могли собраться без изменений.

При этом для новых проектов версия из include/pascal2 рекомендуемая, так как работает как под Delphi7, так и под XE