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


e502 - ошибка X502_ProcessAdcData

Вы не вошли.

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

14.06.2016 10:19:27
#1

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

e502 - ошибка X502_ProcessAdcData

Сделал стриминг на Е502, но примерно через час работы X502_ProcessAdcData выдает ошибку X502_ERR_PROC_INVALID_CH_NUM. Частота 4 кГц 10 каналов.. вроде не так уж и много. Предположил, что не справляется ОС (начинал тестирование с Win7). Уменьшал частоту до 2 кГц, потом до 1 кГц... не помогло, все равно через некоторое время опять возникала та же ошибка. Решил попробовать поднять приоритет приложения. Перешел в Линукс (Rosa6). Использовал и nice и ionice для перевода  приоритета приложения повыше... Все едино, примерно через час опять появляется эта ошибка.. Можете подсказать в чем проблема? Приложил примерный исходник класса для запуска е502.

14.06.2016 12:00:04
#2

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,323

Re: e502 - ошибка X502_ProcessAdcData

А если использовать стандартный пример из SDK x502_stream_read (https://bitbucket.org/lcard/x502api/src … ew-default), то ошибка тоже возникает? Или если в программе lqmeasstudio (https://bitbucket.org/lcard/lqmeasstudio) проверить? Ошибка возникала и под Windows и под Linux?

А куда исходник класса приложили?

15.06.2016 07:44:17
#3

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

Re: e502 - ошибка X502_ProcessAdcData

x502_stream_read вообще не находит никакого устройства, функция E502_UsbGetDevRecordsList возвращает 0 в usb_devcnt, что вообще говоря странно. Я пользуюсь E502_UsbGetSerialList и она возвращает одно устройство, кроме того lsusb тоже показывает, что устройство есть с ID 2a52:e502. Исходники кода пытался положить с помощью клавиши Загрузки... наверное неправильно? Тогда вот пусть будут прямо здесь:

#include "QAdcObject.h"
QAdcObject::QAdcObject(QObject *parent) : QObject(parent)
{
    m_bRun = false;
    m_dev  = 0;
}

QAdcObject::~QAdcObject()
{
    if(m_dev != 0)
    {
        m_bRun = false;
        X502_Close(m_dev);
        X502_Free(m_dev);
    }
}
#define channel_count 10
//#define CHECK_ADC_SCALE
void QAdcObject::init()
{
    char serial[2][X502_SERIAL_SIZE];
    qint32 err, devs;

    if(m_dev != 0)
    {
        m_bRun = false;
        X502_Close(m_dev);
        X502_Free(m_dev);
    }

    err = E502_UsbGetSerialList(serial, 2, X502_GETDEVS_FLAGS_ONLY_NOT_OPENED, (uint32_t*)&devs);
    if(devs == 0)
    {
        QDebug() << "e502 device not found";
        return;
    }
    m_dev = X502_Create();
    err = E502_OpenUsb(m_dev, serial[0]);
    if(err != 0)
    {
        QDebug() << "open e502 failed";
        X502_Free(m_dev);
        return;
    }
	err = X502_SetMode(m_dev, X502_MODE_FPGA);
    if(err < 0)
    {
        QDebug() << QString("set mode failed (%1)").arg(err);
    }
    err = X502_SetLChannelCount(m_dev, channel_count);
    if(err < 0)
    {
        QDebug() << QString("set channel count failed (%1)").arg(err);
    }
    for(int i = 0; i < channel_count; i++)
    {
        err = X502_SetLChannel(m_dev, i, i, X502_LCH_MODE_COMM, X502_ADC_RANGE_5, 1);
        if(err < 0)
        {
            QDebug() << QString("set logical channel failed (%1)").arg(err);
        }
    }
    err = X502_SetSyncMode(m_dev, X502_SYNC_INTERNAL);
    if(err < 0)
    {
        qDebug() << QString("set sync mode failed (%1)").arg(err);
    }
    err = X502_SetSyncStartMode(m_dev, X502_SYNC_INTERNAL);
    if(err < 0)
    {
        qDebug() << QString("set sync start mode failed (%1)").arg(err);
    }

	double fAdcFrame = 4000.0;
    double fAcq = 2000000.0;
    err = X502_SetAdcFreq(m_dev, &fAcq, &fAdcFrame);
    if(err < 0)
    {
        qDebug() << QString("set adc frequency failed (%1)").arg(err);
    }
    err = X502_Configure(m_dev, 0);
    if(err < 0)
    {
        qDebug() << QString("set configure failed (%1)").arg(err);
    }
}

//#define ADC_REORDER_DATA
void QAdcObject::startAdc(bool)
{
    qint32 buffer[32];
    qint32 rcv_size, adc_size, err;
	
	err = X502_SetStreamBufSize(m_dev, X502_STREAM_CH_IN, channel_count);
    if(err < 0)
    {
        QDebug() << QString("set stream buffer size failed (%1)").arg(err);
    }
    err = X502_SetStreamStep(m_dev, X502_STREAM_CH_IN, channel_count);
    if(err < 0)
    {
        QDebug() << QString("set stream step failed (%1)").arg(err);
    }

    err = X502_StreamsEnable(m_dev, X502_STREAM_ADC);
    if(err < 0)
    {
        QDebug() << QString("set stream enable failed (%1)").arg(err);
    }
    err = X502_StreamsStart(m_dev);
    if(err < 0)
    {
        QDebug() << QString("set stream start failed (%1)").arg(err);
    }
    m_bRun = true;
    while(m_bRun)
    {
        rcv_size = channel_count;
        rcv_size = X502_Recv(m_dev, (uint32_t*)buffer, rcv_size, 2000);
        if(rcv_size <= 0)
        {
            QDebug() << QString("error received adc data");
            continue;
        }
        adc_size = rcv_size;

#ifdef ADC_REORDER_DATA
        int first_lch;
        double adc_data[channel_count];
        X502_GetNextExpectedLchNum(m_dev, (uint32_t*)&first_lch);
        err = X502_ProcessAdcData(m_dev, (uint32_t*)buffer, adc_data, (uint32_t*)&adc_size,
                                         X502_PROC_FLAGS_VOLT);
#else
        err = X502_ProcessAdcData(m_dev, (uint32_t*)buffer, ret, (uint32_t*)&adc_size,
                                         X502_PROC_FLAGS_VOLT);
#endif
        if(err < 0)
        {
            QDebug() << QString("error processing data [%1]").arg(err);
			//helper for restart stream after error. It's working but not ever time...
            X502_StreamsStop(m_dev);
            X502_StreamsStart(m_dev);
            continue;
        }
#ifdef ADC_REORDER_DATA
        for(int lch = 0; lch < adc_size; ++lch)
        {
            int pos = (lch >= first_lch)? lch - first_lch : adc_size - first_lch + lch;
            if(pos < adc_size)
            {
                ret[lch] = adc_data[pos];
            }
        }
#endif
		// there is should be my processing data
    }
    X502_StreamsStop(m_dev);
    X502_StreamsDisable(m_dev, X502_STREAM_ADC);
}
15.06.2016 08:21:18
#4

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

Re: e502 - ошибка X502_ProcessAdcData

Странно, а в винде эта функция работает ().. вот что я получаю в окне:

$ x502_stream_read
Версия библиотеки: 1.1.4
Доступны следующие модули:
Модуль № 0: E502, USB      Сер. номер: 2T222563
Введите номер модуля, с которым хотите работать (от 0 до 0)
0
Установлена связь со следующим модулем:
Серийный номер          : 2T222563
Наличие ЦАП             : Да
Наличие BlackFin        : Да
Наличие гальваноразвязки: Да
Индустриальное исп.     : Нет
Наличие интерф. PCI/PCIe: Нет
Наличие интерф. USB     : Да
Наличие интерф. Ethernet: Да
Версия ПЛИС             : 0.1
Версия PLDA             : 0
Версия прошивки ARM     : 1.0.5.0
Сбор данных запущен. Для останова нажмите любую клавишу
Ошибка приема данных: Синхронный сбор уже остановлен
Сбор данных остановлен успешно

15.06.2016 11:29:44
#5

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,323

Re: e502 - ошибка X502_ProcessAdcData

Valery пишет:

функция E502_UsbGetDevRecordsList возвращает 0 в usb_devcnt, что вообще говоря странно.

Да, это очень странно, тем боле что E502_UsbGetSerialList() реализована через E502_UsbGetDevRecordsList(). А у Вас E502 не осталась открытой в Вашей программе?

Valery пишет:

Версия прошивки ARM     : 1.0.5.0
Сбор данных запущен. Для останова нажмите любую клавишу
Ошибка приема данных: Синхронный сбор уже остановлен

Тоже странно, пример не менялся никак? т.к. в примере после вывода информации вызывается f_setup_params, который при успехе должен написать установленные частоты, а в случае ошибки - вывести сообщение. А у Вас вообще никаких сообщений? Что-то я не вижу по какой ветке может пройти изначальный пример, чтобы ничего не написать после информации до запуска сбора

15.06.2016 11:52:46
#6

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

Re: e502 - ошибка X502_ProcessAdcData

1. да с чего это... перегрузил комп, все равно usb_dev_count = 0
2. в примере я вырезал часть, т.к. у меня нет файла l502-reg.ldr, соответственно нечего грузить.. и вырезал лишнего. Вот теперь в винде запускается нормально:

$ x502_stream_read
Версия библиотеки: 1.1.4
Доступны следующие модули:
Модуль № 0: E502, USB      Сер. номер: 2T222563
Введите номер модуля, с которым хотите работать (от 0 до 0)
0
Установлена связь со следующим модулем:
Серийный номер          : 2T222563
Наличие ЦАП             : Да
Наличие BlackFin        : Да
Наличие гальваноразвязки: Да
Индустриальное исп.     : Нет
Наличие интерф. PCI/PCIe: Нет
Наличие интерф. USB     : Да
Наличие интерф. Ethernet: Да
Версия ПЛИС             : 0.1
Версия PLDA             : 0
Версия прошивки ARM     : 1.0.5.0
Установлены частоты:
    Частота сбора АЦП = 2000000
    Частота на лог. канал = 666667
    Частота цифрового ввода = 2000000
Сбор данных запущен. Для останова нажмите любую клавишу

Теперь некоторое время надо ждать возможного появления ошибки

15.06.2016 14:09:20
#7

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

Re: e502 - ошибка X502_ProcessAdcData

разобрался почему в Линуксе не запускалось - надо было стартовать от root (sudo x502_stream_read)... В винде ошибок не было за пару часов работы, запустил в Линуксе.
Но у меня возникло подозрение  - а не может быть так, что эта ошибка из-за многопоточности программы? x502_strem_read однопоточная, а я пользую класс QAdcObject в отдельном потоке.

15.06.2016 15:03:06
#8

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

Re: e502 - ошибка X502_ProcessAdcData

вот, сработало  - выпала "ошибка обработки данных" примерно через час: вместо 3 каналов в x502_stream_read поставил 10. Так что похоже проблема скорее всего не в многопоточности..

15.06.2016 15:16:55
#9

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,323

Re: e502 - ошибка X502_ProcessAdcData

А частота сбора при этом какая была?

15.06.2016 15:18:54
#10

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

Re: e502 - ошибка X502_ProcessAdcData

4000 Гц

15.06.2016 15:22:18
#11

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

Re: e502 - ошибка X502_ProcessAdcData

но кстати говоря в своей программе я частоту снижал до < 1000 Гц, ошибка все равно появлялась... можно и здесь попробовать. А вот такой вопрос - дамп принятого массива может чем-то помочь в анализе этой проблемы?

15.06.2016 16:05:51
#12

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,323

Re: e502 - ошибка X502_ProcessAdcData

Ну в принципе было бы интересно посмотреть (на тот, что из Recv()).
Буду пытаться воспроизвести и у себя.
А кстати, если частоту поставить наоборот максимальную - 2 МГц, то все равно будет проявляться?

15.06.2016 18:37:02
#13

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

Re: e502 - ошибка X502_ProcessAdcData

Вот что получилось после примерно 2-х часов работы:

Версия библиотеки: 1.1.4
usb dev count = 1
Доступны следующие модули:
Модуль № 0: E502, USB      Сер. номер: 2T222563
Введите номер модуля, с которым хотите работать (от 0 до 0)
0
Установлена связь со следующим модулем:
Серийный номер          : 2T222563
Наличие ЦАП             : Да
Наличие BlackFin        : Да
Наличие гальваноразвязки: Да
Индустриальное исп.     : Нет
Наличие интерф. PCI/PCIe: Нет
Наличие интерф. USB     : Да
Наличие интерф. Ethernet: Да
Версия ПЛИС             : 0.1
Версия PLDA             : 0
Версия прошивки ARM     : 1.0.5.0
Установлены частоты:
    Частота сбора АЦП = 2000000
    Частота на лог. канал = 4000
    Частота цифрового ввода = 4000
Сбор данных запущен. Для останова нажмите CTRL+C
Ошибка обработки данных: -140
buff[0] = 0xd2001e64
buff[1] = 0xd3001e64
buff[2] = 0xd4001e64
buff[3] = 0xd5001fea
buff[4] = 0xd6001f27
buff[5] = 0xd70020ac
buff[6] = 0xd8001cdf
buff[7] = 0xd9001c1c
buff[8] = 0xd9001c1c
buff[9] = 0xd9001c1c
Сбор данных остановлен успешно

16.06.2016 15:35:46
#14

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,323

Re: e502 - ошибка X502_ProcessAdcData

Кажется смог у себя воспроизвести ошибку, постараюсь разобраться...

А все же вопрос, если сделать максимальную (или близкую) частоту сбора и кадров (судя по частоте на канал вы видимо понизили частоту следования кадров?), то у Вас ошибка будет проявляться?

16.06.2016 16:40:09
#15

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

Re: e502 - ошибка X502_ProcessAdcData

ну максимум что можно поставить  для случая 10 каналов - это 200 кГц. Хорошо, попробую этот вариант. Кстати, сегодня еще раз запустил в 7 утра и до сих пор ошибки нет.

17.06.2016 07:59:55
#16

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

Re: e502 - ошибка X502_ProcessAdcData

На 200 кГц проработало всю ночь без ошибок. Поставил 2000 Гц. Посмотрим что будет. Я вчера еще одно изменение сделал: почему-то с утра не смог запустить через тот разъем USB, к которому был подключен е502 (ни lsusb ни программа не видела АЦП, хотя в винде все было ок), подключил к другому.
У вас какой стандарт USB используется:  2.0 или 3.0? Может тут возможно засада типа "легкой" несовместимости?

17.06.2016 08:04:42
#17

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

Re: e502 - ошибка X502_ProcessAdcData

и еще такой вопрос: когда возникает ошибка обработки было бы неплохо как бы перезапустить синхронный сбор. Я использовал вариант

Х502_streamStop();
X502_StreamStart();

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

17.06.2016 09:23:03
#18

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

Re: e502 - ошибка X502_ProcessAdcData

вот, все интереснее и интереснее.. Посмотрел на datasheet микроконтроллера, там USB 2.0, а я оказывается вчера подключил в USB-3.0 и все, ошибки похоже исчезли. Сейчас еще подожду (на 2 кГц) немного и верну подключение на USB 2.0..

17.06.2016 11:14:56
#19

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,323

Re: e502 - ошибка X502_ProcessAdcData

Микроконтроллер USB2.0, но вообще USB3.0 должен быть совместим с USB2.0. Конечно там наверное программный стек несколько отличается и какие-то могут быть всегда особенности, но по идее должно работать.

По крайней мере ошибка с номером канала с этим не связана. Просто она может очень редко проявляться, иногда может и больше 2 часов работать. За вчерашний день + ночь я смог поймать ее только 3 раза. Скорее всего это совпадение в плане другого порта.

Ошибка эта насколько я смог выяснить из этих 3-х раз, не связана с USB, это ошибка возникает еще до передачи в USB внутри модуля в интерфейсе можду ПЛИС и микроконтроллером.

Ошибка может проявляться только если суммарный поток данных ниже 100 тыс отчетов/c (т.к. часто E502 используется на более высоких частотах + данная ошибка такая редка, поэтому видимо она осталась не замеченной). Еще мне понадобится какое-то время, чтобы ее исследовать...

По поводу перезапуска синхронного сбора, то Х502_streamStop() и X502_StreamStart(); выглядит корректным вариантом, это как раз его "перезапускает". А что значит "как правило" - иногда не помогает?

Другой вопрос, если речь идет не о перезапустить, а продолжить сбор с минимальной потерей данных, если предположить, что ошибка одиночная/блочная, а дальше сбор восстановится. Тогда это нужно в принятом блоке данных искать после ошибки начало следующего кадра, откидывать данные до него, и затем начать также обрабатывать данные после нахождения, но специально функции для этого нет, если только руками исходя из формата...
С другой стороны, при нормальной работе ошибок быть не должно, если возникает ошибка, то это явно нештатная ситуация, и в ней возможно полный перезапуск сбора выглядит более надежным способом восстановить сбор.

17.06.2016 11:31:41
#20

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

Re: e502 - ошибка X502_ProcessAdcData

Ну да, иногда эта пара вызовов не помогает и все сбивается в непрерывную череду ошибок.. но все равно факт: на USB 3.0 200 кГц работало всю ночь, а 2 кГц все еще работает без ошибок (уже больше 3-х часов). Возможно стек немного другой...
Для чистоты эксперимента возвращаю обмен на USB 2.0.

20.06.2016 13:41:48
#21

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,323

Re: e502 - ошибка X502_ProcessAdcData

Проблему устранили. Вам понадобится обновить прошивки ПЛИС и прошивку контроллера Cortex-M4.


Для этого нужно из пакетов Cent OS 7 поставить: 
1.  lxfw-update-1.0.1-2.1.x86_64.rpm   - утилита для обновления прошивки ПЛИС
2. lboot-1.0.2-1.1.x86_64.rpm    -  утилита для обновления прошивки ARM
3.  lqmeasstudio-1.1.1-1.1.x86_64.rpm 


Далее, по поводу того, что можно работаь только от root.
В Rosa несколько другие пути для правил udev, поэтому нужно будет файлы  e502.rules и lboot.rules скопировать из /usr/lib/udev/rules.d в /etc/udev/rules.d, после чего сделать


sudo udevadm control --reload-rules
sudo udevadm trigger --subsystem-match=usb --attr-match=idVendor=2a52

После этого с E502 можно будет работать от обычного пользователя.

Далее для обновления прошивки ПЛИС нужно запустить
e502-fpga-update-all.sh
Для обновления Cortex-M4 скачать прошивку отсюда https://bitbucket.org/lcard/e502_m4/dow … 1.0.11.bin, запусить lqmeasstudio, провой кнопкой на устройство и выбрать обновить прошивку и указать файл.
Если вы работаете без GUI или lqmeasstudio  будут какие-то сложности, то могу сказать как напрямую через lboot обновить.
После этого должна стать версия FPGA 0.2, а Cortex-M4 - 1.0.11


Тогда можете обновить все и сказать, исчезла ли проблема

20.06.2016 21:32:07
#22

Инженер-электронщик
Откуда: "Л Кард"
Здесь с 21.04.2014
Сообщений: 4,597

Re: e502 - ошибка X502_ProcessAdcData

@ Valery,
мы очень надеемся, что сообщите: решилась ли данная проблема после обновления ПО?

21.06.2016 08:40:33
#23

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

Re: e502 - ошибка X502_ProcessAdcData

Все установил как описано и запустил тестирование.. теперь это надолго  smile . в РОСЕ6 не смог установить lboot - почему-то не находит библиотеку libmodbus.so.5: в пакетах ее почему-то нет, ручками поставил ее из github и собрал - не помогло..
пришлось все проделать в Mint- все встало легко и быстро.
Вообще (просто для информации) хочу сказать - мы благодарны вам за оперативную поддержку и рассчитываем на ваши девайсы, в разработке у нас терминалы защиты, где основным элементов внешнего интерфейса ставим Е502. Причем в качестве рабочих станций используем как машинки Интел/АМД так и Эльбрус.. Это кстати возможно отдельная будет тема - перенос пакетов e502/x502  на Эльбрус.

21.06.2016 10:02:05
#24

Сотрудник "Л Кард"
Здесь с 17.04.2014
Сообщений: 1,323

Re: e502 - ошибка X502_ProcessAdcData

Вообще по идее, если брали из CentOS (а не Fedora) пакеты, то там вроде нет зависимости от modbus. Просто в Fedora более расширенный набор стандартных пакетов и там есть libmodbus в официальном репозитории, поэтому и lboot собран с поддержкой modbus, а в CentOS стандартный набор пакетов (и штатного варианта libmodbus нет, как и в ROSA) и там lboot собран без modbus (modbus в любом случае конкретно для E502 не используется).


Ну в любом случае, главное, что все обновилось)


Спасибо за найденную проблему.

С Эльбрусом это конечно интересная тема. А что там за ОС будет?

21.06.2016 16:26:40
#25

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

Re: e502 - ошибка X502_ProcessAdcData

На Эльбрусе стоит Линукс их (МЦСТ) сборки, последняя версия ядра, которую они выпускают - 3.14. Насколько я знаю они его делали для ВПК, так что ручками в ядре как-то ковырялись на предмет защиты, закладок и прочего.
Есть Qt4 (на ней все работает), я пытался собрать ту же апликуху на их сборке Qt5 - почему-то работать не захотела.. GUI у них - на XFCE4. libusb  - в наличии. Я сделал одну попытку собрать e502 под Эльбрус из исходников, уже не помню почему, но не получилось, типа каких-то пакетов не хватило.. так что к этом вопросу вскоре вернусь.. для нас это один из важных вопросов на сегодня. Если удастся раздобыть плату с Байкалом - то на нее тоже будем софт переносить