Подсчет импульсов

Простейшие вопросы в области инженерной разработки

Подсчет импульсов

Postby jane_wild on 04 Mar 2018, 00:42

Доброго всем здравия ребята. Прошу помощи. Кратко суть. На вал мотора наклеена отражающая лента, на которую направлен лазерный датчик и выход этого датчика заведен на аналоговый вход. В итоге имеется аналоговый массив состоящий из импульсов. Каждый импульс соответствует одному обороту мотора. Возникла необходимость в подсчете этих самых импульсов. Я понимаю, что по большому счету необходимо задействовать аппаратный счетчик DAQ, но не хочется переделывать весь проект. В итоге пытаюсь программно подсчитать количество импульсов. Посмотрите вложенный VI. Чувствую что есть более рациональное (простое) решение. К тому же массив состоит из около 5000 элементов. В итоге я проверяю все 5000 элементов, сравнивая значение с пороговым значением. Вот чувствую что неправильно это и процессору это явно не нравиться..... Спасибо
Attachments
Counter.vi
(18.99 KiB) Downloaded 37 times
User avatar
jane_wild
junior
junior
 
Posts: 61
Joined: 30 Jun 2016, 02:11
LabVIEW Version: 2016
Karma: 0

Re: Подсчет импульсов

Postby Vitekkz88 on 05 Mar 2018, 11:19

Количество сравнений можно уменьшить путём предварительной сортировки данных.
Однако, функция сортировки в LabVIEW использует алгоритм быстрой сортировки и это не всегда оптимально с точки зрения принимаемых данных(лучший и худший случай).
Я проверил Ваш алгоритм на массиве из 10000 элементов. Время отработки = 3-5 мс. В целом не так уж и много.
Если добавить сортировку, то время работы 15-17 мс ( всё время занимает сортировка, т.к. если этот блок вытащить за фрейм, то время работы меньше 1 мс).
Так же можно построить поиск на использовании Threshold Detector VI. В данном случае быстродействие высокое(используется Си-функция), но возможно потребуется так же настраивать. Время отработки ~ 1 мс(плюс минус)
Если необходимо автоматически задавать порог - то используйте функцию AC & DC Estimator VI(но это так же добавит немного времени для обработки, ведь порог будет вычисляться для каждой пачки данных). Получите 1-3 мс в итоге.
Так же попробуйте у графика отключить сглаживание(ПКМ по графику, снять галочку Anti-Aliesed). Проверьте другие участки кода на производительность. Возможно Вы используете много подложек на GUI - это тоже приводит к тормозам работы программы. Лечится c помощью использования Enable/Disable Front Panel Updates (DeferPanelUpdates).
Attachments
Test.png
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
User avatar
Vitekkz88
leader
leader
 
Posts: 979
Joined: 21 Jan 2014, 15:45
Location: Томск
Medals: 3
Activity (1) Silver (1) Автор (1)
LabVIEW Version: 12,13,14
Karma: 268
hardware I/O VIP

Re: Подсчет импульсов

Postby jane_wild on 05 Mar 2018, 15:59

Vitekkz88 wrote: Возможно Вы используете много подложек на GUI - это тоже приводит к тормозам работы программы.

Вы имеете ввиду декорации? У меня да - их много
Я как то не догадалась провести тест на скорость выполнения - спасибо. Пару мс меня вполне устраивает.
Сейчас озадачилась другим... Нужно еще и частоту вращения мерять. Идея простая - сложив количетсво выборок межу фронтами и умножив на время одной (частота дискретизации то известна), получим частоту импульов в секундах. Далее умножив результат на 60 получим желаемое RPM.
Вот тут то собака и порылась... Это в принципе будет работать если в прилетевшем массиве от DAQ есть хотя бы два импульса. При частоте опроса DAQ 100мс мотор должен крутится не менее 1200 оборотов в минуту. А если он вращается 100 об/мин. Тогда как? Именно по этой причине Pulse Measurement.vi выдает ощибку - потому как в массиве может и не быть импульсов. Вообщем воюю теперь с этим - пытаюсь как то при помощи FGV запоминать предыдущее колличество отсчетов...
User avatar
jane_wild
junior
junior
 
