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


Асинхронное считывание данных (E14-440, CIN)

Вы не вошли.

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

Виталий
15.09.2008 14:56:06
#1

Гость

Асинхронное считывание данных (E14-440, CIN)

Добрый день!

Никак не получается запустить асинхронное считывание данных в LabVIEW 8.5 на карточке E14-440. До этого не было необходимости в длительном непрерывном считывании данных с карты, поэтому использовал синхронный режим - все работало нормально.
Сейчас пытаюсь составить очередь запросов, но не удается отловить системное событие по завершению считывания очередной порции данных.
Вот есть два CINa (в MS Visual C++ 6.0)
1. CIN MgErr CINRun(uInt32 *ErrCode, uInt32 *Instance, uInt32 *Length, uInt32 *ChannelN, read_pars *rp, TD1Hdl Data)
{
  IO_REQUEST_LUSBAPI IoReq[2];
  DWORD DataStep;
  int i;

  if(*ErrCode!=0) return noErr;

  DataStep = (*Length)*(*ChannelN);
  NumericArrayResize(iW, 1L, (UHandle*)&Data, 2*DataStep);
  (*Data)->dimSize = 2*DataStep;

  rp->hEvent1 = CreateEvent(NULL, FALSE, FALSE, NULL);
  rp->hEvent2 = CreateEvent(NULL, FALSE, FALSE, NULL);

  memset(&(rp->ReadOv1), 0, sizeof(OVERLAPPED));
  memset(&(rp->ReadOv2), 0, sizeof(OVERLAPPED));
 
  rp->ReadOv1.hEvent = rp->hEvent1;
  rp->ReadOv2.hEvent = rp->hEvent2;

  for(i = 0x0; i < 0x2; i++) {
        IoReq[i].Buffer = (*Data)->value + i*DataStep;
        IoReq[i].NumberOfWordsToPass = DataStep;
        IoReq[i].NumberOfWordsPassed = 0x0;
        IoReq[i].Overlapped = (i == 0x0) ? &(rp->ReadOv1) : &(rp->ReadOv2);
        IoReq[i].TimeOut = 1000;
  };
 
  rp->RequestNumber = 0x0;
  rp->NumberOfWordsToPass = DataStep;

  if(!((ILE440*)(*Instance))->STOP_ADC()) {*ErrCode = STOP_ADC_ERROR; return noErr;};
  if(!((ILE440*)(*Instance))->ReadData(&IoReq[0])) {*ErrCode = READ_ERROR; return noErr;};;

  if(!((ILE440*)(*Instance))->START_ADC()) {*ErrCode = START_ADC_ERROR; return noErr;};
  if(!((ILE440*)(*Instance))->ReadData(&IoReq[1])) {*ErrCode = STOP_ADC_ERROR; return noErr;};

  return noErr;
}

2. CIN MgErr CINRun(uInt32 *ErrCode, uInt32 *Instance, TD1Hdl Data, read_pars *rp, uInt8 *ready)
{
    IO_REQUEST_LUSBAPI IoReq;
    HANDLE Module;

    if(*ErrCode!=0) return noErr;
    *ready = 0;
    Module = ((ILE440*)(*Instance))->GetModuleHandle();
    if(WaitForSingleObject(rp->ReadOv1.hEvent, 10000) == WAIT_TIMEOUT) *ready = 1;
    /*if(GetOverlappedResult(Module, &(rp->ReadOv1), &(rp->NumberOfWordsPassed), FALSE)) *ready = 1; */

  return noErr;
}
Первый инициализирует считывание данных, а второй запускается для проверки завершенности очередного считывания (убрал дополнительную обвязку). Так вот при запуске втрого CIN всегда возращается таймаут (параметр ready=1). В случае, когда пытаюсь в цикле опрашивать состояние запроса через GetverlappedResult() событие также не отлавиливается (параметр ready=0). При этом данные из модуля в буфер забираются нормально. В чем может быть дело? Как можно побороть подобное поведение?
P.S. Заметил, что при вызове функции ReadData изменяются поля структуры OVERLAPPED, в частности в поле Internal устанавливается значение 259. Если же делать совсем короткий запрос (исполняется быстрее, чем задержка между вызовом ADC_START() и последующей ReadData()) в поле Internal = 0, а в InternalHigh - NumberOfBytesToPass.
Это нормальное поведение?
P.P.S. Пример на Visual C++ с асинхронным вводом 80 блоков работает нормально.

Виталий
16.09.2008 10:27:40
#2

Гость

Re: Асинхронное считывание данных (E14-440, CIN)

Проблема частично разрешилась. Она была связана с моим непонимании того, как LabVIEW работает с памятью.
Однако сейчас обнаружил следующий факт. Я создаю 2 запроса на считывание данных (2 структуры OVERLAPPED с уникальными идентификаторами событий). Запускаю сбор данных, проходит время необходимое для считывания первой порции данных, функция GetOverlappedResult() возвращает TRUE и я сохраняю отсчеты в файл. Однако при последующем вызове функции GetOverlappedResult(), тоже возращается TRUE однако уже для запроса с другой структурой OVERLAPPED. При этом если следить за полями 2-х структур, то складывается впечатление, что при выполнении первого запроса, почему то изменяются поля и во второй структуре.
С чем это может быть связано?
Вроде, насколько я понимаю, второй запрос не должен начать выполняться до завершения первого, иначе смысл пула из запросов теряется. А очень похоже, что два запроса как-то коррелируют друг с другом. Не могли бы Вы пояснить, как функция ReadData устроена?