Страница 2 из 2

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

Добавлено: 08 июл 2016, 12:39
НиколайV
Здравствуйте. Программа (точнее ее часть, в которой заключается проблема) состоит из выделения данных, составляющих осциллограмму с соответствующего прибора, и структуры formula node, определяющей длительность импульса, находящегося в этой осциллограмме. Дело вот в чем: массив данных подается на formula node, единожды там обрабатывается, и в следующем общем цикле обрабатывается уже следующий массив. Как можно вынести из цикла formula node так, чтобы она воспринимала заданное нами количество осциллограмм? С целью усреднения расчетной длительности импульса.
Пытался по-разному разносить части из общего цикла, но при этом все перестает работать.

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

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

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

Добавлено: 08 июл 2016, 15:01
Николай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, из которого считывается осциллограмма, в разные циклы. Извиняюсь, вопрос простой как мне кажется, но решить никак не могу, без потери работоспособности программы.

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

Добавлено: 08 июл 2016, 15:24
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

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

Добавлено: 08 июл 2016, 15:29
НиколайV
dadreamer писал(а): Ну да, теперь понятно. Можно (и даже нужно) разнести в два параллельных цикла: цикл получения данных с прибора и цикл обработки данных. Передачу данных между циклами можно организовать через очередь.
Спасибо, буду разбираться.

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

Добавлено: 08 июл 2016, 15:33
dadreamer
НиколайV писал(а):Спасибо, буду разбираться.
На самом деле там ничего сложного нет, если разберётесь. В цикле обработки будете хранить в регистре последние 10 массивов осциллограмм или их усредненные значения (например, по скользящему среднему). При поступлении нового массива через очередь он будет просто добавляться к предыдущим и далее участвовать в мат. операциях.

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

Добавлено: 11 июл 2016, 16:23
НиколайV
Не сказать, что до конца разобрался в очередях, но все заработало удовлетворительно. За исключением того, что я не могу ускорить выполнение цикла - производителя.

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

Но цикл со подключением / выключением осциллографа независимо от задержки выполняется не быстрее, чем раз в 0.7 - 0.8 сек. - и, если я хочу сделать усреднение по ста значениям, то и ждать придется больше минуты. Не подскажете, можно ли это ускорить?

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

Добавлено: 11 июл 2016, 18:28
Blackman
Попробуйте как на рисунке.

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

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

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

Добавлено: 12 июл 2016, 13:10
Borjomy_1
Неудивительно. формулу не стоит использовать. Лучше поднапрячся и обойтись без скриптов.