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


Опрос цифровых и аналог. каналов в разных потоках

Вы не вошли.

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

Алексей
03.10.2012 08:24:26
#1

Гость

Опрос цифровых и аналог. каналов в разных потоках

Здравствуйте.
Использую Е440 или L783M.
Не будет ли ошибки опрашивать цифровые(через pI->IoAsync(&pp)) и аналоговые(после pI->StartLDevice() с циклическим заполнением буфера без синхронизации) каналы в разных потоках?

03.10.2012 10:56:08
#2

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Опрос цифровых и аналог. каналов в разных потоках

не будет

Алексей
26.10.2012 12:52:20
#3

Гость

Re: Опрос цифровых и аналог. каналов в разных потоках

Еще раз здравствуйте.
Поясните в чем может быть проблема:
АЦП Е14-440.
Запускаю сбор данных аналоговых каналов:
pI->InitStartLDevice();
pI->StartLDevice();

после этого опрашиваю так же цифровые каналы:
ASYNC_PAR pp;
pp.s_Type = L_ASYNC_TTL_OUT;
pp.Data[0] = Value;
pI->IoAsync(&pp);

и сразу после этого

ASYNC_PAR pp;
pp.s_Type = L_ASYNC_TTL_INP;
pp.Data[0] = 1;
pI->IoAsync(&pp);
return pp.Data[0];

при частоте опроса аналоговых каналов = 1кГц вроди бы все нормально, но если ставлю например 160кГц, то программа зависает при опросе цифровых каналов.

Если например закомментировать строчки pI->IoAsync(&pp);
то все нормально, или если не запускать сбор аналоговых каналов, тоже все нормально.

все тоже самое с L783M работает нормально.

так задаю параметры АЦП:

ULONG tm = 32; 
pI->RequestBufferStream(&tm,L_STREAM_ADC);

adcPar.t1.s_Type = L_ADC_PARAM;
adcPar.t1.AutoInit = 1;
adcPar.t1.dRate = 160.0;
adcPar.t1.dKadr = 0.0;
adcPar.t1.dScale = 0;
if (SelectBoard == ibL783M) {
   adcPar.t1.SynchroType = 3;
}
else if (SelectBoard == ibE440) {
   adcPar.t1.SynchroType = 0;
}
adcPar.t1.SynchroSensitivity = 0;
adcPar.t1.SynchroMode = 0;
adcPar.t1.AdChannel = 0;
adcPar.t1.AdPorog = 0;
adcPar.t1.NCh = 16;
for(WORD i=0; i < 16; i++) adcPar.t1.Chn[i] = i;
adcPar.t1.FIFO     = 32;
adcPar.t1.IrqStep = 32;
adcPar.t1.Pages = 1;
adcPar.t1.IrqEna = 1;
adcPar.t1.AdcEna = 1;

pI->FillDAQparameters(&adcPar.t1);
pI->SetParametersStream(&adcPar.t1, &tm, (void **)&data, (void **)&sync,L_STREAM_ADC);

pI->EnableCorrection(1);

26.10.2012 13:06:33
#4

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Опрос цифровых и аналог. каналов в разных потоках

Что значит зависает? перестают идти данные с АЦП ?(типа счетчик заполнения встает?)

Алексей
26.10.2012 14:23:03
#5

Гость

Re: Опрос цифровых и аналог. каналов в разных потоках

просто замирает при вызове функции pI->IoAsync(&pp);

Алексей
26.10.2012 14:23:24
#6

Гость

Re: Опрос цифровых и аналог. каналов в разных потоках

пока АЦП из компьютера не выдернешь, все висит

26.10.2012 16:37:36
#7

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Опрос цифровых и аналог. каналов в разных потоках

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

Алексей
29.10.2012 09:01:24
#8

Гость

Re: Опрос цифровых и аналог. каналов в разных потоках

Взял пример из
C:/Program Files/L-Card/LIBRARY/l7xx.dpr

На форму добавил таймер и код:

