'Inteligenty' dom ze sterownikiem PLC

Główna => Programowanie => Wątek zaczęty przez: schuey w Lutego 06, 2020, 12:07:52 pm

Tytuł: Globalne opuszczanie rolet i żaluzji
Wiadomość wysłana przez: schuey w Lutego 06, 2020, 12:07:52 pm
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
Tytuł: Odp: Globalne opuszczanie rolet i żaluzji
Wiadomość wysłana przez: Simeone w Lutego 07, 2020, 08:01:05 am
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.

LongShort_IN1( xSwitch := IN_local1 OR IN_global );
LongShort_IN2( xSwitch := IN_local2 OR IN_global );
Tytuł: Odp: Globalne opuszczanie rolet i żaluzji
Wiadomość wysłana przez: schuey w Lutego 08, 2020, 07:04:46 pm
Przykładowo na parterze w programie SWIATLA_PARTER mam przycisk:

Wiatrolap_Prawy(xButton := IN49, tShortPushButton := T#1500MS);
Następnie w bloku funkcyjnym ROLETA dodałem:

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

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.
Tytuł: Odp: Globalne opuszczanie rolet i żaluzji
Wiadomość wysłana przez: schuey w Lutego 09, 2020, 03:14:59 pm
Udało mi się problem rozwiązać przy pomocy bloku DEBOUNCE. W moim POU dla rolet w bloku VAR dodałem:

Global_Switch_OFF : DEBOUNCE;
Następnie w części programowej

Global_Switch_OFF(IN := SWIATLA_PARTER.Wiatrolap_Prawy.xLong, PM := TRUE, TD := T#100MS);
I w części programowej bloków fukncyjnych na rolety i żaluzje:

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

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