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.

[Python] Położenia krańcowe rolet - potrzebne odpowiednie polecenia, sposób

Aykan72 26 May 2016 23:34 1071 9
  • #1
    Aykan72
    Level 6  
    Dzień dobry!

    Dopiero zacząłem parę dni temu zabawę z językiem Python, jestem laikiem i chcąc nauczyć się czegoś więcej chce napisać program sterujący roletami.
    Do wejść podłączyłem kr_d/g czyli wyłączniki krańcowe(limit switches), czujniki bezpieczeństwa(c_red/org) i zwykłe przyciski monostabilne(gora,stop,dol). Wyjścia to sygnały sterujące sterownikiem dwukanałowym silnika prądu stałego DC(obroty prawo, lewo, PWM).
    Jedyny mój problem tkwi, w tym że jeżeli roleta zjedzie już na dół to nie można załączyć obrotów podnoszących ją do góry jeżeli nie trzyma się przycisku(jeśli [kr_d] jest zwarta i przycisk [gora] mają stan wysoki), analogicznie dzieję się w przeciwną stronę.
    Jak mniemam problem tkwi w tym że "bs'y" się ze sobą "kłócą".
    Proszę o pomoc szanowne grono programistów!
    Pozdrawiam

    tutaj wrzucam mój kod:
    Code: python
    Log in, to see the code
    Ethernet jednoparowy (SPE) - rozwiązania w przemyśle. Szkolenie 29.09.2021r. g. 11.00 Zarejestruj się za darmo
  • #2
    dedito
    Level 39  
    Aykan72 wrote:
    Dopiero zacząłem parę dni temu zabawę z językiem Python
    Czyli jakieś języki już znasz. Jakie?
    Jakie stany wejść odpowiadają wciśniętemu przyciskowi, załączonej krańcówce i pobudzonym czujniku bezpieczeństwa?
  • #4
    dedito
    Level 39  
    Code: python
    Log in, to see the code

    Z powyższego wynika, że przycisk musi być wciśnięty cały czas aby podtrzymać ruch rolety.
    PS.Trochę dziwi, że przycisk nie jest NO.
  • #5
    Aykan72
    Level 6  
    Przycisk jest NO.
    No właśnie to jest problem, że trzeba trzymać przycisk aż wyjedzie poza wyłącznik krańcowy, dopiero wtedy można go puścić a ruch będzie odbywał aż do przerwania przez przycisk lub drugą krańcówkę lub czujnik bezpieczeństwa.
    Próbowałem już wielu sposobów, takich jak restart programu po osiągnięciu punktu krańcowego, czy zapisanie innej logiki. Jednak zawsze bs=1 kłócił się z bs=2 lub bs=3.

    Tutaj dodaję obrazek z logiką napisaną w FBD:

    [Python] Położenia krańcowe rolet - potrzebne odpowiednie polecenia, sposób
  • #6
    dedito
    Level 39  
    Aykan72 wrote:
    Przycisk jest NO.
    wg programu i wcześniejszych wyjaśnień:
    Aykan72 wrote:
    !=1 ==> wciśnięty przycisk

    jest NC
    Aykan72 wrote:
    No właśnie to jest problem, że trzeba trzymać przycisk aż wyjedzie poza wyłącznik krańcowy, dopiero wtedy można go puścić a ruch
    No tak to zaprogramowałeś.
    W FBD pokazałeś coś zupełnie innego.
  • #7
    Aykan72
    Level 6  
    "if GPIO.input(gora)!= 1 or GPIO.input(kr_d) != 1 and GPIO.input(gora) !=1:
    bs=2"

    Jest NO:
    jeśli przycisk jest wciśnięty lub krańcówka dolna jest wciśnięta i przycisk jest wciśnięty
    To wtedy roleta jedzie do góry


    Właśnie mam problem jak zmienić program w Pythonie, wszystko funkcjonuje dobrze poza tym jednym. Dlatego piszę tutaj z prośbą o pomoc. Wiem, że jest źle napisane, chciałbym tylko dowiedzieć się jak to naprawić.
  • #8
    dedito
    Level 39  
    Aykan72 wrote:
    Jest NO:
    Gdyby był NO to na wejściu w momencie wciśnięcia miałbyś stan wysoki czyli 1.
    Napisałeś natomiast, że w momencie wciśnięcia stan na wejściu jest różny od 1 (!1).

    Aykan72 wrote:
    "if GPIO.input(gora)!= 1 or GPIO.input(kr_d) != 1 and GPIO.input(gora) !=1:
    bs=2"

    Jest NO:
    jeśli przycisk jest wciśnięty lub krańcówka dolna jest wciśnięta i przycisk jest wciśnięty

    Powiedzmy, że ten opis reprezentuje powyższy kod to już pomijąjąc co jest NC czy NO jest to funkcja boolowska gdzie AND ma wyższy priorytet nad OR, tak samo jak mnożenie ma pierwszeństwo przed dodawaniem.
    Ja bym wykorzystał jeszcze zmienną bs do podtrzymania ruchu gdy krańcówka jest wciśnięta.
    Cały problem nie dotyczy języka programowania tylko algorytmu sterowania.
    Ja bym to zmienił na coś w stylu:
    Jeżeli (przycisk góra jest wciśnięty lub trwa ruch do góry) i krańcówka góra nie jest wciśnięta to wysteruj ruch do góry, w przeciwnym razie zatrzymaj ruch.
    Nawiasów użyłem celowo ze względu na kolejność działań.
  • #9
    kinggustav
    Level 24  
    Pewnie nie jestem w temacie, ale po co wogóle sprawdzasz stan krańcówki dolnej gdy chcesz jechać do góry? Moim zdaniem górne trzeba sprawdzać, to one mają wyłączyć.