Do Projektu iAutomatyka dołączyli:

https://iautomatyka.pl/wp-content/uploads/2021/07/Obraz-glowny.jpg

Tetris na sterownik PLC

autor: JacekWasilPLC.

Założenia projektu

Projekt zakładał napisanie programu na sterownik PLC, który obsługiwałby logikę i wizualizację popularnej gry Tetris na wyświetlaczu HMI. Do wykonania projektu został użyty sterownik B&R X20CP1382 oraz panel HMI 6PPT30.0702-20. Do programowania sterownika zostało użyte środowisko Automation Studio 4.7. Film przedstawiający działanie projektu znajdziecie pod tym linkiem.

Wizualizacja gry na panelu HMI

Komunikacja ze sterownikiem i ustawienia Hardware

By zrealizować projekt, należy zacząć od dodania urządzeń wykonawczych do naszego projektu hardware. Należy otworzyć zakładkę Configuration View -> Hardware.hwl. Następnie klikając PPM na białe tło wybieramy Add Hardware Module… Z katalogu wybieramy nasze urządzenia i dodajemy je do projektu.Dodawanie urządzeń do projektu

Klikając PPM na dodany panel HMI, ustawiamy dedykowany dla niego adres IP i maskę podsieci. Ten sam adres IP należy ustawić fizycznie na panelu HMI w jego ustawieniach.

Ustawienia HW dla HMI

Przechodząc do zakładki Online -> Settings… mamy możliwość wyszukania sterownika w naszej sieci. Po naciśnięciu ikony Refresh po prawej stronie pojawią nam się dostępne urządzenia. Klikając PPM na nasz sterownik wybieramy opcję Set IP Parameters. Należy ustawić adres IP dla sterownika oraz maskę podsieci i zaznaczyć  Apply IP parameters to: X20CP1382.IF2 (ETH).

Konfiguracja HW PLC Następnie Dodajemy moduł do projektu poprzez przeciągnięcie go na lewą stronę.


Struktura programu

Drzewko projektu

Program został napisany w języku Structed Text. Do drzewka projektu należy dodać blok, w którym będzie realizowany nasz program. W projekcie zostały zawarte struktury, używane do przechowywania danych o stanie przycisków z HMI, zezwoleniach na ruch dla danego bloku czy informacji o pozycji bloku na planszy gry.

W programie zostały także zawarte zmienne globalne w Global.var. Mają one połączenia bezpośrednio z HMI, jak i są używane w całym programie. W drzewku programu znajduje się wizualizacja oraz kod podzielony na części. W TetrisBoardMoveDown znajduje się główna logika programu m.in. odpowiedzialna za opuszczanie bloków w osi pionowej oraz definiuje prędkość opuszczanego bloku. BlockGenerator odpowiada za generowanie losowych kolorów i kształtów bloków. MoveRightLeft sprawdza możliwość przemieszczenia bloku w osi poziomej i realizuje funkcję przesuwania bloku w lewo bądź prawo. RotateBlock odpowiada za obrót bloku zgodnie z ruchem wskazówek zegara.

Wizualizacja

Wizualizacja

Wizualizacja gry i obsługa jest standardowa dla gry Tetris. Zawiera przyciski góra, dół, lewo, prawo, przycisk Start i Reset. Przyciski lewo, prawo odpowiadają za przesuwanie bloku w poziomie. Przycisk góra odpowiada za obrót bloku zgodnie ze wskazówkami zegara, a dół odpowiada za szybsze opuszczenie bloku na dół. W lewym górnym rogu jest wizualizacja następnego bloku. W prawym górnym rogu jest zapisany najlepszy wynik oraz kto go zdobył. Okno ActualPlayer umożliwia wpisanie własnej nazwy gracza, która przenosi się wraz z wynikiem rekordu do okna BEST SCORE a aktualny wynik jest pokazywany w oknie ActualScore. 

Plansza składa się z kwadratów, numerowanych od lewej strony do prawej, z góry do dołu (od 1 do 72). Zmiana koloru kwadratu odbywa się poprzez zdefiniowanie wartości koloru zmienną typu INT i przesłanie jej do kwadratu o danym numerze.

TetrisBoardMoveDown

Na początku danej funkcji następuje odczyt stanu potrzebnych przycisków i zamiana ich na zmienne wykorzystujące ich zbocze narastające. Program wykorzystuje zbocza przycisków góra, dół, lewo, prawo– dzięki czemu przytrzymanie przycisku nie powoduje przykładowo błędnego przesunięcia opadającego bloku o dwa miejsca. Przycisk Reset inicjalizuje grę, poprzez wyczyszczenie planszy, zresetowanie wszystkich zmiennych trzymających dane zbierane podczas gry i zrestartowanie następnego bloku gotowego do umieszczenia na planszy.

