'Inteligenty' dom ze sterownikiem PLC

 Language:
Szukanie zaawansowane  

Aktualności:

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

Autor Wątek: Rejestr ostatnich zdarzeń - naruszenie czujki alarmu  (Przeczytany 5423 razy)

mordorr

  • Full Member
  • ***
  • Wiadomości: 156
    • Zobacz profil
Rejestr ostatnich zdarzeń - naruszenie czujki alarmu
« dnia: Października 20, 2016, 02:16:13 pm »

Cześć,

od jakiegoś czasu podejrzewam nieprawidłową prace czujki alarmu i chciałbym zapisywać 3 ostatnie czasy zadziałania czujek.
kombinowałem jak to zrobić i o ile dla jednej czujki to po prostu można zrobić arraya, do któego będziemy nadpisywać czasy. proste.
ale jak już robię taką funkcjonalność to chciałem to zrobić porządnie i mieć taki mechanizm dla wszystkich czujek.

w tym celu stworzyłm Struct:
TYPE typCzujki :
STRUCT
Status:BOOL;
Last1:STRING;
Last2:STRING;
Last3:STRING;
END_STRUCT
END_TYPE

(status do wizualizacji:) )

i potem robię w programie tak:
RT_Czujka:R_TRIG;
Czujki: ARRAY[1..10] OF typCzujki;

i

FOR i:=1 TO 10 DO
Czujki[i].Status:=arrCzujki[i];
RT_Czujka(clk:=Czujki[i].Status);
IF RT_Czujka.Q THEN
Czujki[i].Last3:=Czujki[i].Last2;
Czujki[i].Last2:=Czujki[i].Last1;
Czujki[i].Last1:=CONCAT(MID(DT_TO_STRING(czas),10,4) ,' ');
Czujki[i].Last1:=CONCAT(Czujki[i].Last1,RIGHT(DT_TO_STRING(czas),8));
END_IF;
END_FOR;

oczywiście tak to nie zadziała, ponieważ Czujki.status zmienia się w każdej iteracji pętli, więc w efekcie w czasie działania czujki zapisuje wszystkie 3 LASTy aktualnym czasem.

jak to obejść nie robiąc 10ciu R_Trigów ?

a moze w ogole macie lepszy pomysł na taki mały bufor danych ?

Zapisane

mordorr

  • Full Member
  • ***
  • Wiadomości: 156
    • Zobacz profil
Odp: Rejestr ostatnich zdarzeń - naruszenie czujki alarmu
« Odpowiedź #1 dnia: Października 20, 2016, 02:22:09 pm »

może tak: ??

FOR i:=1 TO 10 DO


IF Czujki[i].Status=FALSE AND arrCzujki[i]=TRUE THEN
Czujki[i].Last3:=Czujki[i].Last2;
Czujki[i].Last2:=Czujki[i].Last1;
Czujki[i].Last1:=CONCAT(MID(DT_TO_STRING(czas),10,4) ,' ');
Czujki[i].Last1:=CONCAT(Czujki[i].Last1,RIGHT(DT_TO_STRING(czas),8));
END_IF;
Czujki[i].Status:=arrCzujki[i];
END_FOR;
Zapisane

admin

  • Administrator
  • Sr. Member
  • *****
  • Wiadomości: 313
    • Zobacz profil
Odp: Rejestr ostatnich zdarzeń - naruszenie czujki alarmu
« Odpowiedź #2 dnia: Października 20, 2016, 03:17:18 pm »

Cześć

Z kodowaniem to jest tak, że każdy by to robił po swojemu i zawsze trochę inaczej...  ;)

może zrobić 1 RTRIG wspólny na zasadzie:


RT_Czujka(clk := arrCzujki[1] OR arrCzujki[2] OR arrCzujki[3].....)


IF RT_Czujka.Q THEN
  FOR i := 1 TO 10 DO
    IF arrCzujki[ i ] THEN
          (*zapisz tu zdarzenie tej czujki, która akurat jest wzbudzona*)
    END_IF;
  END_FOR;
END_IF;


ale skoro już tworzysz sobie STRUCT to czemu nie zrobisz FB, który na wejściu będzie miał stan czujki, na wyjściu tablicę zdarzeń (EVENTS: ARRAY [1..3] of STRING) a wewnątrz trigger i index, by wiedzieć, którą pozycję tablicy zapisać?

np tak:

FUNCTION_BLOCK Czujka
VAR_INPUT
status: BOOL;
END_VAR
VAR_OUTPUT
events: ARRAY[1..3] OF STRING;
END_VAR
VAR
trigger: R_TRIG;
index: BYTE :=1;
END_VAR

w programie FB Czujka:

trigger(CLK := status);

IF trigger.Q THEN
events[index] := czas; (*jakkolwiek chcesz go sobie sformatowac*)
index := index + 1;
IF index > 3 THEN
index := 1;
END_IF;
END_IF;

i procesie głównym:

PROGRAM PLC_PRG
VAR
czujki : ARRAY[1..10] OF Czujka;
i : BYTE;
END_VAR


FOR i:= 1 TO 10 DO
czujki[i](status := arrCzujki[i]);
END_FOR;

« Ostatnia zmiana: Października 20, 2016, 10:11:44 pm wysłana przez admin »
Zapisane

mordorr

  • Full Member
  • ***
  • Wiadomości: 156
    • Zobacz profil
