Всем привет !
Есть ли у кого блок фильтра значений в формате «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.
Заранее благодарен.
- Обязательно представиться на русском языке кириллицей (заполнить поле "Имя").
- Фиктивные имена мы не приветствуем. Ивановых и Пупкиных здесь уже достаточно.
- Не надо писать свой вопрос в первую попавшуюся тему - всегда лучше создать новую тему.
- За поиск, предложение и обсуждение пиратского ПО и средств взлома - бан без предупреждения. Непонятно? - Читать здесь.
- Рекламу и частные объявления "куплю/продам/есть халтура" мы не размещаем ни на каких условиях.
- Перед тем как что-то написать - читать здесь, а затем здесь и здесь.
- Не надо писать в ЛС администраторам свои технические вопросы. Администраторы форума отлично знают как работает форум, а не все-все контроллеры, о которых тут пишут.
Фильтр быстроменяющихся значений
Модератор: Глоб.модераторы
-
- почётный участник форума
- Сообщения: 5790
- Зарегистрирован: 07 окт 2011, 09:12
- Имя: Гаско Вячеслав Эриевич
- Страна: Россия
- город/регион: Рязань
- Благодарил (а): 673 раза
- Поблагодарили: 841 раз
Фильтр быстроменяющихся значений
Немного странный алгоритм, ИМХО.
Думается мне, что рекурсивная формула для экспоненциального скользящего среднего ( Exponential Moving Average, EMA) была бы тут более уместна.
Методика гуглится "на раз".
Например: https://allfi.biz/Forex/TechnicalAnalys ... rednee.php
Думается мне, что рекурсивная формула для экспоненциального скользящего среднего ( Exponential Moving Average, EMA) была бы тут более уместна.
Методика гуглится "на раз".
Например: https://allfi.biz/Forex/TechnicalAnalys ... rednee.php
---------------------------------------------------
«У человека в душе дыра размером с Бога, и каждый заполняет её как может.» (Жан-Поль Сартр)
"Ту пустоту, которая остаётся в душе, когда в ней нет Бога, и весь мир не может заполнить." (святитель Николай Сербский)
«У человека в душе дыра размером с Бога, и каждый заполняет её как может.» (Жан-Поль Сартр)
"Ту пустоту, которая остаётся в душе, когда в ней нет Бога, и весь мир не может заполнить." (святитель Николай Сербский)
-
- освоился
- Сообщения: 289
- Зарегистрирован: 02 апр 2015, 18:16
- Имя: Симонов Игорь Валерьевич
- Благодарил (а): 27 раз
- Поблагодарили: 9 раз
Фильтр быстроменяющихся значений
Меня даже о вида таких формул всегда "кондратий" хватает, не говоря о том, чтобы в них разбираться. Думаю, тут всё проще. "Скользящее усреднённое" значение мне тут вряд ли подойдёт, т.к. то крайне нечасто изменяемое значение (1 раз в 1 мин.... 30 мин.), которое я хочу получить, я хочу передавать в панель и архивировать там в LOG-файлы на "флэшку" там же с такой же периодичностью.
И меня здесь абсолютно НЕ волнует насколько быстро меняется сигнал, чтобы его как-то сглаживать. Меня волнует, изменится ли он за какое-то (возможно ОЧЕНЬ долгое время 5...60 мин. и даже дольше) больше чем на «Расхождение». И чем реже он будет "вылезать" за него, тем лучше. Представьте себе практически статические сигналы температур в разных точках статора двигателя. Они все равны 75 градусов "плюс-минус" 1...2 в формате 24 / 7 / 365 . Зачем мне постоянно ловить эти "плюс-минус" 1...2 , "забивая мозги" LOG-файлам ?
Вовсе и незачем.
И меня здесь абсолютно НЕ волнует насколько быстро меняется сигнал, чтобы его как-то сглаживать. Меня волнует, изменится ли он за какое-то (возможно ОЧЕНЬ долгое время 5...60 мин. и даже дольше) больше чем на «Расхождение». И чем реже он будет "вылезать" за него, тем лучше. Представьте себе практически статические сигналы температур в разных точках статора двигателя. Они все равны 75 градусов "плюс-минус" 1...2 в формате 24 / 7 / 365 . Зачем мне постоянно ловить эти "плюс-минус" 1...2 , "забивая мозги" LOG-файлам ?
Вовсе и незачем.
-
- не первый раз у нас
- Сообщения: 325
- Зарегистрирован: 17 июн 2016, 14:18
- Имя: Максим
- Благодарил (а): 7 раз
- Поблагодарили: 118 раз
Фильтр быстроменяющихся значений
Пробуйте:
Код: Выделить всё
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
-
- не первый раз у нас
- Сообщения: 325
- Зарегистрирован: 17 июн 2016, 14:18
- Имя: Максим
- Благодарил (а): 7 раз
- Поблагодарили: 118 раз
Фильтр быстроменяющихся значений
На 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