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


Проблема с функцией ReadData для E14-440

Вы не вошли.

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

Vitaly
03.02.2006 13:01:41
#1

Гость

Проблема с функцией ReadData для E14-440

Написал CIN для LabVIEW, который должен осуществлять синхронное считывание данных. При запуске в LabVIEW требуемое количество данных с нужных каналов АЦП возвращается, но обнаружилась следующая проблема. Задержка при считывании данных как то не пропорционально зависит от количества получаемых данных. К примеру, если выбрать 3 канал АЦП с частотой выборки 200 кГц и межканальной задержкой 0,01 мс, то на один кадр измерения тратится в теории 0,02 мс. При запуске считывания с такими параметрами получаются следующие результаты ( в скобках теоретические задержки):
320 точек - 138 мс (6,4 мс)
3200 точек - 142 мс (64 мс)
32000 точек - 862 мс (640 мс)
320000 точек - 11247 мс (6400 мс)
Данное поведение нормально (задержка почти в 2 раза превышает теоретические оценки)? Или как то с этим можно побороться?
Если нужно, то полный код CINа ниже:
CIN MgErr CINRun(uInt32 *hInst, TD1Hdl Channel, TD1Hdl Gain, uInt32 *Length, TD2Hdl Data, event *pars, uInt32 *ErrCode)
{
    *ErrCode = 0;
    DWORD TimeOut;

    if((*Channel)->dimSize!=(*Gain)->dimSize) {
        *ErrCode = 1;
        return noErr;
    };
    if((*Length<32)||(*Length>1024*1024)) {
        *ErrCode = 5;
        return noErr;
    };
    pars->PointsToRead = (*Length)*(*Channel)->dimSize;
    NumericArrayResize(iW, 1L, (UHandle*)&Data,pars->PointsToRead);
    (*Data)->dimSize = pars->PointsToRead;

    pars->ReadEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
    if(pars->ReadEvent == NULL) {
        *ErrCode = 2;
        return noErr;
    };
    memset(&(pars->ReadOv), 0, sizeof(OVERLAPPED));
    pars->ReadOv.hEvent = pars->ReadEvent;
    pars->BytesTransferred = 0;
   

    if(!WSTART_ADC(*hInst)) {
        *ErrCode = 3;
        return noErr;
    };

   if(!WReadData(*hInst, (*Data)->arg1, &(pars->PointsToRead), &(pars->BytesTransferred), &(pars->ReadOv)))  {
       if(GetLastError() != ERROR_IO_PENDING) {
           *ErrCode = 4;
           return noErr;
       };
   };
   while(WaitForSingleObject(pars->ReadEvent, 0) != WAIT_OBJECT_0) {
       Sleep(100);
   };
 
   CloseHandle(pars->ReadEvent);
   WSTOP_ADC(*hInst);
    *ErrCode = 0;
    return noErr;
}

Александр
03.02.2006 15:27:37
#2

Гость

Re: Проблема с функцией ReadData для E14-440

Пришлите,пожалуйста, кусок кода, где Вы заполняете ControlTable[]. Немного не понятно, что есть "выбрать 3 канал АЦП". Вы используете три физ. канала? Или только один канал, третий? Это задается при формировании ControlTable[], поэтому, чтобы оценить, есть ли ошибка при теоретическом расчете задержки, необходимо посмотреть, как Вы конфигурируете каналы.

Наблюдатель
03.02.2006 17:57:52
#3

Гость

Re: Проблема с функцией ReadData для E14-440

"3 канал АЦП" - эт понятно, очепятка, надо читать 3 канала.
А вот чем меряется реальная задержка при считывании данных ?? - эт вопрос ...