Biblioteka Building_common.lib udostępniania przez WAGO umożliwia proste i szybkie podłączenie i kontrolowanie rolet. Stworzenie w oparciu o nią funkcji bardziej złożonych jest jednakże bardzo karkołomne i wymaga wiele 'manualnej' pracy.
Alternatywnym rozwiązaniem jest sięgnięcie po biblioteki OSCAT udostępnianie nieodpłatnie na www.oscat.de. Pozwolę sobie w tym miejscu ostrzec osoby, które nigdy wcześniej nie dotykały ww. bibliotek. Są olbrzymie, szczegółowe, poprzeplatane funkcjami i... ze skromną dokumentacją. Jest to jednak projekt open-source, trzeba więc być wyrozumiałym, ale też wdzięcznym wszystkim, którzy biblioteki te stworzyli.
Pierwszą trudnością po dodaniu do projektu bibliotek oscat-basic i oscat-building może być pojawieniu się przy kompilacji błędu o przekroczeniu dozwolonej liczby POUs. Rozwiązanie podpowiedział kamiKAC na naszym forum:
Wielkie dzięki dla kamiKAC za podpowiedź!
W bibliotece oscat-building dostępnych jest wiele bloków funkcyjnych, z których do sterowania rolet najważniejsze wg mnie są:
BLIND_INPUT - do podłączenia przycisków i sygnałów wejścia,
BLIND_CONTROL(_S) - do podłączenia wyjść DO sterujących silnikiem rolety.
Najprostszą funkcjonalność możemy więc osiągnąć łącząc bloki BLIND_INPUT i BLIND_CONTROL w następujący sposób:
VAR Input_Blind1: BLIND_INPUT; Control_Blind1:BLIND_CONTROL_S; END_VAR * * * Input_Blind1( S1:=Button1 OR VIS_Blind1_UP , S2:=Button2 OR VIS_Blind1DN, POS:=Control_Blind1.POS ); Control_Blind1( UP:=Input_Blind1.QU, DN:=Input_Blind1.QD, S_IN:=Input_Blind1.STATUS, pi:=Input_Blind1.PO\ ); OUT1:=Control_Blind1.MU; OUT1:=Control_Blind1.MD;
Gdzie:
Powiązanie bloków BLIND_INPUT i BLIND_CONTROL_S najlepiej oddaje schemat zaczerpnięty przeze mnie z dokumentacji biblioteki oscat-building
Całe 'piękno' struktury, jaką oferuje biblioteka oscat-building, 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żę.
Oto przykład żywcem wzięty z mojej instalacji - sterowanie 1 roletą w salonie:
VAR Clicker_IN1 : Fb_ShortLong:=(uiTS_10tel_s:=1, uiTL_10tel_s:=1, uiT_10tel_s :=5); END_VAR VAR RETAIN PERSISTENT Input_B_1S1 :BLIND_INPUT:=(PI:=120, MAX_RUNTIME:=T#25s, MANUAL_TIMEOUT:=t#60m, MASTER_MODE:=TRUE); Shade_B_1S1 :BLIND_SHADE_S:=(HORZ1:=70, HORZ2:=150, SHADE_POS:=150, SHADE_DELAY:=T#60s); Control_B_1S1 :BLIND_CONTROL_S:=(T_UP:=T#20s, T_DN:=T#18s); END_VAR * * * Clicker_IN1(xSwitch:=IN1); Input_B_1S1( S1:=Clicker_IN1.xShort OR VIS_B_1S1_UP, S2:=Clicker_IN1.xLong OR VIS_B_1S1_DOWN, IN:=VIS_B_1S1_SpecPos, POS:=Control_B_1S1.POS ); Shade_B_1S1( UP:=Input_B_1S1.QU, DN:=Input_B_1S1.QD, S_IN:=Input_B_1S1.STATUS, pi:=Input_B_1S1.PO, ENABLE:=ShadeFlag_B_1S, SUN:=SunSignal_1S, CX:=ReadClock.Calendar ); Control_B_1S1( UP:=Shade_B_1S1.QU, DN:=Shade_B_1S1.QD, S_IN:=Shade_B_1S1.STATUS, pi:=Shade_B_1S1.PO ); OUT1:=Control_B_1S1.MU; OUT2:=Control_B_1S1.MD;
Gdzie, w definicjach:
Clicker_IN1 - blok funkcyjny z biblioteki WAGO Building_common.lib rozpoznający długie i krótkie przyciśnięcie klawisza. Blok z OSCATa o tej funkcjonalności działa wg mnie dużo gorzej.
Input_B_1S1:
Shade_B_1S1:
Control_B_1S1:
W kodzie programu:
Input_B_1S1:
Shade_B_1S1
Control_B_1S1
W osobnym programie ReadClock (wykonywanym co 1s: Task configuration, Append Task itd.):
VAR Calendar_Updater : CALENDAR_CALC:=(SPE:=TRUE); Calendar : CALENDAR:=(LATITUDE:=51.0, LONGITUDE:=16.0, OFFSET:=120); Holidays :ARRAY [0..29] OF HOLIDAY_DATA; END_VAR * * * Calendar_Updater(XCAL:=Calendar, HOLIDAYS:=Holidays); Calendar.Utc:=SysRtcGetTime(TRUE); (*make sure your system runs at UTC time, otherwise - correct it with for example +/- T#2h*)
Gdzie:
Jak to wszystko działa?
Krótkie przyciśnięcie przycisku pod IN1 podnosi roletę, długie (>0.5s) opuszcza, krótkie naciśnięcie w trakcie ruchu zatrzymuje roletę. Gdy słońce przekroczy pozycję 70 (wschód na 90) roleta zjedzie do pozycji 150 (255 otwarta, 0 zamknięta), po przekroczeniu przez słońce pozycji 150 roleta wróci do pozycji sprzed opuszczenia, tap'nięcie zmiennej VIS_B_1S1_SpecPos w wizualizacji spowoduje ustawienie rolety w pozycji 120. Jako że w salonie mam rolety od wschodu, południa i zachodu, zamykają się i otwierają kolejno zgodnie z pozycją słońca.
UWAGI:
Uffff.... powodzenia...