Witamy, Gość. Zaloguj się lub zarejestruj.
Aktualności:
Forum Sterowniki PLC Inteligentny dom > Inteligentny dom funkcjonalności >

dwuklik, przytrzymanie włącznika, itp

Strony: [1]
Drukuj
Autor Wątek: dwuklik, przytrzymanie włącznika, itp  (Przeczytany 6679 razy)
honsalo
Jr. Member
**
Wiadomości: 12


dwuklik, przytrzymanie włącznika, itp
: Lipiec 21, 2014, 16:33:21 pm »

Witam,

kończę właśnie realizację domu w oparciu o wiedzę zdobytą na tej stronie i forum - na wstępie wielkie dzięki. Postaram się w miarę dostępnego czasu pochwalić się aktywnie w przyszłości co udało się zrobić.

Póki co uzyskałem podstawową funkcjonalność w rodzaju światła, rolety itp. w oparciu o Fateka i moduły rozszerzeń 24X/Y.

Chciałbym wzbogacić teraz funkcjonalność o obsługę wielu kliknięć przycisków i/lub przytrzymania przycisku przez dłuższy czas. Nie do końca odpowiadały mi znalezione przykłady rozwiazania detekcji tego typu aktywności, napisałem więc kawałek od nowa. Załączam go w załączniku i proszę o życzliwą ocenę i podpowiedź w kilku tematach wypunktowanych na końcu.

Podstawowym problemem była dla mnie potrzeba obsłużenia ok 100 przycisków. Wystąpiła może i przesadzona obawa, ale logicznie informatycznie uzasadniona, przed jednoczesnym naciśnięciem różnych przycisków przez domowników w tym samym czasie i w takiej sytuacji nieprzewidywalne działanie programu. W związku z tym nie chciałem korzystać z timerów T a każdemu przyciskowi trzeba było przypisać zmienne trzymające dane o tym właśnie przycisku. Dzięki aktualizowaniu tych zmiennych od razu po przyciśnięciu przycisku (bez np. rejestrów pomocniczych) można w dalszym kodzie łatwiej oprogramować sytuacje np. po trzecim kliku, lub przytrzymaniu 3 sekundowym.

Dodatkowo, z uwagi na konieczność powtarzania 100x tego samego kodu no i estetykę programowania chodziło o jak najprostsze rozwiązanie.

W załączonym schemacie najpierw ustawiana jest "zmienna globalna" R40 MAX_TIME (mało estetycznie), tak aby w razie potrzeby nie zmieniać czasu detekcji przycisku w każdej linijce, a tylko w jednej. Dla uproszczenia czas przyciśnięcia przycisku nie jest liczony osobno dla każdego kliknięcia, a sumowany dla wszystkich kliknięć (bez dodatkowego zerowania po zwolnieniu przycisku jest mniej o jedną instrukcję). Zakładam też że czas ten nie będzie wyrażony dokładnie w sekundach a w ilościach wykonanych cykli [czy dobrze?], ale jeżeli dobrze zakładam że będą one dla danego sterownika stałe to wystarczy aby je nawet z małą dokładnością skalibrować z oczekiwanym przez użytkownika czasem.

Pytania jakie jeszcze się pojawiają:
- inkrementacja zwykłych rejestrów - czy nie lepiej użyć jakiś rejestrów specjalnych?
- lepszy sposób na zapisanie 'stałej' wielkości czasu, niż teraz za pomocą rejestru wypełnianego 08.MOV
- zerowanie trzech kolejnych rejestrów (R50,51,52) w trzech różnych instrukcjach  - chciałoby się estetyczniej jakąś jedną

Z góry dziękuję za podpowiedzi i pomoc

honsalo
Jr. Member
**
Wiadomości: 12


dwuklik, przytrzymanie włącznika, itp
#1 : Lipiec 21, 2014, 16:44:12 pm »

coś nie można załącznika dodać.

spróbuję wkleić tak:
http://images66.fotosik.pl/17/01a521c1738976ca.jpg



http://www.fotosik.pl/pokaz_obrazek/pelny/01a521c1738976ca.html
« Ostatnia zmiana: Lipiec 21, 2014, 16:46:50 pm wysłane przez honsalo »

arturs
Sr. Member
****
Wiadomości: 225



dwuklik, przytrzymanie włącznika, itp
#2 : Lipiec 23, 2014, 22:14:04 pm »

