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

Форум

Вы не вошли.

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

#1 Re: Техническая поддержка » корректировка данных с модуля E154 и конвертация в вольты » 27.07.2018 20:37:05

у меня нет цели все перевести в формат lusbapi, мне надо получить параметры АЦП. в lusbapi есть пример этого, в lcomp_linux нету (по крайней мере, я не нашел), поэтому здесь и привожу в пример метод из lusbapi.

#2 Re: Техническая поддержка » корректировка данных с модуля E154 и конвертация в вольты » 27.07.2018 19:25:28

Poul пишет:

DIOC_SEND_COMMAND такой команды драйвер для модуля не знает. там есть все исходники же.  и посылки команды и чтения массива данных там есть.

вижу обработку этой команды в ldevusbu.c, также при выполнении этого участка кода в dmesg вижу

[278147.636296] lcard: in DIOC_SEND_COMMAND
[278147.636299] lcard: 1 0 2 0

в исходниках есть команды чтения массива данных, да, но нет описания формата этих данных, чтобы перевести их в структуру ADC_PARS_E154.
с методом GetArray_DM, вроде, разобрался, но те данные, которые он возвращает, нельзя просто так взять и использовать, как это сделано в Lusbapi (BOOL WINAPI TLE154::GET_ADC_PARS(ADC_PARS_E154 * const AdcPars)).
можете более точнее указать, где в исходниках или примерах можно посмотреть разбор массива данных от GetArray_DM?

#3 Re: Техническая поддержка » корректировка данных с модуля E154 и конвертация в вольты » 26.07.2018 10:38:24

спасибо!
а про broken pipe что-то можете подсказать?
в ioctl((int)hDevice, dwIoControlCode, &ibuf) в hDevice передаю значение из hVxd объекта типа DaqE154 через вызов LDeviceIoControl:

WORD InBuf[4] = { 0x0001, V_GET_ARRAY, ADC_PARS_BASE, 0x0 };
    for(i = 0x0; i < sizeof(buf); i += MAX_USB_CONTROL_PIPE_BLOCK)
    {
        InBuf[0x2] = (WORD)(ADC_PARS_BASE + i);
        if (!LDeviceIoControl(hl, DIOC_SEND_COMMAND, &InBuf, sizeof (InBuf), buf + i, std::min( (ULONG)(sizeof(buf) - i), (ULONG)MAX_USB_CONTROL_PIPE_BLOCK), &cbRet, NULL))
        {
            LAST_ERROR_NUMBER(5);
            //return FALSE;
        }
    }

но получаю ошибку.
куда копать?

#4 Re: Техническая поддержка » корректировка данных с модуля E154 и конвертация в вольты » 25.07.2018 15:47:43

zavden пишет:

но непонятно, почему их 4 пары, если я задал опрос только двух каналов, а всего у модуля 8 АЦП-каналов?

а, понял: их 4, потому что 4 варианта усиления, так?

#5 Re: Техническая поддержка » корректировка данных с модуля E154 и конвертация в вольты » 25.07.2018 15:44:09

Poul пишет:

калибровочные коэфиц. лежат в структуре PLATA_DESCR после вызова ReadlPlataDescr.  в manual.pdf см описание структуры и функции. емнип сначала лежат смещения потом масштаб по усилениям. Корректировать надо руками. А потом уже переводить в вольты.

спасибо за ответ.

структуру видел, описание в manual.pdf про калибровочные коэффициенты такое:

float KoefADC[8] - калибровочные коэффициенты АЦП

и все.
в ioctl.h есть комментарий

float KoefADC[8]; // 4 offs 4 scale

но непонятно, почему их 4 пары, если я задал опрос только двух каналов, а всего у модуля 8 АЦП-каналов?

#6 Техническая поддержка » корректировка данных с модуля E154 и конвертация в вольты » 24.07.2018 18:25:33

zavden
Ответов: 10

Добрый день!

прошу помощи в вопросе корреткировки данных, полученных с модуля E154.
модуль подключен по USB, работа ведется в системе Linux (4.4.0-130-generic #156-Ubuntu x86_64 GNU/Linux), разработка приложения ведется на C++.
проблема заключается в получении калибровочных коэффициентов с модуля.
в руководстве программиста для e154 написано, что надо получить заполненную структуру MODULE_DESCRIPTION_E154 и из нее использовать поля Adc.OffsetCalibration и Adc.ScaleCalibration.
т.к. работа ведется под Linux, подключить и использовать библиотеку Lusbapi нельзя и готовые методы для получения этой структуры недоступны, поэтому я пробовал реализовать свой метод GET_ADC_PARS через LDeviceIoControl.
но в методе LDeviceIoControl вызов ioctl((int)hDevice, dwIoControlCode, &ibuf) возвращает ошибку "Broken pipe" вместо данных, а если использовать методы device->GetArray_DM(ADC_PARS_BASE, sizeof(buf), buf), то методы возвращают false, т.е. данные тоже не удается получить.

я ж правильно понимаю, что для этого модуля метод EnableCorrection не реализован, поэтому надо собственноручно делать коррекцию?

сейчас пока конвертацию сделал так:

    double ScaleGain[4]={5.0/2000., 1.6/2000., 0.5/2000., 0.16/2000.};
    double K_offset, K_scale;
    int gain_index;
    gain_index=(channel >> 6) & 3;
    K_offset=0.0;
    K_scale=pd.t7.KoefADC[channel]*ScaleGain[gain_index];
    *dest=(acp_code+K_offset)*K_scale;

кажется, что без смещения такая конвертация не совсем верна.

Контакты

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

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

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

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