Считывание длительности "хвостатого" импульса

Захват, обработка и генерирование сигнала
НиколайV
beginner
beginner
Сообщения: 23
Зарегистрирован: 19 май 2016, 11:14
Версия LabVIEW: 2015
Контактная информация:

Осциллограмма

Сообщение НиколайV »

Здравствуйте. Программа (точнее ее часть, в которой заключается проблема) состоит из выделения данных, составляющих осциллограмму с соответствующего прибора, и структуры formula node, определяющей длительность импульса, находящегося в этой осциллограмме. Дело вот в чем: массив данных подается на formula node, единожды там обрабатывается, и в следующем общем цикле обрабатывается уже следующий массив. Как можно вынести из цикла formula node так, чтобы она воспринимала заданное нами количество осциллограмм? С целью усреднения расчетной длительности импульса.
Пытался по-разному разносить части из общего цикла, но при этом все перестает работать.
Вложения
Last v1.3000.vi
(23.37 КБ) 192 скачивания
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Осциллограмма

Сообщение dadreamer »

У меня все верхние SubVI не определились при открытии программы.
Что вынудило использовать именно Formula Node? Нативный код в :labview: работает гораздо быстрее (раза в 1,5-2) (см. тест).
НиколайV писал(а):Дело вот в чем: массив данных подается на formula node, единожды там обрабатывается, и в следующем общем цикле обрабатывается уже следующий массив. Как можно вынести из цикла formula node так, чтобы она воспринимала заданное нами количество осциллограмм? С целью усреднения расчетной длительности импульса.
Честно говоря, не понял, что требуется вынести из Formula Node. Если на текущей итерации нужны значения предыдущего массива, то это делается через сдвиговый регистр. Если прямо из Formula Node нужно вынести какой-то параметр, то добавьте его как выход. Если вы где-то вне цикла задаёте количество осциллограмм, то заведите этот параметр в FN и работайте с ним.
НиколайV
beginner
beginner
Сообщения: 23
Зарегистрирован: 19 май 2016, 11:14
Версия LabVIEW: 2015
Контактная информация:

Re: Осциллограмма

Сообщение НиколайV »

dadreamer писал(а):У меня все верхние SubVI не определились при открытии программы.
Верхние SubVi - драйвера осциллографа.
dadreamer писал(а):Что вынудило использовать именно Formula Node?
Там была трудность в определении длительности импульса с множеством шумов по переднему и заднему фронтам. Мне проще было использовать С-подобный язык, после нескольких неудачных попыток реализовать алгоритм на :labview:.
dadreamer писал(а):Честно говоря, не понял, что требуется вынести из Formula Node. Если на текущей итерации нужны значения предыдущего массива, то это делается через сдвиговый регистр. Если прямо из Formula Node нужно вынести какой-то параметр, то добавьте его как выход. Если вы где-то вне цикла задаёте количество осциллограмм, то заведите этот параметр в FN и работайте с ним.
Осциллограммы считываются непрерывно (вроде, под тысячу или даже больше раз в секунду), а алгоритм в formula node считает текущее значение длительности импульса раз в секунду (поскольку помещен в While Loop), соответственно для разных осциллограмм.

У меня не получается сделать так, чтобы значение длительности импульса бралось для, например, 10 или больше разных осциллограмм и усреднялось. В код я вписал это, но, поскольку formula node находится в общем цикле, берутся 10 одинаковых, а не разных осциллограмм, и значение получается прежним.

Поэтому я и спросил, можно ли как-то разнести formula node и SubVi, из которого считывается осциллограмма, в разные циклы. Извиняюсь, вопрос простой как мне кажется, но решить никак не могу, без потери работоспособности программы.
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Осциллограмма

Сообщение dadreamer »

НиколайV писал(а):У меня не получается сделать так, чтобы значение длительности импульса бралось для, например, 10 или больше разных осциллограмм и усреднялось. В код я вписал это, но, поскольку formula node находится в общем цикле, берутся 10 одинаковых, а не разных осциллограмм, и значение получается прежним.

