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


Форум

Вы не вошли.

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

#1 Re: Техническая поддержка и выбор оборудования » E14-140M Режим покадровой синхронизации » 12.05.2014 14:26:23

Не пойму как отредактировать сообщения. В общем ошибка была в том, что для динамического массива при использовании WinAPI ReadFile нужна ссылка на его начало, в данном примере Buf[ind][0], ну и правильное определение его величины в байтах для передачи в функцию.

#2 Re: Техническая поддержка и выбор оборудования » E14-140M Режим покадровой синхронизации » 12.05.2014 14:04:47

Так, если приемный буфер объявить статическим массивом, то ошибки нет. Значит дело в ReadFile, но проявляется позднее из-за асинхронности.

#3 Re: Техническая поддержка и выбор оборудования » E14-140M Режим покадровой синхронизации » 12.05.2014 13:57:32

Да, ранее со всеми инициализациями MdlHandle := pModule.GetModuleHandle(); Эту часть кода я с примера вашего взял и почти не трогал. Возвращает валидное значение. Все то же с использованием ReadData работает. Скорее всего как всегда какая-нибудь глупость, но пока я ее не найду.

#4 Re: Техническая поддержка и выбор оборудования » E14-140M Режим покадровой синхронизации » 12.05.2014 12:37:40

procedure Test;
var hEvent  : array[0..1] of THandle;
  	ov      : array[0..1] of Overlapped;
    ReadRes : boolean;
    LastErr : cardinal;
    wasReadBytes : DWORD;
    I : integer;
    RB: cardinal;
    yRes: LongBool;
    Buf : array[0..1] of array of SHORT;
begin
	for I := 0 to 1 do
    begin
        SetLength(Buf[I], DataStep);
        ZeroMemory(Buf[I], DataStep*2);
        hEvent[I] := CreateEvent(NIL, True , False, NIL);
    end;
    if NOT pModule.STOP_ADC then exit;

    ZeroMemory(@ov[0], SizeOf(Overlapped));
    ov[0].hEvent := hEvent[0];
    ReadRes := ReadFile(MdlHandle, Buf[0], SizeOf(Buf[0]), wasReadBytes, @ov[0]);
    LastErr := GetLastError;
    if (ReadRes = False) and (LastErr <> ERROR_IO_PENDING) then
    begin
        Log('Bad 1');
    end;

    if pModule.START_ADC then
    begin
        ZeroMemory(@ov[1], SizeOf(Overlapped));
        ov[1].hEvent := hEvent[1];

        ReadRes := ReadFile(MdlHandle, Buf[1], SizeOf(Buf[1]), wasReadBytes, @ov[1]);
        LastErr := GetLastError;
        if (ReadRes = False) and (LastErr <> ERROR_IO_PENDING) then
        begin
            Log('Bad 2');
        end;

        WaitForSingleObject(ov[0].hEvent, Infinite);                   

        RB := 0;
        yRes := GetOverlappedResult(MdlHandle, ov[0], RB, True);

        if NOT yRes then
        begin
            Log(GetLastErrorText);
        end;
        if RB = 0 then ;
    end;
end;

Вот такой последовательный прогон с указанной ошибкой. Не в потоке.

#5 Re: Техническая поддержка и выбор оборудования » E14-140M Режим покадровой синхронизации » 12.05.2014 12:03:31

Да, при первом же вызове. Согласно идеологии, я делаю массив из двух Overlapped структур, двух приемных массивов, создаю и назначаю сигнальные события. До старта АЦП выполняю сначала Стоп, согласно рекомендаций, затем первый асинхронный запрос, первой структурой Overlapped, потом старт АЦП, выполняю второй асинхронный запрос второй структурой, жду события из первой структуры, дожидаюсь, GetOverlappedResult дает указанную ошибку. Значение lpNumberOfBytesTransferred возвращается 0, так же как и буфер в ReadFile тоже нулевой.

unidir.cpp работает, я собственно на нее и смотрел, когда кодил. Сейчас попробую сделать без потока, но вряд ли в этом дело.

#6 Re: Техническая поддержка и выбор оборудования » E14-140M Режим покадровой синхронизации » 10.05.2014 14:01:02

Александр, спасибо за ссылки. С таким подробным разбором трудно что-то не понять. Пытаюсь реализовать через ReadFile-WaitFor-GetOverlappedResult. По каким-то неясным для меня причинам, чтения не производится. Запускаем ReadFile, она возвращает False, но при этом  имеем нормальный ERROR_IO_PENDING. Нормально дожидаемся сигнального события структуры Overlapped. А вот GetOverlappedResult дает ошибку 31 (ERROR_GEN_FAILURE). Но с оборудованием все в порядке, тут же при использовании ReadData все работает. Где рыться? С событиям, индексами вроде в не напутал ничего.

#7 Re: Техническая поддержка и выбор оборудования » E14-140M Режим покадровой синхронизации » 06.05.2014 11:21:40

Снова здравствуйте, буду продолжать писать здесь.