procedure TForm1.Timer2Timer(Sender: TObject);
var pp:ASYNC_PAR;
begin
    pp.s_Type := L_ASYNC_TTL_OUT;
    pp.Data[0] := $A525;
    pLDev.IoAsync(pp);

    pp.s_Type := L_ASYNC_TTL_INP;
    pp.Data[0] := 1;
    pLDEv.IoAsync(pp);

    Label1.Caption := IntToStr(GetTickCount())+/': /' + IntToStr(pp.Data[0]);
end;

программа зависает примерно через 30сек
если при инициализации изменить размер буфера  FIFO:

ap.t1.FIFO := 32;
ap.t1.IrqStep := 32;
ap.t1.Pages := 1;

то зависает через 5-10 сек.

Алексей
29.10.2012 09:02:08
#9

Гость

Re: Опрос цифровых и аналог. каналов в разных потоках

а еще... тоже самое под WinXP работает нормально, глюк только в Win7

Алексей
29.10.2012 09:13:34
#10

Гость

Re: Опрос цифровых и аналог. каналов в разных потоках

ну еще в проекте примера изменил частоту опроса:
ap.t1.dRate := 400.0;
потому что при меньшей частоте дольше ждать зависания

29.10.2012 10:34:13
#11

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Опрос цифровых и аналог. каналов в разных потоках

с такими размерами fifo и irqstep работать не должно в принципе. 1024 минимум наверное... для usb 4096 и более

29.10.2012 10:35:04
#12

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Опрос цифровых и аналог. каналов в разных потоках

ну и страничек pages больше нужно...

Алексей
29.10.2012 11:14:32
#13

Гость

Re: Опрос цифровых и аналог. каналов в разных потоках

так:
ap.t1.FIFO := 4096;
ap.t1.IrqStep := 4096;
ap.t1.Pages := 32;

тоже зависает при:
ap.t1.dRate := 400.0;

Вы скажите какие параметры выставить чтобы просто не зависало.
так нормально?:

ap.t1.FIFO := 4096;
ap.t1.IrqStep := 4096;
ap.t1.Pages := 32;

ap.t1.dRate := 160.0;

29.10.2012 12:13:19
#14

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Опрос цифровых и аналог. каналов в разных потоках

а во втором случае не зависает? если да, то в первом поднять до 8192 или 16384...

Алексей
29.10.2012 12:42:39
#15

Гость

Re: Опрос цифровых и аналог. каналов в разных потоках

вот так:
ap.t1.FIFO := 4096;
ap.t1.IrqStep := 4096;
ap.t1.Pages := 32;
ap.t1.dRate := 160.0;

проработало дольше(2-3 минуты) и потом зависло

Алексей
29.10.2012 13:32:15
#16

Гость

Re: Опрос цифровых и аналог. каналов в разных потоках

вот так проработало еще дольше(больше 10 минут):
ap.t1.FIFO := 8192;
ap.t1.IrqStep := 8192;
ap.t1.Pages := 32;
ap.t1.dRate := 160.0;

но в итоге все равно зависло

29.10.2012 14:31:45
#17

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Опрос цифровых и аналог. каналов в разных потоках

так что всеж таки зависает? какой тред? сбор повиснуть не может тк он счетчик отслеживает просто. те в примере он можетолько в бесконечный цикл войти...

Алексей
29.10.2012 14:58:47
#18

Гость

Re: Опрос цифровых и аналог. каналов в разных потоках

Вы можете у себя открыть проект
.../L-Card/LIBRARY/l7xx.dpr

поставить частоту опроса
ap.t1.dRate := 400.0;

кинуть на форму TTimer, TTimer.Interval=10 и на OnTimer прописать код:
procedure TForm1.Timer2Timer(Sender: TObject);
var pp:ASYNC_PAR;
begin
    pp.s_Type := L_ASYNC_TTL_OUT;
    pp.Data[0] := $A525;
    pLDev.IoAsync(pp);

    pp.s_Type := L_ASYNC_TTL_INP;
    pp.Data[0] := 1;
    pLDEv.IoAsync(pp);

Label1.Caption := IntToStr(trunc(GetTickCount()/1000.0))+/': /' + IntToStr(pp.Data[0]);
end;