Posts: 61
Joined: 30 Jun 2016, 02:11
LabVIEW Version: 2016
Karma: 0

Re: Подсчет импульсов

Postby Vitekkz88 on 05 Mar 2018, 17:04

jane_wild, я имею ввиду подложки, т.е. сторонние картинки, добавленные при кастомизации контролов, например. Или, например, в качестве фона используется какая-то картинка.
Пусть будет 1200 оборотов, это не должно быть проблемой. Либо частоту обновления меняйте в бОльшую или меньшую сторону(я так понял речь о программном таймере).
Можете скинуть кусок данных, на которых возникает ошибка? Укажите пожалуйста частоту, которая должна быть измерена(для проверки сходимости). Можете несколько срезов данных скинуть, не проблема. Разберемся :-)
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
User avatar
Vitekkz88
leader
leader
 
Posts: 979
Joined: 21 Jan 2014, 15:45
Location: Томск
Medals: 3
Activity (1) Silver (1) Автор (1)
LabVIEW Version: 12,13,14
Karma: 268
hardware I/O VIP

Re: Подсчет импульсов

Postby jane_wild on 05 Mar 2018, 18:48

Когда мотор не вращается и импульсов нет и вышеуказанный Vi возвращает ошибку. Поэтому сейчас я пытаюсь придумать свой VI, который бы позволял измерять бОльшие периоды между импульсами. Скажем при вращении мотора 60 об/мин мы имеем период в одну секунду между импульсами. И если с DAQ я получаю данные 10 раз в секунду, значит в одной посылке из десяти фронт возрастет а в какой то другой спадет. Вот я и пытаюсь выловить эти изменения и измерить время между ними, что бы потом вычислить частоту вращения
Attachments
Error.vi
(20.03 KiB) Downloaded 27 times
User avatar
jane_wild
junior
junior
 
Posts: 61
Joined: 30 Jun 2016, 02:11
LabVIEW Version: 2016
Karma: 0

Re: Подсчет импульсов

Postby Vitekkz88 on 06 Mar 2018, 12:58

jane_wild, а Вам нужно буферезировать данные. Как только накопили определенное количество - отправляете на обработку.
По части ошибки: Вам нужно задать верные пороги для определения периода, ошибка об этом и говорит. Сделаем по классическому способу: найдём максимальное значение сигнала, вычислим полный размах. А далее относительно максимум будем брать некоторый процент для задания верхнего, среднего и низкого порогов. Я взял в соотношениях 80%, 50%, 20%. Однако, может возникать ошибка, когда Вы захватили много шума и всего 2 периода. В таком случае потребуется дополнительная обработка сигнала по выделению полезной части сигнала.Пример и исходник прикрепил. Проверил и на Вашем тестовом примере - всё работает. Достаточно заменить цикл сбора данных на Ваши данные и всё :-)
Attachments
Pict.png
Error (2).vi
(27.64 KiB) Downloaded 30 times
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
User avatar
Vitekkz88
leader
leader
 
Posts: 979
Joined: 21 Jan 2014, 15:45
Location: Томск
Medals: 3
Activity (1) Silver (1) Автор (1)
LabVIEW Version: 12,13,14
Karma: 268
hardware I/O VIP

Re: Подсчет импульсов

Postby taras_33 on 06 Mar 2018, 22:13

Женя а какой датчик используется? Положительные импульсы или отрицательные? Center Drive UA собрались тестировать?
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
User avatar
taras_33
advanced
advanced
 
Posts: 175
Joined: 31 Oct 2009, 18:25
Location: Minsk -> Miami
Medals: 1
Activity (1)
LabVIEW Version: 2016
Karma: 92
CLD

Re: Подсчет импульсов

Postby jane_wild on 06 Mar 2018, 23:06

to:Vitekkz88 Спасибо, немного не то что нужно. Нет, оно работать будет, только переделывать структуру проекта нужно.

to:taras_33 Датчик вот этот http://monarchserver.com/Files/pdf/manu ... 4-118R.pdf
Ну да Center Drive. Откуда информация?!
User avatar
jane_wild
junior
junior
 
Posts: 61
Joined: 30 Jun 2016, 02:11
LabVIEW Version: 2016
Karma: 0

Re: Подсчет импульсов

