Do Projektu iAutomatyka dołączyli:

https://iautomatyka.pl/wp-content/uploads/2022/05/autoslalom.jpg

Autoslalomem przez programowanie, czyli nauka programowania poprzez zabawę.

autor: Tomasz Zjawin.

Bądź pozytywnie nastawiony do pracy i zarażaj optymizmem wszystkich dookoła. Nigdy nie pozwól zrobić z siebie ofiary i – na miłość boską – baw się dobrze. [Jack Welch]

Wprowadzenie

Sekwencja nie działa lub działa niekompletnie. Urządzenie nie odpowiada mimo tego, że poprawnie skonfigurowane. Kabel od czujnika się urwał bo elektrycy nie zostawili pętli zapasowej. TIA się  „wykrzaczy” a to już wersja V16 udp.4. Wymiana danych nie działa. GSD zepsute. Boże, mówi człowiek do siebie. Co ja tutaj robię. To jest jakieś szaleństwo. Ale to tylko ułamek problemów automatyka podczas uruchomienia. Stres i ciągła walka z czasem staje się często nie do zniesienia. Ale tylko świadomość tego, że taką sobie drogę człowiek obrał utrzymuje go w przekonaniu o słuszności podjętej decyzji. Bo nic tak nie raduje ostatecznie jak ożywiona maszyna za pomocą tzw. “krzaczków”. Dopiero lata doświadczeń i podjęcie wielu prób podczas uruchomienia sprawiają, że kolejne wyzwania stają się już bardziej “kontrolowalne”. Zdobyta wiedza pozwala na kontrolowanie poziomu stresu i przygotowania się psychicznie do kolejnej bitwy. Doświadczył tego chyba każdy automatyk-programista z krwi i kości.

Chwila w której wszystko w końcu się ustabilizuje i zaczyna się zazębiać i produkcja rusza z buta, jest zwyczajnie nieoceniona. Ale co robić jak produkcja już poprawnie idzie a nadzór trwa i programista się zaczyna nudzić. Siedzi człowiek i patrzy jak jego dzieło dobiegło końca. Paczka podjechała, kod z czytany, pozycjonowanie wózka, przenoszenie i obrót stołu, siłownik przód, tył itd. Ale to zasuwa. Udało się. Jest dokładnie tak jak chcieliśmy.. albo raczej tak jak klient chciał.

Jeszcze małe poprawki, dodanie kilku alarmów, parę detali na wizualizacji i w zasadzie po tygodniu asysty przyjdzie czas pożegnać się budową. I w tym momencie ma się uczucia ambiwalentne. Chęć powrotu do domu jest tak samo silna jak strach przed tym, że coś się „wykrzaczy” zaraz po wyjeździe (jakie szczęście, że jest zdalny dostęp). No ale zakładamy, że już wszystko jest dobrze i można spokojnie zacząć oddychać a puls w końcu się stabilizuje. Pierwszy dzień. Niepewność przeplata się z nudą. Drugi dzień nuda przeplata z niepewnością z przewagą nudy. Idzie produkcja. Na trzeci dzień zaczyna rozpierać energia. Pojawia się myśl. Zrobiłbym coś. Coś bym napisał ale już nie ma co. No i wtedy do ręki wpada telefon i szybciutko czas leci na grach retro. Czwarty dzień. Myśl się upomina, ale miałem coś zrobić a nie tracić czas. I tu nagle jak grom z nieba. A może znowu sobie napiszę swoją grę. Czemu nie. Przecież to tylko kawałek kodu. Nie jest to coś nowego bo zresztą sam już napisałem ich kilka i są też tacy maniacy jak ja zatem po chwili zastanowienia i ułożenia koncepcji algorytmów pada decyzja, do dzieła. Piszemy.

Rozwijając w tym artykule zagadnienia dotyczące programowania w języku SCL pokażę Wam przy okazji kilka być może przydatnych sposobów kodowania i rozwiązań programistycznych, które być może posłużą kiedyś komuś za pewny rodzaj inspiracji. Zapraszam do krótkiego aczkolwiek myślę treściwego artykułu. Miłego czytania i zdobywania nowej wiedzy bawiąc się.


Konsola