и сразу увидите где и что зависает.
Я уже и 100кГц пробовал, работает дольше но в итоге зависает. На WinXP тоже самое работает.

Алексей
29.10.2012 15:33:59
#19

Гость

Re: Опрос цифровых и аналог. каналов в разных потоках

даже так зависает:
ap.t1.dRate := 100.0;
ap.t1.FIFO := 32768;
ap.t1.IrqStep := 32768;
ap.t1.Pages := 32;

причем может и 10 минут отработать нормально, но потом мышкой начинаешь возить и через минуту зависает.
Пускай он мне старые данные выдает или с пропусками или с ошибкой возвращается, но зависание вообще не приемлемо!

29.10.2012 15:41:18
#20

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Опрос цифровых и аналог. каналов в разных потоках

У меня такой код

(этот как в примере 1000)
procedure TForm1.Timer1Timer(Sender: TObject);
var
  pp:ASYNC_PAR;

begin
   if((data<>NIL) and (sync<>NIL)) then
      Memo1.Lines.Add(/'Sync: /'+IntToStr(sync^) + /' /' +IntToStr(data[0])+/' /' +IntToStr(data[128])+/' /' +IntToStr(data[1024]));

   pp.s_Type := L_ASYNC_TTL_INP;
   pp.Data[0] := 1;
   pLDEv.IoAsync(pp);

   Memo1.Lines.Add(/'/');
   Memo1.Lines.Add(/'IoAsync call/');
   Memo1.Lines.Add(/'Data[0] - /'+IntToStr(pp.Data[0]));

end;

(этот 10)
procedure TForm1.Timer2Timer(Sender: TObject);
var
  pp:ASYNC_PAR;
begin

   pp.s_Type := L_ASYNC_TTL_OUT;
   pp.Data[0] := $A525;
   pLDev.IoAsync(pp);

   pp.s_Type := L_ASYNC_TTL_INP;
   pp.Data[0] := 1;
   pLDEv.IoAsync(pp);

//   Memo1.Lines.Add(/'/');
//   Memo1.Lines.Add(/'IoAsync call/');
//   Memo1.Lines.Add(/'Data[0] - /'+IntToStr(pp.Data[0]));
end;

не зависает. те в Memol печатает живой счетчик и светодиодом моргает модуль. Windows 7 32bit. Turbo Delphi 2006.

Алексей
29.10.2012 15:44:43
#21

Гость

Re: Опрос цифровых и аналог. каналов в разных потоках

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

29.10.2012 15:53:48
#22

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Опрос цифровых и аналог. каналов в разных потоках

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

Алексей
30.10.2012 08:03:23
#23

Гость

Re: Опрос цифровых и аналог. каналов в разных потоках

ну я не знаю... я пробовал менять АЦП, менял шнуры подключения к компьютеру.
вот с такими параметрами:

ap.t1.dRate := 400.0;
ap.t1.FIFO := 4096;
ap.t1.IrqStep := 4096;
ap.t1.Pages := 32;

На 2-х компьютерах с XP все работает нормально.
На компьютере с Win7 32bit зависает напроч через 1-5 минут работы.
На ноутбуке(lenovo) с Win7 32bit примерно раз в минуту подвисает на 5-15 секунд но потом продолжает опрос.
На ноутбуке(sumsung) с Win7 64bit зависает напроч примерно через 5-10 минут работы.

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

Подскажите хоть какое-нибудь решение.

Алексей
30.10.2012 10:04:47
#24

Гость

Re: Опрос цифровых и аналог. каналов в разных потоках

Ладно...
Пока сделал через одиночные опросы аналоговых каналов функцией:

pI->IoAsync(&pp);

но частота не более 1 кГц, совсем не хорошо...
Возможно придется отказаться от Е14-440

30.10.2012 10:54:34
#25

Сотрудник "Л Кард"
Откуда: Москва
Здесь с 23.04.2014
Сообщений: 3,727

Re: Опрос цифровых и аналог. каналов в разных потоках

Пример зависает с тамймерами как я привел? Каой даты биос грузится в плату и какой серийный номер платы?

Контакты

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

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

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

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