W tej części kursu opiszę:
Niejszy artykuł bazuje na pojęciach i plikach omawianych w poprzednich częściach - zachęcam więc, by czytać całość od samego początku
Czas zająć się roletami. W mojej ocenie to najbardziej wdzięczne elementy systemu automatyki domowej. Można nakazać im, by opuszczały się i podnosiły o wschodzie/zachodzie słońca lub wg zaprogramowanych timerów. Można też uzależnić ich działanie od intensywności nasłonecznienia i pozycji słońca. Gdy rolety poruszają się same zgodnie z naszymi oczekiwaniami, właściciel domu może zagłębić się w przyjemne poczucie zadowolenia.
Rozbudujmy model naszego mieszkania. Dodamy 2 rolety i przyciski do sterowania:
Jeśli niepokoi Was fakt numerowania wejść i wyjść nie po kolei, wg ich fizycznego umieszczenia, proponuję wrzucenie na luz. Parokrotnie próbowałem zachować „porządek” przy podłączaniu łączników i przekaźników, ale ostatecznie zawsze kończyłem z pewną losowością. Nic to w praktyce nie przeszkadza.
Dbajcie tylko o odpowiednią dokumentację (Np. w Recources -> PLC Configuration, prawy przycisk na „K-Bus…” -> Edit i wypełnianie pól „Comment”).
Zanim opiszę program do sterowania rolet, musimy przejść przez proces dodawania bilbiotek OSCAT. Czemu OSCAT? Dlaczego nie pozostaniemy w świecie bilbiotek WAGO? Ano niestety, po wielu próbach w kilku instalacjach stwierdzam, iż funkcjonalność bibliotek do sterowania roletami oferowanych w pakiecie OSCAT jest po prostu lepsza. Łatwiej je sparametryzować i łatwiej sterować nimi przez komórkę.
Dodanie do projektu ww. bibliotek jest nieco trudniejsze ze względu na ich rozmiar i mnogość zdefiniowanych funkcji. O dodatkowych krokach w trakcie kompilacji programu opowiem w Artykule (...do uzupełnienia...).
Ze strony www.oscat.de pobierz biblioteki OSCAT-Basic i OSCAT-Building. Zapisz je w tym samym katalogu, co wcześniej pobrane biblioteki (!)
Dodaj je do programu przez Recources -> Library Manager (klawisz Ins, lub prawy przycisk na liście bibliotek i „Additional Library”).
Roletami R1 i R2 podłączonymi przez przekaźniki do wyjść OUT5-OUT8 sterować będziemy z klawiszy podłączonych do IN7 i IN8. IN7 sterować będzie R1 a IN8 roletą R2. Krótkie przyciśnięcie będzie podnosić roletę lub przerywać ruch. Długie przyciśnięcie będzie opuszczać roletę. Do dzieła!
W definicjach dodaję :
VAR
(…)
(*
Bloki funkcyjne sterowania rolet
Warto określić wartości początkowe:
PI = pozycja zadana przy wykonywaniu komendy „Cień”
MAX_RUNTIME = czas zasilania silników przy pełnym ruchu
MANUAL_TIMEOUT = czas wyłączenia funkcji automatycznych po jakimkolwiek ręcznym sterowaniu
MASTER_MODE = umożliwiające prawidłowe wykonywanie komendy „Cień”
T_UP = czasu ruchu w górę wykorzystywany do zliczeniowego określania pozycji
T_DN = czas ruchu w dół
*)
Input_Blind_1: BLIND_INPUT := (PI := 150, MAX_RUNTIME := T#25s, MANUAL_TIMEOUT := t#60m, MASTER_MODE := TRUE);
Control_Blind_1 : BLIND_CONTROL_S := (T_UP := T#22s, T_DN := T#20s);
Input_Blind_2: BLIND_INPUT := (PI := 150, MAX_RUNTIME := T#25s, MANUAL_TIMEOUT := t#60m, MASTER_MODE := TRUE);
Control_Blind_2 : BLIND_CONTROL_S := (T_UP := T#22s, T_DN := T#20s);
(*
Do obsługi klawiszy IN7 i IN8
Zauważyć warto, iż w przypadku sterowania roletami lepiej sprawdza się czas 1 sekundy
na rozróżnienie krótkiego/długiego przyciśnięcia (czyli komendy ruchu w górę lub dół).
*)
LongShort_IN7, LongShort_IN8 : Fb_ShortLong := (uiT_10tel_s := 10, uiTL_10tel_s := 1, uiTS_10tel_s := 1);
(* Do sterowania z wizualizacji *)
VIS_Blind_1_UP, VIS_Blind_1_DN, VIS_Blind_1_SHADE : BOOL;
VIS_Blind_2_UP, VIS_Blind_2_DN, VIS_Blind_2_SHADE : BOOL;
(…)
END_VAR
W programie pojawi się dodatkowo:
(* Rozróżnianie przycisków krótki/długi *) LongShort_IN7( xSwitch := IN7 ); LongShort_IN8( xSwitch := IN8 ); (*Roleta Salon 1*) Input_Blind_1( S1 := LongShort_IN7.xShort OR VIS_Blind_1_UP, S2 := LongShort_IN7.xLong OR VIS_Blind_1_DN, IN := VIS_Blind_1_SHADE, POS := Control_Blind_1.POS ); Control_Blind_1( UP := Input_Blind_1.QU, DN := Input_Blind_1.QD, S_IN := Input_Blind_1.STATUS, pi := Input_Blind_1.PO ); OUT5 := Control_Blind_1.MU; OUT6 := Control_Blind_1.MD; (*Roleta Salon 2*) Input_Blind_2( S1 := LongShort_IN8.xShort OR VIS_Blind_2_UP, S2 := LongShort_IN8.xLong OR VIS_Blind_2_DN, IN := VIS_Blind_2_SHADE, POS := Control_Blind_2.POS ); Control_Blind_2( UP := Input_Blind_2.QU, DN := Input_Blind_2.QD, S_IN := Input_Blind_2.STATUS, pi := Input_Blind_2.PO ); OUT7 := Control_Blind_2.MU; OUT8 := Control_Blind_2.MD;
Bloki funkcyjne do sterowania roletami z biblioteki OSCAT-Building wyglądają jak kanapka. Pierwszy jest blok do obsług wejść sterujących – BLIND_INPUT. Analizuje on przyciski, sygnały i.. przesyła dalej. Ostatni jest blok sterujący zasilaniem silników rolet – BLIND_CONTROL_S. Zgrabność tej struktury polega na tym, iż pomiędzy ww. bloki możemy wkładać inne, specyficzne, odpowiedzialne za wybrany obszar funkcyjny tj. sterowanie pozycją 'zrób cień', sterowanie pozycją w nocy (wg słońca lub czasu), sterowanie wg zdarzeń nadzwyczajnych (np. pożar, włamanie, wiatr), ustalanie scen, itd. Całość przypomina więc pojedyncze klocki lego, które można ustawiać jeden na drugim, budując wieżę.
W bieżącym przykładzie nie mamy nic poza analizą przycisków i sterowaniem silnikami rolet, więc BLIND_INPUT połączony jest bezpośrednio do BLIND_CONTROL_S.
W części programowej mamy już wszystko, trzeba jeszcze skonfigurować rolety. Tworzymy więc nowy obiekt wizualizacji (zakładka „Visulaizations”, prawy klawisz, „Add Object” i podajemy nazwę „VIS_SETTINGS”). Oto najważniejsze elementy do sterowania i konfigurowania rolet:
Parametry konfiguracyjne elementów wizualizacji (opisane od lewej do prawej):
Dobrze! Wszystko powinno już działać. Doświadczenie uczy jednak, iż przydatna jest jeszcze jedna zmiana….
Gdy wyłączymy lub zresetujemy sterownik, odtwarza on z pamięci trwałej zapisany tam program i uruchamia go. Wykorzysta w takim przypadku wartości zmiennych i parametrów konfiguracyjnych podanych w części definicji zmiennych. Co jednak ze zmianami, które wprowadziliśmy w międzyczasie? Dostrajając rolety zmierzyliśmy ich czas ruchu w górę i w dół… czy trzeba obliczone wartości wpisać w kod programu by nie przepadły?
Nie! (choć ostatecznie to pomysł na nudny jesienny wieczór). Wystarczy nakazać, by wartości wskazanych zmiennych przechowywane były NAWET JEŚLI WYŁĄCZYMY STEROWNIK.
W naszym przypadku ważne dla użytkownika dane konfiguracyjne umieszczone są w blokach funkcyjnych odpowiedzialnych za pracę rolet. Przenosimy je więc w obszar ograniczony słowami VAR RETAIN PERSISTENT i END_VAR, czyli
VAR (*… zwykłe zmienne, których wartości nie muszą być przechowywane*) END_VAR VAR RETAIN PERSISTENT (*…zmienne których wartość jest zapisywana w pamięci trwałej sterownika*) Input_Blind_1: BLIND_INPUT := (PI := 150, MAX_RUNTIME := T#25s, MANUAL_TIMEOUT := t#60m, MASTER_MODE := TRUE); Control_Blind_1 : BLIND_CONTROL_S := (T_UP := T#22s, T_DN := T#20s); Input_Blind_2: BLIND_INPUT := (PI := 150, MAX_RUNTIME := T#25s, MANUAL_TIMEOUT := t#60m, MASTER_MODE := TRUE); Control_Blind_2 : BLIND_CONTROL_S := (T_UP := T#22s, T_DN := T#20s); END_VAR
Oto paczka z programem wykorzystywanym do tego przykładu.
Na ten moment program kompiluje się bez problemów mimo dodania bibliotek OSCAT. O tym, jak radzić sobie z komunikatami błędów związanymi z nadmiarem jednostek POU piszę w tym Artykule.