1. Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
  2. Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
  3. Не надо писать свой вопрос в первую попавшуюся тему - всегда лучше создать новую тему.
  4. За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения. Непонятно? - Читать здесь.
  5. Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
  6. Перед тем как что-то написать - читать здесь, а затем здесь и здесь.
  7. Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.

Фильтр быстроменяющихся значений

ПЛК SIMATIC (S7-200, S7-1200, S7-300, S7-400, S7-1500, ET200)

Модератор: Глоб.модераторы

Ответить

Автор темы
alex3110
освоился
освоился
Сообщения: 289
Зарегистрирован: 02 апр 2015, 18:16
Имя: Симонов Игорь Валерьевич
Благодарил (а): 27 раз
Поблагодарили: 9 раз

Фильтр быстроменяющихся значений

Сообщение alex3110 »

Всем привет !

Есть ли у кого блок фильтра значений в формате «INTEGER» (или "REAL").
Или где взять ?

Работать, по моим представлениям, должен так :

«Расхождение» = 3 ,
Начальное Входное значение = 25 Текущ. ВЫходное значение = 25

Через 5 сек.
Текущ. Входное значение = 25-->23
Текущ. ВЫходное = 25 (не должно меняться), т.к. (Начальное Входное значение = 25) – (Текущ. Входное значение =23) = 2 < «Расхождение» = 3

Ещё через 5 сек.
Текущ. Входное значение = 23-->27
Текущ. ВЫходное = 25 (не должно меняться), т.к. (Начальное Входное значение = 25) – (Текущ. Входное значение =27) |по модулю| = 2 < «Расхождение» = 3

Ещё через 5 сек.
Текущ. Входное значение = 27-->29
Текущ. ВЫходное = 25 -->29 (должно меняться), т.к. (Начальное Входное значение = 25) – (Текущ. Входное значение =29) |по модулю| = 4 > «Расхождение» = 3

После того, как ВЫходное значение изменится, оно становится «Начальным».
И т.д., по такому же алгоритму.

Желательно, чтобы FC (или FB) могли активироваться/деактивироваться каким-либо битом. Потом можно будет его привязать к соотв-щей кнопке панели. В качестве «начальных» значений брать «текущие» на момент активации.

«Частота опроса» (5…10 сек и более) и «Расхождение» желательно должны оперативно меняться с панели для каждого датчика. Т.е. эти параметры должны быть где-то в каком-то DB.

Заранее благодарен.

Ryzhij
почётный участник форума
почётный участник форума
Сообщения: 5790
Зарегистрирован: 07 окт 2011, 09:12
Имя: Гаско Вячеслав Эриевич
Страна: Россия
город/регион: Рязань
Благодарил (а): 673 раза
Поблагодарили: 841 раз

Фильтр быстроменяющихся значений

Сообщение Ryzhij »

Немного странный алгоритм, ИМХО.
Думается мне, что рекурсивная формула для экспоненциального скользящего среднего ( Exponential Moving Average, EMA) была бы тут более уместна.
Методика гуглится "на раз".
Например: https://allfi.biz/Forex/TechnicalAnalys ... rednee.php
---------------------------------------------------
«У человека в душе дыра размером с Бога, и каждый заполняет её как может.» (Жан-Поль Сартр)
"Ту пустоту, которая остаётся в душе, когда в ней нет Бога, и весь мир не может заполнить." (святитель Николай Сербский)

Автор темы
alex3110
освоился
освоился
Сообщения: 289
Зарегистрирован: 02 апр 2015, 18:16
Имя: Симонов Игорь Валерьевич
Благодарил (а): 27 раз
Поблагодарили: 9 раз

Фильтр быстроменяющихся значений

Сообщение alex3110 »

Меня даже о вида таких формул всегда "кондратий" хватает, не говоря о том, чтобы в них разбираться. Думаю, тут всё проще. "Скользящее усреднённое" значение мне тут вряд ли подойдёт, т.к. то крайне нечасто изменяемое значение (1 раз в 1 мин.... 30 мин.), которое я хочу получить, я хочу передавать в панель и архивировать там в LOG-файлы на "флэшку" там же с такой же периодичностью.
И меня здесь абсолютно НЕ волнует насколько быстро меняется сигнал, чтобы его как-то сглаживать. Меня волнует, изменится ли он за какое-то (возможно ОЧЕНЬ долгое время 5...60 мин. и даже дольше) больше чем на «Расхождение». И чем реже он будет "вылезать" за него, тем лучше. Представьте себе практически статические сигналы температур в разных точках статора двигателя. Они все равны 75 градусов "плюс-минус" 1...2 в формате 24 / 7 / 365 . Зачем мне постоянно ловить эти "плюс-минус" 1...2 , "забивая мозги" LOG-файлам ?
Вовсе и незачем.

