8. Sterowanie roletami i biblioteki OSCAT

W tej części kursu opiszę:

  • Sposób dodawania i wykorzystania bibliotek OSCAT
  • Rozróżnienie między przechowywaniem zmiennych w pamięci ulotnej i pamięci stałej sterownika
  • Zasady budowy programu sterującego roletami

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:

1

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”).

2

 

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);

  (* 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:

3

Parametry konfiguracyjne elementów wizualizacji (opisane od lewej do prawej):

  • Przycisk UP – uruchamia ruch w górę: Text = UP, Colors->Alarm color->Inside = pomarańczowy, Variables->Change color = OUT5, Input->Tap variable = PLC_PRG.VIS_BLIND_1_UP
  • Przycisk DN – uruchamia ruch w dół: Text = DN, Colors->Alarm color->Inside = pomarańczowy, Variables->Change color = OUT6, Input->Tap variable = PLC_PRG.VIS_BLIND_1_DN
  • Przycisk Cień – uruchamia ruch do pozycji zadanej w polu Pozycja Cień: Text = Cień, Input->Tap variable = PLC_PRG.VIS_BLIND_1_SHADE
    (przy tej okazji warto zmienić styl czcionki: Text->Font…->Skrypt = Środkowoeuropejski by umożliwić poprawne wyświetlanie polskich znaków)
  • Pole Pozycja Obecna – podaje obecną pozycję, gdzie 255 to góra, 0 to dół: Text = %s, Variables ->Textdisplay = PLC_PRG.Control_Blind_1.POS
    (umiesczenie w polu Text znaków “%s” i podanie zmiennej w polu Variables->Textdisplay sprawia, że w polu wyświetlana jest wartość wskazanej zmiennej)
  • Pole Pozycja Cień – określa pozycję docelową: Text = %s, Variables->Textdisplay = PLC_PRG.Input_Blind_1.PI, Input->Text input on variable ‘Textdisplay’
    (zaznaczenie pola przy „Text input on variable ‘Textdisplay’ umożliwia wpisanie z ręki wartości zmiennej podanej w Variables->Textdisplay)
  • Pole Czas R. góra – określa czas ruchu w górę: Text = %s, Variables->Textdisplay = PLC_PRG.Control_Blind_1.T_UP, Input->Text input on variable ‘Textdisplay’
    (czas ruchu wykorzystywany jest do zliczeniowego określania pozycji. Najlepiej zmierzyć go stoperem przy ręcznej obsłudze rolet)
  • Pole Czas R. dół – określa czas ruchu w dół: Text = %s, Variables->Textdisplay = PLC_PRG.Control_Blind_1.T_DN, Input->Text input on variable ‘Textdisplay’
  • Pole Czas Zasilania – określa czas zasilania silnika rolet: Text = %s, Variables->Textdisplay = PLC_PRG.Input_Blind_1.MAX_RUNTIME, Input->Text input on variable ‘Textdisplay’

4

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 Artykule (...do uzupełnienia...).