хард-буфер на cDAQ

Радиотехника, платы, схемы, оборудование, фото- видео- приборы, компьютеры
Artem.spb

Activity Автор
professor
professor
Сообщения: 3387
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

хард-буфер на cDAQ

Сообщение Artem.spb »

Я снова со своей проблемой выдачи хитрой последовательности на DO.
И да, я мечтаю чтобы в задаче была cRIO, но там её нет.

Коротко задача: на DO выдаётся хитрая последовательность импульсов (хитрость в том, что пауза между ними постепенно возрастает), поэтому разом взять готовый массив не получится.
решение:
daq_buf.png
готовлю буфер на 2с, дальше в цикле описываю в него по 0,5с.
Задержки в цикле нет. потому что функция записи должна дождаться, когда в буфере будет место, только после этого отправит туда очередную порцию.
На эмуляторе даже всё прекрасно работает.
А дальше иду к реальному cDAQ и всё становится плохо.
В буфер всё успешно пишется, даже на выходе есть то, что надо, НО.
dt измеряется не с проста. На эмуляторе величина в среднем 500мс, что и ожидалось, а вот на реальном железе эта величина 3..100 мс, и через пару минут начинает подскакивать до 8000.
Т.е. получается, что на реальном железе данные отправляются в какой-то неведомый космос, откуда уже передаются на железо. (повторю, что на выходе то, что ожидается, так что прослойка реально работает).
Ещё одна особенность обнаружена: после остановки задачи на выходе часто остаётся 1, что не менее печально.
Долгая переписка с техподдержкой пока не дала результат, предложили только поставить "DAQmx Wait Until Done (VI)", и тут-то обнаружили правильность предположения.
за 10 с функция не дожидается окончания (чел из поддержки сказал, что он дождался минуты за 2-3, что опять же подтверждает огромные размеры буфера).
Тут я решаю проверить, что же там творится, и в случае ошибки запускаю последний цикл. И обнаруживаю, что:
  • - буфер свободен, в нём всегда доступно 2000 точек. Т.е. созданный мной буфер реально на 2000 точек
  • - задача продолжает работать. величина total generated продолжает расти.
т.е. предположение о некой прослойке между программой (буфером) и железом подтверждается.
И возникает вопрос, как получить доступ к параметрам этого буфера?
Так, чтобы не пихать туда больше, чем можно.
мОжно банально поставить в цикле задержку 500 мс, но этот вариант плох тем, что не гарантирует отправку данных с нужной скоростью (вдруг они будут поступать чуть медленнее), что через пару часов (в теории) приведёт к ошибке "нет данных".
ставить паузу меньше тоже не подходит, потому что получаю то, что имею, только в меньших масштабах.

Кто-нибудь сталкивался с такой задачей?
cDAQ-9188
модуль 9402
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2207
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 26 раз

Re: хард-буфер на cDAQ

Сообщение Borjomy_1 »

Тогда контролируйте Total Generated! Если это значение того, что отдано, то необходимая информация у вас есть. Вы же знаете, сколько записали. Записали 2000 значений, дожидаетесь, пока не будет выдано 1000. После даете новую порцию. Дожидаетесь выдачи 3000 и так далее. Не?
Artem.spb

Activity Автор
professor
professor
Сообщения: 3387
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

Re: хард-буфер на cDAQ

Сообщение Artem.spb »

Borjomy_1 писал(а):Тогда контролируйте Total Generated! Если это значение того, что отдано, то необходимая информация у вас есть. Вы же знаете, сколько записали. Записали 2000 значений, дожидаетесь, пока не будет выдано 1000. После даете новую порцию. Дожидаетесь выдачи 3000 и так далее. Не?
Этот вариант пока единственный. Но он плох тем, что это придётся делать руками. Я ожидал от драйвера больше.
Но судя по всему это особенность конкретной корзины. Раньше подобных проблем не встречал.
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2207
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 26 раз

Re: хард-буфер на cDAQ

Сообщение Borjomy_1 »

Хм... для потокового вывода других вариантов нет. Система не будет за вас решать, когда выполнить функцию и отдать управление, чтобы вы успели ей новые данные подпихнуть. Закидывает в буфер и все
Artem.spb

Activity Автор
professor
professor
Сообщения: 3387
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

Re: хард-буфер на cDAQ

Сообщение Artem.spb »

Borjomy_1 писал(а):Система не будет за вас решать, когда выполнить функцию и отдать управление, чтобы вы успели ей новые данные подпихнуть. Закидывает в буфер и все
Вот совсем не логично. приведу аналогию: я создаю очередь на 10 элементов. Отправил туда 10 и ещё не успел вынуть. Пытаюсь отправить 11й. Так вот система терпеливо ждёт, пока место освободится.
При выводе я ожидаю то же самое. Создаю буфер на 2000 и отправляю в него по 500. Но буфер по факту оказывается не 2000, а гораздо больше (причём не очень понятно, сколько именно) и проглатывает всё, что ему дают. Причём я проверял параметр "доступное место", тот самый буфер, который я создал, всегда имеет 2000 свободных точек.
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2207
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 26 раз