SMax
не первый раз у нас
не первый раз у нас
Сообщения: 325
Зарегистрирован: 17 июн 2016, 14:18
Имя: Максим
Благодарил (а): 7 раз
Поблагодарили: 118 раз

Фильтр быстроменяющихся значений

Сообщение SMax »

Пробуйте:

Код: Выделить всё

FUNCTION_BLOCK FB 1
TITLE =
VERSION : 0.1


VAR_INPUT
  ENABLE : BOOL ;	//Enable Operate
  IN : REAL ;		//Input Value
  DIFF : REAL ;		//Differential
  CYCLE : DINT ;	//Cycle Time (s)
END_VAR

VAR_OUTPUT
  OUT : REAL ;		//Output Value
END_VAR

VAR
  TON : "TON";			//Timer ON
  Cyc_Time : TIME ;		//Cycle Time (ms)
  Temp : REAL ;			//Temporary Value
  Start_Timer : BOOL ;		//Start Timer
  Edge : BOOL ;			//Edge Positive
  Pulse : BOOL ;		//One Cycle Pulse
END_VAR

BEGIN
NETWORK
TITLE =

	A     #ENABLE; 
	FP    #Edge; 
	=     #Pulse; 

	A     #Pulse; 
	JCN   Next; 
	L     #IN; 
	T     #Temp; 
	T     #OUT; 

Next:	A     #ENABLE; 
	JCN   End; 

	L     #CYCLE; 
	L     1000; 
	*I    ; 
	T     #Cyc_Time; 

	AN    #TON.Q; 
	=     #Start_Timer; 

	CALL #TON (
		IN		:= #Start_Timer,
		PT		:= #Cyc_Time);

	A     #TON.Q; 
	JCN   End; 

	L     #Temp; 
	L     #DIFF; 
	+R    ; 
	L     #IN; 
	<R    ; 
	JC    Out; 

	L     #Temp; 
	L     #DIFF; 
	-R    ; 
	L     #IN; 
	>R    ; 
	JCN   End; 

Out:	L     #IN; 
	T     #Temp; 
	T     #OUT; 

End:	BE    ; 

END_FUNCTION_BLOCK

SMax
не первый раз у нас
не первый раз у нас
Сообщения: 325
Зарегистрирован: 17 июн 2016, 14:18
Имя: Максим
Благодарил (а): 7 раз
Поблагодарили: 118 раз

Фильтр быстроменяющихся значений

Сообщение SMax »

На SCL:

Код: Выделить всё

FUNCTION_BLOCK FB1
TITLE = ''
VERSION : '0.1'


VAR_INPUT
  ENABLE : BOOL ;	//Enable Operate
  IN : REAL ;		//Input Value
  DIFF : REAL ;		//Differential
  CYCLE : DINT ;	//Cycle Time (s)
END_VAR

VAR_OUTPUT
  OUT : REAL ;		//Output Value
END_VAR

VAR
  TON : "TON";		//Timer ON
  Cyc_Time : TIME ;	//Cycle Time (ms)
  Temp : REAL ;		//Temporary Value
  Start_Timer : BOOL ;	//Start Timer
  Pulse : BOOL ;	//One Cycle Pulse
END_VAR

BEGIN

IF ENABLE AND NOT Pulse THEN
    Temp := IN;
    OUT := IN;
    Pulse := ENABLE;
END_IF;

IF ENABLE THEN
    Cyc_Time := DINT_TO_TIME(CYCLE * 1000);
    Start_Timer := NOT TON.Q;
    TON (IN := Start_Timer, PT := Cyc_Time);
    IF TON.Q THEN 
        IF ((Temp + DIFF) < IN) OR ((Temp - DIFF) > IN) THEN
            Temp := IN;
            OUT := IN;
        END_IF;
    END_IF;
END_IF;

END_FUNCTION_BLOCK

Автор темы
alex3110
освоился
освоился
Сообщения: 289
Зарегистрирован: 02 апр 2015, 18:16
Имя: Симонов Игорь Валерьевич
Благодарил (а): 27 раз
Поблагодарили: 9 раз

Фильтр быстроменяющихся значений

Сообщение alex3110 »

Спасибо, попробую.
Ответить

Вернуться в «Simatic Step7»