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
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:
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
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.
Nie przejmujmy się dziwnym kształtem dodanego elementu. Klikamy na niego dwukrotnie i konfigurujemy:
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).
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:
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.
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.
Kod naszego programu staje się już bardzo długi… poropnuję więc spojrzeć na załączony plik z całością.