Re: хард-буфер на cDAQ

Сообщение Borjomy_1 »

Вообщем-то не стоит рассчитывать на то, что функция будет ожидать, пока освободится место в буфере. Намеком на это является отсутствие такого параметра, как таймаут. В лучшем случае вы получите ошибку переполнения буфера.
Artem.spb

Activity Автор
professor
professor
Сообщения: 3387
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

Re: хард-буфер на cDAQ

Сообщение Artem.spb »

Borjomy_1 писал(а):Намеком на это является отсутствие такого параметра, как таймаут.
когда это он успел стать отсутствующим?
t.png
В лучшем случае вы получите ошибку переполнения буфера.
Это не лучший, а худший случай.
Если я знаю, что 500 точек уйдёт за 500 мс, то поставлю таймаут 1с и всё будет нормально. Более того, по умолчанию таймаут 10с.
Blackman

Activity
leader
leader
Сообщения: 932
Зарегистрирован: 17 янв 2016, 15:02
Награды: 1
Версия LabVIEW: 6.1,8.5,20

Re: хард-буфер на cDAQ

Сообщение Blackman »

По поводу DAQmx Wait Until Done VI
What Is the Difference between the DAQmx Wait Until Done VI and DAQmx Is Task Done VI?
http://digital.ni.com/public.nsf/allkb/ ... 26007B6A18
Если кратко, для непрерывной задачи как правило генерирует ошибку через время таймаута.
Здесь лучше использовать DAQmx Is Task Done VI, который должен выдать ошибку на пустой DAQmx буфер задачи. При этом по идее еще какое то время должна продолжаться генерация: зависит от размера FIFO шасси и режима передачи из DAQmx буфера.
P.S.
Вообщем-то не стоит рассчитывать на то, что функция будет ожидать, пока освободится место в буфере.
Для Output Task именно этим функция и занимается.
.... В лучшем случае вы получите ошибку переполнения буфера.
Из сказанного выше для Output Task можно получить только ошибку буфер пуст (Buffer underflow)
Artem.spb

Activity Автор
professor
professor
Сообщения: 3387
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

Re: хард-буфер на cDAQ

Сообщение Artem.spb »

здесь задача не дождаться завершения выдачи (полного опустошения буфера), а адекватно закидывать новые порции. Остановка уже второстепенна, там проблема только в том, что на предыдущем этапе запихано много точек, которые выдаются ещё оч долго, и если стопануть задачу можно получить 1 на выходе прибора, когда программа уже не работает.
В итоге остановился на варианте проверять "сгенерированно всего". Руками, зато работает.
Blackman

Activity
leader
leader
Сообщения: 932
Зарегистрирован: 17 янв 2016, 15:02
Награды: 1
Версия LabVIEW: 6.1,8.5,20

Re: хард-буфер на cDAQ

Сообщение Blackman »

Размер FIFO шасси для DO Task 2047 samples (слот 1...4) или 1023 samples (слот 5...8). Размер FIFO можно узнать через propety http://digital.ni.com/public.nsf/allkb/ ... F200043B97 .
Размер буфера хоста задан 2000 samples. 2047 + 2000=4047 samples. Максимально возможное количество отсчетов после остановки записи в буфер хоста.
В этом случае при sample rate 1k время генерации 4+ сек.
Однако функции Stop Task или Clear Task останавливают генерацию "мгновенно". После этого остается записать в модуль требуемое значение при остановке.
Проще всего это сделать второй DO Task On Demand, которая должна ждать завершения первой задачи.
Artem.spb

Activity Автор
professor
professor
Сообщения: 3387
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

Re: хард-буфер на cDAQ

Сообщение Artem.spb »

Blackman писал(а):Размер FIFO шасси для DO Task 2047 samples (слот 1...4) или 1023 samples (слот 5...8). Размер FIFO можно узнать через propety http://digital.ni.com/public.nsf/allkb/ ... F200043B97 .
Размер буфера хоста задан 2000 samples. 2047 + 2000=4047 samples. Максимально возможное количество отсчетов после остановки записи в буфер хоста.
В этом случае при sample rate 1k время генерации 4+ сек.
Эта дивная теория разбивается о реальность. И несмотря на то, что в школе меня учили "если теория не совпадает с практикой, тем хуже для практики", это тут не прокатывает.
сначала я включил программу на 10-20 сек, после чего в буфер успешно улетело примерно 8 минут данных. И да, они успешно выдавались 8 минут (график в итоге перестал расти)
gen.png
gen.png (6.49 КБ) 11987 просмотров
Потом я решил проверить размер буфера.
Он , падла, всего 2047. софт буфер 2000. Где же отсиживаются 280000 точек во втором и 513000 в первом случаях?.
buf.png
buf.png (8.66 КБ) 11987 просмотров
Borjomy_1