Odp: Rejestr ostatnich zdarzeń - naruszenie czujki alarmu
« Odpowiedź #3 dnia: Października 20, 2016, 04:02:40 pm »

Muszę przestudiować Twoją propozycję :) nigdy tak nie robiłem - a pierwszy raz zawsze jest interesujący :)

dlaczego Struct ? zakładając 10 czujek, które chcę zilustrować na wizualizacji uzywając Instances i Placeholders.Pomyslalem, ze tak bedzie najlatwiej :)
Zapisane

admin

  • Administrator
  • Sr. Member
  • *****
  • Wiadomości: 313
    • Zobacz profil
Odp: Rejestr ostatnich zdarzeń - naruszenie czujki alarmu
« Odpowiedź #4 dnia: Października 20, 2016, 10:13:53 pm »

po przemyśleniu wycofuję się z tego wspólnego R_TRIGa dla kilku czujek.  Przy wzbudzeniu dwóch w niewielkim odstępie czasu, zapis dokonany byłby tylko dla 1 z nich.  Mówiąc językiem łamanym: gdy czujka1 staje się TRUE, R_TRIG.Q uruchamia zapis, ale gdy czujka2 stanie się true w czasie gdy czujka1 nadal jest TRUE, nie wystąpi drugi R_TRIG.Q...

...proponowałbym więc podejście z Function Block ;)
Zapisane

mordorr

  • Full Member
  • ***
  • Wiadomości: 156
    • Zobacz profil
Odp: Rejestr ostatnich zdarzeń - naruszenie czujki alarmu
« Odpowiedź #5 dnia: Października 20, 2016, 10:33:29 pm »

Wlasnie zycie weryfikuje moj pomysl zapisywania trzech ostatnich naruszen :)
okazuje sie, ze te czujki przy obecnosci naruszane są co parę sekund, więc zapis 3 naruszen troszkę mija się z celem.

myslę o gradientowej zmianie koloru od czasu naruszenia.
np ustawic czas ostatniego naruszenia i w przedziale 0-30s zmieniać kolor od jasnozielonego do jakiegoś powiedzmy ciemnoczerwonego.
trzebaby kolor ustawić w postaci DWord dla Fill Color w ColorVariables dla elementu graficznego.
tutaj juz na pewno FB (a na pewno najwygodniej:) ) trzebaby tylko przeskalować przejscie od zielonego do czewonego na czas.
W wolnej chwili to zrobię. na teraz to co mam mi w zupelnosci wystarczy, zeby sprawdzic, czy czujka "odpala" sama w np w nocy.
Zapisane

admin

  • Administrator
  • Sr. Member
  • *****
  • Wiadomości: 313
    • Zobacz profil
Odp: Rejestr ostatnich zdarzeń - naruszenie czujki alarmu
« Odpowiedź #6 dnia: Października 21, 2016, 09:00:25 am »

Cześć,

'gradientowa zmiana koloru'?  A cóż to za czujki masz i jak nimi sterujesz?
Zapisane

mordorr

  • Full Member
  • ***
  • Wiadomości: 156
    • Zobacz profil
Odp: Rejestr ostatnich zdarzeń - naruszenie czujki alarmu
« Odpowiedź #7 dnia: Października 21, 2016, 10:30:19 am »

Koloru na wizualizacji :)
chodzi o to, zeby pokazac czas od ostatniego naruszenia czujki.

BTW - miałem zrobić narzędzie diagnostyczne, a zrobiłem szpiega ... od razu widać, o której żona z domy wychodzi :P:P

a co do samej rzekomej usterki czujki - to wszystko jest OK. problem pojawil się jednorazowo z alarmem- wlaczyl sie w nocy jak nas nie było :) ale obstawiam, ze to spacerujący po czujce pająk.
a ostatnio zauważyłem, że rano zapala się światło samoczynnie. ale to akurat spowodowane jest tym F_Trigiem:
F_OccupacyNoc(clk:=THANOS_PRG.Thanos1.typThanosRoom.xRoomOccupancy AND Czas_PRG.NOC);

Thanos to panel scienny Thermokonu (pewnie znacie, bo Wago go promuje/promowało).
on ma cos takiego, co sie nazywa obecność. wchodząc wieczorem na górę po prostu przełączam thanosa w Occupacy=false i z automatu gaśnie mi całe oświetlenie i zamykają się rolety.
problem w tym, że żona ostatnio wstaje przed wschodem słońca i ręcznie przełącza thanosa w Occupacy True. czyli mamy obecność i noc jednocześnie, a o wschodzie słońca jest F_OccupacyNoc.Q=true :)

muszę to przerobić...
Zapisane

mordorr

  • Full Member
  • ***
  • Wiadomości: 156
    • Zobacz profil
Odp: Rejestr ostatnich zdarzeń - naruszenie czujki alarmu
« Odpowiedź #8 dnia: Października 21, 2016, 11:01:39 am »

Na pierwszy strzał poszło wyłączenie NOCy z F_Triga tak:
Deklaracje
F_OccupacyNOC:BOOL;
F_OccupacyNOCTrig:F_TRIG;
Program
F_OccupacyNocTrig(clk:=THANOS_PRG.Thanos1.typThanosRoom.xRoomOccupancy);
F_OccupacyNoc:= F_OccupacyNocTrig AND Czas_PRG.NOC

Zapisane