Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

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

Mad Jaro 16 Dec 2012 12:36 9270 31
  • #1
    Mad Jaro
    Level 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 ?
  • #3
    Mad Jaro
    Level 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:
    Code: vbscript
    Log in, to see the code


    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.
  • Helpful post
    #4
    WOBI
    Level 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

    Code: vbnet
    Log in, to see the code

    i procedury bez return

    Code: vbnet
    Log in, to see the code

    zmienił by też
    Code: vbnet
    Log in, to see the code

    na
    Code: vbnet
    Log in, to see the code

    i deklaracje portów
    Code: vbnet
    Log in, to see the code


    to też bo niepotrzebnie używasz zdublowanych zmiennych Coin(2) i Coout(2)
    Code: vbnet
    Log in, to see the code


    tu nasz link do przykładu z menu Link
  • #5
    Mad Jaro
    Level 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:
    Code: vbnet
    Log in, to see the code


    Kompiluje się, po pojawieniu ekranu głównego zawiesza i resetuje.
  • #7
    Mad Jaro
    Level 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..
  • #8
    WOBI
    Level 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.
  • #9
    Mad Jaro
    Level 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ć ?
  • #10
    WOBI
    Level 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.

    Quote:
    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.
    Code: vbnet
    Log in, to see the code
  • #11
    Mad Jaro
    Level 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:
    Code: vbnet
    Log in, to see the code

    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.
  • Helpful post
    #12
    WOBI
    Level 19  
    mała podpowiedź było troche błędów w Twoim programie i przeczytaj co dopisałem wyżej odnośnie pull up


    Code: vbnet
    Log in, to see the code
  • #13
    Mad Jaro
    Level 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.
  • #14
    WOBI
    Level 19  
    Histereza jest źle tak nie powinno być, to błąd, nie możesz dodawać do integer liczby z przecinkiem.
    Code: vbnet
    Log in, to see the code

    zmienna Temp_odc jest typu integer i nie jest zmienną zmiennoprzecinkową. Pomyliłeś się, bo to działanie
    Code: vbnet
    Log in, to see the code

    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ą
    Code: vbnet
    Log in, to see the code

    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
    Code: vbnet
    Log in, to see the code


    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
  • #15
    Mad Jaro
    Level 16  
    Jeżeli chodzi o histereze, fakt tutaj jest błąd:
    Code: vbnet
    Log in, to see the code

    Docelowo ma to wyglądać tak:
    Code: vbnet
    Log in, to see the code

    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.
  • #16
    WOBI
    Level 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ę?
  • #17
    Mad Jaro
    Level 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.
  • #19
    Mad Jaro
    Level 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 ?
  • Helpful post
    #20
    morswin89
    Level 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.

    Code: vbnet
    Log in, to see the code
  • #21
    Mad Jaro
    Level 16  
    Posklejałem coś takiego:
    Code: vbnet
    Log in, to see the code


    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
  • #22
    WOBI
    Level 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.
    Code: vbnet
    Log in, to see the code


    Zmienna histereza nie może mieć wartości 0, minimalna wartość to 1 i górną też przydało by sie ograniczyć. np. tak
    Code: vbnet
    Log in, to see the code


    Oj oj dużo tych blędów, myślę że trochę za bardzo chaotycznie i za szybko bez przemyślenia piszesz ;)
  • #23
    Mad Jaro
    Level 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.
  • #25
    Mad Jaro
    Level 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.
  • #26
    WOBI
    Level 19  
    Tu by trzeba było wstawić, tam gdzie wchodzimy w Manual.

    Code: vbnet
    Log in, to see the code


    i tu

    Code: vbnet
    Log in, to see the code
  • #27
    Mad Jaro
    Level 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:
    Code: vbnet
    Log in, to see the code
  • #28
    zb_b1900
    Level 2  
    Witaj.
    Możesz zamieścić schemat tego sterownika?
  • #29
    Mad Jaro
    Level 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.
  • #30
    zb_b1900
    Level 2  
    Trochę tych tematów było. Dzięki.