Привожу код из примера на Делфи ReadData.

// ожидание выполнение очередного запроса на сбор данных
//if not WaitingForRequestCompleted(IoReq[RequestNumber xor $1].Overlapped^) then break;
if not WaitForSingleObject(IoReq[RequestNumber xor $1].Overlapped.hEvent, IoReq[RequestNumber xor $1].TimeOut) = WAIT_TIMEOUT then 
begin 
ReadThreadErrorNumber := $03; 
break; 
end;

Приведены два варианта ожидания следующей порции, через свою функцию WaitingForRequestCompleted, которая в свою очередь использует стандартную GetOverlappedResult и просто через системную функцию ожидания. Первый вариант закомментен.
Так вот, мне кажется во втором случае NOT явно лишний, мы ведь ждем WAIT_OBJECT_0 при нормальном раскладе, так? Получается код как-то работает, но с ним мы никогда не сможем обработать WAIT_TIMEOUT. Или я чего-то не правильно понимаю? И кстати, как лучше все-таки работать, по первому или по второму варианту в плане надежности?

#8 Re: Техническая поддержка и выбор оборудования » E14-140M Режим покадровой синхронизации » 25.04.2014 07:58:14

Получается да, все это специфика внутреннего устройства ЛГраф. После экспорта данных и просмотра их посредством стороннего ПО все становится нормальным.

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

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

#9 Re: Техническая поддержка и выбор оборудования » E14-140M Режим покадровой синхронизации » 24.04.2014 16:19:04

В каком смысле? Допустим, 500 кадров соберется за сколько физических секунд?

500 кадров собирается (примерно)
- 10сек на частоте 1кГц,
- 20сек на частоте 2кГц.
- 100сек на 10кГц
- 6 сек на 0.2кГц

От числа каналов данное время сбора не зависит.

#10 Re: Техническая поддержка и выбор оборудования » E14-140M Режим покадровой синхронизации » 24.04.2014 15:12:32

Александр Е пишет:
Mikhin пишет:

Число отсчетов зависит от частоты АЦП, хотя не должно.

У меня идея. Кажется, дело просто в том, что под "собрать сигнал на N секунд" LGraph2 подразумевает "собрать N * Fs отсчетов", где Fs - частота дискретизации АЦП. При покадровой синхронизации это, конечно, не настоящие секунды, что и правда сбивает с толку.
Но можно длину сбора задавать не в секундах, а в кадрах, так путаницы меньше.

В режиме без синхронизации все логично, я говорю собрать 3 секунды, он собирает их именно 3 секунды, отображает в 3-х секундном окне, от частоты АЦП зависит детальность оцифровки. При покадровой да, частота как-то влияет, но если я ставлю число кадров, а не число секунд, ничего не меняется в результате.

#11 Re: Техническая поддержка и выбор оборудования » E14-140M Режим покадровой синхронизации » 24.04.2014 14:53:47

1. Генератор на микроконтроллере (Attiny) запитан от контактов GND и +5В разъема Digital (контакты 36 и 37). Провод одиночный длинной 30см.
2. 0 и +5 (из единицы падает в ноль), длительной фронта 15нс. Да, 300мкс
3. Ну собственно земля модуля и является землей источника синхросигнала, поскольку питание идет от самого модуля.

#12 Re: Техническая поддержка и выбор оборудования » E14-140M Режим покадровой синхронизации » 24.04.2014 13:44:15

Спасибо за ответы, но у меня по прежнему какая-то ерунда творится. Я конечно пробовал и в ЛГраф2, у меня ровно тоже выходит. Если я использую режим "без синхронизации", то все нормально и логично. В нужном мне режиме нет. Число отсчетов зависит от частоты АЦП, хотя не должно. Я уже грешу на сами эти синхроимпульсы, но там вроде все нормально. Вот выложу заголовки файлов экспорта для двух случаев с частотой 1КГц и 0.2КГц. Интервал сбора в обоих случаях задан в опциях в секундах (3сек).

----------------------------------------------------------------
Oscilloscope Data File
Experiment Time :   24-04-2014 14:33:09
Number of frames: 3000

Module: E-14-140M (1D899062)

Number Of Channels : 1
Input Rate In kHz: 1.000000
Input Time In Sec: 3.000000
Decimation: 1
Data Format: ADC codes
Segments: 1
Data as Time Sequence:
    Ch  1  
 Канал 1   
-----------------------------------------------------------------

Oscilloscope Data File
Experiment Time :   24-04-2014 14:19:10
Number of frames: 599

Module: E-14-140M (1D899062)

Number Of Channels : 1
Input Rate In kHz: 0.199900
Input Time In Sec: 2.996497
Decimation: 1
Data Format: ADC codes
Segments: 1
Data as Time Sequence:
    Ch  1  
 Канал 1   
-------------------------------------------------------

