Spis treści
- Wstęp
- Schemat połączeń fizycznych
- Logika działania sygnalizacji świetlnej
- Programowanie sterownika
- Tworzenie i konfiguracja projektu
- Implementacja logiki sterowania
- Pierwsza linia logiczna
- Druga linia logiczna
- Trzecia linia logiczna
- Czwarta linia logiczna
- Piąta i szósta linia logiczna
- Łączenie sterownika z komputerem
- Sprawdzanie poprawności działania kodu
- Podsumowanie
Wstęp
W tym artykule dowiesz się, jak zaprogramować sterownik Micro850 w środowisku Connected Components Workbench, aby zasymulować działanie sygnalizacji świetlnej. Utworzony program pozwoli na dynamiczne przełączanie świateł w zależności od obecności pojazdów oraz natężenia ruchu na skrzyżowaniu.
Schemat połączeń fizycznych
Połączenie pomiędzy komputerem a sterownikiem należy zrealizować przy użyciu kabla Ethernet. Przed rozpoczęciem konfiguracji należy upewnić się, że oba urządzenia znajdują się w tej samej podsieci IP i są w stanie się wzajemnie komunikować.
Logika działania sygnalizacji świetlnej
Dla zwiększenia przejrzystości w dalszej części artykułu stosować będziemy następujące oznaczenia
- NS (ang. North-South) - oznaczenie drogi biegnącej w osi pionowej (kierunek północ–południe)
- EW (ang. East-West) - oznaczenie drogi biegnącej w osi poziomej (kierunek wschód–zachód)
Ukazane zostały one na poniższych ilustracjach.


