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.

[Solved] Projekt sygnalizacji świetlnej w programie Saia PG5

pablos19966 11 Apr 2018 11:28 1293 6
IGE-XAO
  • #1
    pablos19966
    Level 6  
    Witam wszystkich,
    Mam do zrobienia projekt prostej sygnalizacji świetlnej.
    Sygnalizacja ma dwa tryby - pulsowania i sterowania. Tryb pulsowania to miganie światła żółtego co 2s. Tryb sterowania uruchamia światło zielone dla pojazdów i czerwone dla pieszych. Układ oczekuje na zgłoszenie żądania zielonego dla pieszych. Gdy wystąpi żądanie układ sprawdza czy światło zielone dla pojazdów świeciło się przynajmniej przez 30 s. Jeśli tak, to układ inicjuje cykl zmiany świateł. Zgłoszenie żądania powoduje zapalenie się lampki na słupie.
    Cykl:
    - zapalenie światła żółtego i zgaszenie światła zielonego dla pojazdów,
    (5 sekund przerwy)
    - zgaszenie światła źółtego i zapalenie światła czerwonego dla pojazdów,
    (3 sekundy przerwy)
    - zapalenie światła zielonego i zgaszenie światła czerwonego dla pieszych,
    (15 sekund przerwy)
    - pulsowanie światła dla pieszych,
    (6 sekund przerwy)
    - zgaszenie światła zielonego dla pieszych i zapalenie światła czerwonego dla pieszych,
    (3 sekundy przerwy)
    - zapalenie światła żółtego dla pojazdów,
    (3 sekundy przerwy)
    - zgaszenie światła czerwonego i żółtego oraz zapalenie światła zielonego dla pojazdów,
    - zgaszenie lampki na słupie.

    To co pogrubione teoretycznie udało mi się zrobić, ale jest jeden problem. Blok odmierzający czas świecenia światła zielonego dla pojazdów podpięty jest w złym miejscu, ponieważ odlicza czas działania trybu sterowanie, a nie czas świecenia. Jednak gdy podłącze blok w miejscu pokazanym na schemacie występuje błąd z powodu zapętlenia funkcji.
    Jak inaczej można odmierzyć ten czas, albo jak inaczej zgasić światło zielone podczas zapalnia światła żółtego tak, aby nie wyskakiwał błąd?

    Pozdrawiam :)

    Projekt sygnalizacji świetlnej w programie Saia PG5
    Kamery 3D Time of Flight - zastosowania w przemyśle. Darmowe szkolenie 16.12.2021r. g. 10.00 Zarejestruj się
  • IGE-XAO
  • Helpful post
    #2
    jestam
    Automation specialist
    Żeby uniknąć zapętlenia diagramu wystarczy zapisać wynik do zmiennej i odczytać z tej samej zmiennej.

    Nie próbuj wciskać całego programu na jedną stronę. I tak się nie zmieści. Użyj zmiennych do przekazania wartości pomiędzy stronami diagramu, albo do określenia znaczenia sygnału, np. trybu sterowania.

    IO.SlotX.Costam to zwykłe zmienne domyślnie mapowanie na we/wy sterownika. To znaczy że stan wyjścia można odczytać. Można nadać dowolne nazwy dla we/wy w Device Configurator->Media Mappings.
  • IGE-XAO
  • #3
    pablos19966
    Level 6  
    Czy chodzi o takie coś? Jak program przejdzie ze strony 1 na 2 to ta pierwsza zostanie "zapomniana"?

    1:
    Projekt sygnalizacji świetlnej w programie Saia PG5


    2:
    Projekt sygnalizacji świetlnej w programie Saia PG5
  • Helpful post
    #4
    jestam
    Automation specialist
    Wykonywane są wszystkie strony kolejno.

    Wielokrotny zapis wartości do tej samej zmiennej/wyjścia powoduje nadpisanie - na wyjściu zobaczysz ostatnio zapisaną wartość, w programie niektóre fragmenty bedą widzieć inne wartości. Dobry styl to zapis tylko raz do zmiennej; wyjątek: cewki -(s)- -(r)-

    Musisz opracować funkcje logiczne sterujące wyjściami, np. żółte gdy tryb pulsowanie i blink lub tryb sterowanie i ...

    Samą sekwencję załączenia świateł chyba najprościej będzie zrobić na połączonych kolejno timerach.

    Zapoznaj się z językiem "diagram sekwencji" - SFC, w Saia nazwali to Graftec. Tam fragmenty programu są przypisane do kroków i tranzycji i wykonują się tylko gdy odpowiednie kroki i tranzycje są aktywne.
  • #5
    pablos19966
    Level 6  
    Dziękuję za podpowiedź. Poczytałem trochę o języku Graftec i postanowiłem wykorzystać go w tym projekcie. Udało mi się zrealizować prawie cały program z jednym małym wyjątkiem. Kiedy włączam sekwencję "sterowanie" program w tranzycji "START_CYKLU/SLUP" odlicza 30 sekund aby móc przejść do następnego kroku. Wszystko działa poprawnie. Niestety po rozpoczęciu 2 cyklu trybu "sterowanie" w tej samej tranzycji program nie odczytuje już tych 30 s - traktuje to tak jakby to było już policzone i nie liczy tego jeszcze raz. Jak można to naprawić? Co trzeba zmienić, aby program odliczał te 30 s za każdym razem gdy dochodzi do tej tranzycji?
  • Helpful post
    #6
    jestam
    Automation specialist
    Kod w tranzycji nie jest wykonywany, gdy program wyjdzie z tej tranzycji. Z perspektywy użytego timera, nie ma drugiego cyklu trybu sterowanie, ponieważ on nie wie, że tranzycja się zakończyła i w kolejnym cyklu ma liczyć czas od nowa.

    Stosuje się inne podejście: w kroku przed tranzycją ładuj timer (utwórz zmienną typu T) zadanym czasem, a w tranzycji sprawdzaj czy czas upłynął. Sterownik dekrementuje timery w tle.
    Bloczki są w grupie "Timer (Graftec)": Load timer, Load timer conditional, Timer is zero.

    Dodatkowo bloczek Wait Time to takie ułatwienie żeby czekać w tranzycji zadany czas, ale jego wyjście musi być prosto do ETR.
  • #7
    pablos19966
    Level 6  
    Dziękuję za pomoc. Użyłem tych bloczków i wszystko działa. Zamykam :)