Skoro już padła decyzja to nie ma odwrotu. Trzeba zacząć tworzyć rozwiązanie. Pierwsza myśl jaka przychodzi do głowy to gra retro. W końcu 2 dni temu piłowałem je na telefonie. Lata 80 to czas wysypu przeróżnej maści konsoli do gier. Zarówno tych stacjonarnych jak i przenośnych. Jedną z popularnych przenośnych konsoli do gier była znana i lubiana mała konsolka rosyjskiej firmy ELEKTRONIKA. Robiła furorę na dzielnicy. Jajko, ośmiornica czy autoslalom królowały na podwórku i trzepaku. Każdy się wymieniał z każdym. Byleby pobić rekordy swoich dzielnicowych kolegów. To właśnie dlatego decyzja padała na jedną z nich. Autoslalom.

Autoslalom to prosta aczkolwiek wciągająca gra w której gracz staje się kierowcą bolidu i pędzi do przodu przez autostradę wyprzedzając wszystkich tych którzy jadą wolniej. Jedyny cel to nie dać się rozbić i zdobyć jak najwięcej punktów. Wspaniale. Koncepcja prosta i szybka w implementacji. Wystarczy inkrementacja 3 rejestrów typu INT do przemieszczania się obiektów oraz 1 również INT do przemieszczania się naszego bolidu. Da się to szybko zrobić. Więc przygody zacząć czas.

Koncepcja

Aby móc sobie zwizualizować od strony technicznej koncepcję programową narysujmy sobie poniższy szkic blokowy.

Wyróżnić można 3 tory. Na każdym torze znajdować się będzie jedno auto i będzie się przemieszczać po wizualizacji od góry do dołu. Zmienne typu INT 1..3 będą podtrzymywać informację o położeniu na trasie danego nadjeżdżającego auta. W naszym przykładzie będziemy mieli aż 8 pozycji. Natomiast nasz bolid będzie przeskakiwał po linii prostej pomiędzy torami 1..3 a jego informacja będzie zawarta w zmiennej INT4. Zatem sama koncepcja gry jest mocno uproszczona i nie wymaga większej logiki i  obliczeń jak tylko prostej i cyklicznej inkrementacji w zasadzie 4 rejestrów i analizy punktu kolizji i czasu. Jeżeli auta zderzą się w pozycji 8 danego toru to nastąpi zderzenie czyli tzw. Game Over. W przeciwnym razie ominięcie nadjeżdżającego auta pozwoli nam na zdobycie punktu i dalszą jazdę do przodu. 

Istotnym zagadnieniem w naszym przypadku jest randomiczność wypuszczania i generowania różnych czasów obiektów czyli fachowo mówiąc czasów generacji i inkrementacji zmiennych aby gra miała sens. Tylko w ten sposób osiągniemy różnorodność i niepowtarzalność każdej sesji.

Aby móc zapamiętywać najlepszy wynik oraz najlepszego playera niezbędne będzie zabezpieczenie również dodawanie rekordów dla podtrzymania tej informacji czyli prosty rejestr licznikowy.

Wizualizacja

Tutaj nie było co wymyślać. W internecie można odnaleźć wiele zdjęć prezentujących te konsole. Nie pozostało nam nic jak uruchomić program graficzny i samodzielnie wykonać wizualizację. Po godzinie prac graficznych konsola została stworzona. Do złudzenia przypomina stare poczciwe rosyjskie (albo raczej na ten czas radzieckie) konsolki firmy ELEKTRONIK. W naszym przypadku wielkość matrycy została dopasowana do panelu operatorskiego KTP400 TP Comfort o rozdzielczości 480x272px. Aby zapewnić użytkownikowi najlepsze rozplanowanie przycisków sterujących zadbano o prostotę. Przycisk LEFT oraz RIGHT służą do przemieszczania się bolidu a pozostałe umożliwiają obsługę gry. Mamy też do dyspozycji przycisk RESET oraz START, dzięki którymi rozpoczniemy grę na nowo.  Po zaimplementowaniu podkładu dla wizualizacji widok prezentuje się jak poniżej.

Best user oraz Best score przypominać nam będą o pozycji najlepszego gracza jednocześnie wprawiając nowego playera w stan emocjonalnego podniecenia i rywalizacji. Musimy jeszcze dodać do wizualizacji transparentne przyciski i sparametryzować je tak aby spełniały naszą funkcjonalność. Pod pola dotykowe przycisków przypisane zostały właściwe bity sterujące uruchamiające daną akcję. 

Kodowanie

