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


не понятна работа буфера (L783)

Вы не вошли.

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

Антон
03.02.2011 15:21:49
#1

Гость

не понятна работа буфера (L783)

Добрый день!
Что-то не понимаю как работать с кольцевым буфером...
Делаю по аналогии с примерами, вопросы в коментариях

const
  FIFO = 1024;
  IrqStep = 1024;
  pages = 128;
type
  WA = array [0..1048576] of SHORT;
  PWA = ^WA;
var
  data:PWA;
  sync:PULONG;
  buffsize : ULONG;
 
//--------------- Настраиваем плату для сбора и запускаем сбор
    buffsize := 1024*1024;

    if (pLDev.RequestBufferStream(buffsize, L_STREAM_ADC) = L_ERROR) then Log.Add(llTRACE, //' RequestBufferStream//');
    // Выделяеться запрошенный 1М слов

    ap.t1.s_Type := L_ADC_PARAM;
    ap.t1.AutoInit := 1;
    ap.t1.dRate := 20;
    ap.t1.dKadr := 0.0;
    ap.t1.dScale := 0;
    ap.t1.SynchroType := 3;
    ap.t1.SynchroSensitivity := 0;
    ap.t1.SynchroMode := 0;
    ap.t1.AdChannel := 0;
    ap.t1.AdPorog := 0;
    ap.t1.NCh := 4;
    ap.t1.Chn[0] := $0;
    ap.t1.Chn[1] := $1;
    ap.t1.Chn[2] := $2;
    ap.t1.Chn[3] := $3;
    ap.t1.FIFO := FIFO;
    ap.t1.IrqStep := IrqStep;
    ap.t1.Pages := pages;
    ap.t1.IrqEna := 1;
    ap.t1.AdcEna := 1;

    if (pLDev.FillDAQparameters(ap.t1) = L_ERROR) then Log.Add(llTRACE, //' FillDAQparameters//');

    if (pLDev.SetParametersStream(ap.t1, buffsize, data, sync, L_STREAM_ADC) = L_ERROR) then Log.Add(llTRACE, //' SetParametersStream//');
    // buffsize- переменная, в которой будет возвращено количество реально используемой памяти (в отсчетах АЦП); - Это как? возвращается 128К.
    // как это связать с количеством каналов?
   
    Collect := true;
    if (pLDev.InitStartLDevice = L_ERROR) then Log.Add(llTRACE, //' InitStartLDevice//');
    if (pLDev.StartLDevice = L_ERROR) then Log.Add(llTRACE, //' StartLDevice//');
    DataCollectThreat := TDataCollectThreat.Create(false);
//---------------
 
procedure TDataCollectThreat.Execute; 
  halfbuffer := IrqStep * pages div 2;             // Собираем половинками кольцевого буфера
  tds := TStringList.Create;
  while(frmMain.Collect) do                       
  begin
    if(sync^ <= halfbuffer) then // Текушая половина буфера - первая
    begin
      while((sync^ <= halfbuffer) AND frmMain.Collect) do Sleep(0);
      fl1 := 0; // Текушая половиной стала вторая, первая заполнена, в из нее будем считывать
    end else // Текушая половина буфера - первая
    begin
      while((sync^ > halfbuffer) AND frmMain.Collect) do Sleep(0);
      fl1 := 1; // Текушей половиной стала первая, вторая заполнена, в из нее будем считывать
    end;

    k := halfbuffer * fl1; // начало половины буфера
    if(frmMain.Collect) then for j := 0 to ((halfbuffer div 4) - 1) do
    begin
      //считываем 4 числа, так как 4 канала
      S := IntToStr(data[k]) + #9 + IntToStr(data[k + 1]) + #9 + IntToStr(data[k + 2]) + #9 + IntToStr(data[k + 3]);
      tds.Add(S);
      k := k + 4;
    end;

    Sleep(0);
  end;
end;

Программа работает, но принимает только четверть данных - например за 10 сек при 20кГц должно быть 200К(по четыре слова), а получаем 50К.
Возникает вопрос - как заполняется кольцевой буфер?

03.02.2011 15:52:42
#2

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

Re: не понятна работа буфера (L783)

размер используемой части буфера pages*IrqStep отсчетов. с количестовм каналов в принципе не обязательно связывать. Буфер заполнянется циклически пока не остановят...

Антон
03.02.2011 15:58:59
#3

Гость

Re: не понятна работа буфера (L783)

а отсчет = N слов (где N - число каналов)?
если считать отсчет = слово, то принимаем только четверть данных

04.02.2011 11:33:07
#4

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

Re: не понятна работа буфера (L783)

отсчет - слово, N отсчетов - кадр. В данном случае опрашивается 4 канала с общей частотой 20кГц, те 5 кГц на канал...