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


Вопрос по L791

Вы не вошли.

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

Александр
21.10.2011 13:46:25
#1

Гость

Вопрос по L791

Здравствуйте.Работаю с АЦП L791, собираю данные за промежутки времени с последующим анализом после окончания сбора. Код сбора выглядит следующим образом :
#pragma optimize ("", off)
void LCard791::Run(void)        //поток сбора
{
    Number=0;                   //Cчетчик собранных половинок
    int halfbuffer=(IrqStep*pages)/2;
    while (collect)
        {
            if (sync[I_ADC_PCI_COUNT_L791]<=halfbuffer)
             {
                while ((sync[I_ADC_PCI_COUNT_L791]<=halfbuffer)&&collect) Sleep(0);
                fl1=0;
             }
             else
             {
                 while ((sync[I_ADC_PCI_COUNT_L791]>halfbuffer)&&collect) Sleep(0);
                 fl1=1;
             }
             k=halfbuffer*fl1;
             memcpy( &Base[halfbuffer*Number+1], &data[k], sizeof(ULONG)*halfbuffer );//Скопировали половинку
             Number++;
        }
    Index=halfbuffer*Number;              //всего данных
}

Код отлично работает. Сейчас появилась задача в реальном времени работать с собранными данными, причем анализ должен быть очень быстрым., и вот сдесь возникла проблема, не могу осмыслить как это сделать?Копировать половинку в свой буфер и сразу обрабатывать?
Так же хотелось бы узнать как у вас организован алгоритм вывода сигнала в LGraph 2, возможно ли сделать подобное в  С++ Builder т.к. Chart насколько я знаю не умеет отрисовывать так быстро...

21.10.2011 18:22:00
#2

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

Re: Вопрос по L791

В принципе да, идея двойной буферизации как раз в этом. Обработка, однако, должна занимать время заведомо меньше (с запасом), чем время сбора очередной порции данных.
Если возможны однократные аномальные задержки - можно сделать боооольшой кольцевой буфер второго уровня и копировать в него. Но, естественно, _в среднем_ обработка все равно должна быть быстрее сбора данных.

Александр
24.10.2011 05:10:55
#3

Гость

Re: Вопрос по L791

Cкажите, как в LGraph 2 производится вывод данных на график?Неужели выводится каждый data[i],й элемент? Ведь на отрисовку точки на графике нужно много времени, или среда в которой разрабатывалась программа обладает такими возможностями?

Александр
25.10.2011 08:18:37
#4

Гость

Re: Вопрос по L791

Скажите пожалуйста, я правильно понял что при потоковом считывании я не могу сделать половинку буфера меньше 65 536 ?Просто передо мной стоит задача анализировать данные с 16ти каналов каждые 0.83 секунды , а при 1кГЦ на канал половинка собирается намного дольше. Вот не могу найти выход из ситуации, может я что то не до конца понимаю по особенностям в работе с платой?

25.10.2011 09:47:39
#5

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

Re: Вопрос по L791

анализируйте куски меньше половинки.

Александр
25.10.2011 09:50:08
#6

Гость

Re: Вопрос по L791

Хммм, тоесть копировать в свой буфер за несколько заходов 1/4 половинки например, а не всей половинкой?это впринцепи идея))Спасибо

25.10.2011 09:58:54
#7

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

Re: Вопрос по L791

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

Александр
28.10.2011 12:27:32
#8

Гость

Re: Вопрос по L791

В алгоритме (1й пост) я начинаю копировать лиш когда заполнится половинка буфера,а как мне сделать условие заполнения 1/8 буфера например? думаю sync[I_ADC_PCI_COUNT_L791/4] < halfbuffer/4 не как не сканает...

Александр
28.10.2011 13:38:50
#9

Гость

Re: Вопрос по L791

Извиняюсь бред написал в предыдущем посте, вроде понял что да как)))