Na tym etapie pozostała już tylko kwestia oprogramowania. W dalszych krokach opiszę kod programu realizujący daną funkcję programową. W naszym przypadku zastosowaliśmy język SCL dający nam nieograniczone możliwości twórcze. 

Cały kod zamyka się w tylko w 109 linijkach edytora SCL. W pierwszym kroku zaczniemy od wygenerowania liczby randomicznej. Uzyskać to możemy np poprzez wykorzystanie funkcji TIME_TCK. W naszym przypadku zawęzimy zakres liczbowy od liczby od 500 do 3000 i będzie to w naszej grze dynamiczny zakres podstaw czasu szybkości jazdy lub fachowo mówiąc czasów inkrementacji. Dla celów wyzwalania procesów w linii 6 przygotowany został impuls zbocza narastającego, który wykorzystany zostanie w dalszej części programu. Musimy również zadbać o to aby nasze pojazdy wyzwalane były w różnych od siebie czasach i prędkościach jazdy. Do tego będziemy cyklicznie inkrementować liczbę, która będzie wyzwalaczem procesu dla każdego z toru. Jeżeli wystąpi dana liczba identyfikująca dany tor i spełnione zostaną odpowiednie warunki logiczne musimy uruchomić odpowiedni licznik inkrementacyjny bolidu na torze. Do określania i/lub zmiany wygenerowanych i podstaw czasu inkrementacji posłuży nam kolejny kod jednak w tym miejscu timery typu TON zostały zaimplementowane a podstawy czasu zapisywane będą w strukturze danych car[3] w zmiennej t_tv mającą dane typu Time. Zmienna t1_tv potrzebna nam jest do przekształcenia wygenerowanej liczby do zmiennej typu czas, która będzie wykorzystywana później w kodzie głównym gry jako zmienna podstawiająca czas dla naszych timerów.

Sekwencja główna

Poniżej to układ sekwencyjny. Rozpisane kroki programowe jasno precyzują co musi się stać i kiedy aby umiejętnie zarządzać procesem gry. Nasza sekwencja składa się tylko z 4 kroków.

Krok 1. 

Oczekujemy na interakcję gracza. Jeśli przyciśnie przycisk START to nasz system odczyta prośbę i przejdzie do kroku 2.

Krok 2.

W tym kroku wymuszamy na użytkowniku wpisanie swojego loginu aby mieć możliwość w przyszłości zapisać jego postępy na liście najlepszego użytkownika. Tu realizuje się kod gry a my skaczemy programowo do miejsca realizacji kodu podstawowego gry. Czekamy cierpliwie aż nasz gracz popełni błąd i dojdzie do kolizji. Tak długo jak mu się udaje tak długo będziemy zliczać jego punkty.

Krok 3.

W tym kroku znajdziemy się już po katastrofie bolidu. Dodatkowo sprawdzimy czy wynik jaki zdobył nasz player jest większy od rywala. Jeżeli tak będzie na zmienimy wynik a jego login od tej pory stanie się najlepszy. Będzie miał zaszczyt bycia najlepszym do czasu gdy nie pokona go inny użytkownik.

Krok 4. 

To koniec sekwencji. Ogłaszamy światu koniec gry i czekamy na reset. Jeżeli nasz użytkownik zresetuje grę to nasza sekwencja zostanie ustawiona do pozycji startowej czyli wszystkie rejestry zostaną wyzerowane.

Sekcja PLAY to sekcja kodowa algorytmu gry. To właśnie tutaj odbywają się procesy matematyczno – logiczne. Ze względu na powtarzalność czynności i/lub funkcji obliczeniowych, zastosowana została pętla FOR. To właśnie wewnątrz jej wykonywane będą te same funkcje dla różnych instancji i zestawów parametrów. Hurtem wykonujemy impuls wyzwalania startu dla każdego z torów. Dzięki wygenerowanym różnym czasom nasze timery będą otrzymywać każdorazowo inną podstawę czasu zatem uzyskaliśmy dzięki temu losową randomiczność startu bolidów. Inicjalizacja niezbędna jest nam, aby zawsze uzyskać na starcie podstawę czasu większą od zera. Jeżeli jeszcze nie wystartowaliśmy z danym bolidem to czekamy na potwierdzenie numeru wyzwalacza toru. Po uruchomieniu się 3 torów uruchamiamy proces inkrementacji naszych rejestrów. Jeżeli osiągną one liczbę większą od 8 to resetujemy proces i czekamy ponownie na jego aktywację.

