Używamy plików cookies (tzw. ciasteczka) by spersonalizować treść i ogłoszenia oraz by analizować ruch na stronie.  W sposób automatyczny dzielimy się informacjami o Twoim użyciu tego portalu z dostawcami ogłoszeń, którzy mogą połączyć te informacje z informacjami, które im udzieliłaś/łeś lub, które sami zebrali. Korzystanie z witryny bez zmiany ustawień dotyczących cookies oznacza, że będą one zamieszczane w Państwa urządzeniu końcowym.  Możecie Państwo dokonać w każdym czasie zmiany ustawień dotyczących cookies zmieniając opcje przeglądarki.

Złożony przykład - Rolety

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:

  • Shade_TemperatureTOF - jest znacznikiem (zegarem) do sygnalizowania, czy temperatura w pomieszczeniu przekroczyła zadany próg.  Użycie TOF zamiast zwykłej zmiennej BOOL niweluje oscylowanie temperatury wokół zadanego progu, co powodowałyby wielokrotne włączanie/wyłączanie systemu zacieniania,
  • Shade_Flag - wykorzystywana do włączania bloków funkcyjnych BLIND_SHADE_S (Enabled:=.....),
  • Shade_Enabled, WINTER - zmienne typu bool sterowane z wizualizacji,
  • Sunsignal - zmienna sygnalizująca odczyty z czujnika nasłonecznienia,
  • Sunrise, Sunset - triggery do sygnalizowania wschodu i zachodu słońca,
  • Blind_Room1_S_X - Schedulery z bibliotek WAGO umożliwiające ustalanie tygodniowego harmonogramu.  Są 2 aby można było oddzielnie ustalać dni robocze i weekendy,
  • Blind_R1_Timer_X - trigggery do sygnalizowania wskazań schedulerów,
  • SWITCH_INXX - bloki funkcyjne do wykrywania krótkiego/długiego przyciśnięcia, różnią się definicją czasu 'długiego' przyciśnięcia,
  • BLIND_ROOM1_UP, BLIND_ROOM1_DOWN - zmienne sumujące warunki podniesienia lub opuszczenia obu rolet,
  • Shade_MinTemp - przechowuje wartość progu temperatury,
  • Blind_R1_DataX - zmienne przechowujące ustawienia schedulerów,
  • Blind_Room1_X_XXX - bloki funkcyjne z bilbioteki OSCAT Building do sterowania roletami; szczegóły o ich definiowaniu i wykorzystaniu znajdują się w odrębnym artykule.

 

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:

  • Wiersz 2 - Shade_TemepratureTOF wykorzystuje wskazania czujnika temperatury odczytywanego w odrębnym procesie (SensorReader),
  • Wiersz 3 - Shade_Flag  sumuje: włącznik systemu automatycznego zacieniania (Shade_Enabled), wskazania warunku przekroczenia temperatury (Shade_TemperatureTOF) i braku zimy,
  • Wiersze 4 i 5 - przy Shade_Flag = TRUE włączane jest zasilanie czujnika oświetlenia a jego odczyt zapisywany jest w zmiennej SunSignal,
  • Wiersze 8 i 9 - SunRise i SunSet wykorzystują zmienne z odrębnego procesu (ReadClock):  zmiennej Calendar typu CALENDAR z biblioteki OSCAT, i zmiennych SunRise_Angle i SunSet_Angle typu SINT przechowującego progi powyżej/poniżej których sygnalizowany jest wschód/zachód słońca.  Progi te ustawiane sa w wizualizacji,
  • Wiersze 12 i 13 - Schedulery wykorzystują zmienną globalną CURRENT_TIME typu DATE_AND_TIME aktualizowaną co sekundę w procesie ReadClock(),
  • Wiersze 16 i 17 - triggery sumujące wskazania schedulerów,
  • Wiersz 26 - zmienna sumujące długie przyciśnięcie klawisza 22 i wskazania schedulera (pod warunkiem że zmienna z procesu VIS_Management w tablicy LightButtons, w pozycji [0,0] jest TRUE) i triggera wskazującego wschód słońca (pod warunkiem że VIS_Management.LightButtons[1,0] = TRUE),
  • Wiersz 28 - j.w. z tą różnicą, że brak jest przycisku opuszczającego wszystkie rolety.  Długie przyciśnięcie klawisza 11 powoduje ustawienie rolet w zadanej pozycji; jest do odnalezienia w kodzie w Wierszach 42 i 58,
  • Wszystkie zmienne  nazwie VIS_B_Rxxxx są typu BOOL i służą do sterowania z wizualizacji.

 

Oto przykłady wizualizacji:

Blinds1

Blinds2

Blinds3