Główna > Programowanie

Globalne opuszczanie rolet i żaluzji

(1/1)

schuey:
Witajcie ponownie,

Do sterowania roletami i żaluzjami fasadowymi stosuję BLIND_INPUT i BLIND_CONTROL_S/BLIND_CONTROL z biblioteki Oscat. Mam już globalny wyłącnik światła zrobiony na funkcji FbEvaluateShortLongPress i chciałbym skorzystać z tej samej zasady przy roletach.

Problem na jaki napotkałem jest taki, że bloki rolet rozpoznają już krótkie i długie przyciśnięcie. Przy krótkim wyzwalają ruch całej rolety, przy długim zmieniamy na przykład położenie lameli. Stosując globalby przycisk, moje xLong tak naprawdę jest w bloku BLIND_INPUT odczytywane jako długie przyciśnięcie i po zwolnieniu klawisza rolety nie idą już na dół.

Czy jest jakaś możliwość rozpoznania tylko zbocza wschodzącego w xLong dla FbEvaluateShortLongPress? Mam nadzieję, że moje pytanie jest zrozumiałe. Zaznaczam, że BLIND_INPUT operuje na dwóch osobnych przyciskach góra/dół czyli SINGLE_SWITCH mamy ustawione na false.

Pozdrawiam,
WS

Simeone:
Wrzuć fragment kodu, o którym piszesz. Będzie łatwiej coś pomóc.

Jeśli dobrze rozumiem problem, to najprostszym rozwiązaniem będzie "do-or-owanie" wejścia z przycisku globalnego do każdego wejścia z przycisków sterujących poszczególnymi roletami

np.


--- Kod: ---LongShort_IN1( xSwitch := IN_local1 OR IN_global );
LongShort_IN2( xSwitch := IN_local2 OR IN_global );

--- Koniec kodu ---

schuey:
Przykładowo na parterze w programie SWIATLA_PARTER mam przycisk:


--- Kod: ---Wiatrolap_Prawy(xButton := IN49, tShortPushButton := T#1500MS);
--- Koniec kodu ---

Następnie w bloku funkcyjnym ROLETA dodałem:


--- Kod: ---Input_Blind(
  S1 := MOVE_UP,
  S2 := MOVE_DOWN OR SWIATLA_PARTER.Wiatrolap_Prawy.xLong,
POS := Control_Blind.POS,
MAX_RUNTIME := MAX_RUNTIME
);

--- Koniec kodu ---

Ten blok jest następnie podpinany do każdej rolety gdzie zmienna MOVE_DOWN ma swoje odpowiadające wejście IN z przycisku lokalnego i ten steruje całkowitym ruchem albo chwilowym. Dodanie OR ... sprawia, że nie mogę wychwycić krótkiego wyzwolenia samym xLong. Nie chcę zastosować xShort bo ten przycisk będzie przypadkowo wciskany i zamykał wszystkie rolety, bez sensu.

schuey:
Udało mi się problem rozwiązać przy pomocy bloku DEBOUNCE. W moim POU dla rolet w bloku VAR dodałem:


--- Kod: ---Global_Switch_OFF : DEBOUNCE;
--- Koniec kodu ---

Następnie w części programowej


--- Kod: ---Global_Switch_OFF(IN := SWIATLA_PARTER.Wiatrolap_Prawy.xLong, PM := TRUE, TD := T#100MS);
--- Koniec kodu ---

I w części programowej bloków fukncyjnych na rolety i żaluzje:


--- Kod: ---Input_Blind(
  S1 := MOVE_UP,
  S2 := MOVE_DOWN OR ROLETY.Global_Switch_OFF.Q,
POS := Control_Blind.POS,
MAX_RUNTIME := MAX_RUNTIME
);

--- Koniec kodu ---

gdzie ROLETY to nazwa mojego POU. Kluczowe jest ustawienie PM na TRUe w bloku DEBOUNCE, oznacza to że wyjście będzie pojedynczym pulsem bez względu na długość wejścia IN. Czas T100ms jest tu czysto umowny, bo nie zależy mi na faktycznym opóźnianiu wejścia.

Może komuś powyższe się przyda? Pozdrawiam

Nawigacja

[0] Indeks wiadomości

Idź do wersji pełnej