Nie jestem jakimś wielkim programistą ale jakoś pomalutku rezam program. Jak obiecałem dzielę się moimi wypocinami może komuś się przydadzą.
Na początek prosta rzecz czyli zapalenie pojedynczego światła. Włączniki są zwierne czyli tzw. dzwonkowe. Nie ma tu filozofii wykorzystujemy gotowy bloczek z biblioteki „bulding”
Fb_LatchingRelay .
swiatlo_zew_drzwi(xSwitch:=w_swiatlo_zew_drzwi); s_zew_drzwi:=swiatlo_zew_drzwi.xActuator;
gdzie:
swiatlo_zew_drzwi –nazwa bloku
w_swiatlo_zew_drzwi- wejście kanapki np. %I0.0;
s_zew_drzwi- wyjście kanapki np. %Q0.0
swiatlo_zew_drzwi.xActuator- wyjscie z bloku
To może teraz troszkę trudniej.
W przedpokoju mam:
- Światło górne
- Światło dolne (obrysówki)
- Dioda w włączniku (sygnalizować będzie wyzwolenie z włacznika)
- czujnik ruchu (ciemna kulka na suficie)
- dwa włączniki.
Jak to ma działać:
Czujnik ruchu włącza światło górne. Pomiędzy godzina 23:00-5:00 czujnik ruchu zalącza jedynie obrysówki.
Włączniki spięte są równolegle i wchodzą na jedno wejście.
Włącznik rozróżnia kliknięcia.
Jedno kliknięcie załącza światło górne oraz diode LED (ponowne kliknięcie wylączy światło)
Dwa kliknięcia załącza światło dolne oraz LED
Kliknięcia są priorytetowe więc olewany jest w tym czasie czujnik ruchu.
Dodatkowo po kliknięciu załącza się licznik i po np.godzinie wyłączy się światło górne a po np. 3h światło dolne (to taka wersja dla zapominalskich nie musze wyłączać światła liczniki zrobią to za mnie ) Jak tylko światło wyłączy się od licznika czujnik ruchu przejmuje z powrotem kontrole.
(* ta czesc odpowiada za sprawdzenie czy ma blokowac swiatlo gorne 23-5*)
IF(godzina_rtc=godzina_poczatek ) THEN
blokuj_swiatlo:=TRUE;
END_IF
IF(godzina_rtc=godzina_koniec) THEN
blokuj_swiatlo:=FALSE;
END_IF
(*---------------------------------------------------------*)
przedpokoj_zwykle(xSwitch:=w_przedpokoj OR wylacz_przedpokoj); (*rozroznia jedno lub 2 klikniecia daje impuls*)
przedpokoj_pojedyncze(xSwitch:= przedpokoj_zwykle.xSingle ); (*jezeli bylo jedno klikniecie podtrzymujemy to bloczkieb fb daje ciaglosc do nastepnego klikniecia*)
IF(przedpokoj_pojedyncze.xActuator=TRUE ) THEN (*jezeli jest pojedynczy impuls to wystaw na diode w wlaczniku true*)
dioda_przedpokoj:=TRUE;
ELSE
dioda_przedpokoj:=FALSE;
END_IF
s_przedpokoj:=przedpokoj_pojedyncze.xActuator; (* jezeli jest pojedynczy impuls zapal rownierz swiatlo na przedpokoju "ustraw true*)
przedpokoj_podwojne(xSwitch:= przedpokoj_zwykle.xDouble ); (* analogocznie podtrzymanie 2 klikniec*)
IF(przedpokoj_podwojne.xActuator=TRUE ) THEN (*jezeli jest podwojny impuls i nie sa juz zapalone diody to zapal diody*)
dioda_przedpokoj:=TRUE;
END_IF
IF(przedpokoj_podwojne.xActuator=FALSE AND przedpokoj_pojedyncze.xActuator=FALSE ) THEN
dioda_przedpokoj:=FALSE;
END_IF
s_obrysowki_dol:=przedpokoj_podwojne.xActuator; (*jezeli jest podwojny zapal obrysowki*)
(* to jest odlicznie dla zwyklego swiatla *)
przedpokoj_TON(IN := przedpokoj_pojedyncze.xActuator , PT:= T#10s); (*przedpokoj_TON(IN := przedpokoj_zwykle.xActuator, PT:= T#35s);*)
wylacz_ton_przedpokoj(CLK:=przedpokoj_TON.Q);
IF(wylacz_ton_przedpokoj.Q=TRUE) THEN
wylacz_przedpokoj:=TRUE;
ELSE
wylacz_przedpokoj:=FALSE;
END_IF
(* to jest licznik obrysowek*)
przedpokoj_TON2(IN := przedpokoj_podwojne.xActuator , PT:= T#10s); (*przedpokoj_TON(IN := przedpokoj_zwykle.xActuator, PT:= T#35s);*)
wylacz_ton_przedpokoj2(CLK:=przedpokoj_TON2.Q);
IF(wylacz_ton_przedpokoj2.Q=TRUE) THEN
przedpokoj_zwykle(xSwitch:=TRUE);
przedpokoj_zwykle(xSwitch:=FALSE);
przedpokoj_zwykle(xSwitch:=TRUE);
END_IF
IF(przedpokoj_pojedyncze.xActuator=FALSE AND przedpokoj_podwojne.xActuator=FALSE) THEN (*IF(przedpokoj_zwykle.xActuator=FALSE) THEN*)
IF(blokuj_swiatlo=FALSE) THEN
przedpokoj(CLK:=r_przedpokoj );
przedpokoj_off_triger(CLK:=r_przedpokoj); (*gasi swiatlo*)
przedpokoj_sema(CLAIM:=przedpokoj.Q,RELEASE:=przedpokoj_off_triger.Q);
s_przedpokoj:=przedpokoj_sema.BUSY;
END_IF
IF(blokuj_swiatlo=TRUE) THEN
przedpokoj(CLK:=r_przedpokoj );
przedpokoj_off_triger(CLK:=r_przedpokoj); (*gasi swiatlo*)
przedpokoj_sema(CLAIM:=przedpokoj.Q,RELEASE:=przedpokoj_off_triger.Q);
s_obrysowki_dol:=przedpokoj_sema.BUSY;
END_IF
END_IF
Pewnie wielu znajdzie masę błędów i niedociągnięć, ale na tym etapie na którym jestem ta cześć programu przetestowana i działa poprawnie. Może są w niej błędy merytoryczne ale to co zamierzałem uzyskać działa. Wszelkie sugestie mile widziane.