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

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

Вы не вошли.

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

12.05.2024 15:38:44
#1

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

Программирование непрерывного сбора данных с 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
Сообщений: 21

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

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

30.05.2024 15:58:46
#3

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

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). Считываются всегда состояние всех цифровых входов, т.к. состояние всех входов передается одним словом в потоке данных, а уже анализировать в полученном слове Вы можете только интересующие Вас биты, соответствующие нужным дискретным входам.

17.06.2024 23:49:01
#4

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

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

Hi!

Спасибо за ответ!
Еще несколько вопросов
1. Я правильно понял, что для данного АЦП невозможно получить выходные данные в "штуках АЦП" и значение младшего разряда (т.е. "сквозную калибровку)? Просто поток данных у нас достаточно большой - 2-3 канала по 100 кГц на канал. И писать и хранить данные в формате double весьма накладно. Гораздо удобнее для сбора и хранения данных использовать формат int16 и знать значение младшего разряда - тогда получить вольты не проблема.

2. По поводу "синхронность сбора данных с аналоговых и цифровых входов. Запустил пример. Поставил 3 канала, 300000 Гц частота сбора и 100000 Гц на канал. Частоту синхронного сбора выставил 100000 Гц. В окошках "установленное" вижу частоту сбора 285714,29 Гц и частоту канала 95238,095 Гц - как и должно быть. Но частота синхронного ввода осталась 100000 Гц. Как ее синхронизовать с аналоговыми каналами? Мне надо чтобы цифровой вход был синхронизован либо с частотой канала, либо с общей частотой.

3. По поводу размера буфера драйвера. Все таки - какой его размер? Я хочу тащить данные с 3-х каналов и частотой 100 кГц на канал + цифровой вход 100 или 300 кГц сегментами по 1-й секунде. Он на много больше секунды? Насколько? Его размер зависит от частоты сбора?

Jury

20.06.2024 16:01:03
#5

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

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

1. Если Вы ходите сохранять значения после калибровки, но просто в формате 16-битного целого, то у есть два варианта:
   - в ProcessData не передавать флаг VOLT, полученные на выходе значения поделить на 8 (чтобы откинуть младшие 8 разрядов из расширенного до 24-бит кода) и преобразовать в int16. Далее при чтении сохраненных данных для перевода в Вольты считаете, что код  (X502_ADC_SCALE_CODE_MAX/8) = 6000000/8 - соответствует номинальному значению используемого диапазона АЦП (далее  RANGE).
   -  в ProcessData использовать с флагом VOLT, но далее преобразовать вольты к нужному масштабу, например ограничить до [-RANGE, +RANGE], далее умножив на (2^15-1) и поделив на RANGE и преобразовав в int16, тогда при обратном переводе при чтении у Вас RANGE будет соответствовать Вашему коду  (2^15-1)

2. Обе частоты определяются делением на целое от опорной, и функции подбора выбирают ближайшую частоту. При задании частоты цифрового ввода равной частоте на канал возникает проблема, что  на делитель для частоты на канал накладывается еще ограничение, что она должна быть кратна числу каналов (или числу каналов + холостых каналов межкадровой задержки) - в вашем случае 3, а делитель для частоты  цифрового ввода этим не ограничен, поэтому для цифрового ввода функция находит более близкую частоту к запрошенным 100 КГц. Если нужна та же частота, что и  на канал АЦП, то можно либо явно выбирать те частоты, которые действительно можно получить из опорной, либо можно просто сперва вызвать функцию установки частоты АЦП и полученную от нее скорректированную частоту на канал подать на вход функции установки частоты дискретного ввода вместо того, чтобы брать ее из интерфейса. Для задания частоты цифрового ввода равной частоте АЦП такой проблемы быть не должно, т.к. ограничения на делитель одинаковы.

3. По умолчанию буфер выделяется исходя из скорости ввода, чтобы его хватило на 4 секунды. При желании можно его изменить функцией X502_SetStreamBufSize до запуска сбора данных.

Контакты

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

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

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

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