Если следовать логике работы алгоритма, то при моей частоте синхроимпульсов в 100Гц, должно быть 300 кадров за 3 секунды. Поскольку у меня здесь 1 канал, то и 300 отсчетов. Я вообще ничего не понимаю. У меня что-то не так с синхроимпульсами?

#13 Re: Техническая поддержка и выбор оборудования » E14-140M Режим покадровой синхронизации » 23.04.2014 10:10:22

Прилеплю два скрина с разными параметрами частоты АЦП (ну и какая галка там тоже видно). Во вкладке синхронизации установлена "покадровая синхронизация". Сбора при частоте АЦП 0.2КГц я ждал примерно 16сек, для 1КГц более минуты. Разумеется 100КГц и не пытался дождаться. Примерно на 4-й секунде после запуска в обоих случаях был сгенерирован похожий сигнал, который виден на графике. В общем что-то работает не так.

1.jpeg
2.jpeg

Я уже начал программировать и первые результаты обнадеживают. Устанавливаю структуру так:

ap.ClkSource := INT_ADC_CLOCK_E140;
ap.EnableClkOutput := ADC_CLOCK_TRANS_DISABLED_E140;
ap.InputMode := TTL_KADR_SYNC_E140;
for I := 0 to (ap.ChannelsQuantity-1) do
    ap.ControlTable I] := (I or (1 shl $5) or (InputRange shl $6));
ap.AdcRate := AdcRate;
ap.InterKadrDelay := 0.0;

Мне требуется оцифровывать каналы с общей землей и поэтому записываю в 5-й байт каждого канала единичку (это корректно так как у меня здесь?) Пока только начал работать, но в данном раскладе попробовал изменять AdsRate и получаю одинаковое число отсчетов за одинаковый период сбора, независимо от этой частоты, что для 100КГц, что для 1КГц к примеру. А это так и должно быть, ибо это частота собирания кадра, а сами кадры стробируются внешними синхроимпульсами требуемой частоты. Сами собираемые данные пока не смотрел.

В общем получается, что в LGraph что-то не так работает или я что-то не так настраиваю.

#14 Re: Техническая поддержка и выбор оборудования » E14-140M Режим покадровой синхронизации » 22.04.2014 17:48:35

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

#16 Re: Техническая поддержка и выбор оборудования » E14-140M Режим покадровой синхронизации » 21.04.2014 14:48:30

Нет, каждый отсчет каждого канала с синхронизацией нам не требуется, для нашего достаточно медленного сигнала считаем преобразование для N каналов по одному синхроимпульсу "одновременным", хотя конечно понятно, что 1-й и N-й канал будут оцифрованы с некоторым смещением, тем меньшим, чем выше частота АЦП.

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

Если вернуться к моим экспериментам с программой Л-Граф. Для простоты я беру один канал, остальные выключаю. Развертку ставлю 1сек/деление, у меня получается 8 секунд все окно. Если выставляю "покадровая синхронизация", то во временной развертке у меня остается активным только поле "частота АЦП", "межкадровая задержка" и "частота кадра" становятся вот такими "?????", т.е их не имеет смысла устанавливать и это верно по идеологии работы данного алгоритма.

Для моей частоты синхроимпульса в 100Гц и одного канала я ожидаю увидеть 100 отсчетов/сек или 800 отсчетов за 8 секундное окно. И это не должно зависеть от установки частоты АЦП, ведь так? А по факту зависит, чем выше я ставлю эту частоту, тем дольше у меня накапливается это окно в 8 секунд, поскольку увеличивается число отсчетов вместе с повышением частоты АЦП. При этом, если убрать галку "автозапуск", то по ручному старту кнопкой, получаю лишь один этот 8-ми секундный экран и далее сбор останавливается. Хотя по идее, он должен продолжаться, ибо синхроимпульсы то идут без перерыва. Что не так?

#17 Техническая поддержка и выбор оборудования » E14-140M Режим покадровой синхронизации » 21.04.2014 10:58:05

Mikhin
Ответов: 32

Здравствуйте!

Осваиваем ваш девайс и столкнулись с проблемами. Коротко о сути нашей задачи.

Необходимо оцифровать аналоговый сигнал, но при внешней синхронизации. Согласно описанию, на вход INT аналогового разъема подается синхроимпульс (обратный перепад, размах 5В, длительность порядка 300мкСек). Частота его 100герц. Необходимо получить кадр по поступлению данных синхроимпульсов.

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

Выставляю режим синхронизации "Цифровая покадровая синхронизация". Правильно ли я понимаю, что частота работы АЦП может быть практически любой, но бОльшей чем необходимо для формирования кадра из N каналов? Поскольку наш сигнал весьма медленный, это несложное условие. Т.е. частотой работы АЦП мы устанавливаем скорость формирования кадра, а далее просто происходит простой и ожидание следующего синхроимпульса? Мне нужно получить 100 отсчетов в секунду с нужного числа каналов, согласно частоте синхроимпульсов. Но такое ощущение, что система/программа просто этих импульсов не замечает.

Помогите разобраться.

Контакты

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

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

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

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