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

Синхронный вывод и ввод E-502

Вы не вошли.

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

23.07.2020 12:01:25
#1

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

Синхронный вывод и ввод E-502

Добрый день!

Работаю с картой E-502 в Labview в синхронном режиме, задача состоит в том, чтобы выводить импульсы в определенной последовательности на цифровые выводы и считывать данные АЦП с 6 каналов. К карте собственно подключаются оптические датчики.
В качестве основы взял ваш пример по синхронному сбору АЦП и добавил синхронный вывод на DOUT. Данные по АЦП следующие: частота кадра — 10000 Гц, частота сбора одного канала — 60000 Гц, частота вывода на DOUT — 2500 Гц.
Вывод сигналов работает нормально, проверил на осциллографе, а сбор данных осуществляется с какой-то временной задержкой, см. рисунок:
https://www.lcard.ru/forums/img/members … 3-1158.jpg

Т.е. регистрируемые импульсы с АЦП запаздывают по отношению к управляющим импульсам, подающимся на DOUT. Причем эта задержка меняется при каждом запуске программы.
Задача состоит в том, чтобы считывать уровень полки импульса и далее с ней работать, а в таком режиме работы это невозможно...
Подскажите пожалуйста как можно синхронизировать вывод и ввод данных, или хотя бы стабилизировать временную задержку между ними?

Заранее спасибо!

24.07.2020 16:20:09
#2

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

Re: Синхронный вывод и ввод E-502

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

Я посмотрел тот пример, что Вы присылали.
Тут нужно учитывать, что хотя сам модуль позволяет вводить и выводить сигнал синхронно с заданной частотой и диаграммы синхронного ввода и вывода привязаны к одной точке старта, но сами данные между модулем и программой на ПК передаются с задержками. Более того, под ОС общего назначения эти задержки строго не определены и могут варьироваться от запуска к запуску.

В связи с этим синхронный вывод с точной привязкой по времени возможен только при условии, что на момент вывода данные уже загружены в сам модуль, т.е. всегда нужно иметь загруженную часть сигнала в памяти самого модуля (время предзагруженного сигнала в общем и определяет макс. суммарную задержку, которая не приведет к разрыву данных).

У Вас в программе выполняется предзагрузка, но всего на две точки для каждого канала (что для частоты 2.5 КГц меньше мс).
В результате, когда Вы запускаете синхронный ввод-вывод через StreamsStart, пока модуль пошлет ответ (функция завершается по успешному ответу от модуля)  и этот ответ будет обработан программой ПК, у Вас эти точки уже давно будут выведены и из-за отсутствия новых данных последняя точка будет повторяться до тех пор, пока не придут новые данные, которые уже начнут выводиться синхронно с момента прихода, но длительность паузы пока данных не было будет зависеть от задержек передачи ответа, его обработки, посылки новых данных, которые каждый раз разные. При этом с АЦП данные собираются с момента старта всегда синхронно и хоть и получаются в ПК с задержкой, но соответствуют синхронным моментам времени с заданной частотой от начала сбора.

Таким образом Вам нужно изначально предзагрузить достаточно данных - хотя бы 7-10 Ваших циклов по 8 мкс, чтобы к моменту посылки новых данных буфер на вывод не опустошился и вывод был бы строго синхронным. Я для проверки у себя завел DOUT1 и DOUT2 на первый и второй канал АЦП  и проверил Ваш пример с достаточной предзагрузкой, в результате получился синхронный сигнал с той же задержкой от начала, что и выводилось, без сдвигов от запуска к запуску:
e502_labview.png
При обработке данных от АЦП Вы при необходимости можете учитывать эту разницу в циклах, т.е. первый принятый цикл данных с АЦП будет соответствовать точно первому предзагруженному циклу и т.д.

Также у Вас несколько странно был сделан сам вывод. В Prepeare передается размер каждого сигнала (на цикл у Вас 20 точек) и каждый массив на входе должен быть этого размера, а в Send передается уже размер слов общего результирующего массива. Т.к. Вы используете все 3 потока вывода, то он должен быть в 3 раза больше. У Вас же получалось, что Вы подавали размер 4, при этом массив цифровых линий был из одного элемента (3 других по сути использовались как мусор из памяти за массивом), далее получался массив на 12 элементов из которых Вы передавали только 4 первых (ЦАП1, ЦАП2, DOUT, ЦАП1), что соответствовало двум циклам вывода, где во втором значения ЦАП2 и DOUT повторялись, т.к. они не пришли в кадре (т.е. так как Вы из выходного потока передавали все равно только один DOUT, то лишний мусор на выходе из PrepareData не видели). Да и разбивать цикл на 10 частей и выводить по два отсчета особого смысла не имеет, логичнее формировать и посылать сразу блок на цикл в 8 мс (времена реакции в 1мс все равно сильно меньше мин. возможных задержек в windows).