Activity Professionalism Silver
doctor
doctor
Сообщения: 2207
Зарегистрирован: 28 июн 2012, 09:32
Награды: 3
Версия LabVIEW: 2009..2020
Откуда: город семи холмов
Благодарил (а): 27 раз
Поблагодарили: 26 раз

Re: хард-буфер на cDAQ

Сообщение Borjomy_1 »

Два буфера - буфер верхнего уровня, практически бесконечный, и буфер нижнего уровня (FIFO), подержанный аппаратно, из которого производится запись непосредственно в канал вывода (либо дискретный, либо ЦАП), например через DMA канал.
Выдача будет остановлена, когда TotalSampPerChanGenerated сравняется с totsend.
Непонятно, что тут сложного? Берете TotalSampPerChanGenerated и totsend и проверяете, что totsend - TotalSampPerChanGenerated > FIFO Len/2. Если условие выполняется, то закидываете новую порцию.
Artem.spb

Activity Автор
professor
professor
Сообщения: 3387
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

Re: хард-буфер на cDAQ

Сообщение Artem.spb »

Borjomy_1 писал(а):Два буфера - буфер верхнего уровня, практически бесконечный,
в этом и вопрос. какого лешего он бесконечный, если я просил только 2000?
Выдача будет остановлена, когда TotalSampPerChanGenerated сравняется с totsend.
это я знаю и проверил.
Непонятно, что тут сложного? Берете TotalSampPerChanGenerated и totsend и проверяете, что totsend - TotalSampPerChanGenerated > FIFO Len/2. Если условие выполняется, то закидываете новую порцию.
Ничего сложного, уже давно сделано и проверено.
но для меня очень странно, что функция записи ведёт себя неадекватно, и почему буфер бесконечный, хотя я создаю вполне конкретный.
timeout specifies the amount of time in seconds to wait for the VI to write all samples. NI-DAQmx performs a timeout check only if the VI must wait before it writes data. This VI returns an error if the time elapses. ....
такая обтекаемая формулировка. Если должна, подождёт, а если не должна, то не подождёт.
Blackman

Activity
leader
leader
Сообщения: 932
Зарегистрирован: 17 янв 2016, 15:02
Награды: 1
Версия LabVIEW: 6.1,8.5,20

Re: хард-буфер на cDAQ

Сообщение Blackman »

Artem, Вы не проверяли при каком количестве записанных отсчетов начинается генерация? Была информация, что шасси включает генерацию, если FIFO (очередь) заполнена на половину или больше.
В дальнейшем DAQmx (по умолчанию ) закидывает новую порцию, если она заполнена на половину или меньше. Механизм трансфера из общей памяти по умолчанию DMA. Все значения настроек доступны через properties.
Возможно там же было о поведении DAQmx в случае если размере буфера устанавливается меньше размера FIFO.
Artem.spb

Activity Автор
professor
professor
Сообщения: 3387
Зарегистрирован: 31 июл 2011, 23:05
Награды: 2
Версия LabVIEW: 12-18
Благодарил (а): 49 раз
Поблагодарили: 172 раза
Контактная информация:

Re: хард-буфер на cDAQ

Сообщение Artem.spb »

Blackman писал(а):Artem, Вы не проверяли при каком количестве записанных отсчетов начинается генерация?
Вот прямо так не проверял, но по-моему старт стразу. По крайней мере, когда я записывал в буфер мало точек, запускал задачу, а потом переходил в основной цикл, то задача вываливалась с ошибкой "данные кончились", т.е. пока цикл разгонялся и генерировал массив данных, точки в буфере заканчивались, что наводит на мысль о старте без задержек.
buf3.png
Была информация, что шасси включает генерацию, если FIFO (очередь) заполнена на половину или больше.
где такое было?
И это очень странно. Особенно при космических размерах буфера :)
В дальнейшем DAQmx (по умолчанию ) закидывает новую порцию, если она заполнена на половину или меньше.
это тоже непонятно. И противоречит эксперименту. Данные влезают в буфер очень бодро, что говорит о большом размере буфера.
Механизм трансфера из общей памяти по умолчанию DMA.
да, но от этого мне не легче и это не даёт информации о размере буфера и причинах его поведения.
Все значения настроек доступны через properties.
Это я знаю, вопрос только в том, какие настройки надо крутить.
тут ничего особо нет, размер задаю, но от него мало что зависит
buf1.png
buf1.png (8.06 КБ) 11952 просмотра
доступное место почти всегда 2000.
buf2.png
Возможно там же было о поведении DAQmx в случае если размере буфера устанавливается меньше размера FIFO.
"там", это где?
Ответить

Вернуться в «Железо»