Sprzęt i konfiguracja
W pokoju dziecinnym na ścianach od południa i zachodu znajdują się okna z roletami (roleta I; sterowanie silnikiem z wyjść OUT1 i OUT2 i roleta II; sterowanie silnikiem z wyjść OUT3 i OUT4). Na ścianie zachodniej przy oknie znajduje sią 2-klawiszowy łącznik zwierny (klawisze 1 i 2 podpięte do IN1 i IN2). Przy drzwiach wejściowych do pokoju (ściana wschodnia) również znajduje się 2-klawiszowy łącznik zwierny (klawisze 11 i 22 podpięte do IN11 i IN22).
Do dyspozycji mam też czujnik światła słonecznego na 24VDC zasilany z OUT10 i w przypadku przekroczenia zadanego poziomu nasłonecznienia, zwracający sygnał do IN10.
Funkcjonalność
Łącznik znajdujący się przy oknie służy do 'tradycyjnego' sterowania roletą. Krótkie przyciśnięcie klawisza (1) powoduje rozpoczęcie podnoszenia rolety (I). Krótkie przyciśnięcie w trakcie ruchu rolety powoduje zatrzymanie. Długie przyciśnięcie klawisza powoduje rozpoczęcia opuszczania rolety.
Łącznik znajdujący się przy drzwiach służy do kontrolowania oświetlenia. Jednakże długie przyciśnięcie klawisza (11) powoduje opuszczenie obu rolet do zadanej pozycji. Długie przyciśnięcie klawisza (22) powoduje podniesienie obu rolet.
Możliwość ustawienia rolet w 'zadanej pozycji' jest warte uwagi, gdyż umożliwia szybkie:
- ustawienie rolet np. w połowie okna, co powoduje ręczne zacienienie w słoneczne dni,
- ustawienie rolet w pozycji 'prawie zamknięte', czyli przed 'zaciśnięciem się' lameli, gdy między nimi pozostają małe przerwy wpuszczające nieco światła i dające efekt półmroku - wykorzystywane przez nas w czasie popołudniowych drzemek dzieci.
Dzięki klawiszom 11 i 22 mam więc możliwość, zależnie od pory roku i konfiguracji 'zadanej pozycji' przyspieszonego ustawiania scen, lub ręcznego podniesienia obu rolet.
Ponadto istnieje możliwość podnoszenia i opuszczania rolet zgodnie z wschodem/zachodem słońca lub ustawieniami zegara. Zazwyczaj więc w okresie zimowym rolety opuszczają się całkowicie o zachodzie słońca i podnoszą o 07:00.
Dodatkową funkcją jest automatyczne ustawianie rolet w pozycji 'cień', gdy latem słońce znajduje się w zadanej pozycji, czujnik światła potwierdził występowanie ostrego słońca, a termometr wskazał, iż w pokoju temperatura przekroczyła zadany próg.
Kod, w części definicji zmiennych
VAR Shade_TemperatureTOF : TOF:=(PT:=T#1h); Shade_Flag : BOOL; Shade_Enabled, WINTER : BOOL; SunSignal : BOOL; SunRise : F_TRIG; SunSet : F_TRIG; Blind_Room1_S_1, Blind_Room1_S_2: FbScheduleWeekly; Blind_R1_Timer_On : R_TRIG; Blind_R1_Timer_Off : F_TRIG; SWITCH_IN1, SWITCH_IN2 : Fb_ShortLong:=(uiTS_10tel_s:=1, uiTL_10tel_s:=1, uiT_10tel_s:=5); SWITCH_IN11, SWITCH_IN22 : Fb_ShortLong:=(uiTS_10tel_s:=1, uiTL_10tel_s:=1, uiT_10tel_s:=10); BLIND_ROOM1_UP, BLIND_ROOM1_DOWN : BOOL; END_VAR VAR RETAIN PERSISTENT Shade_MinTemp: BYTE:=21; Blind_R1_Data1, Blind_R1_Data2: typScheduleWeekly; Blind_Room1_1_Input : BLIND_INPUT:=(PI:=150, MAX_RUNTIME:=T#25s, MANUAL_TIMEOUT:=t#60m, MASTER_MODE:=TRUE); Blind_Room1_1_Shade : BLIND_SHADE_S:=(HORZ1:=100, HORZ2:=215, SHADE_POS:=150, SHADE_DELAY:=T#5m); Blind_Room1_1_Control : BLIND_CONTROL_S:=(T_UP:=T#23s, T_DN:=T#22s); Blind_Room1_2_Input :BLIND_INPUT:=(PI:=150, MAX_RUNTIME:=T#25s, MANUAL_TIMEOUT:=t#60m, MASTER_MODE:=TRUE); Blind_Room1_2_Shade : BLIND_SHADE_S:=(HORZ1:=160, HORZ2:=280, SHADE_POS:=150, SHADE_DELAY:=T#5m); Blind_Room1_2_Control : BLIND_CONTROL_S:=(T_UP:=T#23s, T_DN:=T#22s); END_VAR
Gdzie:
Kod, w części programu
(*Temerature test and Sunlight sensor*) Shade_TemperatureTOF(IN:=SensorReader.TEMPERATURE_ROOM1/10>Shade_MinTemp); Shade_Flag:=Shade_Enabled AND Shade_TemperatureTOF.Q AND NOT WINTER; OUT10:=Shade_Flag; SunSignal:=IN10; (*Sunrise and Sunset definition*) SunRise(CLK:=ReadClock.Calendar.SUN_VER<ReadClock.SunRise_Angle); SunSet(CLK:=ReadClock.Calendar.SUN_VER>ReadClock.SunSet_Angle); (*Schedulers*) Blind_Room1_S_1(xEnable:=TRUE, dtActualTime:=CURRENT_TIME, typScheduleWeekly:=Blind_R1_Data1); Blind_Room1_S_2(xEnable:=TRUE, dtActualTime:=CURRENT_TIME, typScheduleWeekly:=Blind_R1_Data2); (*Triggers for Schedulers*) Blind_R1_Timer_On (CLK:=Blind_Rom1_S_1.xSwitchChannel OR Blind_Room1_S_2.xSwitchChannel); Blind_R1_Timer_Off(CLK:=Blind_Room1_S_1.xSwitchChannel OR Blind_Room1_S_2.xSwitchChannel); (*Short/Long Swittches*) SWITCH_IN1(xSwitch:=IN1); SWITCH_IN2(xSwitch:=IN2); SWITCH_IN11(xSwitch:=IN11); SWITCH_IN22(xSwitch:=IN22); (*Handling of Schedulers and central switches*) BLIND_ROOM1_UP:=SWITCH_IN22.xLong OR Blind_R1_Timer_On.Q AND VIS_Management.LightButtons[0,0]) OR SunRise.Q AND VIS_Management.LightButtons[0,1]); BLIND_S_DOWN:=(Blind_R1_Timer_Off.Q AND VIS_Management.LightButtons[1,0]) OR SunSet.Q AND VIS_Management.LightButtons[1,1]); (*Blind in Room1 from the South*) Blind_Room1_1_Input( S1:=SWITCH_IN1.xShort OR VIS_B_R1_1_UP OR BLIND_ROOM1_UP, S2:=SWITCH_IN1.xLong OR VIS_B_R1_1_DOWN OR BLIND_ROOM1_DOWN, IN:=SWITCH_IN11.xLong OR VIS_B_R1_1_POS, POS:=Blind_Room1_1_Control.POS ); Blind_Room1_1_Shade( UP:=Blind_Room1_1_Input.QU, DN:=Blind_Room1_1_Input.QD, S_IN:=Blind_Room1_1_Input.STATUS, pi:=Blind_Room1_1_Input.PO, ENABLE:=Shade_Flag, SUN:=SunSignal, CX:=ReadClock.Calendar ); Blind_Room1_1_Control( UP:=Blind_Room1_1_Shade.QU, DN:=Blind_Room1_1_Shade.QD, S_IN:=Blind_Room1_1_Shade.STATUS, pi:=Blind_Room1_1_Shade.PO ); OUT1:=Blind_Room1_1_Control.MU; OUT2:=Blind_Room1_1_Control.MD; (*Blind in Room1 from the West*) Blind_Room1_2_Input( S1:=SWITCH_IN2.xShort OR VIS_B_R1_2_UP OR BLIND_ROOM1_UP, S2:=SWITCH_IN2.xLong OR VIS_B_R1_2_DOWN OR BLIND_ROOM1_DOWN, IN:=SWITCH_IN11.xLong OR VIS_B_R1_2_POS, POS:=Blind_Room1_2_Control.POS ); Blind_Room1_2_Shade( UP:=Blind_Room1_2_Input.QU, DN:=Blind_Room1_2_Input.QD, S_IN:=Blind_Room1_2_Input.STATUS, pi:=Blind_Room1_2_Input.PO, ENABLE:=Shade_Flag, SUN:=SunSignal, CX:=ReadClock.Calendar ); Blind_Room1_2_Control( UP:=Blind_Room1_2_Shade.QU, DN:=Blind_Room1_2_Shade.QD, S_IN:=Blind_Room1_2_Shade.STATUS, pi:=Blind_Room1_2_Shade.PO ); OUT3:=Blind_Room1_2_Control.MU; OUT4:=Blind_Room1_2_Control.MD;
Gdzie:
Oto przykłady wizualizacji: