Programowanie robota można porównać do rozmowy z obcokrajowcem. Jeżeli chcemy, żeby robot nas zrozumiał i wykonywał to o co go prosimy, musimy mówić jego „językiem”. Każdy z wymienionych robotów w niniejszym artykule ma właśnie taki własny „język”.

W drugiej części artykułu kontynuujemy analizę pojęcia stałej i zmiennej programowej oraz na ich występowaniu w środowisku programowym FANUC.

I tak kolejnym sposobem zapisu pozycji jest wykorzystanie współrzędnych osiowych (JOINT). Przykładowo:

Uczymy się języka robotów foto 1 cz 2 blog Robo Challenge

Jak widać na zdjęciu wyżej mamy zapisane wartości bezwzględne osi. Ten typ zapisu jest wygodny i bezpieczny dla pozycji robota, które nie powinny zależeć od zdefiniowanych układów kartezjańskich, np. pozycji wyjściowej robota w aplikacji (HOME).

Dla pozycji wykorzystywanych w programach lepiej jest zastosować zapis kartezjański między innymi po to, aby:
– możliwe było wyobrażenie sobie ułożenia robota w przestrzeni (szczególnie w zdefiniowanych układach),
– w łatwiejszy sposób odczytać wartości,
– poddać edycji wartości oraz zastosować offsety do pozycji.

Bardzo przydatnym trikiem jaki nie raz używaliśmy to możliwość łatwej zmiany współrzędnych pomiędzy typem osiowym a kartezjańskim. Dzięki niemu łatwo możemy „naprawić” niechlujnie przeuczoną bazę, bez konieczności przeuczania wszystkich punktów programu.

Tajemny sposób to zmiana wszystkich punktów napisanych w danej bazie na współrzędne osiowe (robot zachowa prawidłowe pozycje w programie), następnie przeuczenie bazy i powtórna zmiana na współrzędne kartezjańskie. Bez tego zabiegu, zmiana bazy przesunęłaby wszystkie trajektorie – a tak pozwala nam to na wyczyszczenie kodu.

c) Rejestry znaków (SR[numer])

Uczymy się języka robotów foto 2 cz 2 blog Robo Challenge

Rejestry znaków (SR[numer])

No i wreszcie nasze tytułowe „stringi”. Mi jako programiście słowo kojarzy się z typem danych, ale zasięgając opinii osób spoza branży jednak z częścią garderoby (nie wiem, dlaczego, ale możecie się podzielić w komentarzach swoim pierwszym skojarzeniem😉).

String registers to rejestry ciągu znaków, w których można zawrzeć informację opisaną zarówno znakami jak i liczbami. Wizualnie mogą więc wyglądać jak zmienne zawierające np. wartość real, natomiast dla robota są tylko „obrazkiem” liczby. Posłużmy się przykładem, aby to lepiej zobrazować. Co się stanie jeśli wykonamy takie operacje jak na obrazku niżej?

STOP
Zastanówcie się przez chwilę sami nad wynikiem w rejestrach SR[3] oraz SR[4], ponieważ na kolejnym zdjęciu zobrazuję, jak wygląda rezultat wykonany przez robota.

RESUME

Jak widać na zdjęciu wyżej jeżeli dodamy zwykłe dwa rejestry będące wartością liczbową (R[1]+R[2]) to w string register (SR[3]) otrzymamy wynik z operacji matematycznej. W drugim przypadku gdy dodamy do siebie dwa rejestry ciągu znaków (SR[1]+SR[2]) to w wyniku (SR[4]) otrzymamy dodanie do siebie znaków ASCII, które tylko „wyglądają” jak liczby.

W drugim przykładzie spróbujemy stworzyć jakąś przydatną wiadomość i przechować ją w string register. Co się stanie po dodaniu do siebie SR – to już wiemy z przykładu wyżej, ale co się stanie, gdy dodamy do SR zwykły rejestr R? Przykładowo aktualnie wybrany typ w produkcji?

STOP
Chwila na zastanowienie… Zakładam, że już znasz odpowiedź, a więc…

RESUME

Chyba nie było zaskoczeniem jaki rezultat otrzymaliśmy? Tak więc można trochę pododawać i pomieszać w tym programowaniu.