nie czaję o co chodzi z tym sumowaniem czasów.. chcesz to robić doświadczalnie? w sensie że dobierać wartość w r40 na czuja? żadnej stałej czasowej nie ma czyli w każdym cyklu rejestry zmieniają się? nie wiem czy dobrze zrozumiałem ideę.. a co z tym jak ktoś kliknie szybko dwa razy.. a za 2s raz?
chyba błąd jest w fundamentalnych założeniach.. chyba że czegoś nie zrozumiałem..
jak nie chcesz tylu timerów to może zrób zeby jeden timer obsługiwał np. grupę przycisków - typu - sypialnia, salon itp. zeby w zasięgu wzroku były inne przyciski obsługiwane timerami.. a jak chcesz tak to wprowadz jakoś coś co zliczy czas..
« Ostatnia zmiana: Lipiec 23, 2014, 22:16:08 pm wysłane przez arturs »

primary1
Full Member
***
Wiadomości: 81


dwuklik, przytrzymanie włącznika, itp
#3 : Lipiec 24, 2014, 15:11:59 pm »

Czyli po jednym kliknięciu -np. chcę zapalić światło - muszę czekać, aż "czas" bezklika będzie większy od MAX TIME.
Trochę to denerwujące będzie.
Jeżeli nie chcesz wykorzystywać timerów, to wykorzystaj liczniki, albo inkrementację rejestrów i puls 0,1s (M1921) do zliczania impulsów.

honsalo
Jr. Member
**
Wiadomości: 12


dwuklik, przytrzymanie włącznika, itp
#4 : Lipiec 24, 2014, 15:28:02 pm »

Cytat: primary1  Lipiec 24, 2014, 15:11:59 pm
Czyli po jednym kliknięciu -np. chcę zapalić światło - muszę czekać, aż "czas" bezklika będzie większy od MAX TIME.
Trochę to denerwujące będzie.
no właśnie nie trzeba czekać na MAXTIME - przez to że nie ma żadnej zmiennej pomocniczej, z której byłoby kopiowane dopiero po upływie maksymalnego czasu można od razu reagować po naciśnięciu. Trzeba tylko sprawdzać zawartość rejestru odpowiadającego danemu przyciskowi. I np. funkcją 171 - jeżeli dany w przykładzie R50 > 1 to zapala światło, a gdy R50 >2 zapala drugie światło. Równocześnie można dać drugi warunek na rejestr z czasem i jeżeli tam będzie R51 > 2 (sekundy) to zapala trzecie światło. Tylko po stronie logiki wykonującej to zapalanie świateł trzeba uwzględnić czy liczymy czas czy kliki żeby jedno z drugim nie kolidowało

Boję się tylko że po wdrożeniu produkcyjnym sprawdzanie przez cały czas np. taką funkcją 171 stanu 100 zwykłych rejestrów i to jeszcze w dwóch czy trzech wariantach (>1, >2 >3 itp - choć to można by trochę zawsze zoptymalizować) będzie nieefektywne i może jakoś dociążać sterownik. Czy macie jakieś na ten temat zdanie/opinię?


Cytuj
Jeżeli nie chcesz wykorzystywać timerów, to wykorzystaj liczniki, albo inkrementację rejestrów i puls 0,1s (M1921) do zliczania impulsów.

z liczników zrezygnowałem bo też jest ich ograniczona ilość - trzeba by grupować jak w poście powyżej proponowano. Z pulsu też zrezygnowałem bo inkrementacja następowała przez cały czas _trwania_ pulsu - czyli efekt był taki że przy załączonym M1921 albo M1922 wartość rejestru wzrastała np. o 5 w jednym pulsie. A aby jeden raz inkrementować trzeba by dodać jakiś semafor/flagę pozwalającą na tylko jednorazowe wykonanie - co by komplikowało kod.


honsalo
Jr. Member
**
Wiadomości: 12


dwuklik, przytrzymanie włącznika, itp
#5 : Lipiec 24, 2014, 15:52:51 pm »

Cytat: arturs  Lipiec 23, 2014, 22:14:04 pm
nie czaję o co chodzi z tym sumowaniem czasów.. chcesz to robić doświadczalnie? w sensie że dobierać wartość w r40 na czuja? żadnej stałej czasowej nie ma czyli w każdym cyklu rejestry zmieniają się? nie wiem czy dobrze zrozumiałem ideę.. a co z tym jak ktoś kliknie szybko dwa razy.. a za 2s raz?

