EXTRM - экстремум

Назначение.
Функциональный блок EXTRM применяется для поиска и фиксации локальных экстремумов (минимального и максимального значения) меняющегося во времени сигнала.
Состав структурной переменной.
Переменная со структурным типом EXTRM будет добавлена в локальный словарь автоматически при добавлении блока в редактор.

Описание алгоритма.
-
До запуска блока (RUN=FALSE), поиск экстремумов не осуществляется (Dsmx =Dsmn =FALSE), входной сигнал X без изменения передается на выходы (Ymin=Ymax=X).
-
После запуска блока (RUN=TRUE), на выходах Ymax и Ymin сохраняется значение сигнала X на момент запуска, и начинается поиск локальных экстремумов. В процессе поиска входной сигнал X проходит через фильтр нижних частот, представленный передаточной функцией:
, где ТF - постоянная времени фильтра. -
Если TF<=0, то входной сигнал X не фильтруется (Ymin=Ymax=X).
-
Найденное минимальное или максимальное значение входного сигнала X передается на выход Ymin или Ymax соответственно, и сохраняется до обнаружения нового локального экстремума. После обнаружения локального минимума или максимума соответствующие дискретные выходы Dmin=TRUE или Dmax=TRUE в течение одного цикла контроллера.
-
Направление поиска фиксируется на дискретных выходах Dsmn и Dsmx: в процессе поиска минимума Dsmn= TRUE, в процессе поиска максимума Dsmx = TRUE.
Пример работы блока.
В качестве примера продемонстрирована диаграмма сигналов с поэтапным описанием изменений:
![]()
|
Дополнительные параметры фильтрации сигнала.
В процессе поиска локальных экстремумов можно отфильтровывать помехи, для этого используются значения зоны нечувствительности и допустимой скорости изменения сигнала в районе экстремума.
Зона нечувствительности задается через входной параметр DB:
Допустимая скорость изменения сигнала, при которой фиксируется экстремум, задается через входной параметр V:
Влияние зоны нечувствительности и максимальной скорости продемонстрировано на следующем изображении.
![]() |
Пример синтаксиса на языке ST.
//вызов функционального блока EXTRM
Block.EXTRM(RUN, X, TF, DB, V);
//чтение локального максимума
Ymax := Block.Ymax;
//выход Dsmx=true во время поиска максимума
Dsmx := Block.Dsmx;
//выход Dmax=true в течение цикла контроллера после фиксации максимума
Dmax := Block.Dmax;
//чтение локального минимума
Ymin := Block.Ymin;
//выход Dsmn=true во время поиска минимума
Dsmn := Block.Dsmn;
//выход Dmin=true в течение цикла контроллера после фиксации минимума
Dmin := Block.Dmin;
|


