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

e2010b feat InitStartLDevice

Вы не вошли.

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

24.10.2014 13:43:27
#1

Участник
Здесь с 24.10.2014
Сообщений: 26

e2010b feat InitStartLDevice

Здравствуйте,

на основе рекомендованного примера l7xx.tst пытаюсь почитать lcard e2010b. Функция InitStartLDevice () завершается с ошибкой (GetLastError: 259). Все предыдущие операции выполняю как в примере - проверял, вроде бы ничего не забыл.

К входам АЦП ничего не подключено.

Пожалуйста подскажите, что я делаю не так.

спасибо за ответ,
с уважением,
С.А.

Приложение:

ULONG *sync, tid;
USHORT complete, *fdata, *data;

USHORT IrqStep = 1024;//777-777%7; // половинка буфера кратная числу каналов
USHORT FIFO = 1024;         //
USHORT pages = 128;
USHORT multi = 4; // - количество половинок кольцевого буфера, которое мы хотим собрать

long fsize;
ULONG WINAPI ServiceThread (PVOID /*Context*/) {...} 

void e2010b_setup (ADC_PAR * adcPar)
    {
    adcPar->t2.s_Type = L_ADC_PARAM;
    adcPar->t2.AutoInit = 1;
    adcPar->t2.dRate = 1000.0;
    adcPar->t2.dKadr = 0.0;
    adcPar->t2.SynchroType = 0x01;
    adcPar->t2.SynchroSrc = 0x00;
    adcPar->t2.AdcIMask = SIG_0|SIG_1|SIG_2|SIG_3;
         
    adcPar->t2.NCh = 2;
    adcPar->t2.Chn[0] = 0x0;
    adcPar->t2.Chn[1] = 0x1;
    adcPar->t2.Chn[2] = 0x2;
    adcPar->t2.Chn[3] = 0x3;
    adcPar->t2.FIFO = 32768;
    adcPar->t2.IrqStep = 32768;
    adcPar->t2.Pages = 32;
    adcPar->t2.IrqEna = 1;
    adcPar->t2.AdcEna = 1;

    adcPar->t2.StartCnt = 0;
    adcPar->t2.StopCnt = 5500;
    adcPar->t2.DM_Ena = 0;
    adcPar->t2.SynchroMode = 0;//A_SYNC_UP_EDGE | CH_0;
    adcPar->t2.AdPorog = 0;

    std::cout << "Pages:             " << adcPar->t2.Pages << std::endl;
    std::cout << "IrqStep:           " << adcPar->t2.IrqStep << std::endl;
    std::cout << "FIFO:              " << adcPar->t2.FIFO << std::endl;
    std::cout << "Rate:              " << adcPar->t2.dRate << std::endl;
    
    adcPar->t2.dRate = 0;

    std::cout << "Pages:             " << adcPar->t2.Pages << std::endl;
    std::cout << "IrqStep:           " << adcPar->t2.IrqStep << std::endl;
    std::cout << "FIFO:              " << adcPar->t2.FIFO << std::endl;
    std::cout << "Rate:              " << adcPar->t2.dRate << std::endl;
    }

int main (int argc, char * argv[])
    {
    HINSTANCE hComponent = ::LoadLibrary (L"lcomp.dll");
    if ( hComponent == NULL )
        return 0;
  
    CREATEFUNCPTR CreateInstance = 
        (CREATEFUNCPTR) ::GetProcAddress (hComponent, "CreateInstance");
        
    LUnknown * pIUnknown = CreateInstance (0);
    if ( pIUnknown == NULL ) {
	std::cout << "-" << GetLastError ();
        return 1; 
	}
        
    IDaqLDevice * pI;
    HRESULT hr = pIUnknown->QueryInterface (IID_ILDEV, (void**)&pI);
    if (! SUCCEEDED (hr)) 
       return 1; 
    
    pIUnknown->Release ();

    // Начало работы с платой
    pI->OpenLDevice ();
    pI->LoadBios ("e2010");
    
    PLATA_DESCR_U2 pd;
    pI->ReadPlataDescr (& pd);
    
    DWORD tm = 10000000;
    pI->RequestBufferStream (&tm, L_STREAM_ADC);
    std::cout << "Allocated memory size(word): " << tm << std::endl;

    ADC_PAR adcPar;   
    e2010b_setup (&adcPar);

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

    IrqStep = adcPar.t2.IrqStep;
    pages = adcPar.t2.Pages;
        
    fsize = multi * (pages / 2) * IrqStep; 
    HANDLE hFile = CreateFile (L"data.dat", GENERIC_READ | GENERIC_WRITE, 
			       FILE_SHARE_WRITE,
                               NULL,
			       CREATE_ALWAYS,
			       FILE_FLAG_RANDOM_ACCESS,
			       NULL);
    if (hFile == INVALID_HANDLE_VALUE) { 
       std::cout << "File open error";
       return -1;
       }

    HANDLE hMap = CreateFileMapping (hFile, NULL, PAGE_READWRITE, 0, 2 * fsize, NULL);
    if (hFile == INVALID_HANDLE_VALUE) { 
       std::cout << "File mapping error";
       return -1;
       }

    fdata = (WORD *) MapViewOfFile (hMap, FILE_MAP_WRITE, 0, 0, 0);
    complete = 0;
    
//  pI->EnableCorrection ();
    pI->InitStartLDevice (); //L_STREAM_ADC);
!!!!!!!!!! ЗДЕСЬ - ОШИБКА 259    std::cout << GetLastError() << std::endl;

//    HANDLE hThread = CreateThread (0, 0x2000, ServiceThread, 0, 0, & tid);
            
   // Запускаем сбор в драйвере
   ULONG status = pI->StartLDevice ();//L_STREAM_ADC);
   std::cout << GetLastError() << std::endl;

   // Печатаем индикатор сбора данных
    while (! complete) {
//        std::cout << GetLastError() << std::endl;
        Sleep(2000
	);
        }

   std::cout << "StartLDevice returned "
             <<  (status ? "TRUE":"FALSE") 
	     << std::endl;

    // Завершение работы
    pI->CloseLDevice ();
    // Закрытие интерфейса
    pI->Release ();
    }