Teraz trochę ciekawsze zadanie. Jak zrobić, aby zapisać wiadomość do danego SR[]?
SR[1]=’Wiadomosc’ ? Nieee… to by było za łatwe! Standardowo, niżej zobrazowany przykład:

Teraz „na szybko” co jest co 😊. Funkcja CALL() pozwala nam na wywołanie innego programu,  a w nawiasach „wrzucamy” jakich argumentów (AR[]) możemy użyć w funkcji (jako zmienne lokalne między innymi, ale to dalej). W programie STRING_WIADOMOSC_CHAR używamy AR do zapisania komunikatu w pamięci SR.

STOP
Chwila na zastanowienie nad rezultatem….

RESUME

No i już jest zapisana wiadomość!

Dodatkowo z poziomu wykonywanego samego programu można skorzystać na następujących opcji:
STRLEN -> sprawdzenie ilości znaków w danym SR[],
STRSUB -> daje nam możliwość „wyciągnięcia” konkretnego fragmentu string,
FINDSTR -> pozwala na wskazanie w danym SR[], na którym miejscu znajduje się fragment innego string,

d) Dodatkowo w robocie do zapisu i przesyłania informacji służą wejścia/wyjścia cyfrowe (DI/DO).
Połączenie ich w grupę sygnałów daje nam możliwość zapisu/odczytu wartości całkowitych (int).

Na powyższym przykładzie sygnały bitowe od DO[1] do DO[16] zostały połączone w grupę sygnałową składającą się sumarycznie z dwóch bajtów danych (16 bitów). Można dzięki temu przesłać wartości całkowite do urządzenia zewnętrznego.

W zależności, które wyjście jest ustawiane na On/Off otrzymujemy konkretną wartość. Zakres przesyłania danych całkowitych jest możliwy w obszarze od 0 do 65535. Zapis konkretnej wartości jest dwukierunkowy tzn. możemy wpisać konkretną wartość całkowitą w grupie sygnałowej (prawa kolumna) i zapalą się konkretne bity po lewej stronie i odwrotnie. Wartość ta widoczna jest w zapisie dwójkowym w DO/DI, a w zapisie dziesiętnym w GO/GI.

Przykładowo: Chcemy wysyłać do sterownika PLC wartość równą 1000, a więc zostaną zapalone odpowiednie bity:

W środowisku programowania FANUC możemy sięgnąć do języka KAREL, który daje większe możliwości tworzenia struktur oraz operacji na nich wykonywanych. Podstawowe typy danych dostępnych w KAREL:
a) INTEGER -> wartość całkowita,
b) REAL -> wartość rzeczywista,
c) BOOLEAN -> wartość stanu TRUE/FALSE,
d) STRING -> ciąg znaków,
e) VECTOR -> struktura XYZ składająca się z trzech wartości REAL,
f) CONFIG -> struktura orientacji osi robota do punktu, składająca się z trzech wartości INTEGER oraz czterech wartości BOOLEAN,
g) POSITION -> struktura (dokładniej macierz) pozycji składająca się z czterech wartości VECTOR oraz wartości zapisanej w CONFIG,
h) XYZWPR -> struktura składająca się z łącznie sześciu wartości REAL (pozycji x,y,z oraz orientacji w,p,r) oraz wartości zapisanych w CONFIG,
i) XYZWPREXT -> struktura bardzo zbliżona do XYZWPR, zawiera dodatkowo informacje o osiach zewnętrznych z wartościami typu REAL,
j) JOINTPOS -> struktura składająca się z domyślnie dziewięciu wartości typu REAL odnoszących się do zapisanych w poszczególnych osiach robota.

Przykład jak wygląda deklaracja stałych i zmiennych w KAREL:

Podsumowując, w środowisku programowania robotów FANUC jesteśmy w stanie użyć ogólnie dostępne typy zmiennych, należy się zawsze zastanowić w jakim celu tworzymy daną zmienną/stałą, aby odpowiednio zadeklarować jej typ. Dostępne struktury (pozycje, tool&base robota) są tworzone przy użyciu podstawowych typów danych (int, real, bool, string). Przy programowaniu w każdym środowisku tak naprawdę ogranicza nas własna wyobraźnia (i czas potrzebny na zrealizowanie projektu).

KONIEC CZĘŚCI DRUGIEJ

Autor: Karol Grońskirobotycy.com

robotycy.com partner Robo Challenge logo