Sekcja crash to sedno naszej gry. To tutaj sprawdzamy, czy nasz bolid uderzył w nadjeżdżającego przeciwnika lub też nie. W przypadku kolizji na którejkolwiek pozycji nasz program zgłosi stan kolizji w przeciwnym razie zaliczy punkt. Stan kolizji ma miejsce, wtedy gdy licznik zdołał się wypełnić, a na jego właściwym torze stał nasz pojazd. 

W linijkach 94-97 to najzwyklejsze w świecie dodawanie punktu, czyli zwykła inkrementacja zmiennej INT tj. i:=i+1;

Cały pozostały kod odpowiedzialny jest za poruszanie się naszego obiektu wzdłuż linii poziomej. Dzięki przyciskom LEFT oraz RIGHT również inkrementujemy licznik w zakresie od 1-3 a na wizualizacji zaznaczamy opcję visibility zależną od aktualnej liczby. Tak samo należy zrobić dla każdego bolidu.

W zasadzie to tyle. Skonstruowany kod został możliwie uproszczony, aby wykonywał się prosto i powtarzalnie. Działanie skryptu można zaobserwować na poniższym video YT zamieszczonym pod wskazanym linkiem.

Podsumowanie

Cały proces twórczy od A-Z zajął tylko 8h. Całą dniówke. Był to jednak chyba jeden z najciekawszych dni podczas uruchomienia, a to co po nas zostało do dzisiaj świadczy o tym, że Veni, Vidi, Vici. Operatorzy dopytują do dzisiaj czy jest szansa na coś nowego, bo na nocnej zmianie zdarza się czasami naprawdę, że nie ma co robić i przydałoby się jeszcze w coś pograć. Sprawia to radość, że takim prostym kodem można umilić komuś czas a sobie po raz kolejny udowodnić pasję i radość z wykonywanego zawodu. Nie kosztowało mnie to zbyt wiele a wręcz przeciwnie to dręczące pytanie, jak to najprościej wykonać dręczyło mnie tak bardzo, że uległem tej wewnętrznej pokusie uproszczenia tego kodu do minimum. Praca nie musi być ciężka. Ona może również być bardzo przyjemna mimo tych wszystkich tych sytuacji stresujących. To wszystko zależy od nas i naszego podejścia. Pracuj tak, aby po paru latach nie czuć wypalenia zawodowego tylko ciągłą radość z obranego kierunku zawodowego, jakim jest programista PLC, a jeżeli czujesz się znudzony to .. być może musisz przestać narzekać i ostatecznie zmienić pracę.



Utworzono: / Kategoria:

Reklama



PRZECZYTAJ RÓWNIEŻ



NAJNOWSZE PUBLIKACJE OD UŻYTKOWNIKÓW I FIRM

Reklama



POLECANE FIRMY I PRODUKTY
  • ÖLFLEX® CLASSIC 110 – elastyczny przewód sterowniczy do różnych zastosowań, w płaszczu z PVC, aprobata VDE, odporność na oleje, 300/500 V, również do YSLY lub YY CPR: informacje pod adresem www.lapppolska.pl Certyfikat zgodności VDE z...
  • Bezpieczny, prosty w obsłudze i energooszczędny Seria serwowzmacniaczy Mitsubishi Electric MELSERVO MR-J4 wraz z kompatybilnymi modułami pozycjonującymi oraz zaawansowanymi kontrolerami motion, umożliwia konstruktorom maszyn i urządzeń oraz...
  • Nowoczesne dotykowe panele operatorskie HMI firmy WEINTEK Labs. – Bezpłatne oprogramowanie narzędziowe w pełnej wersji – Precyzyjne, dotykowe ekrany wyświetlające szczegółową grafikę – Obszerne biblioteki komponentów grafi...
  • Produkty i rozwiązania firmy SICK są równie różnorodne jak codzienność w przedsiębiorstwie. Szkolenia SICK dla użytkowników umożliwiają zdobycie wiedzy na temat zróżnicowanej oferty naszych innowacyjnych produktów w formie dostosowanej do k...
    Link: Terminy
  • 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...
  • Wyświetlacz słupkowy ITP15 jest kompaktowym wskaźnikiem procesowym, który wizualizuje analogowy sygnał wejściowy w zakresie od 0 do 100% z 10 słupkami po 10%. Sygnałem wejściowym może być liniowy sygnał napięciowy 0 (2) -10 V lub sygnał prą...