logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Atmega8 - Uruchamianie przekaznikow o okreslonym czasie

m.biruta 07 Paź 2012 21:24 1641 8
REKLAMA
  • #1 11388213
    m.biruta
    Poziom 16  
    Witam,
    Siedze juz kilka dni nad opracowywaniem algorytmu dzialania ukladu i nie moge opracowac takiego, ktory dzialal by w kazdej zakladanej sytuacji. Moze ktorys z Was koledzy wpadnie na pomysl :-)

    Mam 5 przekaznikow ktorymi steruje. Nektore urzadzenia sa samodzielne, inne do pracy wymagaja uruchomienia innych peryferiow. Zaleznosci przy przekaznikach wygladaja nastepujaco:

    Przekaznik1 (samodzielny), przekaznik2 (opcja dla p1), przekaznik3 (wymaga p1), przekaznik4 i 5 (wymagaja p1).

    Urzadzenie na przekazniku1 uruchamiane bedzie na ustalony okres czasu o danej godzinie codziennie (np. na godzine, codziennie o 17:00). Jesli pewna usluga zostanie wlaczona, to zawsze gdy przekaznik1 bedzie uruchomiony, przekaznik2 rowniez.

    Urzadzenie na przekazniku3 bedzie uruchomione jesli temp. z czujnika1 bedzie wyzsza od ustalonej, a temp. Na czujniku2 bedzie w ustalonym zakresie. Przy pracy tego urzadzenia uruchomiony bedzie musial byc przekaznik1.

    Urzadzenia na przekaznikach 4 i 5 uruchamiane beda na wyznaczony czas co okreslona ilosc dni (np. Na 10 sekund co 14 dni). Podczas ich pracy (oraz przez ilka minut po zakonczeniu) przekaznik1 bedzie musial dzialac.


    Caly uklad bedzie posiadal system zegarowy, pomyslalem wiec o zapisywaniu daty uruchomienia oraz zakonczenia dzialania w zmiennych w formacie timestamp oraz wykonywaniu co 1sekunde daemon-a dzialajacego w oparciu o algorytm jak ponizej:

    [Odczytaj aktualny czas (timestamp)] -> [jesli czas wl <= aktualny <= czas wyl] sprawdzamy status uslugi (0 wylaczony, 1 wlaczony) -> jesli status=0 wlaczamy przekaznik -> [jesli czas wl <= aktualny > czas wyl] sprawdzamy status uslugi -> jesli status=1 wylaczamy przekaznik -> zatrzymujemy na 1 sek i zapetlamy.

    Problem w tym, ze przy takim algorytmie i sposobie dzialania powstalyby kolizje podczas uruchomienia kilku uslug na raz (wtedy ostatnia nadpisywalaby wczesniejsza i ja zatrzymywala) i pewnie w calej masie innych sytuacji. Czy macie moze pomysl jak to wszystko uruchamiac, zatrzymywac i zapamietywac kiedy nastepnym razem uruchomic dana usluge?
  • REKLAMA
  • #2 11388999
    dondu
    Moderator na urlopie...
    Witaj,

    Czytałem dwa razy, ale pora późna więc może "nie kumam czaczy" :)

    m.biruta napisał:
    Problem w tym, ze przy takim algorytmie i sposobie dzialania powstalyby kolizje podczas uruchomienia kilku uslug na raz (wtedy ostatnia nadpisywalaby wczesniejsza i ja zatrzymywala) i pewnie w calej masie innych sytuacji.

    Przecież to Ty decydujesz, co w takiej sytuacji ma zrobić program i ewentualnie, co ma jaki priorytet nad innym procesem.
  • #3 11389144
    SylwekK
    Poziom 32  
    Pokaż możez co już napisałeś. Czy wykorzystujesz znaczniki równolegle z przekaźnikami do sygnalizacji w programie, że ten jest już włączony? Absolutnie nie widzę tu problemu z algorytmem... chyba coś za bardzo namieszałeś :-) Polecam sobie zrobić na papierze drzewko zależności (algorytm pracy) wtedy wszystko będzie jak na dłoni.
  • REKLAMA
  • #4 11390482
    m.biruta
    Poziom 16  
    SylwekK napisał:
    Pokaż możez co już napisałeś. Czy wykorzystujesz znaczniki równolegle z przekaźnikami do sygnalizacji w programie, że ten jest już włączony? Absolutnie nie widzę tu problemu z algorytmem... chyba coś za bardzo namieszałeś :-) Polecam sobie zrobić na papierze drzewko zależności (algorytm pracy) wtedy wszystko będzie jak na dłoni.

    Jest to prawdopodobne, że coś namieszałem, a właściwie, że moja koncepcja działania tego przyblokowała mi umysł :) Mam taką głupią przypadłość, że program piszę sobie zawsze w autobusie w notatniku, więc ciężko mi będzie go teraz zaprezentować, tym bardziej, że w połowie uznałem algorytm za błędny.

    Poniżej rozrysowałem zależności pomiędzy przekaźnikami:
    Atmega8 - Uruchamianie przekaznikow o okreslonym czasie

    Przekaźnik 1: Może zostać uruchomiony ręcznie, jako wymuszenie z menu. Dodatkowo uruchamiany będzie na określony czas codziennie o wybranej porze oraz jako dodatek dla przekaźników 3, 4 i 5 (po wyłączeniu przekaźników 4 lub 5 przekaźnik 1 musi działać jeszcze przez 5 minut).

    Przekaźnik 2: Jeśli opcja jest włączona, działa zawsze jako dodatek do przekaźnika 1, czyli nie uruchamiany jest samodzielnie.

    Przekaźnik 3: Uruchamiany będzie gdy temp. na czujniku 1 będzie wyższa niż zadana oraz gdy temp. na czujniku 2 i 3 będzie w wyznaczonym przedziale. Działanie tego przekaźnika uruchamiać będzie również przekaźnik 1.

    Przekaźnik 4: Uruchamiany będzie na określony czas (liczony w sekundach) co wyznaczoną ilość dni. Przekaźnik ten uruchamia przekaźnik 1 i podtrzymuje jego działania przez 5 minut po wyłączeniu przekaźnika 4.

    Przekaźnik 5: Uruchamiany będzie na określony czas (liczony w sekundach) co wyznaczoną ilość dni. Przekaźnik ten uruchamia przekaźnik 1 i podtrzymuje jego działania przez 5 minut po wyłączeniu przekaźnika 5.

    W mojej głowie siedzi myśl aby każdy z przekaźników miał dwie zmienne określające w formacie timestamp czas uruchomienia oraz wyłączenia przekaźników. Daemon uruchamiany co sekundę sprawdzałby czy któraś ze zmiennych mieści się w ramach uruchomienia oraz wyłączenia. W momencie wyłączenia zmienne byłyby aktualizowane (dodawane X godzin/dni włączenia i wyłączenia). Problem pojawiłby się wtedy, gdy np. przekaźnik 4 (uruchomiony na np. 3 sekundy) wywołałby uruchomienie przekaźnika 1 (na 5 minut i 3 sekundy, czyli 303 sekundy), a w trakcie wyszłoby, że przekaźnik 1 ma się uruchomić na 2 godziny, bo właśnie jest godzin 15... Z moich założeń przez ten sposób kontroli czasu uruchomienia oraz powiązania przekaźników powstałoby wiele kolizji.
  • REKLAMA
  • #5 11390628
    excray
    Poziom 41  
    Dalej nie o końca rozumiem o co dokładnie Ci chodzi ale z tego co zrozumiałem wyknułem taki mniej więcej kod:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #6 11391864
    m.biruta
    Poziom 16  
    Powiedzmy, ze jest to mocno uproszczona wersja tego co chce uzyskac ;)

    1. Ustalam, ze przekaznik 1 ma byc uruchamiany codziennie o godz 15 na dwie godziny.
    2. Ustalam, ze podczas pracy przekaznika 1 zawsze ma byc uruchamiany przekaznik 2
    3. Ustawiam rowniez, ze przekaznik 3 masie uruchamiac gdy temp. Z czujnika 1 bedzie wyzsza niz np. 25C a odczyt z czujnika 2 bedzie nizszy niz 30C. Dzialanie przekaznika 3 wymaga uruchomienia przekaznika 1.
    4. Ustawiam, ze przekaznik 4 i 5 maja sie uruchamiac na 4 sekundy co 14 dni o 2 w nocy. Dzialanie tych przekaznikow wymaga uruchomienia przekaznika 1 oraz jego dzialania przez 5 minut po wylaczeniu przekaznika 4 lub 5.

    I teraz myslalem zeby zrobic tak: dla kazdego przekaznika zrobic 3 zmienne w ktorych trzymany bylby stan uslugi (0 wyl, 1 wlaczony), czas startu oraz czas wylaczenia. Problem w tym, ze jesli o tej godz 15 uruchomi sie przekaznik 1, a o 15:30 beda spelnione warunki temperaturowe i uruchomiony zostanie przekaznik 3 (a wiec i 1 ktory i tak juz dziala) to jesli po 10 min temp bedzie nieodpowiednia to razem z przekaznikiem 3 zostanie wylaczony przekaznik 1 pomimo tego, ze powinien jeszcze pracowac przez 70 minut.

    Albo jesli byloby ustawione, ze przekaznik 1 ma sie wlaczyc na te 2 godziny nie o 15 tylko o 1 w nocy. Wtedy godzine bedzie pracowal normalnie, a o 1 kiedy zostanie uruchomiony przekaznik 4 lub 5, zostanie ustawiony czas uruchomienia przekaznika na 1:00:00, a zakonczenia na 1:05:03 wiec zresetowany zostanie czas zakonczenia ustawiony wczesniej na 2:00:00 :-/ Teraz rozumiesz o co mi chodzi i gdzie widze problem?
  • REKLAMA
  • #7 11391902
    excray
    Poziom 41  
    m.biruta napisał:
    Problem w tym, ze jesli o tej godz 15 uruchomi sie przekaznik 1, a o 15:30 beda spelnione warunki temperaturowe i uruchomiony zostanie przekaznik 3 (a wiec i 1 ktory i tak juz dziala) to jesli po 10 min temp bedzie nieodpowiednia to razem z przekaznikiem 3 zostanie wylaczony przekaznik 1 pomimo tego, ze powinien jeszcze pracowac przez 70 minut.

    Wystarczy zrobić dwie zmienne, powiedzmy relaya1 i relayb1. Pierwsza będzie używana w przypadku 1 a druga w przypadku 3 a suma OR tych zmiennych ustala stan przekaźnika 1. Jak dla mnie to wszystko się w miarę prosto da zrobić ustalając odpowiednie warunki.
  • #8 11392618
    SylwekK
    Poziom 32  
    Jest dokładnie jak mówi @excray. Jeśli każdy przekaźnik ma już swoją zmienną to operacjami logicznymi można wszystko pięknie pogodzić. Podejrzewam, że błędy w działaniu w zacytowanym wyżej fragmencie właśnie biorą się z włączania wszystkiego na piechotę... skoro przekaźnik ma pracować jeszcze te 70 minut to chyba to gdzieś jest zapisane i program się tego powinien trzymać.
  • #9 11393382
    m.biruta
    Poziom 16  
    No tak, ale w zmiennej tego przekaźnika jest zapisane, że ma się on włączyć w dniu jutrzejszym. Uruchomienie go przez inną usługę nadpisze te dane. Ale już znalazłem inną metodę. W funkcjach każdego z przekaźników będą też zmienne odnośnie uruchomienia wszystkich innych przekaźników z którymi ten przekaźnik jest połączony.
REKLAMA