Postby Vitekkz88 on 07 Mar 2018, 04:32

jane_wild писала::Нет, оно работать будет, только переделывать структуру проекта нужно.

Любопытно, а какая сейчас у Вас структура проекта, что проблематично встроить потоки по накоплению данных и по их обработке? :crazy:
jane_wild писала:Когда мотор не вращается и импульсов нет и вышеуказанный Vi возвращает ошибку. Поэтому сейчас я пытаюсь придумать свой VI, который бы позволял измерять бОльшие периоды между импульсами.

Зачем? :think: Если уже существующий .vi настраивается и всё нормально считает. К тому же Pulse Measurments.vi реализован с использованием Си-функции...Что-то вы недоговариваете, jane_wild. Не, мне просто интересно, что там за хитрая обработка такая или сигнал.
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
User avatar
Vitekkz88
leader
leader
 
Posts: 979
Joined: 21 Jan 2014, 15:45
Location: Томск
Medals: 3
Activity (1) Silver (1) Автор (1)
LabVIEW Version: 12,13,14
Karma: 268
hardware I/O VIP

Re: Подсчет импульсов

Postby taras_33 on 07 Mar 2018, 06:18

Любопытно, а какая сейчас у Вас структура проекта,

Если я правильно понимаю, то структура проекта досталать по наследсву от предыдущего программиста... :wink: И если это так, то там наворочено будь здоров и так просто очереди с циклами туда не воткнешь. Вывод либо делать stand alone application. Либо разработать VI, который получив массив данных и частоту дискритизации, сможет в реальном времени вычислять все сам.
Что и желает в итоге получить Женя. Я доброту помню, вот держи.
Краткие пояснения к коду. Поскольку импульсы отрицательные, то вылавливать будем нисходящие фронты. Далее будем вычилять сколько сэмплов между фронтами, а дальше все просто - время -> герцы -> обороты.
Данный VI прогонял как на симуляции ( кстати FGV Hysteresis добален именно для этого случая, для работы от датчика смело можно выкидывать) так и на реальном железе (использовал генератор вместо датчика с мотором). Делал на скорую руку, возможны глюки, но вроде как мной замечено не было.
Теперь мои соображения. На медленных оборотах все чудесно, чем выше обороты, тем меньшее количество сэмплов приходится на один импульс. В итоге высоких скоростях плюс минус один отсчет приводит к заметным скачкам RPM на индикаторе. Вывод: либо нужно максимально увеличивать частоту дискретизации, либо делать скользящее среднее, что бы увеличить стабильность показаний.
Правда для случая с Center Drive это не подойдет. Там нужно ловить максимальные обороты... Если мне не изменяет память на 470-ом обороте скорость вращения должна быть не менее 22000 оборотов в минуту или что то около того. А теперь считаем 22000/60 = 366.6 импульса в секунду. Другими словами 366 Герц или период 2.73 mS Но у нас то цифровое измерение! И точность зависит от дискретизации. При sample rate 10000 выборка = 0.0001 сек. Не может быть 0.00273 - Будет либо 0.0027 либо 0.0028. Отсюда и скачки на индикаторе - для данного случая либо 22222 либо 21428. Поэтому один канал DAQ настраивать на максимальную частоту дискретизации и вперед.... Удачи
Attachments
RPM_Counter.zip
(47.96 KiB) Downloaded 23 times
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
User avatar
taras_33
advanced
advanced
 
Posts: 175
Joined: 31 Oct 2009, 18:25
Location: Minsk -> Miami
Medals: 1
Activity (1)
LabVIEW Version: 2016
Karma: 92
CLD

Re: Подсчет импульсов

Postby Vitekkz88 on 07 Mar 2018, 09:16

taras_33 писал(а):И если это так, то там наворочено будь здоров и так просто очереди с циклами туда не воткнешь. Вывод либо делать stand alone application.Либо разработать VI, который получив массив данных и частоту дискритизации, сможет в реальном времени вычислять все сам.