ta wartość w R40 to ma być okienko czasowe w którym trzeba się zmieścić z kliknięciami. Właśnie o to chodzi że jeżeli ktoś kliknie szybko dwa razy i po 2 sekundach jeszcze raz to jeżeli to okienko będzie wynosić np. 5 sekund to sterownik zliczy 3 kliknięcia. Jeżeli okienko będzie np. 1,5 sekundy - to sterownik zliczy 2 kliknięcia a następnie jedno kliknięcie. Jakoś trzeba rozróżnić czy ciągle trwają kliknięcia jednej serii czy też zaczęła się już kolejna seria.
Dzięki temu że jest to jedna zmienna nie trzeba przy 100 przyciskach poprawiać tego czasu.
Nie podoba mi się tylko forma tej zmiennej - w postaci zapisu w rejestrze. Ale w Fateku chyba inaczej nie możnaby zdefiniować takiej zmiennej globalnej?

Cytuj
chyba błąd jest w fundamentalnych założeniach.. chyba że czegoś nie zrozumiałem..
jak nie chcesz tylu timerów to może zrób zeby jeden timer obsługiwał np. grupę przycisków - typu - sypialnia, salon itp. zeby w zasięgu wzroku były inne przyciski obsługiwane timerami.. a jak chcesz tak to wprowadz jakoś coś co zliczy czas..

tak, to jest podstawowe rozwiązanie które rozważałem - jeżeli to z rejestrami nie będzie działać to trzeba będzie do tego wrócić

primary1
Full Member
***
Wiadomości: 81


dwuklik, przytrzymanie włącznika, itp
#6 : Lipiec 24, 2014, 21:22:27 pm »

Cytat: honsalo  Lipiec 24, 2014, 15:28:02 pm
no właśnie nie trzeba czekać na MAXTIME - przez to że nie ma żadnej zmiennej pomocniczej, z której byłoby kopiowane dopiero po upływie maksymalnego czasu można od razu reagować po naciśnięciu. Trzeba tylko sprawdzać zawartość rejestru odpowiadającego danemu przyciskowi. I np. funkcją 171 - jeżeli dany w przykładzie R50 > 1 to zapala światło, a gdy R50 >2 zapala drugie światło.

No to ja też nie rozumiem jak to ma działać.
Przecież potrzebny jest jakiś przedział czasu na dwuklik. Sterownik się nie domyśli, czy klikasz tylko raz, czy zamierzasz kliknąć raz jeszcze.

arturs
Sr. Member
****
Wiadomości: 225



dwuklik, przytrzymanie włącznika, itp
#7 : Lipiec 24, 2014, 22:40:23 pm »

po to ta zmienna w r40..
ale to moim zdaniem bedzie słabo działać bo to będzie zliczać przebiegi drabinki i od tego zależec będzie ten czas..
do do inkrementacji w czasie pulsu to nie masz racji.. pulsem zliczasz tylko czas i nic więcej.. jak chcesz zliczyć czas w okienku to zrób na zbocze rosnące pulsu i z głowy (strzałka do góry na drabince)

honsalo
Jr. Member
**
Wiadomości: 12


dwuklik, przytrzymanie włącznika, itp
#8 : Lipiec 25, 2014, 12:25:12 pm »

Cytat: arturs  Lipiec 24, 2014, 22:40:23 pm
po to ta zmienna w r40..
ale to moim zdaniem bedzie słabo działać bo to będzie zliczać przebiegi drabinki i od tego zależec będzie ten czas..
zgadza się, dlatego pisałem że zakłądam że czas nie będzie wyrażony w sekundach - ale to dla zastosowania domowego nie ma znaczenia czy określę że "okienko" czasowe ma wynosić 2 sekundy czy 250 impulsów. Zakładam że czas wykonania będzie zawsze taki sam?

Cytuj
do do inkrementacji w czasie pulsu to nie masz racji.. pulsem zliczasz tylko czas i nic więcej.. jak chcesz zliczyć czas w okienku to zrób na zbocze rosnące pulsu i z głowy (strzałka do góry na drabince)
zgadza się, dzięki.


Przy okazji znalazłem już optymalizację czyszczenia trzech sąsiednich rejestrów naraz jedną instrukcją - jakby ktoś szukał to jest zgrabna funkcja 114 Z-WR która wypełnia daną liczbę zmiennych zadaną wartością

Strony: [1]
Drukuj
Skocz do: