10. Timery i planowanie zdarzeń

W tej części kursu opiszę:

  • Dodawanie timerów / schedulerów do programu
  • Wykorzystanie ich do sterowania roletami
  • Zasady tworzenia wizualizacji dla timerów

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

Skoro nasz program wie już, która jest godzina, wykorzystajmy tę informację do czasowego zaprogramowania rolet.

Wykorzystam do tego celu bibliotekę WAGO Scheduler_03.lib oraz Visu_Scheduler_03_e.lib (do pobrania ze strony WAGO).

Pierwszym krokiem jest, oczywiście, dodanie do programu ww. bibliotek. Z lewego panelu wybieramy zakładkę Resources->Library manager->prawy klawisz myszy na listę bibliotek->Additional Library i wybieramy ww. pliki, które zgodnie z rekomendacją są w tym samym katalogu, co dodane poprzednio oscat_basic, oscat_building itd.

Tygodniowy programator czasowy składa się z dwóch elementów:

  1. Bloku sterującego typu FbScheduleWeekly
  2. Obiektu / zmiennej złożonej typu typScheduleWeekly, która przechowuje wszystkie ustawienia.

Definicję bloków sterujących umieszczamy pomiędzy VAR i END_VAR

Scheduler_Blind_1, Scheduler_Blind_2 : FbScheduleWeekly;

A zmiennej przechowującej ustawienia pomiędzy VAR RETAIN PERSISTENT i END_VAR

Data_Blind_1, Data_Blind_2 : typScheduleWeekly;

Dodajmy jeszcze kilka zmiennych pomocniczych:

VAR

  Enable_Schedulers : BOOL := True;
  Scheduler_Blind_1_ON, Scheduler_Blind_2_ON : R_TRIG;
  Scheduler_Blind_1_OFF, Scheduler_Blind_2_OFF : F_TRIG;
  Blinds_UP, Blinds_DN : BOOL;

VAR_END
  • Enable_Schedulers będzie głównym włącznikiem działania timerów.
  • Scheduler_Blind_1_R_Trig i kolejne służą wykrywaniu załączenia/wyłączanie timerów.
  • Blinds_UP i Blinds_DN „zbiorą” warunki związane z komendami do ruchu w górę i w dół.

Zacznijmy od wizualizacji. W wizualizacji VIS_SETTINGS dodajemy element typu „Visualization”. Ikona tego elementu znajduje się pomiędzy paletą malarską a przyciskiem „OK”. Gdy dodamy ten element do naszej wizualizacji rysując dowolnej wielkości prostokąt, otworzy się okno dialogowe „Select Visualization”.  Z listy wybieramy visuScheduleWeekly.

1

2

Nie przejmujmy się dziwnym kształtem dodanego elementu. Klikamy na niego dwukrotnie i konfigurujemy:

  • Visulaization->Frame – czyścimy pole przy „Draw”
  • Visualization->Frame zaznaczamy pole „Fixed”, by element miał stały rozmiar
  • Visulaization->Placeholder…->klikamy w polu „Replacement”, naciskamy F2, z listy pod pozycją PLC_PRG wybieramy „Data_Blind_1 (typScheduleWeekly)”

3

To wszystko! Nasz dodany element wizualizacji jest już połączony ze zmienną przechowującą dane. Dla drugiej wizualizacji robimy to samo, lecz jako „Replacement” wybieramy „Data_Blind_2” (najprościej jest skopiować wstawioną już wizualizację CTRL+C CTRL+V lub poprzez przeciągnięcie jej myszą, przy wciśniętym klawiszu CTRL).

4

Czas na programowanie:

(*bloki zarządzające timerami*)
Scheduler_Blind_1(xEnable := Enable_Schedulers, dtActualTime := CURRENT_TIME, typScheduleWeekly := Data_Blind_1);
Scheduler_Blind_2(xEnable := Enable_Schedulers, dtActualTime := CURRENT_TIME, typScheduleWeekly := Data_Blind_2);

(*wykrywanie włączenia/wyłączenia bloków timerów*)
Scheduler_Blind_1_ON(CLK := Scheduler_Blind_1.xSwitchChannel);
Scheduler_Blind_1_OFF(CLK := Scheduler_Blind_1.xSwitchChannel);
Scheduler_Blind_2_ON(CLK := Scheduler_Blind_2.xSwitchChannel);
Scheduler_Blind_2_OFF(CLK := Scheduler_Blind_2.xSwitchChannel);

(*sumowanie impulsów ON/OFF*)
Blinds_UP := Scheduler_Blind_1_ON.Q OR Scheduler_Blind_2_ON.Q;
Blinds_DN := Scheduler_Blind_1_OFF.Q OR Scheduler_Blind_2_OFF.Q;

Definicja bloku Scheduler_Blind_1 wymaga podłączenia 3 parametrów:

  • xEnable, który steruje ogólnym włącznikiem funkcji
  • dtActualTime, do którego podłączyć trzeba aktualny czas
  • typScheduleWeekly, któremu należy wskazać zmienną, w której przechowywana jest konfiguracja danego timera.

Odnośnie „sumowanie impulsów” muszę wyjaśnić, iż NIE planuję, by każda z rolet miała osobny timer, lecz chcę, by oba timery załączały obie rolety równocześnie. Dzięki temu możliwe jest ustalenie innych godzin otwarcia/zamknięcia dla dni powszednich i dla dni wolnych. W efekcie impuls włączenia któregokolwiek timera zsumowany zostanie jako impuls do podniesienia rolet.

5

Konieczne jest jeszcze podłączenie całej powyższej pracy z roletami:

Input_Blind_1(
  S1 := LongShort_IN7.xShort OR VIS_Blind_1_UP OR Blinds_UP,
  S2 := LongShort_IN7.xLong OR VIS_Blind_1_DN OR BLINDS_DN,
  IN := VIS_Blind_1_SHADE,
  POS := Control_Blind_1.POS
);

Dzięki temu impuls, który pojawi się na zmiennej Blinds_UP, sprawi, że rolety się podniosą, a impuls pojawiający się na zmiennej Blinds_DN sprawi, że rolety zostaną opuszczone.

6

Kod naszego programu staje się już bardzo długi… poropnuję więc spojrzeć na załączony plik z całością.