Можно и не добавлять очереди, обработчик в отдельном цикле сидит и на вход требует массива данных и Fs(можем назвать это отдельным VI). Вопрос: зачем залазить в дом через трубу, если двери и так открыты? Мне просто интересно, может есть какая-то причина брезговать Pulse Measurments.vi? Сэмплы от фронта до фронта считать...ну фииииг знает. Не, это будет работать, просто опять заходим через зад почему-то. Я не стал сравнивать быстродействие работы того или иного алгоритма, но результаты RPM они дают одинаковые(плюс-минус на высоких оборотах). Результаты колбасить начинают - вы правы. В моём случае от постоянного изменяющегося периода в сотых-тысячных долях, в Вашем случае это связано с неверным подсчетом сэмплов между фронтами.
Однако, если мы будем считать RPM опираясь на количество фронтов - то получим самый точный результат.
Знаем Fs, знаем общее количество отчетов, знаем количество фронтов = можем рассчитать RPM. Я проверил, результат годный и статичный даже на грязных сигналах с завалеными фронтами(в рамках разумного).
Разумеется следует повышать частоту дискретизации с увеличением оборотов и не нужно пытаться обмануть теорему Котельникова :rtfm:
И Боже Вас упаси использовать скользящее среднее для этой задачи - это алгоритм грубой подгонки и требует многократного повторения для получения более-менее приемлемого результата. Используйте другие алгоритмы :brows:
Инженер - это открыто светящийся интеллект, свободный и не обидный юмор, это легкость и широта мысли...Это воспитанность, тонкость вкусов, хорошая речь, плавно согласованная и без сорных словечек...
-А. И. Солженицын
User avatar
Vitekkz88
leader
leader
 
Posts: 979
Joined: 21 Jan 2014, 15:45
Location: Томск
Medals: 3
Activity (1) Silver (1) Автор (1)
LabVIEW Version: 12,13,14
Karma: 268
hardware I/O VIP

Re: Подсчет импульсов

Postby jane_wild on 07 Mar 2018, 19:58

Это у меня одной так? Или это связано с работой на портале, в связи с переездом.
Error.png
Error.png (7.15 KiB) Viewed 701 times

На форум не зайти.
Я доброту помню, вот держи

Спасибо огромное - то что нужно! Работает как часы, использую два канала частота дискретизации 500кГц. :thank:
User avatar
jane_wild
junior
junior
 
Posts: 61
Joined: 30 Jun 2016, 02:11
LabVIEW Version: 2016
Karma: 0

Re: Подсчет импульсов

Postby dadreamer on 07 Mar 2018, 20:35

jane_wild wrote:Это у меня одной так? Или это связано с работой на портале, в связи с переездом.
Error.png

На форум не зайти.

Это уже давно не переезд, это вот такое: viewtopic.php?f=141&t=9642
User avatar
dadreamer
professor
professor
 
Posts: 3009
Joined: 17 Feb 2013, 16:33
Medals: 4
Activity (1) Professionalism (1) Автор (2)
LabVIEW Version: 2.5 — 2017
Karma: 728
I/O VIP vision internet

Re: Подсчет импульсов

Postby taras_33 on 07 Mar 2018, 22:34

Мне просто интересно, может есть какая-то причина брезговать Pulse Measurments.vi?

Так никто и не брезгует. Просто это специфика теста. Датчик в состоянии покоя имеет высокий уровень, когда луч попадает на кусочек ленточки - низкий. Поэтому и считать нужно инверсные импульсы. И не только что бы знать RPM, там еще куча всякого, которое требует колличество оборотов и не только - с этим "не только" Женя думаю сама разберется. Установили приблуду в начальное положение, наклеили отражающий стикер и поехали... А Pulse Measurments что меряет? отрицательные или положительные импульсы? Что там закопано в DLL? А здесь все на виду - простые понятные элементарные математические функции. Впрочем каждому свое....

Кстати Jane с 8 Марта поздравляю!!! Жаль что Клара Цеткин до США не добралась - не знают тут такого...
Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the Universe trying to produce bigger and better idiots.
So far, the Universe is winning!
User avatar
taras_33
advanced
advanced
 
Posts: 175
Joined: 31 Oct 2009, 18:25
Location: Minsk -> Miami
Medals: 1
Activity (1)
LabVIEW Version: 2016
Karma: 92
CLD


Return to Для чайников

Who is online

Users browsing this forum: Bing [Bot], Yandex and 17 guests

cron