'Inteligenty' dom ze sterownikiem PLC

 Language:
Szukanie zaawansowane  

Aktualności:

Powrót do strony głównej: www.edom-plc.pl

Autor Wątek: Wygładzanie szybkozmiennych danych  (Przeczytany 6948 razy)

Tom01

  • Full Member
  • ***
  • Wiadomości: 101
    • Zobacz profil
Wygładzanie szybkozmiennych danych
« dnia: Grudnia 15, 2016, 07:59:44 pm »

Pewnie tytuł niejasny, ale już tłumaczę.

Jest sobie czujnik analogowy 0-10V, np światła, wilgotności czy jakikolwiek. Z modułu analog input dostajemy zmienną WORD która przyjmuje prawie 16-bitową wartość, podaną dziesiętnie 0-32767. Kłopot polega na tym, że wartość "skacze". Szukam sposobu na uśrednianie zmiennej, tak aby niewielkie wahania odczytu poziomu nie wpływały na sterowanie w dalszym ciągu programu. W drugim kroku, szukam sposobu na płynną zmianę. Np zmienna zmieni się bardzo szybko z 1000 na 1400 a ja chciałbym aby wartość zmiennej płynnie "przejechała" od 1000 do 1400 w określonym czasie. Na razie rozwiązałem to tak, że podprogram odczytujący wartość wywołuję co 2 sek, więc jakieś uśrednienie jest, ale to nie do końca o to chodzi. Jakieś pomysły?
Zapisane

vakul

  • Full Member
  • ***
  • Wiadomości: 149
    • Zobacz profil
Odp: Wygładzanie szybkozmiennych danych
« Odpowiedź #1 dnia: Grudnia 15, 2016, 09:47:39 pm »

Pierwszy pomysł mam taki:

Zrób próbkowanie np. co 1 sekundę.

Stan aktualny (X) - np X=1000
Stan odczytany z czujnika (Y) - np. Y=1400
Przyjmij o ile jednorazowo chcesz zmieniać wartość X aby przejście było płynne. Załóżmy, że jest to D=100.

Co 1 sekundę sprawdzasz takie warunki:
IF (X+D)<=Y THEN X = X+D
IF (X-D)>=Y THEN X = X-D

Czyli przejście od 1000 do 1400 zajmie 4 sekundy, jeśli w trakcie przejścia 1000 do 1400 Y zmieni się na 1300 to zmiana nie będzie zauważalna ale zakończy się już po 3 sekundach. Przejście z 1300 na 1350 nie będzie wykonane (dla D=100), bo nie spełni warunków itd.

Dobierając czas próbkowania i parametr D powinieneś otrzymać zamierzony efekt, czyli wyeliminować oscylacje i uzyskać płynne przejścia.

Z grubsza tak bym to widział, choć trzeba to jeszcze dopieścić.

Zapisane

Tom01

  • Full Member
  • ***
  • Wiadomości: 101
    • Zobacz profil
Odp: Wygładzanie szybkozmiennych danych
« Odpowiedź #2 dnia: Grudnia 15, 2016, 11:21:20 pm »

Poniżej implementacja pomysłu w języku FBD.



Ogólnie to działa, ale ma wadę. Jeden parametr D to za mało do wykrywania wielkości zmian i "kroku" zmiany jasności lamp. Aby lampy płynnie zmieniały jasność D musi być mały a jeśli jest mały to jest mniejszy niż oscylacja Y. Jeśli jest większy od oscylacji to z kolei widać skoki jasności lamp.
Zapisane

admin

  • Administrator
  • Sr. Member
  • *****
  • Wiadomości: 313
    • Zobacz profil
Odp: Wygładzanie szybkozmiennych danych
« Odpowiedź #3 dnia: Grudnia 16, 2016, 10:42:34 am »

Cześć Panowie,

W takich sytuacjach z automatu zwracam się w stronę biblioteki OSCAT.  W dziale 19 widzę 5 funkcji do filtrowania sygnału analogowego.  Może warto popróbować? (link do dokumentacji)