24.10.2014 14:13:18
#2

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

Re: e2010b feat InitStartLDevice

если именно e2010b, то биос грузить нужно e2010m

Sergei Alekseev
24.10.2014 14:55:07
#3

Гость

Re: e2010b feat InitStartLDevice

Здравствуйте,

спасибо за ответы, BIOS поменял на е2010m.pld.

Дальше я провел замеры результатов GetLastError()  для функций InitStartLDevice () и StartLDevice (), получил  соответственно значения 259 и 536870912. При этом обе эти функции возвращают L_SUCCESS (0).

Значит ли это, что они отрабатывают правильно и успешно?

спасибо,
С.А.

24.10.2014 16:18:08
#4

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

Re: e2010b feat InitStartLDevice

если сбор пошел то успешно.

24.10.2014 17:42:51
#5

Участник
Здесь с 24.10.2014
Сообщений: 26

Re: e2010b feat InitStartLDevice

сбор не пошел, программа сваливается в ошибку.

Таким образом я пытался опроверить где находится ее источник - в потоке, который читает буфер или в функциях работы с устройством.

спасибо

27.10.2014 13:01:21
#6

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

Re: e2010b feat InitStartLDevice

Тестовый прмер работает?

Sergey Alexeev
27.10.2014 16:36:14
#7

Гость

Re: e2010b feat InitStartLDevice

Тестовый пример компилируется у меня с ошибками - я его собираю в MinGW. Я проверил сегодня - StartLDevice () завершилась успешно, но сбор не начался.

тестовый примерю сейчас в VisualC

27.10.2014 17:05:23
#8

Участник
Здесь с 24.10.2014
Сообщений: 26

Re: e2010b feat InitStartLDevice

В Visual C++ скомпилировать пример l7xx.tst быстро не удалось.

Запустил версию этого примера, поставляемую вместе с библиотекой из папки Release_md64.  Выглядит так, что похоже не работает. Я сделал скрин с результатов работы, выложил его по ссылке https://yadi.sk/i/JOZBf7PDcKVGo

После настройки сбора данных, создания файла, инициализации LCard, старта записи  буфер

.......... Starting ...
SUCCESS -> CreateFile(data.dat)
SUCCESS -> CreateFileMapping(data.dat)
SUCCESS -> MapViewOfFile(data.dat)
SUCCESS -> InitStartLDevice(ADC)
SUCCESS -> StartLDevice(ADC)

индикатор сбора данных

...........    0
остается неизменным в течение 2 и более минут, затем по нажатию кнопки на клавиатуре, программа может быть остановлена пользователем.

спасибо

28.10.2014 13:19:38
#9

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

Re: e2010b feat InitStartLDevice

Ладно. А если L-Graph2 установить и там попробовать с модулем поработать?

28.10.2014 13:38:35
#10

Участник
Здесь с 24.10.2014
Сообщений: 26

Re: e2010b feat InitStartLDevice

C L-Graph2 я начинал работу с устройством - там все работает.

Может быть, что дело в настройках?

