Форум: Техническая поддержка

Тема: Программирование непрерывного сбора данных с E-502 в среде LabView

Вы не вошли.

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

12.05.2024 15:38:44
#1

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

Программирование непрерывного сбора данных с E-502 в среде LabView

Hi All!

Вопросы по программированию непрерывного сбора данных с АЦП Е-502 в среде LabView.

1. Если мне надо тянуть данные с 3-х каналов с частотой скажем 100 кГц каждый, то в библиотеке X502 параметр f_adc я устанавливаю в 300000 и f_frame - 0?

2. Если f_adc установлено в 300000 - какова истинная частота? Обычно такие частоты получаются делением опорной частоты на некий множитель - соответственно частота получается не круглая, а с неким "хвостом".

3. В примере "X502_recv" прием данных идет "произвольными кусками" - сколько за 250 мс накопится - столько и будет принято. Вопросы такие:
- размер буфера buf - это размер буфера в драйвере и он не должен переполнятся? Т.е. он должен быть в разы больше, чем может накопиться за 250 мс?
- можно ли узнать сколько отсчетов есть в буфере? В конечном итоге я хочу читать данные порциями фиксированной длины.
- можно ли как то контролировать не переполнился ли буфер?
- в примере данные переводятся в вольты параметром flags. Можно ли получить данные в "родном" формате int16 и значение младшего разряда, чтобы пересчитывать потом самому по мере необходимости?
4. Синхронный цифровой вход:
- если АЦП работает на частоте 300 кГц (3 канала по 100 кГц) - значит ли это что цифровой вход читает отсчеты с частотой 300 кГц одновременно с АЦП?
- Можно ли считывать не все 16 разрядов/каналов - а только 1 или 2? Конечная цель всего этого - подать на один из разрядов PPS или PPM сигнал и считать количество отсчетов АЦП за 1 секунду или минуту, чтобы иметь точную временную привязку и знать истинную частоту АЦП.

Jury

29.05.2024 13:46:57
#2

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

Re: Программирование непрерывного сбора данных с E-502 в среде LabView

Hi All!
Не скромный вопрос.
Я правильно понимаю, что по вышеупомянутым вопросам поддержка отсутствует?
Jury

30.05.2024 15:58:46
#3

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

Re: Программирование непрерывного сбора данных с E-502 в среде LabView

1. Да, f_adc = 300000, f_frame может быть либо явно указан как 100000, либо передано значение меньше или равно нуля (в последнем случае выбирается наибольшая частота кадров - без межкадровой задержки)
2. Частота АЦП получается делением опорной частоты на целое число. Опорная частота, если используется внутренняя, может быть либо 2 МГц (по умолчанию), либо 1.5 МГц (устанавливается функцией SetRefFreq - должна вызываться до SetAdcFreq). Реальное значение установленных частот возвращается на выходе SetAdcFreq (в примере отображаются на индикаторах).
3. Размер buf - размер пользовательского буфера, в который будут сохранены данные из буфера драйвера (сам буфер в драйвере значительно больше и от этой функции его размер не зависит), поэтому его не нужно делать с запасом. Recv вернет управление как только произойдет одно из двух событий: либо истечет указанное время, либо если в buf будет сохранено указанное количество отсчетов. Поэтому если хотите принимать данные блоками нужной длины, то можете сделать buf этого размера и указать такой же size в Recv, а таймаут сделать с запасом (чтобы при нормальной работе функция Recv всегда возвращала управление по готовности size данных). Это удобно, когда принимаете данные только с АЦП для обработки фиксированными блоками. Когда прием идет и по АЦП и по дискретным входам, то тут несколько сложнее, т.к. все данные передаются вместе в одном потоке, и размер buf - для суммарного потока, поэтому в примере уже после разбиения в ProcessData данные складываются отдельно в буфер АЦП и в буфер DIN, из которых уже извлекаются фиксированными блоками по мере наполнения этих дополнительных буферов. Можно еще использовать функцию GetRecvReadyCount для получения количества готовых для чтения отсчетов в буфере драйвера, но она работает не для всех интерфейсов подключения (не работает для Ethernet).

Если буфер переполнится то модуль перестанет передавать новые данные до его освобождения и они начнут отбрасываться (т.е. новые данные не затирают старые, пока они не будут приняты с помощью Recv). На месте полученного таким образом разрыва модуль вставит специальное слово, в результате чего при обработке места разрыва в ProcessData  будет возвращен соответствующий код ошибки.

Можно не передавать флаг VOLT, тогда функция ProcessData вернет коды, расширенные до 24-бит смещением влево,  но тип выходных данных в любом случае будет double, т.е. для получения кода можно разделить на 8 и взять целую часть. Ну либо не использовать ProcessData а вручную разобрать формат данных по описанию из раздела 5.12 низкоуровневого описания (https://www.lcard.ru/download/x502_low_level.pdf).

Но в любом случае еще есть калибровочные коэффициенты АЦП, которые применяются внутри модуля (для чего код и расширяется до 24-бит, чтобы не терять дробную часть), поэтому если Вы хотите коды АЦП без калибровки, то нужно еще до запуска сбора установить калибровочные коэффициенты АЦП равными k=1 и b=0 для используемых диапазонов с помощью функции SetAdcCoef.

4. Частота синхронного ввода настраивается отдельно, но также как деление опорной. Если Вы ее настроили такой же, как f_adc, то да, читаются практически в одно время - с фиксированными задержками, описанными в пункте 3.3.8 руководства пользователя (https://www.lcard.ru/download/e-502_users_guide.pdf). Считываются всегда состояние всех цифровых входов, т.к. состояние всех входов передается одним словом в потоке данных, а уже анализировать в полученном слове Вы можете только интересующие Вас биты, соответствующие нужным дискретным входам.

Контакты

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

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

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

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