Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[BASCOM] - Sterownik C.O. tryb Manual/Auto jak zrobić Menu

Mad Jaro 16 Gru 2012 12:36 8571 31
  • #1 16 Gru 2012 12:36
    Mad Jaro
    Poziom 16  

    Witam, piszę program dla sterownika C.O. i mam pewien problem. Przyjąłem sobie moją pętlę główną jako "tryb AUTO". Obliczam w niej temperaturę, oraz sprawdzam poszczególne warunki sterowania przekaźnikami: wentylator, pompa.

    Chciałbym do tego zrobić tzw. "tryb MANUAL", gdzie program będzie tak jakby omijał wszystkie warunki z pętli głównej i można sterować przekaźnikami ręcznie za pomocą przycisków. Jedynie, gdy temperatura kotła przekroczy 80'C załączy pompę z automatu.

    Jaką procedurą zrealizować taki tryb w bascom ?

    0 29
  • #2 16 Gru 2012 13:07
    msb
    Poziom 14  

    ja bym to zrobił tak :

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Jak chcesz to ci prześle na priv kod mojego sterownika.A tak w sumie to 80 st to troche za późno na pompe fabryczne mają zdaje się 40-60 st.

    0
  • #3 16 Gru 2012 13:24
    Mad Jaro
    Poziom 16  

    Dzięki możesz podesłać, zerknę również sobie na obsługę menu (jestem też w trakcie tworzenia) i również proszę was o pomoc.

    Kod wygląda tak:

    Kod: vb
    Zaloguj się, aby zobaczyć kod


    Nie za bardzo działa mi to menu, jak się zagłębię to później nie mogę wrócić. Poza tym wiesza się cały program.

    0
  • Pomocny post
    #4 17 Gru 2012 13:55
    WOBI
    Poziom 19  

    Tak się dzieje jak stosujesz instrukcje Gosub, program idzie do procedury a tam znowu stosujesz Gosub i w tej na koncu nieszczęsne Retrurn. Program idzie w "krzaki" bo przepełniasz stosy i nadpisujesz w pamięci Ram zmienne. Poczytaj o procedurach i funkcjach w pomocy Bascoma, użyj Declare Sub a potem Sub: i END SUB.

    Stosuj też deklaracje ramki i stosu np. tak

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    i procedury bez return

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    zmienił by też
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    na
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    i deklaracje portów
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    to też bo niepotrzebnie używasz zdublowanych zmiennych Coin(2) i Coout(2)
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    tu nasz link do przykładu z menu Link

    0
  • #5 17 Gru 2012 14:53
    Mad Jaro
    Poziom 16  

    Jeśli chodzi o temperatury to w zasadzie ma to być tylko jeden czujnik, procedura obsługi była zaczerpnięta z mojego poprzedniego programu dlatego tak zostało. Usunąłem też podział na etapy, który tutaj nie będzie potrzebny i poprawiłem resztę wg. Twoich wskazówek. Co do deklaracji portów, przyciski mam podciągnięte sprzętowo do 1.

    Wygląda to tak:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Kompiluje się, po pojawieniu ekranu głównego zawiesza i resetuje.

    0
  • #6 17 Gru 2012 15:32
    WOBI
    Poziom 19  

    Poprawiłem cały szkielet, sprawdz i przeanalizuj cały program.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #7 17 Gru 2012 15:45
    Mad Jaro
    Poziom 16  

    Wisi na ekranie głównym.

    Jak wspomniałem wcześniej obsługę 1-wire w case'ach można wywalić całkowicie. Tak jak to zrobiłem w kodzie powyżej, przyciski mam podciągnięte sprzętowo 4k7 do VCC, więc podciąganie programowe mija się z celem.

    Myślę, że przez to moje menu niepoprawnie zrobione się rozjeżdża..

    0
  • #8 17 Gru 2012 16:34
    WOBI
    Poziom 19  

    Nie panujesz poprostu nad zmienną Menu, nie ma ona żadnego ograniczenia.
    Przeniosłem główne menu z case 0: do case Else:. Poprawiłem powyżej program. Teraz powinieneś już pomału dojść jak to zrobić. Zmienna menu jest wyświetlana na LCD po wartości płomienia więc zobacz co się z nią dzieje. Przyciski mają drgania i zmienna trochę też wariuje, pomyśl o zlikwidowaniu tego zjawiska.

    0
  • #9 17 Gru 2012 16:50
    Mad Jaro
    Poziom 16  

    Dokładnie, zmienna menu nie ma ograniczeń i wychodzi poza zakresy menu. I teraz właśnie zastanawiam się czy do każdego podmenu mam robić warunki, czy da się to może jakoś prościej rozwiązać ?

    0
  • #10 17 Gru 2012 20:03
    WOBI
    Poziom 19  

    Ja bym to zrobił nie przez zmienną Menu i porównywanie Case, tylko przez flagi bitowe, a najlepiej poszczególne bity np. Dim Menu_manual as Byte a później ustawiał i sprawdzał poszczególne bity Manu_manual.0 Manu_manual.1 Manu_manual.2 itd. możesz wtedy używać operatorów logicznych w IF.

    Cytat:
    przyciski mam podciągnięte sprzętowo 4k7 do VCC, więc podciąganie programowe mija się z celem.


    Nie tak do końca, to nic nie przeszkadza że masz podciągnięte zewnętrznymi rezystorami, to dodatkowe zabezpieczenie, mi np. w urządzeniu pękł taki rezystor, może pęknąć sciezka na płytce i przycisk (port łapał zakłócenia) sam się przełączał, urządzenie szalało. Tym bardziej to nic nie kosztuje, a dodatkowo uodparnia urządzenie. ( to z praktyki)

    A tak apropo klawiszy zmień na to, nie będzie reagować tak szybko na zmiany zmiennej Menu.
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #11 17 Gru 2012 20:21
    Mad Jaro
    Poziom 16  

    Nie mam pojęcia jak to ugryźć na Case'ach. Wszędzie piszą , że jest o wiele łatwiej to zrobić i prościej na Case'ach.

    Z flagami czuję, że było by nie mniej zamieszania i raczej sobie z tym nie poradzę.


    Uruchomiłem jeszcze histereze, w takim programie jak teraz:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Jeżeli uda mi się wejść do manual to mogę + - sterować przekaźnikami. Ale też jeżeli, dany przekaźnik jest aktualnie załączony to nie mogę go wyłączyć w manual. Wyłącza się na sekundę i z powrotem załącza.

    0
  • Pomocny post
    #12 17 Gru 2012 20:26
    WOBI
    Poziom 19  

    mała podpowiedź było troche błędów w Twoim programie i przeczytaj co dopisałem wyżej odnośnie pull up


    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #13 17 Gru 2012 20:48
    Mad Jaro
    Poziom 16  

    Już jest trochę lepiej, co to podciągania pull up to nie wiedziałem, myślałem że podciągnięcie sprzętowe wystarczy, ale lepiej mieć zabezpieczenie jak mówisz.
    A histereza była źle napisana, że ją usunąłeś ?

    Je szczę jak oddzielić ten tryb manual od pętli głównej, żeby tak jak wcześniej pisałem nie brał pod uwagę warunków i alarmów.

    0
  • #14 18 Gru 2012 10:21
    WOBI
    Poziom 19  

    Histereza jest źle tak nie powinno być, to błąd, nie możesz dodawać do integer liczby z przecinkiem.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    zmienna Temp_odc jest typu integer i nie jest zmienną zmiennoprzecinkową. Pomyliłeś się, bo to działanie
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    daje wynik temperatury odczytany z DSa i przeliczony do postaci "dziesiętnej" by wartość integer reprezentowała temperaturę w stopniach C, ale przecinek jest tylko dodawany funkcją
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    do stringu który wyświetla LCD.

    A w zmiennej Temperatura jest tak: jeśli jest 1 to znaczy że na LCD pojawi się 0.1C, jeśli jest 10 to na LCD będzie 1.0C, jeśli jest 23 to LCD będzie 2.3C i td.
    Więc jeśli chcesz dodawać histerezę 0.1C to musisz dodawać 1
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Co do podprogramu Menu to usuń wszystkie CLS bo powodują zacinanie się programu i zajmują czas, skoro używasz Locate i wysyłasz do LCD znaki wypełniające całą przestrzeń znakową LCD to CLS jest zbędne.

    Co do auto/manual zastosuj flagę i jeśli jest auto to jest zero, wykonuj program automatycznego załączania przekaźników, a jeśli jest 1 to omijaj ten fragment

    0
  • #15 18 Gru 2012 10:36
    Mad Jaro
    Poziom 16  

    Jeżeli chodzi o histereze, fakt tutaj jest błąd:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Docelowo ma to wyglądać tak:
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    Z dokładnością do 1'C (bo taka ma być docelowo), czyli w takim przypadku histereza napisana przeze mnie miała by sens ? Ponieważ będę pracował na liczbach dziesiętnych i zmienna Temp_odc może pozostać jako integer.

    CLS, również poprawiam.

    Najgorzej jest z tym MENU całym, nigdy nie zagłębiałem się w wielopoziomowe menu dlatego jest to dla mnie dość skomplikowane. W sumie nie tyle menu co odpowiednie procedury skoków i powrotów.

    0
  • #16 18 Gru 2012 13:39
    WOBI
    Poziom 19  

    Histereza ma sens i to co poprawiłeś jest już dobrze, integer ma tak być bo to już jest przeliczone jak napisałem wyżej. dodajesz 10 to zmieniasz o stopień 1C.
    Co do menu to dalej nie panujesz nad zmienną Menu, zobacz wg. Twojego pomysłu menu pierwszego poziomu to case 1 lub 2 lub 3, a podmenu to numery 10, 20 , 30. A co robisz klawiszem OK? dodajesz + 10, jak mniemam chciałeś by po naciśnięciu klawisza OK zmieniało się z 1 na 10, z 2 na 20, z 3 na 30, a tak defakto to ... program dodaje 10 i jest 1 na 11, 2 na 12, 3 na 13. Dlatego nie działa. Czy dobrze myślę?

    0
  • #17 18 Gru 2012 13:52
    Mad Jaro
    Poziom 16  

    Tzn, menu główne ma się zawierać w case 1, 2, 3 zgadza się.

    Naciskając OK dodaję do zmiennej menu 10, czyli przechodzę na podmenu MANUAL czyli case 11, 12, 13, 14. Teraz w zależności, który case jest wybrany (przypuśćmy 11) to aby przejść niżej przyciskam DOL dodaję do zmiennej 1 i przechodzę do case 12. Aby przejść wyżej przyciskam GORA dodaję do zmiennej 3 i przechodzę na case 14.

    Teraz chcąc powrócić do menu głównego (case 1,2,3) na case 14 przyciskam OK odejmuję od zmiennej 13 i przechodzę do case 1.

    Ja to jakoś tak zagmatwanie rozumuję i nie mam pojęcia jak to rozpracować, ponieważ nie zawsze warunki będą takie same.

    0
  • #18 18 Gru 2012 14:55
    morswin89
    Poziom 23  

    Mogę podpowiedzieć ze swojej strony menu robię na 2 zmiennych: menu i podmenu. Wszystkie warunki i case umieszczone w jednej pętli z jednym skokiem do podprogramu obsługi klawiszy.

    0
  • #19 18 Gru 2012 14:59
    Mad Jaro
    Poziom 16  

    Domyślałem się, że zrobienie tego na jednej zmiennej będzie problemem, a mógłbyś podać jakiś chociaż namiastek składni takiego kodu ?

    0
  • Pomocny post
    #20 18 Gru 2012 20:37
    morswin89
    Poziom 23  

    Wycięte z większego programu ale widać cała pętle i ideę menu, obsługi ekranu głównego i nawet kolejnych poziomów (podmenu). Skok do odczytu klawiszy jest raz na pętle niezależnie w której części menu znajdujemy się.

    Zmienna Marker jest znacznikiem określający położenie aktualnie wyświetlanej zawartości ekranu. Menu to zamienna odpowiadająca ilości pozycji w menu a zamienna podmenu to kolejne pozycje w wybranych parametrach głównego menu.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #21 19 Gru 2012 11:33
    Mad Jaro
    Poziom 16  

    Posklejałem coś takiego:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Ekran główny wyświetla się prawidłowo, nie wiem czy wyciąłem procedurę sprawdzania przycisków, no i jak przypisać tam funkcje co przycisków tzn. ok, gora, dol, plus, minus

    0
  • #22 19 Gru 2012 14:16
    WOBI
    Poziom 19  

    Wgraj ten plik i powiedz jak działa menu i sterowanie ręczne i auto..


    Zmień operacje na temperaturze na pozbawioną części ułamkowej (po przecinku), łatwiej będzie operować na warunkach bo maja rozdzielczość jednego stopnia więc to co wyświetlasz na LCD z przecinkiem nie jest potrzebne Tobie.
    Można to zrobić np tak.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Zmienna histereza nie może mieć wartości 0, minimalna wartość to 1 i górną też przydało by sie ograniczyć. np. tak
    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    Oj oj dużo tych blędów, myślę że trochę za bardzo chaotycznie i za szybko bez przemyślenia piszesz ;)

    0
  • #23 19 Gru 2012 16:15
    Mad Jaro
    Poziom 16  

    Manu działa poprawnie, z tym, że moim zdaniem za wolno reaguje na przyciski, przykładowo w podmenu ustawienia, muszę praktycznie trzymać cały czas przycisk + i co sekundę się zmienia wartość.

    Zaś gdy klikam ok na powrót do menu to czasem znów wchodzi w podmenu, tak jakby przycisk ok 2x nacisnął się (drgania styków?)

    Aha i buzzer cały czas wyje, jest sterowany plusem wiec chyba trzeba zmienić config na początku programu na: input

    Powiem, skąd mój pośpiech...otóż dziś doszły ostatnie część i i sterownik (sprzętowo) mam już zrobiony. Pozostało "tylko.." napisać program i podłączyć do pieca.
    Jak można się domyślić jest to sterownik do pieca na olej przepracowany i dopóki nie mam go podłączonego do pieca mogę palić tylko w dzień (kontroluje sytuacje). Raz pozostawiłem na noc to rano kotłownie zostałem zalaną olejem...dobrze, że się nie zapaliło.

    0
  • #25 19 Gru 2012 17:56
    Mad Jaro
    Poziom 16  

    Teraz działa powiedział bym fajnie :D

    Teraz tak, chcąc aby wentylator był załączany zawsze przy włączeniu sterownika, ale też, żeby wchodząc w manual automatycznie się wyłączał to gdzie umieścić zmienną wentyl ?

    Ogólnie to chciałbym zrobić tak, że powiedzmy jak pompa, elektro i wentyl są załączone w trybie auto (spełniają warunki załączeniowe) i wchodzę w tryb manual, to wszystkie się wyłączają i mogę sterować ręcznie. Po wyjściu z trybu manual, z powrotem są załączane gdyż spełniają warunki zadane.

    0
  • #26 19 Gru 2012 21:09
    WOBI
    Poziom 19  

    Tu by trzeba było wstawić, tam gdzie wchodzimy w Manual.

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod


    i tu

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #27 19 Gru 2012 21:22
    Mad Jaro
    Poziom 16  

    Już sobie poradziłem z tym, przekaźnikiem.

    I mam jeszcze jedno pytanie, chciałbym zrobić tak, że:

    w trybie MANUAL jeśli temperatura przekroczy 80'C to automatycznie włączy się przekaźnik pompy, a wyłączy przekaźnik elektrozaworu.

    Bo jak zrobię warunek na te 80'C i gdy przy 80 wyłączy elektrozawór to zaś warunek płomienia go co sekundę załącza a ten wyłącza i tak sobie "pyka". Trzeba by zrobić mniej więcej tak, że jak jest temp 80'c to niezależnie czy jest tryb manual czy auto i niezależnie czy jest płomień czy go niema odłączy elektrozawór i załączy pompę

    teraz kod wygląda mniej więcej tak:

    Kod: basic4gl
    Zaloguj się, aby zobaczyć kod

    0
  • #28 08 Sty 2013 23:20
    zb_b1900
    Poziom 2  

    Witaj.
    Możesz zamieścić schemat tego sterownika?

    0
  • #29 09 Sty 2013 08:56
    Mad Jaro
    Poziom 16  

    Jak byś dobrze poszukał w moich tematach to byś znalazł.

    Ale proszę dla leniwych: Link

    Ze swojej strony dodam, że już go trochę po testowałem, i jestem 100% zadowolony, spełnia swoje zadanie. Oczywiście jest kilka modyfikacji jakie bym wprowadził, gdybym go projektował jeszcze raz.

    1. Zamontował bym mocniejsze trafo 12V i dołożył dodatkowo jeden przekaźnik 12V, żeby można było sterować też elektrozaworami samochodowymi (są tańsze).
    2. Wyprowadził bym również 12V ze sterowaniem płynnym 3-12V do zasilania silniczka wolnoobrotowego z przekładnią połączonego z samochodową pompą oleju (wtedy uzyskujemy płynną dozowalność paliwa)

    Chyba tyle...reszta się sprawdziła, zabezpieczenie przed zdmuchnięciem płomienia działa, a głównie na tym mi zależało.

    0
  • #30 09 Sty 2013 09:10
    zb_b1900
    Poziom 2  

    Trochę tych tematów było. Dzięki.

    0