Сначала взял настройки из примера, поставляемого вместе с библиотекой, результат я вчера описал. Сегодня поменял на вот такие:

 
    
    adcPar->t2.s_Type = L_ADC_PARAM;
    adcPar->t2.AutoInit = 1;
    adcPar->t2.dRate = 5000.0;
    adcPar->t2.dKadr = 0.01;
    adcPar->t2.SynchroType = 0x01;
    adcPar->t2.SynchroSrc = 0x00;
    adcPar->t2.AdcIMask = SIG_0|SIG_1|SIG_2|SIG_3;
         
    adcPar->t2.NCh = 4;
    adcPar->t2.Chn[0] = 0x0;
    adcPar->t2.Chn[1] = 0x1;
    adcPar->t2.Chn[2] = 0x2;
    adcPar->t2.Chn[3] = 0x3;
    adcPar->t2.FIFO = 32768;
    adcPar->t2.IrqStep = 32768;
    adcPar->t2.Pages = 32;
    adcPar->t2.IrqEna = 1;
    adcPar->t2.AdcEna = 1;

    adcPar->t2.StartCnt = 0;
    adcPar->t2.StopCnt = 500;
    adcPar->t2.DM_Ena = 1;
    adcPar->t2.SynchroMode = 0;//A_SYNC_UP_EDGE | CH_0;
    adcPar->t2.AdPorog = 1;

результат, тот же,

спасибо

28.10.2014 13:56:24
#11

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

Re: e2010b feat InitStartLDevice

это все по 0
  adcPar->t2.StartCnt = 0;
    adcPar->t2.StopCnt = 0;
    adcPar->t2.DM_Ena = 0;
    adcPar->t2.SynchroMode = 0;//A_SYNC_UP_EDGE | CH_0;
    adcPar->t2.AdPorog = 0

и еще, а сейчас то с Д-Graph2 оно все еще работает? lcomp.exe последний с сайта?

28.10.2014 14:29:29
#12

Участник
Здесь с 24.10.2014
Сообщений: 26

Re: e2010b feat InitStartLDevice

да работает, я испытывал L-Graph 2 вчера вечером перед тем как вам написать (тогда же и выкачал его).

Когда я читаю состояние устройства

    PLATA_DESCR_U2 pd;
    pI->ReadPlataDescr (& pd);
    
    std::cout << "SerNum       " << pd.t6.SerNum  << std::endl
                  << "BrdName      " << pd.t6.BrdName << std::endl
                  << "Rev          " << pd.t6.Rev     << std::endl
                  << "DspType      " << pd.t6.DspType << std::endl
                  << "IsDacPresent " << pd.t6.IsDacPresent  << std::endl
                  << "Quartz       " << pd.t6.Quartz << std::endl;

диод на тыльной стороне корпуса моргает о приеме/передаче.

Далее, после вызова функций

  ULONG status = pI->InitStartLDevice (); //L_STREAM_ADC);
    std::cout << status << " <-> " << GetLastError() << std::endl;
    if (status != L_SUCCESS)
        std::cout << "status: " << status << std::endl;
	
    HANDLE hThread = CreateThread (0, 0x2000, ServiceThread, 0, 0, & tid);
            
   // Запускаем сбор в драйвере
   status = pI->StartLDevice ();//L_STREAM_ADC);

он горит зеленым и больше не моргает, т.е. можно сказать, что прием/передача больше не идет,

спасибо

28.10.2014 15:06:41
#13

Участник
Здесь с 24.10.2014
Сообщений: 26

Re: e2010b feat InitStartLDevice

По 0 сбросил параметры, как вы советовали - результат тот же, сбора нет, диод не моргает

29.10.2014 13:16:41
#14

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

Re: e2010b feat InitStartLDevice

Я проверил под win7 x32 если в примере L7XX.TST обнулить  как я написал и запускать с прошивкой e2010m, то у меня работает. Если не обнулять, то стоит в 0.

13.11.2014 16:24:12
#15

Участник
Здесь с 24.10.2014
Сообщений: 26

Re: e2010b feat InitStartLDevice

Скомпилировал 32 битный пример и запустил его на 64 битной машине - работает, данные собирает,

спасибо

13.11.2014 18:04:23
#16

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

Re: e2010b feat InitStartLDevice

64 битный на 64 битной не работает?

14.11.2014 08:32:49
#17

Участник
Здесь с 24.10.2014
Сообщений: 26

Re: e2010b feat InitStartLDevice

Вместе с библиотекой я получил уже скомпилированный 64-битный пример (файл - l7xx.tst/release_amd64/client64.exe). Когда я его запускаю, сбора данных не происходит, файлы data.dat и data1.dat, расположенные в этой папке  - пустые.

Более подробно симптомы описаны в сообщении #8 этой ветки.

14.11.2014 09:26:35
#18

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

Re: e2010b feat InitStartLDevice

понятно

Контакты

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

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

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

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