W projekcie została użyta flaga gFirstScan, która również inicjalizuje plansze przy pierwszym uruchomieniu sterownika PLC. Flaga ma przypisaną wartość początkową 1 i przy pierwszym załączeniu sterownika zostaje aktywowana funkcja odpowiedzialna za inicjalizację programu oraz zmienia wartość flagi gFirstScan na 0. Przycisk Start na HMI powoduje ustawienie bitu StartGame na 1, który odpowiedzialny jest za wykonywanie całego programu. StartGame zostaje zresetowany w momencie, gdy gracz przegra, czyli wszystkie bloki dojdą do góry planszy. Każdy z bloków składa się z 4 oddzielnych kwadratów, gdzie każdy z kwadratów ma swoją zdefiniowaną pozycję i kolor.

Przemieszczanie figur w dół odbywa się poprzez sprawdzenie warunków, czy poniżej danej figury jest miejsce do przesunięcia bloku, który aktualnie jest w ruchu. Ten warunek jest sprawdzany na podstawie koloru danego kwadratu- kwadrat koloru białego oznacza, że miejsce jest wolne. Bardzo istotne jest to, że kolor biały ma wartość liczbową 16 (wartość ta będzie się powtarzać w reszcie kodu). Jeśli dane miejsce jest wolne, to następuje przesunięcie każdego z czterech kwadratów o określony wektor pozycji, stały dla każdego kwadratu. W ten sposób zostaje zwolniony aktualny kolor w miejscu, gdzie znajduje się opadający blok i zostają zamalowane cztery kwadraty przesunięte o wektor w osi pionowej.Opuszczanie bloku

Prędkość opadania bloku jest powiązana ze zdefiniowanym czasem opadania, przypisanym do zmiennej gBlockVelocity. Początkowa prędkość opadania bloku jest równa jednej kratce na jedną sekundę. Po każdych pięciu opuszczonych blokach prędkość ta maleje o 100 ms. Gdy blok nie może zostać przemieszczony niżej, najpierw sprawdzany jest warunek czy blok nie znajduje się zbyt wysoko (u szczytu planszy) – jeśli tak to gra zostaje przerwana i pojawia się napis Game Over. Jeżeli blok został opuszczony prawidłowo i znajduje się już w pozycji odłożonej (poniżej bloku znajduje się inny blok bądź jest to dół planszy) to wartość logiczna bitu gBlockPlaced zostaje ustawiona na 1. gBlockPlaced powoduje, że dany blok nie zostanie już opuszczony niżej oraz zostanie wygenerowany nowy blok.

W programie TetrisBlockMoveDown została także zawarta logika odpowiadająca za kasowanie linii planszy, w której zostały zapełnione wszystkie kwadraty. Po każdym odłożeniu bloku jest sprawdzany stan planszy- jeżeli jakieś bloki zapełniły daną linię w poziomie, to zostaje ona usunięta, a wszystkie kolory kwadratów powyżej zostają przesunięte w dół.

Usuwanie ułożonych blokówW momencie zbicia bloków naliczane są punkty, których wartość jest nieliniowa. Za zbicie jednej linii naliczane jest 10 punktów, za dwie linie 40, za trzy dostajemy 90, a za 4 zbite linie dostaniemy 160 punktów. Gdy aktualna wartość punktów przekroczy wartość BEST SCORE to zostaje ona zapisana wraz z loginem gracza do rekordu gry. Zmienna gBestPlayer (STRING) i gBestScore (INTIGER) są zmiennymi typu Retain przez co najlepszy wynik zostaje zapisany nawet po odciętym zasilaniu sterownika i jego ponownym włączeniu.

BlockGenerator

W BlockGenerator została zawarta logika generowania poszczególnych bloków i ich kolorów. Program korzysta z 250 kolorów, które zostały pomniejszone o kolory bardzo jasne, by lepiej były widoczne na panelu HMI. Każdy z kolorów ma przypisaną wartość liczbową od 1 do 250. Poza kolorami mamy cztery typy bloków, jakie możemy wygenerować. Losowość generacji kolorów i bloków opiera się o czas cyklu sterownika. W każdym cyklu wartość koloru i typu zostaje inkrementowana o jeden i jest to zapętlone. Więc w momencie odłożenia bloku, kolejny wygenerowany blok będzie typu, jaki akurat został wygenerowany w danym cyklu sterownika. Tak samo odbywa się generowanie koloru bloku. Bloki generowane są poprzez zmianę czterech kwadratów w oknie generacji bloku- w zależności od typu bloku dane kwadraty zmieniają swój kolor.

