Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Funkcja furtki w napędzie do bramy FORCE 760

koczis_ws 14 Nov 2021 22:36 2880 44
Fluke Kamera Termowizyjna
  • #31
    mpier
    Level 26  
    Może być swtich...case, a mogą być osobne funkcje dla każdego zdarzenia, najlepiej takie, które coś robią konkretnego. Przykładowo fragment to dwa przyciski i jeden LED. Przycisk 1 włącza LED na 5 sekund, przycisk 2 wyłącza lub włącza zabawę.
    Code: c
    Log in, to see the code

    Pewnie nie jest to najlepszy sposób, ale tak nie układasz skomplikowanych warunków "if" na sześć poziomów i nie tracisz miejsca na delay.

    Dodano po 50 [minuty]:

    Teraz możesz zmienić funkcję przycisku 2 na "programowanie" czasu świcenia:
    Code: c
    Log in, to see the code

    Po zmianie ustaw_timer(timer1, 5) na ustaw_timer(timer1, czas_świecenia) otrzymasz włącznik światła z programowanym czasem święcenia. Reszty kodu nie zmieniasz.
  • Fluke Kamera Termowizyjna
  • #32
    Janusz_kk
    Level 32  
    mpier wrote:
    Może być swtich...case, a mogą być osobne funkcje dla każdego zdarzenia, najlepiej takie, które coś robią konkretnego.

    Funkcje i tak muszą być ale to nie jest maszyna stanów.
    maszyna wygląda tak
    Code: c
    Log in, to see the code

    Oczywiście dane i sterowanie jest bez sensu, obrazuje tylko przykład jak zrobić maszynę stanów.
  • #33
    mpier
    Level 26  
    Racja, przedstawiony fragment to nie jest maszyna stanów, to jedynie kawałek pokazujący przewagę programu opartego o "maszynę stanów", nad zagnieżdżonymi ifami przeplecionymi dwudziestoma delayami. Te cztery dwuliniowe funkcje to cała logika "programowalnego wyłącznika światła". Co do samej maszyny: dwa stany i trzy zdarzenia dla pierwszego przykładu i niestety tylko jeden stan, ale za to 4 zdarzenia dla drugiego.

    W przypadku autora może być podobnie. W bardzo prostej wersji sześć stanów (nicnierobienie, oczekiwanie_na_uruchomienie_bramy, otwieranie, zamykanie, programowanie_otwierania, programowanie_zamykania). Zacząć trzeba od rysunku.
  • #34
    Janusz_kk
    Level 32  
    mpier wrote:
    Zacząć trzeba od rysunku.

    A dokładnie od grafu gdzie będzie pokazana logika programu. Wtedy można to przeanalizować i pisać program właściwy :)
  • #35
    koczis_ws
    Level 27  
    Przy pisaniu takich prostych programów to graf mam w głowie :)
    W sumie to program ma działać zgodnie z założeniami i ten działa. A jeśli chodzi o minimalizowanie zajętości pamięci to wypowiedziałem się wcześniej w #26.
  • Fluke Kamera Termowizyjna
  • #36
    koczis_ws
    Level 27  
    Janusz_kk wrote:
    {typedef enum {spoczynek, furtka, brama, krancowka,stop} e_ster;e_ster komenda;switch (komenda) { case (spoczynek): if (start) komenda=brama; break; case (brama): if(krancowka) komenda=stop; break; case (krancowka); if(jakas komenda) komenda=furtka;break; case (stop): coś tam robię; komenda=spoczynek; break;}
    Oczywiście dane i sterowanie jest bez sensu


    No właśnie bo jak w moim przypadku mam określić wartość zmiennej 'komenda'? Czy nie za pomocą If ow.
    Bo jak ją już określę to faktycznie dalszy ciąg jest elegancki. :)
  • #37
    SylwekK
    Level 31  
    Wartość 'komenda' określa się w kolejnych case po wykonaniu właściwej funkcji. Oczywiście nie jest zabronione korzystanie z if'ów i jak najbardziej można się nimi wspomagać :)
  • #38
    Janusz_kk
    Level 32  
    Dołożyłem Ci furtkę, więc teraz masz wszystkie komendy, jak dołożysz nową do tabeli e_ster, to musisz ją 'obsłużyć' w pętli case, czyli dodać linijkę "case (nowa): coś tam; break;"

    Code: c
    Log in, to see the code
  • #39
    koczis_ws
    Level 27  
    Główna pętla programu może wyglądać tak:
    while(1)
    {
    if(!Furtka) // Przycisk Furtka puszczony
    {
    Przygas; // Nic nie rób
    }
    else // Wciśnięty przycisk FURTKA - start cyklu furtki
    {
    FurtkaON (); // Wykonaj cykl FURTKA
    }
    if (!Prog) // Przycisk PROG nie jest wciśnięty
    {
    Przygas; // Nic nie rób
    }
    else // Wciśnięto przycisk PROG Programowanie
    {
    Programowanie(); // Wykonaj cykl programowania
    }
    }

    Było by przejżyśiej. Ja upakowałem poszczególne funkcje w pętli, ale się w tym nie pogubiłem :)
  • #40
    mpier
    Level 26  
    Coraz bliżej. Rysunek nie jest kompletny, ale jest to oczywiście działający program. Tak, ten rysunek jest działającym programem, który można przepisać już w C, używając switch...case, jak zaproponował @januszkk1.
    Funkcja furtki w napędzie do bramy FORCE 760
    Tym sposobem, cały rysunek to jeden switch, a stany (prostokąty) to "case". Zdarzenia (strzałki) analogicznie. Tłumaczenie dosłowne:
    Code: c
    Log in, to see the code

    Na rysunki nie ma timera dla ONE, ale dorysowanie go to jedna strzałka.
    To jest najprostszy sposób jaki przychodzi mi do głowy. Żadna funkcja typu stan_kiedy_zdarzenie() nie może zawierać delay.

    Może się nie pogubiłeś, ale twój program zajmuje 100% pamięci, 100% procesora a zmiana czegokolwiek, to na 100% nowy program. Powyższymi sposobami, dodanie funkcji wpuszczania szerszych ludzi, po dłuższym przytrzymaniu przycisku to dorysowanie jednej strzałki: nicnierobienie ---K1_DŁUGO--->otwieranie.
  • #41
    koczis_ws
    Level 27  
    mpier wrote:
    dodanie funkcji wpuszczania szerszych ludzi, po dłuższym przytrzymaniu przycisku


    Aś poszedł po bandzie :D Przecież to jest tylko brama, a szerokość można ustawić dla najgrubszych i już. Przedstawiony rysunek dokładnie przedstawia to co przytoczyłem ostatnio.
    A o wykorzystaniu pamięci już sie 2 razy wypowiedziałem.
    Program w C połączony z nauką języka wykonałem z ciekawości jak to jest z wydajnością, pierwotny był w Bascom. Ale dobrze, w ramach ciekawości spróbuję napisać ten program od nowa wykorzystujęc Twoje sugestie.
    Zdobyta wiedza może się kiedyś przydać przy tworzeniu bardziej ambitnych programów.
  • #42
    SylwekK
    Level 31  
    koczis_ws wrote:
    Zdobyta wiedza może się kiedyś przydać przy tworzeniu bardziej ambitnych programów.

    No, bo o to tu właśnie teraz chodzi i to też było celem zaproponowania przez mnie maszyny stanów :) Uczyć się można na wszystkim, trzeba poznawać różne techniki programowania w zależności od potrzeb. Wiele programów przepisałem z bascoma na C dla nauki, wyprawy i z czystej ciekawości ile program zajmie w nowym wydaniu :)
  • #43
    koczis_ws
    Level 27  
    Zmieniłem program zgodnie z Waszymi sugestiami. Jest bardziej czytelny, zamiast wielu zagnieżdżonych IF ów jest switch ale i tak zajmuje prawie całą pamięć.
    Jeśli ktoś będzie miał ochotę go zmniejszyć, ale bez okrawania funkcjonalności to bardzo chętnie skorzystam :D
    mpier - Nie ma opcji szerszego otwierania, poprostu jak przyjdzie gruba ciotka to się otworzy bramę na oścież :)
    Code: c
    Log in, to see the code
  • #44
    mpier
    Level 26  
    N
    koczis_ws wrote:
    Zmieniłem program zgodnie z Waszymi sugestiami. Jest bardziej czytelny, zamiast wielu zagnieżdżonych IF ów jest switch ale i tak zajmuje prawie całą pamięć.

    Na pierwszy rzut oka, to niczym się ta wersja nie różni od poprzedniej. Funkcje Czekaj, Opóźnij, Czas_otwierania, i Czas_oczekiwania można śmiało usunąć. Jeśli naprawdę potrzebujesz, to lepsza będzie taka: "Czekaj() {};" Funkcja jest pusta wiec nie zajmuje miejsca a jednocześnie nic nie robi, więc zastępuje cztery wymienione wcześniej. Prawdopodobnie zostanie ona zoptymalizowana (usunięta), ale dla pewności można jej wywołania w kodzie zakomentować (skoro i tak nic nie robi).

    Myślę, że wybrałeś na początek trochę za duży projekt. Standardowo wypadałoby zacząć od "migania ledem", dołożyć przycisk a później drugi i może trzeci. To jest fragment działającego programu:
    Code: c
    Log in, to see the code

    W trybie automatycznym (ST_AUTO) naciśnięcie przycisku K1 (EV_K1_PR) włącza diodę, a odliczenie czasu 1000ms (EV_TIMER_LED) wyłącza diodę. Funkcja włączająca/wyłączająca diodę nie wykonuje żadnego delay ani nie czeka "na uspokojenie styków przekaźnika".

    W wolnej chwili spróbuj dopisać do tego obsługę drugiego przyciski (EV_K2_PR) , który zmieni tryb pracy wyłącznika z automatycznego na na ręczny (ST_ONOFF). W tym stanie przycisk K1 powinien cyklicznie włączać i wyłączać diodę na pinie PB4, a K2 przełączyć z powrotem do ST_AUTO. W skrócie: należy dorysować jedno kółko i dwie, albo trzy strzałki, np. ST_AUTO---EV_K2_PR-->ST_ONOFF. Opisałem to w poprzedniej wiadomości.
  • #45
    koczis_ws
    Level 27  
    mpier wrote:
    Funkcje Czekaj, Opóźnij, Czas_otwierania, i Czas_oczekiwania można śmiało usunąć.

    Popatrzyłem na to co stworzyłeś, ale wydaje mi się, że nie do końca wiesz jak to ma działać.

    Tak więc założenie było takie:

    - Częściowe otwarcie przyciskiem z domu.
    - Gdy brama jest w ruchu to ten przycisk nie działa.
    - Gdy brama nie jest zamknięta to ten przycisk nie działa.
    - Maksymalnie uproszczone i intuicyjne programowanie czasów.
    - Możliwość przywrócenia ustawień domyślnych (jak się coś popieprzy).
    - Dane zapisane w EEPROM mikrokontrolera wiadomo po co.
    Potem jeszce doszło zakończenie cyklu gdy ktoś uruchomi lub zatrzyma bramę w trakcie.
    A jeśli chodzi o wielkość projektu to robiłem podobne a nawet większe tyle że nie w C (Bascom i inne). Pisałem też duże programy na PLC, programy/makra do SolidWorksa , więc namawianie mnie żebym sobie migał LEDem jest trochę nie na miejscu.
    Mój program Furtka działa bardzo dobrza, szwagier zadowolony jak nie wiem co, a że mój styl Ci się nie podoba to trudno :(