PDA

Просмотреть полную версию : Усредняющий фильтр аналогового сигнала


av242736
08.08.2016, 12:20
Здравствуйте!
Помогите пожалуйста начинающему изучать среду разработки SMLogix.
Меня интересует алгоритм работы усредняющего фильтра аналогового сигнала, реализованного на блоке "Spdelay". Запутался в тиках и циклах. Например, если я задам цикл работы системы = 100 мс., а на входе "dt" блока задержки установлю значение = 10, то сигнал со входа "in" на выход "Out0" будет передаваться с временной задержкой примерно равной = 1 секунде (1000 мс), образуя тем самым что-то вроде кольцевого буфера? И значение со входа "in" дойдет до выхода "Out9" примерно за 10 секунд? То есть примерно каждую секунду на выход "Out0" будет передаваться значение со входа блока?

Gromov
08.08.2016, 12:42
Здравствуйте!
Помогите пожалуйста начинающему изучать среду разработки SMLogix.
Меня интересует алгоритм работы усредняющего фильтра аналогового сигнала, реализованного на блоке "Spdelay". Запутался в тиках и циклах. Например, если я задам цикл работы системы = 100 мс., а на входе "dt" блока задержки установлю значение = 10, то сигнал со входа "in" на выход "Out0" будет передаваться с временной задержкой примерно равной = 1 секунде (1000 мс), образуя тем самым что-то вроде кольцевого буфера? И значение со входа "in" дойдет до выхода "Out9" примерно за 10 секунд? То есть примерно каждую секунду на выход "Out0" будет передаваться значение со входа блока?

Обратите внимание на описание к этому блоку. В вашем случае, сигнал будет обновляться раз в 10 секунд. т.к. для обновления одного значения - надо 10 циклов программы по 100 мс. У вас надо обновить 10 значений. таким образом 10*100*10 = 10000мс.

serg-el
08.08.2016, 12:47
Всё правильно.
Но для проектов, такое усреднение, лично я бы не использовал.
RC-фильтр с загрузкой при старте - гораздо лучше будет.

av242736
08.08.2016, 14:32
Спасибо большое за помощь!
Я возможно этот фильтр и не буду использовать, в проектах для систем вентиляции, мне просто не совсем понятен алгоритм его работы.
У меня еще вопрос: если в моем случае, сигнал будет обновляться раз в 10 секунд, то с какой задержкой будут производиться математические операции (сложение и деление), как я понимаю это вычисление среднего арифметического числа?
Если я правильно понял, то получается, что если значение на входе "in" не будет изменяться как минимум 10 секунд, и будет равно "25", то на выходе блока "ADD" получится значение суммы = "250" ?

Gromov
08.08.2016, 14:37
Да, получится, только спустя 10 циклов программы после установления 25 на входе.
То есть, на протяжении 10 секунд после, например, включения и загрузки - значение на выходе add будет увеличиваться с 0 до 250 по 25 в секунду.

av242736
08.08.2016, 15:25
Спасибо за более подробное объяснение!
Все равно до конца никак не въеду. Получается, что блок "ADD" пока не сложит все свои входные значения, то не выдаст общую сумму? То есть блок будет как бы накапливать (аккумулировать) входные значения в течении 10 секунд, пока все его входные переменные не получат свои значения, и только тогда выдаст общую сумму и блок "DIV" поделит ее на 10 ?

Gromov
08.08.2016, 15:53
Спасибо за более подробное объяснение!
Все равно до конца никак не въеду. Получается, что блок "ADD" пока не сложит все свои входные значения, то не выдаст общую сумму? То есть блок будет как бы накапливать (аккумулировать) входные значения в течении 10 секунд, пока все его входные переменные не получат свои значения, и только тогда выдаст общую сумму и блок "DIV" поделит ее на 10 ?

Не. Дело в том, что на выходе блока задержки - нули, до тех пор, пока он не выдаст на каждый выход переменную со входа. Пусть будет 25.
в первом цикле программы - блок задержки имеет все нули, соответственно, блок add складывает 10 нулей. Блок div делит 10 нулей на 10, на выходе - ноль.

Затем, после прошествия задержки dt - подаётся переменная на 1 выход блока delay. теперь блок add складывает 25 и 9 нулей. div поделит и получит 2.5.

И так далее, по времени dt будет добавлять ещё по 25 на выход..

А вообще - вам бы на реальном контроллере потрогать это дело. Сразу вопросы снимутся.

