W niniejszym artykule znajduje się opis wykorzystania czasowych bloków funkcyjnych do automatycznego wyłączania oświetlenia, oraz wyłączania światła w pomieszczeniu zależny po wyłączeniu światła w pomieszczeniu wiodącym
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
Zanim przejdziemy do omówienia sterowania roletami przedstawię jeszcze jeden pomysł odnośnie oświetlenia. Rozbudujmy nasz dom o kuchnię i pomieszczenie gospodarcze:
Światło w kuchni OUT3 powinno być sterowane łącznikiem ściennym IN5, a światło w spiżarni OUT4 łącznikiem IN6. Ponadto OUT4 powinno gasnąć:
W definicjach pojawią się dodatkowe zmienne:
VAR VIS_Light_1, VIS_Light_2 : BOOL; VIS_Light_K1, VIS_Light_K2 : BOOL; Light_1, Light_2 : Fb_LatchingRelay; Light_K1, Light_K2 : Fb_LatchingRelay; LongShort_IN1, LongShort_IN2 : Fb_ShortLong := (uiT_10tel_s := 20); Light_K2_Delay : Fb_Delay := (dwTon_10tel_s := 12000, dwToff_10tel_s := 1);
Light_K1_FTrig : F_TRIG; END_VAR
Blok funkcyjny Fb_Delay jest częścią biblioteki building_common.lib i pozwala opóźnić włączenie i wyłączenie wybranego obwodu. Opóźnienie włączenia definiowane jest w 0.1 sekundy parametrem dwTon_10tel_s. Opóźnienie wyłączenia definiowane jest parametrem dwToff_10tel_s. Schemat działania zaczerpnięty z dokumentacji biblioteki wygląda następująco:
Przy definicji dwTon_10tel_s := 12000 impuls TRUE pojawi się na xOutput po 20 minutach od momentu pojawienia się impulsu na xInput. Jako że dwToff_10tel_s := 1 impuls TRUE na xOutput będzie trwał 0,1 sekundy od wyłączenia impulsu na xInput.
W programie mamy teraz:
LongShort_IN1( xSwitch := IN1 ); LongShort_IN2( xSwitch := IN2 ); (* światło SALON 1 *) Light_1( xSwitch := LongShort_IN1.xShort OR IN3 OR VIS_Light_1, xCentON := LongShort_IN1.xLong, xCentOFF := LongShort_IN2.xLong ); OUT1 := Light_1.xActuator; (* światło SALON 2 *) Light_2( xSwitch := LongShort_IN2.xShort OR IN4 OR VIS_Light_2, xCentON := LongShort_IN1.xLong, xCentOFF := LongShort_IN2.xLong ); OUT2 := Light_2.xActuator; (* światło KUCHNIA *) Light_K1(xSwitch := IN5 OR VIS_Light_K1); OUT3 := Light_K1.xActuator; (* światło SPIŻARNIA *) Light_K1_FTrig(CLK := OUT3);
Light_K2_Delay (xInput := OUT4); Light_K2(xSwitch := IN6 OR VIS_Light_K2, xCentOFF := Light_K1_FTrig.Q OR Light_K2_Delay.xOutput); OUT4 := Light_K2.xActuator;
W linii Light_K1_FTrig(CLK := OUT3); każemy blokowi F_TRIG czekać na ‘zbocze opadające’, czyli wyłączenie się OUT3. Gdy to nastąpi, Light_K1_FTrig na wyjściu Q przez jeden cykl programu zwróci TRUE.
W linii Light_K2_Delay (xInput := OUT4); uzależniamy działanie funkcji Fb_Delay (opisanej powyżej) od wyjścia OUT4.
W kolejnej linii do zmiennej wejścia xCentOff bloku Light_K2 podpinamy wyjście bloku Light_K1_FTrig, czekającego na wyłączenie światła OUT3 w kuchni oraz wyjście bloku Light_K2_Delay, czekającego z wygenerowaniem impulsu 20 minut od czas włączenia światłą OUT4 w spiżarni.
W załączonym pliku programu z niniejszego przykładu zaktualizowałem też wizualizację. Można poklikać i sprawdzić, czy wszystko działa. Powodzenia!