MoveLeftRight

Przemieszczanie bloku w linii poziomej znajduje się w MoveLeftRight. Globalny stan przycisków jest tu odczytywany i przypisywany do zmiennych lokalnych już jako pozytywne zbocza sygnałów dla danych przycisków. Funkcja zostaje uruchomiona w momencie wykrycia przyciśnięcia danego przycisku lewo  bądź prawo. Dana funkcja sprawdza najpierw, czy blok, który chcemy przesunąć, nie znajduje się na skraju planszy. Gdy ten warunek jest spełniony, następuje sprawdzenie, czy miejsce w kierunku, którym chcemy przemieścić nasz blok, jest wolne. Sprawdzamy to poprzez identyfikacje koloru kwadratu danego miejsca. By nie powielać funkcji, została tu użyta zmienna L rozróżniająca kierunek, w którym chcemy przesunąć nasz blok.

Ruch w osi poziomej

RotateBlock

Obrót bloku jest dość złożoną funkcją, która musiała zostać napisana pod każdy blok z osobna. Poza blokiem w kształcie kwadratu (złożonego z czterech mniejszych kwadratów), każdy blok obraca się o 360 stopni zgodnie z ruchem wskazówek zegara. Logika funkcji jest podobna dla każdego bloku, ale przesunięcia małych kwadratów zależą od typu bloku i jego aktualnej orientacji. Jest tu wykorzystywana struktura bloku tBlock, która zawiera informacje o typie bloku, jego aktualnej orientacji względem położenia początkowego, kolorze bloku i pozycji wszystkich czterech kwadratów, z których się składa. W momencie zmiany stanu przycisku  w górę następuje uruchomienie funkcji obrotu. Sprawdzane są wszystkie warunki na obrót danego bloku w zależności od jego typu i aktualnej orientacji. Gdy obrót jest możliwy, kwadraty z aktualną pozycją zostają wyczyszczone, a pozycje kwadratów po obrocie zmieniają swój kolor na ten, jaki aktualnie ma nasza figura opadająca w dół planszy.

Ocena artykułu zgłoszonego do Konkursu iAutomatyka 4.0 pisz artykuły, zdobywaj punkty, wymieniaj je na nagrody.

Kryterium 1 2 3 4 5 6 7 8 9 10
Punkty (0-2) 1 2 2 2 2 1 2 1 2 2
Suma zdobytych punktów: 17


Utworzono: / Kategoria:

Reklama



PRZECZYTAJ RÓWNIEŻ



NAJNOWSZE PUBLIKACJE OD UŻYTKOWNIKÓW I FIRM

Reklama



POLECANE FIRMY I PRODUKTY
  • System MasterIN firmy Finder składa się z przekaźnikowych modułów sprzęgających z terminalami Push-in. Technologia ta reprezentuje najnowsze osiągnięcia w bezśrubowych ‘sprężynowych’ zaciskach, oferujących szybką instalację. W porównaniu do...
  • Selektor napędów Panasonic umożliwia przeglądanie napędów z serii MINAS, wyszukiwanie ich w prosty sposób, a nawet porównywanie ze sobą. Dzięki wyszukiwaniu po słowach kluczowych i przy użyciu funkcji filtrowania, potrzeba zaledwie sekund a...
  • Zapraszam Cię na kurs tworzenia wizualizacji HMI z wykorzystaniem panelu XV102 od firmy EATON. Kurs stworzyłem z myślą o każdym, kto chce zacząć przygodę z tworzeniem wizualizacji HMI przy użyciu programu Galileo. Stworzyłem kurs bazujący n...
  • #PILZ wraca na rynek komponentów dla aplikacji zdecentralizowanych z nową wyspą z grupy #PDP67 powiększając tym samym istniejące portfolio o nowe rozwiązanie.Moduł PDP67 jak każda wyspa I/O to urządzenie ułatwiające koncentrację sygnałów w ...
  • Ten kurs zawiera podstawy z dziedziny serwomechanizmów. Składa się z pierwszego modułu wprowadzającego, pełnego kursu o serwomechanizmach. Mini kurs przeprowadzi Cię przez podstawowe zagadnienia związane z serwomechanizmami. Zaczniemy od sa...
  • EPSITRON®ECO & COMPACT Power OSZCZĘDNOŚĆ KOSZTÓW Zasilacze EPSITRON® ECO i COMPACT Power to nie tylko oszczędność przy zakupie, ale również niższe koszty dzięki łatwej obsłudze oraz braku konieczności serwisowania. Są one doskonałym roz...