Programowana przez nas sygnalizacja świetlna będzie składać się z 4 zapętlających się stanów przedstawionych poniżej.
Faza 1. NS – światła czerwone, zatrzymanie pojazdu EW – światła zielone, jazda dozwolona |
Faza 2. NS – światła żółte, przygotowanie do jazdy EW – światła żółte, przygotowanie do zatrzymania |
Faza 3. NS – światła zielone, jazda dozwolona EW – światła czerwone, zatrzymanie pojazdu |
Faza 4. NS – światła żółte, przygotowanie do zatrzymania EW – światła żółte, przygotowanie do jazdy |
Działanie sygnalizacji świetlnej zostało przedstawione na poniższym schemacie. W celu skrócenia i uproszczenia opisów zastosowano następujące oznaczenia możliwych sytuacji na skrzyżowaniu:
- warunki normalne: na puste skrzyżowanie wjeżdża pojazd i zatrzymuje się na czerwonym świetle
- warunki specjalne: na skrzyżowaniu znajduje się większa liczba pojazdów, czyli jednocześnie muszą zaistnieć dwie sytuacje:
- Na drodze, dla której sygnalizator świetlny wyświetla zielone światło, pojazdy przejeżdżają w sposób cykliczny.*
- Przynajmniej jeden pojazd oczekuje na zmianę sygnału świetlnego z czerwonego na zielone.
*Dokładne wartości czasowe zostaną określone w dalszej części artykułu.
Programowanie sterownika
Tworzenie i konfiguracja projektu
Po uruchomieniu programu klikamy odpowiednio „New”, a następnie, po potencjalnej zmianie nazwy projektu, „Create”.
Otworzy nam się wówczas drzewo wyboru z którego wybieramy nasz kontroler - 2080-LC50-48QWB-SIM. Następnie klikamy na „Select”, aby zatwierdzić wybór, i „Add to Project” (pole to powinno zostać wówczas aktywowane), aby dodać nasz kontroler do projektu.
Następie dodajemy nowy projekt w języku ladder poprzez kliknięcie prawym przyciskiem myszy na znajdujący się w „Project Organizer” panel „Programs”. Otworzy się wtedy lista rozwijana, z której wybieramy kolejno „Add” oraz „New LD: Ladder Diagram”.
Następnie możemy zmienić nazwę naszego programu, która domyślnie przyjmuje wartość „Prog1”. Aby to zrobić klikamy na niego prawym przyciskiem myszy, wybieramy „Rename” i wpisujemy wybraną przez nas nazwę zatwierdzając ją przy pomocy klawisza „Enter” na klawiaturze.
W naszym przypadku nazwiemy ten program „Traffic_Lights”.
Następnie przechodzimy do sekcji „Global Variables”. Naszym celem jest przypisanie aliasów poszczególnym wyjściom i wejściom sterownika, aby później być w stanie szybko zidentyfikować konkretne elementy prgramu. Wartości przypisujemy zgodnie z poniższą grafiką.
Dodatkowo, dla jeszcze lepszej czytelności zwięszymy szerokość pojedynczych bloków, a także zmienimy sposób wyświetlania, aby automatycznie dla nowo dodanych bloków wyświetlane były tylko aliasy. W tym celu klikamy prawym przyciskiem myszy na białe pole znajdujące się pod domyślnie dodaną linią logiczną. Wyświetla nam się lista rozwijana, na której wybieramy opcję „Properties”.
Następnie spośród dostępnych opcji zmieniamy „Cell Width” na „50”, a także „Variable Information” na „Alias”.
Po wykonaniu powyższych przygotowań możemy przejść do pisania programu.
Implementacja logiki sterowania
Pierwsza linia logiczna
Zadaniem pierwszej stworzonej przez nas linii logicznej będzie nadanie parametrów początkowych, tj. włączenie zielonego światła na trasie wschód-zachód, czerwonego światła na trasie północ-południe, a także wyłączenie wszystkich pozostałych świateł.
Aby to uczynić to na samym początku tworzymy 5 dodatkowych przęseł połączonych równolegle, aby mieć do dyspozycji łącznie 6 linii logicznych. Robimy to poprzez przenoszenie ikony rozgałęzienia (ang. branch) na główną linię logiczną. Kolejne równoległe przęsła w ladderze można dodawać, przeciągając nową gałąź w taki sposób, aby umieścić ją dokładnie na środku istniejącej odnogi. Gdy kursorem znajdziemy się we właściwym miejscu, interfejs wizualnie to potwierdzi – ikona z plusem powinna wówczas subtelnie się powiększyć, sygnalizując możliwość rozgałęzienia logiki.
W rezultacie powinniśmy otrzymać poniższy schemat.
Następnie wyszukujemy blok „Set Coil” i umieszczamy go na dwóch szczeblach drabinki. Po umieszczeniu już pierwszego z nich całość programu powinna przesunąć się na prawą stronę linii logicznej.
W analogiczny sposób dodajemy na pozostałe 4 szczeble bloki „Reset Coil”.
Dodatkowo, aby mieć gotowy komplet elementów znajdujących się na pierwszej linii logicznej, umieszczamy na nim styk zwierny, który spotykany jest w CCW pod nazwą „Direct Contact”.
Kolejnym krokiem jest przypisanie wartości do wcześniej dodanych elementów.
W tym celu należy dwukrotnie kliknąć wybrany element, co spowoduje otwarcie tabeli zmiennych globalnych powiązanych z programem. Szczególną uwagę warto zwrócić na pole „Scope” – jeśli zamiast „Micro850” widnieje tam „Traffic_Light” (czyli nazwa naszego programu napisanego w języku drabinkowym), konieczna będzie jego zmiana, aby uzyskać stamtąd dostęp do wejść i wyjść sterownika.
Po ustawieniu odpowiedniego zakresu („Micro850”) wyświetli się lista dostępnych sygnałów z przypisanymi wcześniej aliasami. Teraz możemy je przypisać do poszczególnych elementów programu, klikając dwukrotnie na każdy z nich.
Dla styku rozwiernego należy przypisać wartość „_SYSVA_FIRST_SCAN” . Początkowo w programie nie będzie widoczny dla niego żaden opis. Powód, dlaczego tak jest, omówiono w dalszej części artykułu.
Pozostałym elementom przypisujemy odpowiednie aliasy zgodnie z ilustracją poniżej.
Możemy zauważyć, że nad stykiem zwiernym po lewej stronie linii logicznej nie pojawia się żadne pole tekstowe. Dzieje się tak dlatego, że zgodnie ze zmienionymi przez nas wcześniej ustawieniami, program domyślnie wyświetla aliasy zamiast nazw przypisanych do przycisków/ wejść/wyjść/zmiennych. Taka zmiana została wprowadzona celowo — w całym projekcie znajdować się będzie 48 elementów, dla których bardziej czytelne będzie wyświetlanie aliasów, oraz 11 elementów, dla których lepszą opcją jest wyświetlanie samej nazwy.
W sytuacji, gdy mamy do czynienia z jednym z tych 11 przypadków należy ręcznie przywrócić mu pierwotny sposób wyświetlania. W tym celu klikamy prawym przyciskiem myszy na dany element i wybieramy opcję „Properties”.
W pojawiającym się po prawej stronie oknie wybieramy opcję „Name”.
Ze względu na powtarzalność tego procesu, w dalszej części nie będziemy już wspominać o zmianie trybu wyświetlania nazw dla elementów, które nie mają przypisanych aliasów. Dotyczyć to będzie w większości zmiennych przypisywanych do timerów.
Druga linia logiczna
Naszym następnym celem jest stworzenie timera, który będzie zliczał jak długo zapalone jest zielone światło (wykorzystywane będzie to później przy definiowaniu akcji dla warunki specjalne)
W tym celu dodajemy do programu nową linię logiczną. Możemy zrobić to na kilka sposobów. Jednym z nich jest wyszukanie „Rung” i przeniesienie na, znajdującą się na samym dole, ikonę plusa dla poprzedniej linii logicznej.
Dodajemy do niej dwa bloki „Reverse Contact” oraz jeden blok „TON”. Całość prezentować się będzie w następujący sposób.
Następnie przypisujemy tym stykom odpowiednie wyjścia.
W kolejnym kroku dodajemy zmienne potrzebne do obsługi timera użytego w tej linii logicznej. Aby to uczynić musimy jednak najpierw je utworzyć. W tym celu klikamy dwukrotnie na „Local Variables” znajdujące się po lewej stronie ekranu w „Project Organizer”.
Otworzy nam się wówczas dodatkowe okno. Z wybieranej listy przy "Scope" wybieramy "Trafic Lights", aby przejść do panelu zmiennych.
Zmienne dodajemy, wpisując ich nazwę w polu „Name”, wybierając odpowiedni typ danych („Data Type”) oraz przypisując wartość początkową („Initial Value”). Poniżej znajduje się zestaw zmiennych przygotowanych zgodnie z tymi ustawieniami.
Używane są one w następujących celach:
- Time_green_lights - używana przy definiowaniu warunków specjalnych. Służy do zapamiętywania jak długo aktywna jest sygnalizacja świetlna w fazie 1 lub 3.
- Time_green__lights_check - poprzez porównanie ze zmienną „Time_green_lights” sprawdzane jest, czy przełączyć sygnalizację na fazę 2 lub 4 w zależności od tego jaka faza jest wówczas aktywna.
- Time_yellow_lights - używana aby zdefiniować jak długo będzie aktywne światło żółte (czas trwania faz 2 i 4).
- Time_empty_crossroad - używana, przy definiowaniu warunków normalnych, jeżeli timer doliczy do tej wartości to nastąpi zmiana fazy sygnalizacji świetlnej.
- Time_counting - wymagana przez program zmienna techniczna. Opisuje teoretyczną, maksymalną wartość czasu określanego przez zmienną "Time_green_lights". Celowo wybrano wartość, która będzie w praktyce nieosiągalna.
W sytuacji, gdy stworzone zostały już wszystkie zmienne musimy dodać część z nich do naszego pierwszego timera. Przypisujemy odpowiednio „Time_counting” oraz „Time_green_light”, aby uzyskać efekt tak jak na poniższej ilustracji.
Trzecia linia logiczna
W tej linii nadane zaprogramowane zostanie przełączanie sygnalizacji świetlnej z fazy 1 na 2.
WAŻNE: Ze względu na specyfikę programu (a dokładniej pisząc, działania rozgałęzień) zaleca się, aby podczas tworzenia tej linii logicznej dodawać bloki zgodnie z opisaną w artykule kolejnością. W dalszej części artykułu opisany zostanie krok po kroku sposób działania tej części programu.
Na początek dodajmy na schemat pierwszą linię logiczną.
Dodajmy 3 rozgałęzienia, z których to 2 z nich będą połączone ze sobą równolegle.
Następnie dodajemy blok „>=” .
Kolejno dodajemy timer „TON” .
A następnie 3 styki zwierne. Dwa na dolnym rozgałęzieniu, jeden na górnym rozgałęzieniu.
W kolejnym kroku dodamy 2 styki rozwierne na górne rozgałęzienie.
Następnie dodajemy 3 rozgałęzienia poprzez przeniesienie na, umieszczone wcześniej, styki zwierne.
Na każde z dodanych rozgałęzień dodajemy nowy styk zwierny. Dodatkowo umieszczamy jeszcze jeden styk zwierny przed pierwszym rozgałęzieniem.
Finalnie dodajemy 2 bloki „Set Coil” i 1 blok „Reset Coil” na, znajdujące się po prawej stronie, rozgałęzienie.
Następnie przypisujemy styki w następujący sposób.
Aby ułatwić zrozumienie i uprościć omawianie działania tej linii logicznej, została podzielona na cztery fragmenty opisane poniżej.
Na samym początku musimy upewnić się, że dla pojazdu, który spełnia warunki normalne (fragment zaznaczony kolorem zielonym) lub specjalne (fragment niebieski), zapalone jest czerwone światło. Niepotrzebne byłoby przecież zmieniać stan sygnalizacji świetlnej w sytuacji, gdy dla wszystkich pojazdów nadjeżdzących na skrzyżowanie aktywne byłoby światło zielone. Następnie, gdy upewnimy się, że na skrzyżowaniu znajduje się przynajmniej jeden pojazd oczekujący na czerwonym świetle, sygnalizacja przełącza się w tryb opisanych wcześniej w artykule warunków normalnych lub specjalnych.
Na górnej linii logicznej (zaznaczonej kolorem zielonym) zdefiniowane zostały warunki normalne. Na początku sprawdzamy, czy w kierunku, dla którego aktualnie aktywne jest czerwone światło wjechał pojazd z północy (N_CAR_SENSOR) lub południa (S_CAR_SENSOR). Następnie za pomocą czujników E_CAR_SENSOR oraz W_CAR_SENSOR upewniamy się, że na skrzyżowaniu nie znajduje się żaden inny pojazd jadący w kierunku wschód-zachód.
Jeśli żaden z wymienionych czujników nie zostanie aktywowany, rozpoczyna się odliczanie czasu przez timer. Warunki muszą pozostać niezmienione przez czas definiowany jako „Time_empty_crossroad” - dopiero wtedy uruchamiana jest dalsza część linii logicznej.
Podsumowując: kierowca nie będzie stał na czerwonym świetle dłużej niż 5 sekund (czas zdefiniowany przez zmienną "Time_empty_crossroad") jeżeli wjechał na puste skrzyżowanie.
Na dolnej linii logicznej (zaznaczonej kolorem niebieskim) zdefiniowane zostały warunki specjalne. Podobnie jak wcześniej, na początku sprawdzamy, czy na jezdnię z aktywnym czerwonym światłem (NS_RED_LIGHT) wjechał pojazd z północy (N_CAR_SENSOR) lub południa (S_CAR_SENSOR). Następnie, na podstawie sygnału z czujników E_CAR_SENSOR lub W_CAR_SENSOR, sprawdzana jest obecność pojazdu na jezdni, na której świeci się zielone światło. Warunek zostaje spełniony, jeśli przynajmniej jeden z tych czujników jest aktywny. W dalszej części sprawdzane jest jak długo było zapalone czerwone światło dla tego pasa („Time_green_lights”). Jeśli czas ten przekroczy wartość Time_green_lights_check, uruchamiana jest dalsza część linii logicznej.
Podsumowując: kierowca nie będzie stał na czerwonym świetle dłużej niż 10* sekund (czas zdefiniowany przez zmienną "Time_green_lights") jeżeli wjechał na ruchliwe skrzyżowanie.
* - ze względów praktycznych zadecydowano, aby ustawić stosunkowo niewielką wartość po to, by podczas testowania programu w miarę szybko być w stanie przełączać poszczególne fazy działania symulowanej sygnalizacji świetlnej. W rzeczywistych warunkach wartość ta byłaby znacznie większa.
Finalnie, w sytuacji, gdy zostaną spełnione warunki normalne lub specjalne, następuje wygaszenie zielonego światła w aktywnej fazie sygnalizacji. Jednocześnie na wszystkich sygnalizatorach zapalane są światła żółte.
Czwarta linia logiczna
Linia ta, znacznie prostsza od poprzedniej, odpowiada za zmianę fazy sygnalizacji świetlnej z 2 na 3.
Tworzymy ją dodając nową sekwencję logiczną i umieszczając elementy zgodnie z poniższym schematem.
Następnie przypisujemy zmienne zgodnie ze zdjęciem poniżej.
W tej linii logicznej sprawdzane są dwa warunki: aktywne muszą być żółte światła zarówno w kierunku EW, jak i NS, a jednocześnie zielone światło w kierunku EW musi być wyłączone. Gdy wszystkie z nich są spełnione uruchamiany jest timer odmierzający 2 sekundy (czas określony przez zmienną „Time_yellow_lights”). Następnie sygnalizacja przełącza się w fazę 3.
Piąta i szósta linia logiczna
Linie te działają analogicznie do linii 3 i 4. Najprościej je utworzyć poprzez ich skopiowanie i modyfikację.
W tym celu, trzymając naciśnięty lewy przycisk „Ctrl”, klikamy po kolei lewym przyciskiem myszy na cyfry znajdujące się po w lewej skrajnej stronie linii logicznych nr 3 i 4. Naszym celem jest to, aby obie zaznaczone były niebieskim kolorem. Następnie klikamy prawym przyciskiem myszy na 3 linię logiczną i z rozwijanego menu wybieramy opcję „Copy”.
Operację ponawiamy, jednak teraz zamiast opcji „Copy” wybieramy „Paste”.
W rezultacie powinniśmy otrzymać taki widok, gdzie odpowiednio linie 3 i 5 oraz 4 i 6 są identyczne z wyjątkiem nazw timerów.
W liniach logicznych 5 i 6 należy zamienić w nazwach parametrów wszystkie wystąpienia „NS” na „EW” oraz „EW” na „NS”. Analogicznie, litery „N” i „S” zamieniamy na „E” i „W”, oraz odwrotnie – w zależności od kontekstu. Na tym etapie całość powinna wyglądać jak na poniższym przykładzie.
Cały program prezentuje się następująco
Łączenie sterownika z komputerem
Aby połączyć się ze sterownikiem należy przejść do zakładki Micro850, a następnie wybrać przycisk „Connect”, znajdujący się w prawym górnym rogu.
Podczas pierwszego połączenia z urządzeniem pojawi się okno z listą dostępnych połączeń. Z niej należy wybrać odpowiedni sterownik i zatwierdzić wybór, klikając „OK”. Jeśli wcześniej łączyliśmy się już z tym urządzeniem (przy użyciu tej samej ścieżki ), to okno nie zostanie wyświetlone, a połączenie z mikrokontrolerem zostanie nawiązane automatycznie.
Następnie pojawią się ostrzeżenia na temat niezgodności programu przesyłanego z komputera z tym zastanym na mikrokontrolerze. Jako, że chcemy uruchomić program napisany w CCW wybieramy opcję „Download current project to the controller”, a następnie „Download” i „Tak”.
Sterownik powinien teraz działać zgodnie z napisanym przez nas programem.
Sprawdzanie poprawności działania kodu
Po wgraniu programu na sterownik, automatycznie aktywowane zostają dwa wyjścia. Zgodnie ze sposobem przypisania zmiennych podczas tworzenia programu są to wyjścia cyfrowe 0 i 5. Poniżej przedstawiono cztery fazy działania sygnalizacji świetlnej jako symulację stanu odpowiednich wyjść. Dla każdej fazy pokazano aktualny stan wyjść cyfrowych wraz z odpowiadającymi im kolorami sygnalizacji świetlnej.
Faza 1 |
Faza 2 | ||
NS |
EW |
NS |
EW |
IO_EM_DO_00 IO_EM_DO_01 IO_EM_DO_02 |
IO_EM_DO_03 IO_EM_DO_04 IO_EM_DO_05 |
IO_EM_DO_00 IO_EM_DO_01 IO_EM_DO_02 |
IO_EM_DO_03 IO_EM_DO_04 IO_EM_DO_05 |
Faza 3 |
Faza 4 |
||
NS |
EW |
NS |
EW |
IO_EM_DO_00 IO_EM_DO_01 IO_EM_DO_02 |
IO_EM_DO_03 IO_EM_DO_04 IO_EM_DO_05 |
IO_EM_DO_00 IO_EM_DO_01 IO_EM_DO_02 |
IO_EM_DO_03 IO_EM_DO_04 IO_EM_DO_05 |
W celu łatwiejszego śledzenia działania programu, poszczególne ścieżki przejścia są testowane sekwencyjnie. Choć w praktyce możliwe jest występowanie różnych warunków po sobie, w naszym przypadku zależy nam na sprawdzeniu każdego z nich osobno. Aby zasymulować konkretne sytuacje należy postąpić według poniższych instrukcji.
- Warunki normalne
- Przytrzymujemy dowolny z przycisków symulujących czujniki na trasie północ–południe (można również przytrzymać oba jednocześnie). Należy jednak upewnić się, że żaden z czujników na trasie wschód–zachód nie jest aktywny. Po upływie 5 sekund (czas określony przez zmienną „Time_empty_crossroad”) następuje zmiana fazy na drugą.
- Zwalniamy przycisk (lub przyciski) i odczekujemy 2 sekundy (czas określony przez zmienną „Time_yellow”). Po tym czasie powinna nastąpić zmiana fazy na trzecią.
- Analogicznie jak w przypadku zmiany z fazy pierwszej, przytrzymujemy dowolny z przycisków symulujących czujniki na trasie wschód–zachód (można również przytrzymać oba jednocześnie). Należy jednak ponownie upewnić się, że żaden z czujników na trasie północ–południe nie jest aktywny. Po upływie 5 sekund sterownik przełącza się na fazę czwartą.
- Zwalniamy przycisk (lub przyciski) i odczekujemy 2 sekundy. Następnie następuje zmiana fazy na pierwszą, rozpoczynając cykl od nowa.
- Warunki specjalne:
- Po upływie 10 sekund (czas zdefiniowany przez zmienną „Time_green_light”) załączamy przynajmniej jeden przycisk symulujący ruch na trasie północ–południe oraz przynajmniej jeden przycisk dla trasy wschód–zachód. Natychmiastowo powinna nastąpić wtedy zmiana fazy na drugą.
- Postępujemy tak samo jak w przypadku warunków normalnych
- Analogicznie jak w przypadku zmiany z fazy pierwszej po upływie 10 sekund załączamy przynajmniej jeden przycisk symulujący ruch na trasie wschód–zachód oraz przynajmniej jeden przycisk dla trasy północ–południe. Natychmiastowo powinna nastąpić wtedy zmiana fazy na drugą.
- Postępujemy tak samo jak w przypadku warunków normalnych
Podsumowanie
Teraz już wiesz jak zasymulować sygnalizację świetlną przy pomocy sterownika Micro850. Jeśli masz pytania lub potrzebujesz wsparcia w realizacji własnych aplikacji, skontaktuj się z nami: rockwell@elmark.com.pl