Работа с очередью
-
- beginner
- Сообщения: 40
- Зарегистрирован: 21 мар 2014, 14:09
- Версия LabVIEW: 2011
- Контактная информация:
Работа с очередью
Есть два параллельных цикла. В одном опрашивается периферия и рассчитывается математика (быстрый), в другом отрисовывается интерфейс (сравнительно медленный). В быстром цикле данные принимаются от железа в массивах определенной длины. Я запихиваю эти массивы в очередь по мере их поступления. Теперь мне надо в медленном цикле выковыривать эти массивы из очереди. Что бы очередь не переполнялась, выковыривать надо бОльшими кусками. Т.е. записываю часто, но мелко, читаю редко, но крупно. Я верно мыслю? Как мне реализовать непрерывное чтение из очереди в массив большего размера? Например, в быстром цикле (10 Гц) в очередь приходит два массива по 1000 элементов. В медленном цикле (1 Гц) я хочу выковырять один массив из 20000 элементов. Как мне это реализовать? Спасибо
-
IvanLis
- guru
- Сообщения: 5464
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 87 раз
Re: Работа с очередью
Нет, не верно .VladosXPOM писал(а):Я верно мыслю?
Что бы очередь не переполнялась, чтение из нее должно выполняться чаще (в среднем) чем запись.
Организация очереди позволяет сделать асинхронно прием и обработку, что позволит в случае задержки при обработке не потерять данные от устройства.
Для реализации, как Вы написали.
Нужно в приемном цикле организовать массив и писать данные в него, по достижении определенного размера, записывать его в очередь. А уже цикл обработки заберет массив из очереди.
Я как правило для накопления использую промежуточный цикл, но можно обойтись и без него, все зависит от оборудования.
Получается:
"Приемный цикл" крутится независимо от нас, принимает данные с устройства и пишет в "Очередь прием".
"Цикл накопления" срабатывает при каждой записи данные в "Очередь прием" и перекидывает их в "буфер массив", проверяет его размер. Если необходимый объем данных накоплен, то данные записываются в "Очередь обработка". При этом остаток можно оставить в "буфер массив", они пойдут на обработку в следующей порции.
"Цикл обработки" срабатывает при записи данных в "Очередь обработка". И выполняет с данными необходимые операции.
Имеем:
"Приемный цикл" и "Цикл накопления" вращаются примерно с одинаковой скоростью.
"Цикл обработки" срабатывает по мере поступления данных.
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
- beginner
- Сообщения: 40
- Зарегистрирован: 21 мар 2014, 14:09
- Версия LabVIEW: 2011
- Контактная информация:
Re: Работа с очередью
Можете подсказать как именно организовать "дозапись" меньшего массива в больший массив за несколько итераций цикла? Подозреваю, что через сдвиговый регистр
-
IvanLis
- guru
- Сообщения: 5464
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 87 раз
Re: Работа с очередью
Все верно.VladosXPOM писал(а):Подозреваю, что через сдвиговый регистр
Набросал пример для наглядности:
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
- beginner
- Сообщения: 40
- Зарегистрирован: 21 мар 2014, 14:09
- Версия LabVIEW: 2011
- Контактная информация:
Re: Работа с очередью
Огромное спасибо, все работает.
Скажите, существуют ли такие способы обработки сигнала в LV, когда прибор в цикле не ждет прихода всего массива и целиком его обрабатывает, а начинает обработку с приходом первого сигнала, постепенно продвигая данные вперед по мере их поступления. Встречал в палитрах приборы PtbPt или running RMS например. Они работают по такому принципу?
Скажите, существуют ли такие способы обработки сигнала в LV, когда прибор в цикле не ждет прихода всего массива и целиком его обрабатывает, а начинает обработку с приходом первого сигнала, постепенно продвигая данные вперед по мере их поступления. Встречал в палитрах приборы PtbPt или running RMS например. Они работают по такому принципу?
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Работа с очередью
VladosXPOM, У по-точечной реализации есть только один плюс - малое время реакции. Все остальное - только минус (высокие накладные расходы на обработку, загрузка процессора, сложность реализации, необходимость предусмотрения буферов и прочее). Так как вы не выдаете управляющий сигнал, то вам абсолютно не нужна обработка по точкам. А для вывода на экран графика достаточно интервала 100мс. Под это время и рассчитывайте размер пакета.
-
- beginner
- Сообщения: 40
- Зарегистрирован: 21 мар 2014, 14:09
- Версия LabVIEW: 2011
- Контактная информация:
Re: Работа с очередью
Просто в программе используется FFT для полосы частот. Если на вход подать маленький пакет данных, то спектральное разрешение слишком низкое. Поэтому приходится несколько пакетов запихивать в один большой массив и уже по нему считать спектр. При этом, пока данные записываются в большой массив, спектр не обновляется. Налицо очень большое время отклика программы между приходом реальных данных от АЦП и отображением их на спектре. Может как то можно это обойти? Спасибо
-
IvanLis
- guru
- Сообщения: 5464
- Зарегистрирован: 02 дек 2009, 17:44
- Награды: 7
- Версия LabVIEW: 2015, 2016
- Откуда: СССР
- Благодарил (а): 28 раз
- Поблагодарили: 87 раз
Re: Работа с очередью
Уменьшить размер буфера - накопителя.VladosXPOM писал(а):Может как то можно это обойти? Спасибо
Повысить частоту поступления данных.
Знание нескольких принципов освобождает от знания многих фактов!
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
Правила форума
Как добавить в сообщение картинку или файл
Конвертация / версий (форматов) VI
Как правильно задать вопрос...
-
- doctor
- Сообщения: 2211
- Зарегистрирован: 28 июн 2012, 09:32
- Награды: 3
- Версия LabVIEW: 2009..2020
- Откуда: город семи холмов
- Благодарил (а): 27 раз
- Поблагодарили: 27 раз
Re: Работа с очередью
VladosXPOM, Практика показывает, что если даже применять скользящее окно, для, например, обсчета спектра за 1 сек, со смещением 100мс, вы всё равно никакого увеличения динамики не получите. Причина заключается в том, что данные усредняются по гармоникам.
например прохождение импульса ___________----____________ приводит к тому, что в течение N-ного количества времени (ширина окна) вид спектра меняться не будет, хотя обновление и вычисление будет происходить в 10 раз чаще.
Можно, конечно, сделать вариант, когда более высокие гармоники считаются по меньшему окну (пропорциональному длине периода гармоники), однако возникает вопрос взаимного пересечения спектров при разных df и FFT тут уже не применишь.
например прохождение импульса ___________----____________ приводит к тому, что в течение N-ного количества времени (ширина окна) вид спектра меняться не будет, хотя обновление и вычисление будет происходить в 10 раз чаще.
Можно, конечно, сделать вариант, когда более высокие гармоники считаются по меньшему окну (пропорциональному длине периода гармоники), однако возникает вопрос взаимного пересечения спектров при разных df и FFT тут уже не применишь.
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
- 16 Ответы
- 3263 Просмотры
-
Последнее сообщение Artem.spb
-
- 4 Ответы
- 220 Просмотры
-
Последнее сообщение Andrew Lunev