av242736
08.08.2016, 16:40
Огромное спасибо!!!
Вроде более менее понял. Согласен, что на реальном контроллере проще понять алгоритм. Я так понимаю в режиме отладки? Просто я некоторое время работал в среде CoDeSyS, а там есть режим эмуляции. Контроллер я заказал, будет только через 3-4 недели. Захотел заранее, так сказать теоретически подготовиться.
А может вы посоветуете, какой фильтр обработки аналогового сигнала лучше применить в реальном проекте?
Например: приточная система вентиляции с водяным калорифером, датчики типа PT1000, трехходовой клапан с аналоговым управлением, пид-регулятор.
Может есть готовый макрос фильтра?

Gromov
08.08.2016, 16:58
Огромное спасибо!!!
Вроде более менее понял. Согласен, что на реальном контроллере проще понять алгоритм. Я так понимаю в режиме отладки? Просто я некоторое время работал в среде CoDeSyS, а там есть режим эмуляции. Контроллер я заказал, будет только через 3-4 недели. Захотел заранее, так сказать теоретически подготовиться.
А может вы посоветуете, какой фильтр обработки аналогового сигнала лучше применить в реальном проекте?
Например: приточная система вентиляции с водяным калорифером, датчики типа PT1000, трехходовой клапан с аналоговым управлением, пид-регулятор.
Может есть готовый макрос фильтра?

Конечно. Велосипеды уже изобретены. вот они
http://forum.segnetics.com/showthread.php?t=314

А по поводу эмуляции в вышеуказанной программе - почти бесполезная штука. Реальные величины в ней имитировать крайне проблематично.
Индикацию в ней имитировать невозможно.

Сам несколько раз сталкивался с тем, что режим эмуляции работал не так, как работал потом контроллер, приходилось на объекте код переписывать.

На мой взгляд, эмуляция должна быть либо идеальная и 100% честная, либо никакая. Достичь первого варианта почти невозможно, либо очень трудо/финансово затратно

А вообще, что касается разработки ПО для вентиляции - есть прекрасная штука, называется Конструктор. http://segnetics.com/smconstructor_hvac - вот здесь качается. Там же и инструкция к нему.
Это программное решение сократит время разработки программы в сотни раз. Готовую вентиляцию удастся создать минут за 15.

av242736
08.08.2016, 17:05
Согласен с вами. Просто я не знаком с режимом отладки и не знаю на сколько он хорош или наоборот. Вот придет контроллер, тогда и попробуем. Спасибо еще раз, что потратили на меня свое время.

av242736
08.08.2016, 19:43
Кстати это часть макроса который называется "Filter_bypass". Его мне как раз предложил SMConstructor_HVAC. Набросок макроса приложил к сообщению. Рисовал карандашом поэтому не очень хорошо видно.

serg-el
09.08.2016, 11:40
Рисовал карандашом поэтому не очень хорошо видно.

А ещё и вверх ногами ;)
SMConstructor_HVAC ставит по умолчанию именно усредняющий фильтр.
Помимо того что он будет выдавать данные с задержкой, так ещё и фильтрация у него плохая. Категорически советую заменить на RC-фильтр.

Arsie
09.08.2016, 12:06
А ещё и вверх ногами ;)
SMConstructor_HVAC ставит по умолчанию именно усредняющий фильтр.
Помимо того что он будет выдавать данные с задержкой, так ещё и фильтрация у него плохая. Категорически советую заменить на RC-фильтр.

Наивно думать, что RC-фильтр работает без задержки :xsunx_01:

Да ладно думать, ещё и вводить в заблуждение других...


PS. По ссылке http://forum.segnetics.com/showthread.php?t=314 есть и RC-фильтр, называется filter-e.

serg-el
09.08.2016, 13:12
Наивно думать, что RC-фильтр работает без задержки :xsunx_01:

Да ладно думать, ещё и вводить в заблуждение других...



Если сбрасывать в 0 - то да, будет с задержкой.
Если загружать значение входа на выход - то нет.

И данная ссылка была приведена ранее.
И я не писал, что там нет RC фильтра.
Просто скинул свои (и не только;) ) варианты данных фильтров.

Arsie
09.08.2016, 13:40
Если сбрасывать в 0 - то да, будет с задержкой.
Если загружать значение входа на выход - то нет.

И данная ссылка была приведена ранее.
И я не писал, что там нет RC фильтра.
Просто скинул свои (и не только;) ) варианты данных фильтров.

Публикуйте каждый раз "дисклеймер" (c), говорящий о том, что макросы проверяли только вы и они никакого отношения к Сегнетиксу не имеют и применять человек их будет на свой страх и риск - у меня пропадут к вам претензии.

serg-el
09.08.2016, 15:45
Публикуйте каждый раз "дисклеймер" (c), говорящий о том, что макросы проверяли только вы и они никакого отношения к Сегнетиксу не имеют и применять человек их будет на свой страх и риск - у меня пропадут к вам претензии.

