В этой статье хочу рассмотреть два варианта фильтра аналоговых сигналов, полученных с входного модуля промышленного контроллера.
Перед разработчиком программного обеспечения для АСУ ТП частенько стоит вопрос обработки аналогового сигнала, подверженного резким изменениям. Например, при измерении расхода на расходомерной шайбе, аналоговый сигнал, приходящий от датчика расхода (перепада давления) выглядит примерно вот так:
Поэтому такой сигнал нужно фильтровать.
Существует немало способов отфильтровать аналоговый сигнал, но мы рассмотрим с вами два: фильтр низких частот на основе апериодического звена первого порядка и на основе фильтра Калмана.
В теорию я вдаваться не буду. Просто приведу формулы и примеры их реализации в контроллере.
Да, в контроллерах вся обработка и расчеты ведутся циклично (см.статью Как работает ПЛК). Поэтому и формулы для расчетов используются разностные. Т.е. значение текущее рассчитывается из предыдущего.
Итак, первая формула:
Хтек = (Тф*Хпр+tр*Хсч)/(Тф+tр), где
Хтек – искомое на данном шаге значение сигнала (OutValue);
Хпр – значение сигнала, полученное на предыдущем шаге (memIn);
Хсч – значение сигнала, полученное из модуля на данном шаге (inValue);
Тф – постоянная времени фильтра (Tf);
Tр – период расчета (Tcalc).
Программная реализация на STL в виде функционального блока (ФБ) для контроллера Omron CJ1M:
OutValue:= (Tf*memIn+Tcalc*inValue)/( Tf+Tcalc);
memIn:= OutValue;
где inValue, Tf и Tcalc – входные параметры ФБ типа REAL, а OutValue – выходной параметр типа REAL, он же – фильтрованное значение входного сигнала. ВременнЫе сигналы Tf и Tcalc задаются в секундах.
Я, чаще всего, обрабатываю аналоговые сигналы в цикле 0,5 секунды. Тогда использую формулу попроще:
OutValue:= (2,0*Tf*memIn+inValue)/(2,0*Tf+1,0);
memIn:= OutValue;
В этом случае количество входных параметров сокращается на один.
Вторая формула :
Хтек = К*Хсч +(1-К)* Хпр, где
Хтек – искомое на данном шаге значение сигнала (OutValue);
Хпр – значение сигнала, полученное на предыдущем шаге (memIn);
Хсч – значение сигнала, полученное из модуля на данном шаге (inValue);
К – коэффициент Калмана, от которого зависит степень сглаживания сигнала. Чем он меньше, тем сильнее будет сглажен сигнал. И его нужно подбирать «под сигнал».
Программная реализация на том же STL в виде функционального блока (ФБ) для контроллера Omron CJ1M:
OutValue:= K* inValue +(1-K)*memIn;
memIn:= OutValue;
где inValue и К– входные параметры ФБ типа REAL, а OutValue – выходной параметр типа REAL, он же – фильтрованное значение входного сигнала.
Вот, собственно, и все.
Оба фильтра работают замечательно для беспокойных аналоговых сигналов. И достаточно просты для расчетов. Я их реализовывал сначала даже на языке LD. Тот еще квест. 🙂
Пишите в комментариях другие способы. И знакомо ли вам то, о чём я писал?
Если статья понравилась – делитесь с друзьями и коллегами в соцсетях (кнопочки внизу).
Удачных реализаций алгоритмов!