Подправленный пример я выслал Вам на почту.

P.S,: если цикл всегда одинаковый, а вывод уровней на ЦАП явно к фазе цикла не привязан, то проще использовать циклический вывод для DOUT и асинхронный для ЦАП.

24.07.2020 18:14:21
#3

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

Re: Синхронный вывод и ввод E-502

Алексей L Card пишет:

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

Я посмотрел тот пример, что Вы присылали.
Тут нужно учитывать, что хотя сам модуль позволяет вводить и выводить сигнал синхронно с заданной частотой и диаграммы синхронного ввода и вывода привязаны к одной точке старта, но сами данные между модулем и программой на ПК передаются с задержками. Более того, под ОС общего назначения эти задержки строго не определены и могут варьироваться от запуска к запуску.

В связи с этим синхронный вывод с точной привязкой по времени возможен только при условии, что на момент вывода данные уже загружены в сам модуль, т.е. всегда нужно иметь загруженную часть сигнала в памяти самого модуля (время предзагруженного сигнала в общем и определяет макс. суммарную задержку, которая не приведет к разрыву данных).

У Вас в программе выполняется предзагрузка, но всего на две точки для каждого канала (что для частоты 2.5 КГц меньше мс).
В результате, когда Вы запускаете синхронный ввод-вывод через StreamsStart, пока модуль пошлет ответ (функция завершается по успешному ответу от модуля)  и этот ответ будет обработан программой ПК, у Вас эти точки уже давно будут выведены и из-за отсутствия новых данных последняя точка будет повторяться до тех пор, пока не придут новые данные, которые уже начнут выводиться синхронно с момента прихода, но длительность паузы пока данных не было будет зависеть от задержек передачи ответа, его обработки, посылки новых данных, которые каждый раз разные. При этом с АЦП данные собираются с момента старта всегда синхронно и хоть и получаются в ПК с задержкой, но соответствуют синхронным моментам времени с заданной частотой от начала сбора.

Таким образом Вам нужно изначально предзагрузить достаточно данных - хотя бы 7-10 Ваших циклов по 8 мкс, чтобы к моменту посылки новых данных буфер на вывод не опустошился и вывод был бы строго синхронным. Я для проверки у себя завел DOUT1 и DOUT2 на первый и второй канал АЦП  и проверил Ваш пример с достаточной предзагрузкой, в результате получился синхронный сигнал с той же задержкой от начала, что и выводилось, без сдвигов от запуска к запуску:
e502_labview.png
При обработке данных от АЦП Вы при необходимости можете учитывать эту разницу в циклах, т.е. первый принятый цикл данных с АЦП будет соответствовать точно первому предзагруженному циклу и т.д.

Также у Вас несколько странно был сделан сам вывод. В Prepeare передается размер каждого сигнала (на цикл у Вас 20 точек) и каждый массив на входе должен быть этого размера, а в Send передается уже размер слов общего результирующего массива. Т.к. Вы используете все 3 потока вывода, то он должен быть в 3 раза больше. У Вас же получалось, что Вы подавали размер 4, при этом массив цифровых линий был из одного элемента (3 других по сути использовались как мусор из памяти за массивом), далее получался массив на 12 элементов из которых Вы передавали только 4 первых (ЦАП1, ЦАП2, DOUT, ЦАП1), что соответствовало двум циклам вывода, где во втором значения ЦАП2 и DOUT повторялись, т.к. они не пришли в кадре (т.е. так как Вы из выходного потока передавали все равно только один DOUT, то лишний мусор на выходе из PrepareData не видели). Да и разбивать цикл на 10 частей и выводить по два отсчета особого смысла не имеет, логичнее формировать и посылать сразу блок на цикл в 8 мс (времена реакции в 1мс все равно сильно меньше мин. возможных задержек в windows).

Подправленный пример я выслал Вам на почту.

P.S,: если цикл всегда одинаковый, а вывод уровней на ЦАП явно к фазе цикла не привязан, то проще использовать циклический вывод для DOUT и асинхронный для ЦАП.

Спасибо! Теперь все синхронно работает.
Еще такой вопрос - вывод на DOUT логичнее сделать с частотой 1250 Гц и поделить логический массив на 10 столбцов, но при попытке так сделать, он устанавливает частоту вывода 1953.12 Гц, получается это минимальная частота вывода для карты?

24.07.2020 19:23:04
#4

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

Re: Синхронный вывод и ввод E-502

Да, частота вывода получается путем деления опорной частоты на делитель, максимальное значение которого 1024 (X502_OUT_FREQ_DIV_MAX в описании API), т.е. минимальная частота вывода как раз получается 2 МГц/1024  = 1953,125 Гц.
Частоты ниже получаются только повтором значений.

Контакты

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

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

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

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