Filter RC_v4.msl - © - лично мой. Никакого отношения к Сегнетиксу не имеет и применять их на свой страх и риск.
Filter RC (Lite).msl - © - проверен и дополнено описание внутри лично мной. Никакого отношения к Сегнетиксу не имеет и применять их на свой страх и риск.
Filter RC (Lite)_v2.msl - © - проверен и дополнено описание внутри лично мной. Никакого отношения к Сегнетиксу не имеет и применять их на свой страх и риск.

Есть какие-нибудь претензии? :pioneer:

Да и когда они были? Ведь я же не Ваш сотрудник, а альфа, бета и прочая тестер ;)

Arsie
09.08.2016, 16:15
Есть какие-нибудь претензии? :pioneer:

Да и когда они были? Ведь я же не Ваш сотрудник, а альфа, бета и прочая тестер ;)

Я часто сталкиваюсь, когда в ТП приходят претензии к макросам, взятым на форуме. Уходит немало времени, чтобы объяснить человеку, "что почём" (c)

Т.е. "ложечки находятся, но осадочек остаётся" (с)

serg-el
09.08.2016, 16:24
претензии к макросам, взятым на форуме

Ссылочки грабелек не подскажете?

Arsie
09.08.2016, 17:09
Ссылочки грабелек не подскажете?

В плане? Какие именно макросы? Я их в любом случае удаляю с форума, если проверка показывает, что они неработоспособны.

Если чужой макрос не удалён, значит я его либо не проверял, либо с ним всё ок.

av242736
10.08.2016, 23:04
Добрый вечер всем!
Если я правильно понял, то в моем случае обрабатывать аналоговый сигнал лучше RC-фильтром, чем усредняющим, значит буду копать в сторону RC-фильтров. Непонятно только почему SMConstructor по умолчанию предлагает использовать усредняющий, более медленный фильтр? За рисунок простите, я его как только не крутил, а он все равно вверх ногами встал, не получается перевернуть. Ну да ладно.

Gromov
11.08.2016, 09:22
Добрый вечер всем!
Если я правильно понял, то в моем случае обрабатывать аналоговый сигнал лучше RC-фильтром, чем усредняющим, значит буду копать в сторону RC-фильтров. Непонятно только почему SMConstructor по умолчанию предлагает использовать усредняющий, более медленный фильтр? За рисунок простите, я его как только не крутил, а он все равно вверх ногами встал, не получается перевернуть. Ну да ладно.

Тут есть несколько мнений разных людей. Ваша задача - решить, которому из мнений вы доверяете. Так же, не стоит забывать, что в конечном итоге, только вы знаете характеристики настраиваемой системы. Возможно, в вашем случае подойдёт любой фильтр.
У каждого из предложенных решений есть свои недостатки.
А что касается конструктора - он разрабатывался для управления обычной вентиляцией. И он с этим отлично справляется. Можете использовать конструкторские решения - они подкреплены огромным опытом внедрения на разных объектах.

Arsie
11.08.2016, 10:59
Добрый вечер всем!
Если я правильно понял, то в моем случае обрабатывать аналоговый сигнал лучше RC-фильтром, чем усредняющим, значит буду копать в сторону RC-фильтров. Непонятно только почему SMConstructor по умолчанию предлагает использовать усредняющий, более медленный фильтр? За рисунок простите, я его как только не крутил, а он все равно вверх ногами встал, не получается перевернуть. Ну да ладно.

Фильтры все замедляют сигнал, кроме предиктивных. Что усредняюший, что экспоненциальный (он же RC) фильтр - это фильтры первого порядка. Сигнал при одинаковом уровне фильтрации задерживают идентично.

Если перейти к конкретным реализациям, то "заводской" фильтр имеет возможность ускориться при сильном изменении измеряемой величины. Этого свойства лишены RC-фильтры.

Другими словами, используйте то, что я вам показал и не забивайте себе голову всякой чепухой :drunk02:

av242736
18.08.2016, 23:50
Доброй ночи!
Спасибо за помощь. Рассмотрел все варианты фильтров по вашим ссылкам. Пока остановился на "заводском" варианте.

sea007
02.09.2022, 02:13
Получение усредненного значения аналогового сигнала на входе в течении заданного времени. Определение массы продукта.

Время измерения массы может варьироваться.
Время перевожу в целое число тиков. Затем каждый тик прибавляю текущий аналоговый сигнал к накопленной сумме за уже прошедшие тики. Суммарное значение делю на число прошедших тиков. Тем самым получаю среднее значение массы
Пример:
Тик 100 мс, заданное время измерения 0,5 с. Получаем усреднение по пяти значениям.

