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

Форум

Вы не вошли.

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

#1 Re: Техническая поддержка » Синхронизация крейтов LTR-EU-2 » 22.07.2024 14:28:47

Для синхронизации данных модулей разных крейтов можно использовать механизм синхрометок (см. пункт 4.7 руководства https://www.lcard.ru/download/ltr.pdf) и разъем SYNC крейтов (см рис. 3.6  в пункте 3.2.3 руководства). Необходимо соединить один из выходов DIGOUT этого разъема одного крейта с входом DIGIN другого (с учетом рекомендаций из пункта 3.6.9), после чего настроить один крейт на генерацию импульса по метке старт на соответствующем DIGOUT, а другой - на генерацию метки по сигналу на входе DIGIN. Потом запускаете сбор со всех моделей, подаете программную команду генерации метки на первом крейте, в результате она будет вставлена в потоки всех модулей обоих крейтов и по ней Вы сможет совместить данные с точностью до периода АЦП.

Если Вы сами пишите ПО, то использование функций библиотеки для синхронизации запуска описано в разделе 4.6 руководства ltrapi (https://www.lcard.ru/download/ltrapi.pdf). Для программы LMS этот режим описан в разделе 2.8 документа https://www.lcard.ru/download/lms_users_guide.pdf.

#2 Re: Техническая поддержка » LTR11 неожиданные значения в случае включения единственного канала » 20.06.2024 16:17:17

А это Вы видите в своей программе? Можете на всякий случай проверить например на метрологическом ПО (ltr11_metr), проявляется ли этот эффект?

#3 Re: Техническая поддержка » Подключение крейта LTR-U-1 » 20.06.2024 16:06:58

Второй слот - это внутренний "виртуальный" модуль самого крейта LTR-U-1 и он виден всегда, когда подключен крейт, а в слоте 1 должен быть сам измерительный модуль. При этом крейт в LTR-U-1 питается от USB, а для работы измерительного модуля нужно подключение внешнего адаптера питания. Поэтому в первую очередь проверьте, точно ли он подключен и исправен.

#4 Re: Техническая поддержка » Программирование непрерывного сбора данных с E-502 в среде LabView » 20.06.2024 16:01:03

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 до запуска сбора данных.

#5 Re: Техническая поддержка » АЦП не измеряет постоянное напряжение » 07.06.2024 12:26:25

Здравствуйте!
По картинке если модуль исправен, то похоже на проблему с подключением, у Вас сигнал AGND подключен, как в примерах в главе 6 руководства (https://www.lcard.ru/download/e-502_users_guide.pdf)?

#6 Re: Техническая поддержка » Программирование непрерывного сбора данных с E-502 в среде LabView » 30.05.2024 15:58:46

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

#7 Re: Техническая поддержка » L-502 Синий экран смерти при загрузке драйвера » 29.05.2024 21:28:47

Здравствуйте.

Попробуйте обновить на машине, на которой плата видится корректно, прошивку ПЛИС до последней версии (0.10) с помощью  утилиты <путь установки SDK>/tools/lxfw-update последнего SDK (использование описано в readme.txt в этой директории)

#8 Re: Техническая поддержка » Межмодульная синхронизация L502 » 08.05.2024 13:43:45

На ведущем модуле Вам нужно задать опорную частоту в 1.5 МГц (которую будет использовать сам ведущий модуль и генерировать для ведомого) с помощью X502_SetRefFreq() до настроек частоты АЦП, а для ведомого нужно задать ожидаемое значение внешней опорной частоты с помощью X502_SetExtRefFreqValue() перед установкой частоты АЦП, чтобы функция установки частоты АЦП корректно подобрала делители опорной частоты.

За 10 часов при пределах отклонения опорной частоты в ±0,005 % (5.5.1 из https://www.lcard.ru/download/l-502_users_guide.pdf) максимально допустимое расхождение в худшем случае будет (если у одного модуля отклонение на -0,005%, у другого на +0,005% - за счет этого умножение на 2 в конце) в секундах равно: 10*3600*(0,005/100)*2 = 3.6 c. Хотя в конкретном случае оно может быть значительно меньше...

#9 Re: Техническая поддержка » Считывание данных с LTR24-2 Python » 06.05.2024 18:57:03

Насчет соответствия размеров типов есть сомнения... по крайней мере у меня sizeof(ctypes.c_ulong) дает 8 вместо 4, а sizeof(ctypes.c_bool) - 1, вместо также 4 (BOOL определен как 4-байтовое в типах Windows, в отличие от BOOLEAN - 1 байт). Лучше бы использовать типы с явным размером:

int = ctypes.c_int32
BOOL =  ctypes.c_uint32
BYTE = ctypes.c_uint8
WORD = ctypes.c_uint16
DWORD = ctypes.c_uint32

Если поменять на такое соответствие типов и использовать pack = 4, то что с соответствием размеров и данными будет?

#10 Re: Техническая поддержка » Межмодульная синхронизация L502 » 06.05.2024 18:25:46

А какая опорная частота используется  (функции X502_SetRefFreq() для ведущего и X502_SetExtRefFreqValue() для ведомого) ? т.к. при работе от внешней частоты верхний предел 1.5 МГц, то нужно перейти с 2 МГц на 1.5 МГц.
Нули появляются на ведомом модуле? на всех каналах? Сбор идет без остановки и просто в потоке с какого-то момента данные становятся нулями а потом опять же без перезапуска все восстанавливается или как?

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

#11 Re: Техническая поддержка » Крейт LTR-EU-8/16 перестал видеть модули LTR212 и LTR27 » 06.05.2024 18:10:11

Добрый день! Судя по скриншотам это аппаратная проблема в крейте, она не связана с ПО или версией Windows (видимо просто совпало по времени), т.к. сам крейт корректно определяется в системе, а определение наличия модулей уже выполняется внутри крейта. Видимо по какой-то причине от модулей перестал доходить сигнал их присутствия до крейта. В любом случае придется связываться с офисом и передавать крейт в ремонт.

#12 Re: Техническая поддержка » Установка LMS - "Ошибка запуска службы базы данных экспериментов" » 23.04.2024 15:07:31

2. По журналу похоже, что это не после полного удаления (что у C:\Program Files (x86)\L-Card\L Card Measurement Studio\bin\db\ на момент установки были файлы).
Если поставить LMS, пропустив ошибки, затем ее удалить и при удалении согласиться на полное удаление базы экспериментов (если будут ошибки - нажать пропустить), убедится, что вся папка установки пуста, и заново попробовать установить LMS, можете прислать также сообщения из деталей после этого? Запускаете установщик от имени Администратора при этом?
3. Да, опечатка, имел ввиду [mysqld.exe].

#13 Re: Техническая поддержка » Считывание данных с LTR24-2 Python » 22.04.2024 19:40:15

Также смущает, что у Вас в объявлении идет _pack_ = 1, хотя ltr24api.h используется выравнивание на 4, а не 1.
Также, чтобы проверить правильность описания структур в Phyton, сравните значение размера структуры TLTR24, полученное sizeof из вашей программы, и значение, которое будет в поле Size после вызова LTR24_Init()

#14 Re: Техническая поддержка » Установка LMS - "Ошибка запуска службы базы данных экспериментов" » 22.04.2024 18:32:01

Здравствуйте.
А какая ОС на каждом из ПК?
Если при этой ошибке прерывать установку и открыть "детали", то можете тут выложить последние строки из оттуда?
При прерванной установке файлы внутри <пусть установки LMS>/bin/db/bin есть файлы включая mysld.exe? Если его запустить вручную, будет какое-то сообщение или просто ничего не будет происходить?
В меню Windows "Управление компьютером" -> "Службы и приложения" -> "Службы" есть в этом случае служба LMSDbService? Какое состояние? Если попробовать правой кнопкой нажать и выбрать "Запустить"?

#15 Re: Техническая поддержка » Считывание данных с LTR24-2 Python » 18.04.2024 15:48:43

Enanik пишет:

# переключаем модуль в тестовый режим
   pLTR24.contents.TestMode = True

А в тестовый режим зачем переключаете? Тестовый режим для канала диф. входа это как раз режим измерения собственного нуля, тогда данные вполне объяснимы...

#16 Re: Техническая поддержка » Установка драйвера на orangepi » 11.04.2024 15:25:14

У Вас судя по всему какая-то очень старая версия исходников драйвера lcomp.
В упомянутой в предыдущем посте такого быть не должно...

#17 Re: Техническая поддержка » Работа LTR43 с RS485 » 22.12.2023 11:20:31

RS485 на LTR43 можно использовать при написании своей программы с использованием штатной библиотеки ltr43api (функции описаны в https://www.lcard.ru/download/ltr43api.pdf).

В LMS в настоящее время работа с RS485 LTR43 не поддерживается. Также не совсем понятно, что имеется ввиду под поддержкой RS485 в законченном ПО, тут скорее может идти речь о поддержке конкретных устройств с интерфейсом RS485, подключаемых к LTR43.

Для чего Вы хотите использовать RS485? Что именно к нему подключаете?

#18 Re: Техническая поддержка » LTR отказывает в доступе » 29.11.2023 15:43:10

Да, точно также, взяв файлы отсюда: https://www.lcard.ru/download/ltr_eu_8_16_fw2000.zip.
Но точно также запись прошивки можно делать только по USB

#19 Re: Техническая поддержка » Получение списка модулей крейта » 28.11.2023 11:00:26

Добрый день.
Все коды идентификаторов модулей есть в перечислении _LTRNative.MODULETYPE, с ними по хорошему и нужно сравнивать, вставляя его значения как Net Property. Сами же эти числа являются по сути двухбайтовыми значениями, где младший и старший байт равны номеру модуля, т.е. их можно получить по формуле: n + 256*n, где n - номер модуля.

#20 Re: Техническая поддержка » LTR отказывает в доступе » 28.11.2023 04:24:55

Да, в прошивке 2.0.0.0 есть проблема, что при разрыве соединения, если крейт не получил пакет закрытия, то у него соединение остается незакрытым и не может быть установлено новое соединение. Попробуйте обновить прошивку крейта на 3.0.0.13 (https://www.lcard.ru/download/ltreu-fw-3.0.0.13.zip). Для этого нужно подключить крейт по USB и в LTR Manager нажать правой кнопкой по крейту и выбрать соответствующее действие и указать файл (ltr030 - 8/16 местный, ltr031 - 2-местный)

#21 Re: Техническая поддержка » LTR отказывает в доступе » 24.11.2023 18:46:28

А какая версия прошивки крейта у Вас используется (можно посмотреть в LTR Manager)?

#22 Re: Техническая поддержка » Синхронный опрос модулей в LTR-EU-8 » 10.11.2023 13:36:19

Для синхронизации данных нескольких модулей можно использовать механизм синхрометок крейта. Для этого нужно использовать функции работы с крейтом из ltrapi (в LabView класс ltrcrate из ltrModulesNet), как описано в пункте 4.6 документа https://www.lcard.ru/download/ltrapi.pdf, а также для каждого модуля использовать вариант Recv, в котором помимо данных возвращаются счетчики меток tmark. Общая идея, что сперва Вы запускаете сбор со всех модулей (он будет в разное время за счет задержек передач команд запуска), после этого даете крейту команду генерации метки СТАРТ, а при приеме данных от модулей отбрасываете данные (кратно размеру кадра) до тех пор, пока счетчик меток старт в tmark не изменится. Таким способом вы привяжете момент начала данных от всех модулей к метке СТАРТ с точностью до периода дискретизации модуля.

Этот механизм можно использовать для всех модулей непрерывного сбора данных, но нельзя для LTR210 в режиме покадрового сбора. Но для LTR210 есть свои сигналы синхронизации, которые можно соединить и настроить работу в режиме ведомый-ведущие и получить синхронный сбор кадров. Если нужна синхронизация кадров LTR210 с данными других модулей, то можно использовать разъем синхронизации крейта LTR-EU. Можно либо настроить, чтобы крейт генерировал сигнал при метке СТАРТ на выходе DIGOUT1 или DIGOUT2 разъема синхронизации и его завести на синхровход модулей LTR210 и настроить их запуск от внешнего цифрового сигнала, либо реализовать в обратную строну, где ведущий LTR210  будет вырабатывать сигнал на выходе синхронизации и его завести на DIGIN1 или DIGIN2 разъема синхронизации крейта и настроить генерацию меток по сигналу на этом входе. В первом случае кадр в LTR210 будет собираться по команде генерации синхрометки крейта, а во втором наоборот, синхрометки будут генерироваться по сбору кадра в LTR210 по команде к LTR210. В любом случае метка будет привязана к моменту сбора кадров LTR210 и данные других модулей можно будет привязать к данным кадра LTR210.

Использование привязки данных к метке СТАРТ для LTR24 на LabView можно посмотреть в примере отсюда: https://www.lcard.ru/download/examples/ … _start.zip.
Пример использования класса ltrcrate в LabView на примере настройки выходов разъема синхронизации можно посмотреть в примере: https://www.lcard.ru/download/examples/ … ut-cfg.zip

#23 Re: Техническая поддержка » L-502 и Astra Linux SE Смоленск » 19.10.2023 17:48:43

Есть ли на этой системе инструменты сборки ПО (gcc)? Есть ли возможность собрать консольный пример для модуля https://gitlab.com/l-card/acq/devices/x … type=heads и протестировать, будет ли зависание, если его запускать?

Если взять пакет x502studio (это та же lqmeasstudio, просто в новых версиях сменила название) версии 1.3.2, то проявляется ли на ней? Если в настройках приложения отключать спектральную обработку и/или увеличить интервал обработки/уменьшить время блока обработки, то как-то это влияет на зависания?

#24 Re: Техническая поддержка » L-502 и Astra Linux SE Смоленск » 19.10.2023 00:59:05

Здравствуйте. А какая версия прошивки FPGA в модуле L-502 (отображается в студии)? 
Сам модуль L-502 один и тот же в обоих случаях?
Под  ОС Astra Linux  Орел в качестве ПК выступает такой же моноблок или там другое железо?
Влияет ли настроенная частота ввода на зависания?

#25 Re: Техническая поддержка » L502 подсчёт времени » 14.10.2023 23:19:05

Здравствуйте.

По поводу точности, то нужно учитывать, что для любого способа, основанного на внутренней частоте процессора есть ошибка, связанная с неточностью значения самой этой частоты, от которой работает процессор. Для L-502 эта точность 50ppm или 0.005 % (т.е. для измерения времени секунды может быть ошибка до 50 мкс).

По поводу Вашего кода.
Во первых не совсем понятна инициализация таймера, *pTIMER0_CONFIG = 0x0003 - это режим работы EXT_CLK - подсчета импульсов внешнего сигнала, который должен подаваться на соответствующую ножку процессора (чего в схеме L-502 нет), значения pWIDTH и pPERIOD также не очень понял, и они устанавливаются когда *pTIMER0_CONFIG равен 0, т.е. таймер запрещен и эти изменения вообще могут быть неприменимы.

Если Вам нужен таймер, который генерирует прерывания раз в мс, то Вам нужно настроить режим PWM_OUT без использования собственно выходного сигнала PWM на ножке (OUT_DIS = 1), с постоянной (не однократной) генерацией сигнала (PERIOD_CNT = 1) и с разрешенной установкой бита прерывания в конце каждого периода (IRQ_ENA = 1). Таймер по умолчанию работает от частоты SCLK = 132.5 МГц, соответственно в регистр длительности периода, чтобы она была 1 мс, нужно записать значение 132500. Регистр WIDTH определяет длину активного значения импульса (duty cycle) для сигнала pwm и т.к. сам PWM сигнал Вы не используете, то его значение не важно, но на всякий случай лучше установить его в действительное значение, т.е. не менее 1, но меньше PERIOD.

Т.е. код инициализации таймера без разрешения обработчика прерывания таймера может выглядеть так:

*pTIMER0_CONFIG = PWM_OUT | PERIOD_CNT | IRQ_ENA | OUT_DIS;
*pTIMER0_PERIOD = 132500;
*pTIMER0_WIDTH  = 1;
*pTIMER_STATUS = TIMIL0; /* сброс флага прерывания на случай, если он был установлен */

После конфигурации таймер необходимо также запустить через TIMER_ENABLE.

*pTIMER_ENABLE = TIMEN0;

В этом режиме можно проверить настройки таймера без разрешения обработчика путем обычного опроса (т.к. бит IRQ_ENA установлен, то таймер будет устанавливать флаг прерывания, который можно проверить и сбросить, но сам обработчик не будет вызываться, т.к. не разрешен в pSIC_IMASK1), периодически вызывая проверку:

if (*pTIMER_STATUS & TIMIL0) {
    *pTIMER_STATUS = TIMIL0; /* сброс идет записью 1 */
    
    /* увеличение счетчика мс */ 
}

Если все работает как надо (идет подсчет мс корректно), то долее можно разрешить уже обработчик.

Строка REGISTER_ISR(12, inc_time); регистрирует обработчик прерывания для прерывания IVG12. Через регистры IAR Вы делаете маппинг прерываний от периферии на прерывания контроллера (IVG7 - IVG15) (что необходимо, т.к. обработчиков под периферию всего 9, а источников намного больше). В макросе Pxx_IVG(n)  значение n - это как раз номер IVG, а значение xx - Peripheral ID# (для TIMER0 - 32), т.е. правильный вызов макроса - P32_IVG(12). Во-вторых делать просто операцию "или" не совсем корректно, т.к. уже есть назначение по умолчанию при старте и поле может быть не 0 (и к слову для TIMER0 это как раз IVG12 и можно было бы ничего не писать), поэтому сперва значение этого поля в IAR4 нужно обнулить. Для этого я не нашел готовый макрос, поэтому в прошивке пишу через явную битовую маску:

*pSIC_IAR4 = (*pSIC_IAR4 & 0xFFFFFFF0) | P32_IVG(12);

Т.е. после настройки таймера и до его разрешения через pTIMER_ENABLE, нужно вставить:

*pSIC_IAR4 = (*pSIC_IAR4 & 0xFFFFFFF0) | P32_IVG(12);
REGISTER_ISR(12, inc_time);
*pSIC_IMASK1 |= IRQ_TIMER0;

В обработчике прерывания необходимо аналогично проверить флаг от таймера и сбросить его, после чего вызвать ssync(), чтобы флаг сбросился до выхода из обработчика и не попасть в обработчик второй раз:

ISR(inc_time) {
    if (*pTIMER_STATUS & TIMIL0) {
        *pTIMER_STATUS = TIMIL0; /* сброс идет записью 1 */
    
        /* увеличение счетчика мс */ 

        ssync()
    }
}

Контакты

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

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

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

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