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


Форум

Вы не вошли.

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

#1 Re: Техническая поддержка » E20-10. Взаимодействие с ЦАП. » 17.07.2025 18:03:45

Можете подсказать, какое из ваших устройств поддерживает синхронную (потоковое по прерываниям от устройства) запись/чтение на скорости 1МГц?

#2 Техническая поддержка » E20-10. Взаимодействие с ЦАП. » 04.07.2025 18:23:28

illie
Ответов: 3

Устройство E20-10. Win'10, Qt6.
Проблема с потоковой записью в ЦАП. Единичная запись по отсчетам работает - на выходе устройства можно увидеть сигнал. Но хотелось бы "правильно" записывать данные потоком.

Основные части кода:

 // Настройки ЦАП
    dacPar.t1.s_Type = L_DAC_PARAM;
    dacPar.t1.AutoInit=1;  
    dacPar.t1.dRate=1000.0;
    dacPar.t1.FIFO=1024;   
    dacPar.t1.IrqStep=1024; 
    dacPar.t1.Pages=32;
    dacPar.t1.IrqEna=1;     
    dacPar.t1.DacEna=1;     
    dacPar.t1.DacNumber=0; 

    _pI->FillDAQparameters(&dacPar.t1);

   ULONG db=512000;

  _pI->RequestBufferStream(&db, L_STREAM_DAC)   
  _pI->SetParametersStream(&dacPar.t1,&db, (void **)&data1, (void **)&sync1, L_STREAM_DAC
    
  _pI->EnableCorrection();

  hEventData = CreateEvent(0,FALSE,FALSE,NULL);  
  _pI->SetLDeviceEvent(hEventData)
  qRegisterMetaType <HANDLE>("HANDLE");

  _dataReady.setHandle(hEventData);

....
  // Далее соединяем сигнал/слот
connect(&_dataReady, &QWinEventNotifier::activated, this, &MainWindow::sendData);
...
  // Запускаем сбор
   pI2->InitStartLDeviceEx(L_STREAM_DAC);
   pI2->StartLDeviceEx(L_STREAM_DAC);

  // Далее жду прерывания от устройства и записываю данные в слоте sendData
...

#define DSize 32*1024

void MainWindow::sendData()
{
    static qint32 data[DSize];
    _pI2->StopLDeviceEx(L_STREAM_DAC);

    for(int i = 0; i < DSize; i++) 
    {
        USHORT value = ((USHORT)(1024*sin((2.0*(3.1415926*i)/1024)))&0xFFF)|0x0000;
        data1[i] = value;
    }

    _pI2->InitStartLDeviceEx(L_STREAM_DAC);
    _pI2->StartLDeviceEx(L_STREAM_DAC);    
} 

Но такой вариант не работает, нет прерываний и функция sendData() не выполняется. Полностью аналогичный вариант, если запускать АЦП - работает и данные на входе устройства есть и их можно вывести.

Что я делаю не так?
Не понимаю значение переменных в структурах
    dacPar.t1.FIFO=1024;   
    dacPar.t1.IrqStep=1024;
    dacPar.t1.Pages=32;

И как рассчитываются исходя из этого объемы данных, которые нужно записать/считать.
Частота дискретизации нужна 1МГц.

#3 Re: Техническая поддержка » Библиотека LComp. Проблема с подключением » 29.04.2025 18:17:16

Тихомиров Сергей пишет:

1. Исходная библиотека написана на С++, изначально под Windows. Она же единственная и неповторимая LComp. И никакой libusb.
2. Если программируете под Windows, то заголовочный файл windows.h просто необходим.
3. Попробуйте добавить #include <initguid.h> где-нибудь перед включением ifc_ldev.h.

Да, теперь собралось, заработало. Спасибо.

#4 Re: Техническая поддержка » Библиотека LComp. Проблема с подключением » 29.04.2025 18:10:31

Инициализация модуля. И подключение заголовков библиотеки

#include <windows.h>

//#define INITGUID

#include "../LIBRARY/include/ioctl.h"
#include "../LIBRARY/include/ifc_ldev.h"
#include "../LIBRARY/include/create.cpp"
#include "../LIBRARY/include/e2010cmd.h"

#include <math.h>

void *handle = NULL;
LUnknown *pIUnknown;
IDaqLDevice *pI = 0;
SLOT_PAR sl;

ULONG slot;
char biosname[255];
PLATA_DESCR_U2 ph;
ULONG pointsize;

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_pbInit_clicked()
{
    if(CallCreateInstance(L"lcomp64.dll")==0)
    {
        QMessageBox::critical(this, "Error", "Failed load library", QMessageBox::Ok);
        return;
    }
    pIUnknown = CreateInstance(0);
    if(pIUnknown == NULL)
    {
        QMessageBox::critical(this, "Error", "Failed to get interface", QMessageBox::Ok);
        return;
    }
    HRESULT hr = pIUnknown->QueryInterface(IID_ILDEV,(void**)&pI);
    if(!SUCCEEDED(hr))
    {
        QMessageBox::critical(this, "Error", "Failed QueryInterface", QMessageBox::Ok);
        return;
    }

    pIUnknown->Release();

    pI->OpenLDevice(); // открыли устройство
    pI->GetSlotParam(&sl); // считали параметры слота - интересует тип платы
    pI->LoadBios(biosname); // загрузили биос, если не поддерживается то вернет L_NOTSUPPORTED
    pI->PlataTest();        // протестировали, у некоторых плат это просто заглушка
    pI->ReadPlataDescr(&ph); // обязательно прочитали флеш, он нужен для расчетов внутри библиотеки
    pI->GetParameter(L_POINT_SIZE, &pointsize);
}

#5 Техническая поддержка » Библиотека LComp. Проблема с подключением » 29.04.2025 14:52:12

illie
Ответов: 3

Добрый день!
Конфигурация: Win10, lcomp.dll (архив от 24.01.23 скачан с вашего сайта), Qt 5.14.1 (или Qt6.9 - неважно), компилятор MinGW64. Оборудование e20-10.
Взял из этой же папки пример (L7XX.OSC) - он поддерживает e20-10. Собранный пример запускается и работает (собран под MSVS).
Если создать проект в Qt-Creator и подключить туда файлы заголовков библиотеки (как в примере), то вываливается огромная куча ошибок о неизвестных типах данных.
2025-04-29_143038.png
Инклудим <windows.h> - решает проблему.
После некоторых манипуляций... В итоге получаю ошибку

C:/Qt/Tools/mingw1310_64/bin/../lib/gcc/x86_64-w64-mingw32/13.1.0/../../../../x86_64-w64-mingw32/bin/ld.exe: debug/mainwindow.o:mainwindow.cpp:(.rdata$.refptr.IID_ILDEV[.refptr.IID_ILDEV]+0x0): undefined reference to `IID_ILDEV'

Как корректно подключить библиотеку для работы с ней в Qt?

Я правильно понимаю, что есть исходная библиотека на Си (она под линукс), есть Ваша обертка над этим в винде - lcomp и есть чисто Ваша библиотека libusb. Какой из них корректно пользоваться?