Как это реализовать на FBD в SMLogix наиболее просто и корректно?

1exan
02.09.2022, 05:51
Получение усредненного значения аналогового сигнала на входе в течении заданного времени. Определение массы продукта.

Время измерения массы может варьироваться.
Время перевожу в целое число тиков. Затем каждый тик прибавляю текущий аналоговый сигнал к накопленной сумме за уже прошедшие тики. Суммарное значение делю на число прошедших тиков. Тем самым получаю среднее значение массы
Пример:
Тик 100 мс, заданное время измерения 0,5 с. Получаем усреднение по пяти значениям.

Как это реализовать на FBD в SMLogix наиболее просто и корректно?


Фильтация аналоговых сигналов (https://dl.segnetics.com/WebHelp/SMLogix/index.html?example_afilter.htm)

sea007
02.09.2022, 10:18
Фильтация аналоговых сигналов (https://dl.segnetics.com/WebHelp/SMLogix/index.html?example_afilter.htm)

В этой конструкции количество точек усреднения фиксировано, время усреднения тоже.

Необходимо задавать время усреднения показаний от которого будет зависеть количество точек усреднения.

Arsie
02.09.2022, 10:30
Время перевожу в целое число тиков. Затем каждый тик прибавляю текущий аналоговый сигнал к накопленной сумме за уже прошедшие тики. Суммарное значение делю на число прошедших тиков. Тем самым получаю среднее значение массы

Как это реализовать на FBD в SMLogix наиболее просто и корректно?

Ровно как и написали. На сумматоре считаете аналоговый сигнал, затем насуммированное делите на время измерения. Блоков 5-6 навскидку, не больше.

Можно даже на дополнительном сумматоре или счётчике считать время и непрерывно делить накопленное аналогое значение на накопленное значение времени c последующем вычитанием среднего, получив скользящее среднее, а не усреднение "от сих до сих".

sea007
02.09.2022, 13:10
Усреднение производится при наличии сигнала на входе On. В конце измерения фиксируется среднее значение на выходе Out.

Корректная конструкция?

10947

Arsie
02.09.2022, 13:50
Усреднение производится при наличии сигнала на входе On. В конце измерения фиксируется среднее значение на выходе Out.

Корректная конструкция?

10947

Вместо 6 и 11 проще использовать ^REG(int). А зачем величина на миллисекунды умножается и почему после сумматоров обратные связи?

sea007
02.09.2022, 14:43
Вместо 6 и 11 проще использовать ^REG(int). А зачем величина на миллисекунды умножается и почему после сумматоров обратные связи?

По обратному фронту нужно фиксировать усредненное значение (в конце измерения).

Получается интеграл измеряемой величины / на время интегрирования = среднее значение. Плюс еще избавляемся от деления на ноль.

Через обратные связи получаем сигнал на втором входе сумматора из предыдущего цикла.

Может и проще можно, поэтому и спросил...


Добавлено через 6 минут


Типа блока "statistics_real" из CoDeSys пытаюсь реализовать

Arsie
02.09.2022, 15:59
Типа блока "statistics_real" из CoDeSys пытаюсь реализовать

Это скользящее среднее, как я и писал вам. Но для весов оно не годидзе, т.к. процесс насыпания/установки объекта на платформу вам неинтересен, вес в этот момент гарантированно не тот и негативно влияет на результат измерения.

Вот что вам нужно, среднее за фиксированный интервал. По готовности платформы даёте сигнал "run" и ждёте единицы на выходе syn.

https://forum.segnetics.com/attachment.php?attachmentid=10948&stc=1&d=1662119941

Arsie
02.09.2022, 16:21
Типа блока "statistics_real" из CoDeSys пытаюсь реализовать

В этом блоке в кодесисе ошибка. При сбросе выход среднего равен нулю, хотя по факту должен быть равным входному значению и уже накапливать статистику именно от входного значения, а не от нуля. Хотя, возможно, они уже закостылили это в каком-то патче, что на выходе FB показывает ноль, а внутри себя знает, что ноль - это палево от неразумных программеров и так делать не надо. И считает дальше всё правильно.

https://forum.segnetics.com/showthread.php?p=77764#post77764

sea007
02.09.2022, 16:32
Это скользящее среднее, как я и писал вам. Но для весов оно не годидзе, т.к. процесс насыпания/установки объекта на платформу вам неинтересен, вес в этот момент гарантированно не тот и негативно влияет на результат измерения.

Вот что вам нужно, среднее за фиксированный интервал. По готовности платформы даёте сигнал "run" и ждёте единицы на выходе syn.

https://forum.segnetics.com/attachment.php?attachmentid=10948&stc=1&d=1662119941

Спасибо за пример реализации, просмотрю!