Pozdrawiam,
Zapisane

Tom01

  • Full Member
  • ***
  • Wiadomości: 101
    • Zobacz profil
Odp: Wygładzanie szybkozmiennych danych
« Odpowiedź #4 dnia: Grudnia 16, 2016, 10:54:04 am »

A jak z dostępnością tej biblioteki? Płatna? Licencjonowana?
Zapisane

admin

  • Administrator
  • Sr. Member
  • *****
  • Wiadomości: 313
    • Zobacz profil
Odp: Wygładzanie szybkozmiennych danych
« Odpowiedź #5 dnia: Grudnia 16, 2016, 11:37:17 am »

free

download & use :)

www.oscat.de
Zapisane

vakul

  • Full Member
  • ***
  • Wiadomości: 149
    • Zobacz profil
Odp: Wygładzanie szybkozmiennych danych
« Odpowiedź #6 dnia: Grudnia 16, 2016, 07:53:42 pm »

Zerknąłem w oscata i rzeczywiście masz tam dokładnie to czego potrzebujesz.
A chciałem koło dla Ciebie wynaleźć :)

Ale jak już potestujesz, to daj znać jak się toto sprawuje.
Zapisane

Tom01

  • Full Member
  • ***
  • Wiadomości: 101
    • Zobacz profil
Odp: Wygładzanie szybkozmiennych danych
« Odpowiedź #7 dnia: Lutego 05, 2017, 04:50:10 pm »

Testowałem do tej pory oscat w trybie emulacji, jednak przy próbie załadowania do sterownika są dwa problemy. Pierwszy to komunikat o zbyt dużej ilości modułów. Można to zwiększyć w konfiguracji systemu docelowego, ale wówczas pojawia się komunikat o zbyt dużej ilości danych dla sterownika. Jakieś pomysły? Sterownik to 750-880.
Zapisane

mordorr

  • Full Member
  • ***
  • Wiadomości: 156
    • Zobacz profil
Odp: Wygładzanie szybkozmiennych danych
« Odpowiedź #9 dnia: Lutego 06, 2017, 10:42:55 am »


RAMP_INT(
   IN:=CurrLight ,
   ASCEND:= iAscend,
   Descend:= iDescend,
   TIMEBASE:= t#0.1s,
   RESET:= ,
   OUT=> );


i tyle
Zapisane

Tom01

  • Full Member
  • ***
  • Wiadomości: 101
    • Zobacz profil
Odp: Wygładzanie szybkozmiennych danych
« Odpowiedź #10 dnia: Lutego 15, 2017, 11:28:46 pm »

Na razie zrobiłem to tak. Pierwszy filtr z oscat odsiewa zakłócenia pikowe. Drugi z biblioteki util.lib gładko przejeżdża na nową wartość w sytuacji nagłej zmiany oświetlenia. Trzeci bloczek to włącznik dzień/noc z histerezą, też z util.lib. Działa piknie. Może się komuś przyda.



Zapisane

Tom01

  • Full Member
  • ***
  • Wiadomości: 101
    • Zobacz profil
Odp: Wygładzanie szybkozmiennych danych
« Odpowiedź #11 dnia: Marca 03, 2017, 10:43:23 am »

Gdyby ktoś chciał wykorzystywać moje rozwiązanie, załączam erratę. Zauważyłem, że filtr wygładzający RAMP_INT potrafi wyjechać poza wartość maksymalną  czujnika, czyli 32767. Aktywator HISTERESIS interpretuje wówczas wartość ujemną. Skutek jest taki, że jak słońce zaświeci w czujnik, potrafi zaktywować tryb noc. Zastosowałem dodatkowy bloczek SCALE z oscata, który ogranicza zakres dynamiki na wyjściu oraz wymieniłem aktywator z histerezą na wersję od Wago. Chodzi o format wejścia. Poprzedni przyjmował tylko zmienną typu integer i nie współpracował z wyjściem bloczka SCALE.

Zapisane