Поэтому я и спросил, можно ли как-то разнести formula node и SubVi, из которого считывается осциллограмма, в разные циклы. Извиняюсь, вопрос простой как мне кажется, но решить никак не могу, без потери работоспособности программы.
Ну да, теперь понятно. Можно (и даже нужно) разнести в два параллельных цикла: цикл получения данных с прибора и цикл обработки данных. Передачу данных между циклами можно организовать через очередь.
dadreamer писал(а):
dadreamer писал(а):Синхронизировать циклы можно через очереди, уведомители и прочие инструменты.
В интернете полно примеров по передаче данных между параллельными циклами. Изучите, как работают механизмы синхронизации, на примере http://www.ni.com/white-paper/3023/en/ (подход "Producer - Consumer"). Посмотрите схожие темы на форуме, например http://www.labviewportal.org/viewtopic. ... 096#p66096 , http://labviewportal.org/viewtopic.php?p=68893#p68893 , http://labviewportal.org/viewtopic.php? ... 4cb#p62828

А также вот вам литература и примеры:
1) "LabVIEW Основы II: Разработка" : шаблон «Производитель-потребитель» + материал в главе 2 "Передача данных между несколькими циклами"
2) Питер Блюм "LabVIEW: стиль программирования", в частности глава 8 "Шаблоны" и раздел 8.3.1 "Параллельные циклы"
3) примеры в папке C:\Program Files (x86)\National Instruments\LabVIEW 2014\examples\Synchronization
НиколайV
beginner
beginner
Сообщения: 23
Зарегистрирован: 19 май 2016, 11:14
Версия LabVIEW: 2015
Контактная информация:

Re: Осциллограмма

Сообщение НиколайV »

dadreamer писал(а): Ну да, теперь понятно. Можно (и даже нужно) разнести в два параллельных цикла: цикл получения данных с прибора и цикл обработки данных. Передачу данных между циклами можно организовать через очередь.
Спасибо, буду разбираться.
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Осциллограмма

Сообщение dadreamer »

НиколайV писал(а):Спасибо, буду разбираться.
На самом деле там ничего сложного нет, если разберётесь. В цикле обработки будете хранить в регистре последние 10 массивов осциллограмм или их усредненные значения (например, по скользящему среднему). При поступлении нового массива через очередь он будет просто добавляться к предыдущим и далее участвовать в мат. операциях.
НиколайV
beginner
beginner
Сообщения: 23
Зарегистрирован: 19 май 2016, 11:14
Версия LabVIEW: 2015
Контактная информация:

Re: Считывание длительности "хвостатого" импульса

Сообщение НиколайV »

Не сказать, что до конца разобрался в очередях, но все заработало удовлетворительно. За исключением того, что я не могу ускорить выполнение цикла - производителя.

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

Но цикл со подключением / выключением осциллографа независимо от задержки выполняется не быстрее, чем раз в 0.7 - 0.8 сек. - и, если я хочу сделать усреднение по ста значениям, то и ждать придется больше минуты. Не подскажете, можно ли это ускорить?
Вложения
Last v1.3.5.vi
оригинальная
(26.2 КБ) 162 скачивания
Last v1.3.6.vi
альтернативная
(17.92 КБ) 162 скачивания
Blackman

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

Re: Считывание длительности "хвостатого" импульса

Сообщение Blackman »

Попробуйте как на рисунке.
Вложения
Example.png
НиколайV
beginner
beginner
Сообщения: 23
Зарегистрирован: 19 май 2016, 11:14
Версия LabVIEW: 2015
Контактная информация:

Re: Считывание длительности "хвостатого" импульса

Сообщение НиколайV »

Blackman писал(а):Попробуйте как на рисунке.
Сделал. Работает нормально, но быстрее, чем за 0.5 секунды так и не выполняется.
Borjomy_1

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

Re: Считывание длительности "хвостатого" импульса

Сообщение Borjomy_1 »

Неудивительно. формулу не стоит использовать. Лучше поднапрячся и обойтись без скриптов.
Вложения
Вместо формулы.png
Либо так
Либо так
Ответить
  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Обработка сигнала»