7. Automatyczne wyłączanie świateł

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:

1

Ś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 20 minut po włączeniu (na wypadek, gdy ktoś o nim zapomniał)
  • gdy wyłącza się OUT3 (bo skoro wychodzimy z kuchni, światło w spiżarni jest niepotrzebne)

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:

2

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.

3

W załączonym pliku programu z niniejszego przykładu zaktualizowałem też wizualizację. Można poklikać i sprawdzić, czy wszystko działa. Powodzenia!