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

PLC Step7 7-400 Jak zbudować przerzutnik T w języku drabinkowm

12 Kwi 2011 19:15 8519 13
  • #1 9392531
    Konto nie istnieje
    Konto nie istnieje  
  • #2 9392805
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #3 9393877
    jestam
    Specjalista Automatyk
    Posty: 1794
    Pomógł: 210
    Ocena: 144
    Cytat:

    Próbowałem czegoś takiego, ale niestety nie działa:
    | |I1.0----(P)M1.0----|/|Q1.0----(S)Q1.0
    | |I1.0----(P)M1.1----| |Q1.0----(R)Q1.0
    Hmm, dlaczego moje rozwiązanie nie pracuje poprawnie?

    Nie działa, ponieważ program jest wykonywany sekwencyjnie.
    Dla Q1.0=0, przy zboczu na I1.0 mamy (S)Q1.0, czyli Q1.0 jest 1.
    Następna linia, wykrywa zbocze, Q1.0 jest 1 więc zeruje Q1.0.

    Dla przerzutnika T, wyjście =1 gdy (jest zbocze na wejściu i wyjście było 0) lub (nie ma zbocza na wejściu i wyjście było 1).

    Pierwszy wiersz LAD musi wykryć zbocze (wynik w markerze), w drugim budujesz XORa z wyniku pierwszego i poprzedniego stanu Q.

    ||I1.0---(P)M1.0---()M1.1
    ||M1.0---|/|Q1.0--+----()Q1.0
    |/|M1.0--||Q1.0---+

    Nie baw się w "Kto zaproponuje najbardziej optymalny układ", pozostań przy "najbardziej czytelnym" układzie. Markery i linie programu są tanie.
  • #4 9395694
    Konto nie istnieje
    Konto nie istnieje  
  • #5 9397012
    lazik_s
    Poziom 14  
    Posty: 92
    Pomógł: 7
    Ocena: 9
    A I1.0
    FP M0.0
    = M0.1

    A M0.1
    A Q0.0
    R Q0.0

    A M0.1
    AN Q0.0
    S Q0.0
  • #7 9397232
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #8 9397358
    lazik_s
    Poziom 14  
    Posty: 92
    Pomógł: 7
    Ocena: 9
    Cytat:
    lazik_s napisał:
    A I1.0
    FP M0.0
    = M0.1

    A M0.1
    A Q0.0
    R Q0.0

    A M0.1
    AN Q0.0
    S Q0.0


    a nie czasem tak?:
    FP M0.0
    = M0.1

    AN M0.1
    A Q0.0
    R Q0.0

    A M0.1
    AN Q0.0
    S Q0.0

    Nie, ponieważ M0.1 jest TRUE tylko podczas jednego cyklu po wystąpieniu FP na I1.0
  • #9 9397412
    Konto nie istnieje
    Konto nie istnieje  
  • #10 9398704
    lazik_s
    Poziom 14  
    Posty: 92
    Pomógł: 7
    Ocena: 9
    Masz rację. Żeby dużo nie dopisywać:
    A I 1.0
    FP M 0.0
    = M 0.1

    A M 0.1
    A Q 0.0
    JCN AA1
    R Q 0.0
    JU AA2
    AA1: A M 0.1
    AN Q 0.0
    JCN AA2
    S Q 0.0
    AA2: NOP 0
  • #11 9399085
    jestam
    Specjalista Automatyk
    Posty: 1794
    Pomógł: 210
    Ocena: 144
    Cytat:

    Witam, twój układ po drobnej poprawce działa.

    Racja.

    Cytat:

    Poprawia się wszystko, gdy utworzę sobie na początku:
    | |I1.0 ---- (P) M1.0 ---- ( )M4.0
    i zamiast | |I1.0 ---- (P) M1.0 użyję tylko ( )M4.0, czyli tak:


    Nie należy używać wielokrotnie -(P)- z tym samym markerem.

    Uwaga ogólna: zmieniając język zmienia się sposób myślenia o programie.

    W STL używasz skoków do pomijania fragmentów kodu, budujesz konstrukcje if...then...else.
    W LD masz wyrażenia logiczne wykonywane zawsze, nie ma skoków, co najwyżej można użyć warunkowego wykonania bloku (wejście enable).
  • #12 9400076
    Konto nie istnieje
    Konto nie istnieje  
  • #13 9402759
    jestam
    Specjalista Automatyk
    Posty: 1794
    Pomógł: 210
    Ocena: 144
    Cytat:
    jestam napisał:


    W STL używasz skoków do pomijania fragmentów kodu, budujesz konstrukcje if...then...else.
    W LD masz wyrażenia logiczne wykonywane zawsze, nie ma skoków, co najwyżej można użyć warunkowego wykonania bloku (wejście enable).


    Program napisany w LAD przypomina strukturę układu logicznego, zbudowanego z bramek i przerzutników. A w STL przypomina program liniowy, tzn. linijka za linijką. Ale PLC i tak wykonuje polecenia sekwencyjnie, bez względu w jakim języku program jest napisany.



    W STL (i podobnych językach: ST, IL, ...) mógłbyś napisać:
    if zbocze and stan = 0
    then stan = 1
    else if zbocze and stan = 1 then
    ...

    albo
    if zbocze and stan = 0
    then { stan = 1; goto koniec; }
    if zbocze and stan = 1
    then { stan = 2; goto koniec; }
    ...
    koniec:

    W LD musisz zrobić tak jak zrobiłeś:
    Cytat:

    Rozwiązałem problem następująco:
    1. Na początku zapisuję impuls z przycisku do pamięci Mx.y
    2. Dalej kopiuję zmienną DBx.stan do zmiennej tymczasowej lokalnej #stan
    3. Dalej jest lista instrukcji if then
    Jeśli #stan==0 i dodatkowe warunki są prawdziwe to DBx.stan=1
    Jeśli #stan==1 i dodatkowe warunki są prawdziwe to DBx.stan=2
    Jeśli #stan==2 i dodatkowe warunki są prawdziwe to DBx.stan=3
    Jeśli #stan==3 i dodatkowe warunki są prawdziwe to DBx.stan=0
    //"dodatkowe warunki są prawdziwe" to u mnie impuls brany z | |Mx.y

    W ten sposób usunąłem sekwencyjność w pojedynczym skanie, dla tej zmiennej DBx.stan. Teraz zawsze tylko jedna instrukcja if then wykona się w pojedynczym skanie.

    To jest właściwe podejście dla LD.

    Cytat:

    Coś za coś, ale to już nie przeszkadza, a mianowicie: W jednym skanie PLC może wystąpić maksymalnie jedna zmiana stanu, jedno przejście do innego stanu automatu.

    Jeśli zmiana stanu ma zachodzić przy zboczu na wejściu, to może zajść co najwyżej jedna zmiana stanu co drugi cykl.
    Program, w którym dokonuje się tylko jedna zmiana stanu w cyklu jest łatwiejszy do testowania: inaczej należałoby przetestować wszystkie możliwe sekwencje zmian w jednym cyklu.

    Cytat:

    Ps. Chętnie posłucham innych pomysłów, może da się to wykonać bardziej elegancko?

    Przejście przez stany 0-1-2-3-0... przy zboczu na wejściu można zrobić tak:
    if zbocze then stan := (stan + 1) mod 4
    :)
  • #14 9412442
    Konto nie istnieje
    Konto nie istnieje  

Podsumowanie tematu

✨ W dyskusji poruszono problem budowy przerzutnika T w języku drabinkowym (LAD) dla sterownika PLC Step7 7-400. Użytkownik chciał uzyskać na wyjściu Q1.0 stan 1 po pierwszym naciśnięciu przycisku S1, a następnie na przemian 0 i 1. W odpowiedziach zaproponowano różne podejścia do rozwiązania, w tym użycie markerów do detekcji zbocza sygnału oraz konstrukcji logicznych. Użytkownicy podkreślili, że program w LAD działa sekwencyjnie, co wpływa na sposób implementacji logiki. Ostatecznie, po poprawkach, zaproponowano działający schemat, który wykorzystuje markery do detekcji zbocza oraz odpowiednie instrukcje do zmiany stanu wyjścia.
Wygenerowane przez model językowy.
REKLAMA