Języki programowania robotów przemysłowych
Cezary Zieliński drukuj
Pierwsze roboty przemysłowe zaczęto wykorzystywać w fabrykach pięćdziesiąt lat temu. Naturalnym jest, że w tak długim okresie rozwój technologii elektronicznych i informatycznych musiał mieć duży wpływ na sposób sterowania tymi urządzeniami. Aktualny stan techniki w tej dziedzinie najlepiej zobrazować, analizując języki programowania robotów przemysłowych różnych producentów. Artykuł ten nie tylko prezentuje w skrócie języki obecnie stosowane przez dziesięciu producentów robotów, ale również pokazuje kontekst, w jakim były one tworzone.
Wprowadzenie
W literaturze fachowej dotyczącej robotyki termin „programowanie robotów” nie jest zdefiniowany precyzyjnie. Część autorów uważa, że odnosi się on do całości oprogramowania związanego ze sterowaniem, modelowaniem i symulacją działania robotów. Inni natomiast traktują to pojęcie o wiele węziej, ograniczając się do metod specyfikacji zadań, które robot ma wykonać. W artykule będziemy się odnosić do tej węższej interpretacji. Należy jednak zaznaczyć, że granica rozdzielająca oba podejścia jest rozmyta. Niekiedy trudno jest rozgraniczyć, gdzie się kończy oprogramowanie sterujące, a gdzie zaczyna oprogramowanie interpretujące program określający, jakie czynności ma wykonać robot.
Generalnie sposoby programowania robotów przemysłowych można podzielić ze względu na sposób wyrażania programu działań robota na:
- tekstowe, a w tym graficzne (off-line),
- nietekstowe (on-line),
- hybrydowe (zawierające w sobie obie powyższe formy).
Forma tekstowa sprowadza się do napisania programu działań robota za pomocą edytora tekstu, a następnie przekazania jego treści sterownikowi do interpretacji lub, niezmiernie rzadko, po wcześniejszej kompilacji programu. Zaletą tej formy programowania jest to, że nie wymaga uczestnictwa robota w tworzeniu programu, a więc może on wtedy wykonywać inne czynności produkcyjne. Innymi zaletami jest łatwość dokumentacji programu, możliwość pisania programów wariantowych, łatwe wykorzystanie informacji pochodzących z czujników oraz łatwość wprowadzania lokalnych zmian do treści programu. Roboty przemysłowe cechuje duża powtarzalność wykonywanych ruchów, ale mała dokładność. Innymi słowy, powracanie do raz wskazanego miejsca wykonywane jest z dużą precyzją, ale numeryczne wyrażenie pozycji i jej rzeczywiste osiągnięcie mogą być obarczone dużym błędem. W związku z tym w przypadku programów stworzonych w formie tekstowej trzeba przeprowadzić żmudną i nie zawsze możliwą do matematycznego zdefiniowania procedurę kalibracji pozycji, które robot ma osiągnąć.
Forma nietekstowa była pierwotnym sposobem programowania robotów przemysłowych. Były one programowane przez uczenie, występujące w dwóch odmianach: PTP (point-to-point) i CP (Continuous Path). Pierwsza z nich wiązała się z ustawianiem ramienia robota w kolejnych pozycjach i zapamiętywaniem tych pozycji przez sterownik w wyniku naciśnięcia przez programistę odpowiedniego przycisku na panelu programowania. Przy odtwarzaniu ruch między zapamiętywanymi pozycjami był interpolowany. Druga wymagała wodzenia manipulatora wzdłuż pożądanych trajektorii, natomiast to układ sterowania z pewną częstotliwością zapamiętywał aktualne pozycje ramienia. Niektóre sterowniki umożliwiały odtwarzanie zapamiętanej trajektorii albo w zwolnionym, albo w przyspieszonym tempie. Zaletą obu tych metod uczenia jest to, że nauczone pozycje odtwarzane są precyzyjnie dzięki dużej powtarzalności robotów przemysłowych. Wadą jest brak dokumentacji programu, trudność w wykorzystaniu informacji z czujników, niemożliwość wariantowego wykonania programu oraz kłopot z modyfikowaniem programów.
Nietrudno zauważyć, że formy tekstowe i nietekstowe są komplementarne względem siebie, Stąd obecne sterowniki robotów przemysłowych wykorzystują metody hybrydowe. Nieliczne pozycje kluczowe dla wykonania programu są uczone, natomiast większość pozostałych określanych jest w programie numerycznie względem tych nauczonych. Do form tekstowych wyrażania programów robotów należy zaliczyć formy graficzne, w których zamiast tekstu programu tworzony jest jego diagram, np. sieć działań, wszakże wypełniana tekstem. Zamiast edytorów tekstowych używa się do tego edytorów graficznych. Natomiast do form nietekstowych należy zaliczyć uogólnienie uczenia zwane programowaniem przez demonstrację. W tym przypadku człowiek pokazuje robotowi, jakie czynności ma wykonać, a ten, obserwując tę demonstrację dzięki swoim kamerom i innym czujnikom, interpretuje pokaz i zapamiętuje czynności do realizacji. Oczywiście samo pokazanie czynności może być niewystarczające do właściwego wykonania zadania. Demonstrujemy na przykład przygotowanie jajka na miękko, którego czas gotowania zależy od tego, czy jajko zostanie włożone do wrzątku czy do zimnej wody. Ta informacja może zostać przekazana za pomocą głosu. Programowanie robotów przez demonstrację jest otwartym zagadnieniem badawczym i w związku z tym nie jest jeszcze stosowane w przemyśle.
Zadanie, które ma wykonać robot, o ile wykorzystana jest tekstowa forma wyrazu, może być przedstawione z użyciem różnych pojęć abstrakcyjnych. Zależnie od zbioru przyjętych pojęć mówi się o różnych ontologiach. W filozofii ontologia to teoria bytu, a więc nauka mówiąca, jakie twory (byty) istnieją i jakie są relacje między nimi. W przypadku języków programowania robotów również muszą być zdefiniowane byty, za pomocą których opisywane będą zadania, które robot ma wykonać. Efektor robota poruszany jest za pomocą siłowników pneumatycznych lub hydraulicznych albo silników elektrycznych. Sterowanie tymi urządzeniami wymaga ustalenia pozycji, do których mają się poruszyć. Tak więc na najniższym poziomie ontologicznym wystąpią silniki z atrybutem określającym położenie ich elementów ruchomych. Silniki poruszają członami manipulatora, które tworzą łańcuch kinematyczny, więc można odwołać się bezpośrednio do położeń par kinematycznych (złącz). Niezależnie od tego, czy odwołujemy się do silników czy wzajemnych położeń członów łańcucha kinematycznego, matematycznym wyrazem ich położenia jest wektor w przestrzeni konfiguracyjnej (złącz, przegubów). Niemniej jednak łatwiej jest opisać czynności robota przez określenie pozycji (położenia i orientacji) końcówki manipulatora w przestrzeni operacyjnej (przestrzeń położeń kartezjańskich wraz z wybraną reprezentacją orientacji). W tym celu z końcówką związuje się lokalny ortokartezjański układ współrzędnych (trójścian) i określa się położenie jego początku oraz orientację tego układu względem
globalnego układu odniesienia. Ten globalny układ odniesienia musi być wcześniej zdefiniowany. Pozycje i trajektorie ruchu trójścianu związanego z końcówką wyznacza się względem tego globalnego układu. Matematycznie wspomniane pozycje wyraża się za pomocą wektorów składających się z trzech współrzędnych początku układu oraz trzech kątów wyznaczających jego orientację za pomocą macierzy jednorodnej o wymiarach 4 × 4 albo za pomocą kwaternionu. Należy zwrócić uwagę, że powyższe ontologie odnoszą się do manipulatora, którego pozycja wyrażana jest matematycznie w różny sposób. Niemniej jednak zadania robotów dotyczą oddziaływania robota na obiekty znajdujące się w środowisku. Te obiekty znajdują się w różnych relacjach przestrzennych między sobą. Tak więc ontologie tego poziomu muszą uwzględniać zarówno obiekty występujące w środowisku, jak i wzajemne relacje, w jakich się one znajdują. Z każdym z obiektów wiązane są lokalne układy odniesienia – zazwyczaj jest ich wiele, ponieważ trzeba wyróżnić wiele charakterystycznych miejsc, związanych np. z fragmentem obiektu przeznaczonym do jego stawiania, miejscem jego chwytania oraz miejscem, które wchodzi w interakcje z innymi obiektami. Wyróżnienie samych obiektów nie wystarcza, gdyż związki między nimi wpływają na ich przemieszczanie. Sklejenie lub ześrubowanie dwóch obiektów powoduje, że niezależnie od tego, który z tych obiektów zostanie przemieszczony, drugi też się przesunie. Natomiast postawienie filiżanki na spodku spowoduje przemieszczenie tej pierwszej, gdy przesuniemy spodek, ale uniesienie filiżanki nie wpłynie na lokalizację spodka. Taka ontologia nakłada bardzo wysokie wymagania na zdolności układu sterującego robota do interpretacji skutków swoich działań. Zazwyczaj łączy się to z koniecznością istnienia co najmniej geometrycznego modelu środowiska w systemie sterującym. Obecne roboty przemysłowe jeszcze nie posiadają zdolności do operowania skomplikowanym modelem geometrycznym środowiska. W dalszej części artykułu zostaną przedstawione możliwości układów sterowania robotów przemysłowych dostępnych na polskim rynku. Te możliwości definiowane są przez języki ich programowania.
Języki programowania robotów przemysłowych
Obecne roboty przemysłowe programowane są zazwyczaj z użyciem panelu programowania, który dołączony jest do sterownika robota za pomocą długiego kabla lub łącza radiowego, umożliwiającego zbliżenie się operatora do miejsca, w którym robot ma wykonać swoje operacje. Alternatywnie program może być tworzony z wykorzystaniem komputera i edytora tekstowego. Jednak zawsze panel programowania jest potrzebny do wprowadzenia do sterownika robota współrzędnych pewnych szczególnych miejsc związanych z realizowanym zadaniem – co, jak wspomniano, określane jest jako uczenie robota. Większość języków programowania robotów była wzorowana na języku BASIC, przy czym dodano oczywiście typy danych związane z opisem geometrycznym pozycji końcówki robota oraz miejsc charakterystycznych otoczenia. Stąd pewna inklinacja do operowania zmiennymi globalnymi oraz zachowanie instrukcji skoku GOTO. Istnieją również języki programowania robotów, które w większym stopniu były wzorowane na językach strukturalnych, a w szczególności na języku Pascal. Rozgraniczenie języków na te dziedziczące po BASIC-u i po Pascalu nie jest wyraźne – mamy raczej do czynienia z płynnie przesuwającą się granicą.
Poziom ontologiczny języka programowania robotów wyznaczają przede wszystkim instrukcje ruchowe tego języka. Praktycznie we wszystkich przedstawionych poniżej językach instrukcje te odnoszą się albo do końcówki manipulatora, albo do jego złącz, a więc widać, że poziomy ontologiczne mogą być wymieszane w ramach jednego języka. Końcówką jest albo narzędzie, albo pewne miejsce charakterystyczne trzymanego
przedmiotu. W przypadku narzędzi typu: aparaty spawalnicze, zgrzewarki lub pistolety lakiernicze rozkazy odnoszą się do pozycji części roboczej narzędzia. W przypadku chwytaków argumenty rozkazów ruchowych stanowią: pozycja punktu centralnego znajdującego się między szczękami lub, po uchwyceniu przedmiotu, jakaś jego część charakterystyczna, np. spód.
Prócz instrukcji ruchowych języki te mają instrukcje sterujące wykonaniem programu, instrukcje podstawienia skojarzone ze zdolnością do obliczania wyrażeń matematycznych oraz rozkazy służące do sterowania urządzeniami współpracującymi i do pozyskiwania odczytów z czujników. Istotne jest, na jakich typach danych można prowadzić obliczenia matematyczne. Analizując poszczególne języki programowania robotów, należy przedstawić zarówno typy danych, na których operują instrukcje, jak i repertuar tych instrukcji, ze szczególnym uwzględnieniem rozkazów ruchowych. Ponadto istnieją konstrukcje językowe umożliwiające obsługę przerwań oraz reakcję na wykryte błędy.
Język programowania robotów ABB – RAPID
Dane, na których działają programy napisane w języku RAPID, mogą być: stałe, zmienne oraz zmienne trwałe (PERSISTENT). Te ostatnie zachowują swą wartość nawet po zakończeniu działania programu, a więc po jego restarcie te wartości mogą być wykorzystane. Podstawowymi typami danych są dane numeryczne (zarówno liczby całkowite, jak i zmiennoprzecinkowe), ciągi znaków (STRING) i wartości logiczne, a ponadto dane geometryczne, takie jak: wektory trójskładnikowe odpowiadające punktowi, orientacje, pozycje trójścianów, wektory opisujące aktualny stan złącz manipulatora.
Powyższe dane wykorzystywane są jako argumenty podprogramów (procedur i funkcji) oraz do budowy wyrażeń matematycznych wykorzystywanych przez instrukcje podstawienia. Sterowanie wykonaniem programu realizowane jest standardowymi instrukcjami wyboru (IF, TEST), pętlami (FOR, WHILE), za pomocą instrukcji skoku (GOTO) oraz wywołaniami podprogramów. Instrukcji GOTO oczywiście należy unikać, stosując się do ogólnie przyjętych zasad programowania strukturalnego. Programy tworzone są jako moduły składające się z danych oraz kodu operującego na tych danych. Język umożliwia stosowanie wielowątkowości (wielozadaniowości), gdzie przykładowo równolegle do wykonywania ruchu uruchamiana jest procedura sterująca aparatem spawalniczym. W języku zachowano wywodzący się z języka BASIC brak rozdziału na instrukcje dotyczące obliczeń od poleceń dla systemu operacyjnego, stąd polecenia zapamiętania lub załadowania programu. Sterownik IRC-5, który interpretuje język RAPID, ma możliwość porozumiewania się za pomocą łącz szeregowych z panelem programowania, pamięcią masową, dołączonymi czujnikami oraz komputerem nadrzędnym. Język rozróżnia sygnały analogowe od cyfrowych. Umożliwia oczekiwanie przez określony czas (WAITTIME) albo na zdarzenie sygnalizowane zaobserwowaniem zmiany na wejściu lub wyjściu (WAITDI, WAITDO). Ta druga możliwość dotyczy zmiany wyjścia sterownika spowodowanej przez równolegle działający program.
Język RAPID ma dość długą listą instrukcji ruchowych. Ich parametrami są takie wielkości jak: prędkość i przyspieszenie ruchu, masa przenoszonego obiektu, konfiguracja ramienia (istotna przy wyborze pożądanego rozwiązania odwrotnego zagadnienia kinematyki), sposób zachowania ramienia manipulatora w pobliżu osobliwości kinematycznej, wybór osi podatnych, parametry serwomechanizmów oraz restrykcje dotyczące przestrzeni roboczej. Wszystkie instrukcje ruchów są typu PTP, czyli ruch od aktualnego położenia do wskazanego argumentem, przy zadanym sposobie interpolacji. Stosowane są następujące metody interpolacji: kołowa (MoveC), liniowa (MoveL) – obie w przestrzeni operacyjnej oraz liniowa w przestrzeni złącz manipulatora (MoveJ). Ruchy mogą być wykonywane względem globalnego układu odniesienia (MoveAbsJ) lub układu związanego z aktualnym położeniem manipulatora (MoveJ). W trakcie ruchu mogą być aktywowane wyjścia sterownika (MoveCDO, MoveJDO, MoveLDO). Równolegle z wykonaniem ruchu może być uruchamiana procedura, przykładowo sterująca urządzeniem współpracującym (MoveCSync, MoveLSync). Mogą również być wykonywane ruchy poszukiwawcze (SearchC, SearchL). Ponadto istnieją bogate biblioteki procedur wspomagających oprogramowywanie różnych zadań, np. spawanie lub zgrzewanie.
Język programowania robotów KUKA – KRL
Do programowania robotów firmy KUKA wykorzystywany jest język proceduralny KRL (KUKA Robot Language), podobny do języka Pascal. Podstawowymi typami danych używanymi w KRL są liczby całkowite, zmiennoprzecinkowe, wartości logiczne oraz typ znakowy – pojedynczy znak ASCII. Z danych podstawowych można tworzyć dwu- lub trójwymiarowe tablice oraz struktury. Oprócz tego w języku istnieją struktury predefiniowane, służące do opisu pozycji manipulatora za pomocą położenia jego poszczególnych osi (AXIS) lub przez zadanie współrzędnych położenia i orientacji końcówki w przestrzeni kartezjańskiej (POS), oraz do reprezentacji dodatkowych układów współrzędnych względem układu bazowego (FRAME). Struktury typu E6AXIS oraz E6POS zawierają ponadto pozycje osi dodatkowych urządzeń współpracujących z robotem. W celu jednoznacznego opisu pozycji manipulatora struktury POS i E6POS zawierają również pola określające, w której części zakresu ruchu znajdują się poszczególne osie robota.
Poza typowymi instrukcjami, takimi jak przypisanie wartości wyrażenia matematycznego do zmiennej, instrukcje warunkowe oraz pętle, KRL ma instrukcje specyficzne dla zadań robotów, służące do zadawania ruchu: PTP – ruch do zadanego punktu i orientacji w przestrzeni przy stałej prędkości każdej osi z osobna (szczególnie przydatny, jeżeli na drodze do zadanego punktu znajdują się punkty osobliwe kinematyki manipulatora), LIN oraz CIRC – ruch końcówki do zadanego punktu i orientacji po linii prostej lub łuku w przestrzeni operacyjnej (kartezjańskiej). Możliwe jest również sklejanie oraz wygładzanie trajektorii ruchu, co usprawnia wykonanie programu oraz zmniejsza przyspieszenia występujące podczas ruchu. W tym celu dodatkowy licznik programowy wyprzedza rzeczywiste wykonanie programu i jest używany do planowania ruchu wprzód.
Użytkownik ma kontrolę nad dużo większą liczbą parametrów ruchu, niż wynika to z liczby argumentów polecenia ruchu. Takie wartości jak (w zależności od możliwości sprzętowych konkretnego manipulatora) profil prędkości, maksymalne przyspieszenia czy pożądane siły, wywierane wzdłuż osi odpowiednio zdefiniowanych układów współrzędnych, ustawia się, korzystając z predefiniowanych zmiennych globalnych. Podobnie dostęp do wejść oraz wyjść sterownika jest zapewniony przez predefiniowane zmienne globalne $IN[] i $OUT[] (dla wejść i wyjść cyfrowych) oraz $ANIN[] i $ANOUT[] (dla analogowych). Istnieją również zaawansowane polecenia obsługi wejść i wyjść, jak np. PULSE (impulsowy sygnał wyjściowy), SYN OUT bądź SYN PULSE (ustawienie stanu wyjścia synchronizowane z wykonaniem pewnej części trajektorii). Do synchronizacji z upływem czasu służą m.in. instrukcje WAIT (zatrzymanie programu na określony czas), WAITFOR (oczekiwanie np. na odpowiedni stan wejścia lub wyzerowanie czasomierza) oraz HALT (oczekiwanie na zezwolenie operatora na dalsze działanie).
Firma KUKA wytwarza również roboty, które mogą być stosowane zarówno w przemyśle, jak i do celów badawczych. Są to roboty LWR (Light-Weight Robot Arm) o udźwigu do 7 kg, przy ciężarze ramienia 14 kg. Roboty te są godne szczególnej uwagi ze względu na dodatkowe cechy ich języka programowania. Układ regulacji robota KUKA LWR 4+ może pracować w następujących trybach:
- regulator pozycji – wykorzystywany w większości zastosowań przemysłowych; w tym trybie robot zawsze osiąga zadaną pozycję, a podatność na odchylenia od zadanej pozycji wynika jedynie z jego własności mechanicznych;
- sterowanie impedancyjne ze sztywnością określoną w przestrzeni kartezjańskiej (Cartesian stiffness controller) – umożliwia wprowadzenie podatności oraz tłumienia parametryzowanych osobno dla osi X, Y i Z układu kartezjańskiego oraz rotacji względem tych osi; przemieszczany układ współrzędnych może być wyrażony względem układu bazowego albo układu związanego z narzędziem;
- sterowanie impedancyjne ze sztywnością określoną w stawach (axis stiffness controller) – pozwala parametryzować podatność oraz tłumienie w ruchu poszczególnych stawów manipulatora;
- tryb kompensacji grawitacji.
Parametry związane ze sterowaniem impedancyjnym przechowywane są w globalnej zmiennej $STIFFNESS. Struktura ta zawiera pola, w których można ustawić bieżący tryb pracy regulatorów, wybrany układ współrzędnych (bazowy lub narzędzia), definicje tych układów, parametry sztywności i tłumienia dla poszczególnych kierunków w przestrzeni kartezjańskiej oraz poszczególnych osi manipulatora. W strukturze $STIFFNESS ustawia się również wartości ograniczeń narzuconych na: maksymalne odchylenie od zadanej trajektorii, maksymalną siłę wywieraną przez narzędzie, maksymalny uchyb pozycji pojedynczego stawu oraz maksymalny moment wywierany przez pojedynczy staw. Do programowania ruchu ze sterowaniem impedancyjnym, oprócz typowych komend opisujących ruch w sposób pozycyjny PTP, LIN i CIRC, dodano pomocnicze komendy:
- RIGBYCONTACT i SWITCHNOW – służące do zmiany trybu sterowania, również automatycznie, po wykryciu kontaktu narzędzia z obiektem;
- DESIREDFORCE, DESIREDFORCESTART, DESIREDFORCECLEAR – do zadania siły w przestrzeni kartezjańskiej w trybie Cartesian stiffness controller.
Język programowania robotów Comau – PDL2
Roboty firmy Comau, korzystające ze sterowników C5G, programowane są za pomocą języka PDL2. Jedna jednostka C5G może sterować kilkoma manipulatorami (do 40 osi). Język ten jest wzorowany na Pascalu. PDL2 umożliwia wykonywanie wielu programów równolegle. Programy dzielą się na wstrzymywalne (wstrzymywane za pomocą instrukcji HOLD, a wznawiane za pomocą instrukcji START) i niewstrzymywalne. Te pierwsze zazwyczaj dotyczą sterowania ruchem manipulatorów, natomiast te drugie – sterowania procesem technologicznym.
Język PDL2 ma rozbudowany zestaw typów danych: liczby całkowite (INTEGER) i rzeczywiste (REAL), dane logiczne (BOOLEAN), ciągi znaków alfanumerycznych (STRING), semafory, służące do wzajemnego wykluczania jednoczesnego dostępu do zmiennych globalnych różnym programom (SEMAPHORE), a ponadto dane złożone: struktury (RECORD), trójelementowe wektory (VECTOR), pozycje trójścianów wraz z konfiguracją ramienia (POSITION), wektory zmiennych złączowych manipulatora (JOINTPOS), pozycje wraz z dodanymi zestawami położeń osi urządzeń współpracujących, np. toru jezdnego, na którym zamontowano manipulator (XTNDPOS), a ponadto jedno- i dwuwymiarowe tablice (ARRAY) powyższych typów. Możliwe jest definiowanie typów użytkownika jako rekordów (NODE), co służy do budowy ścieżek ruchu manipulatora i zmiennych typu PATH. Wartości zmiennych o charakterze pozycyjnym mogą być określane przez uczenie. Sterownik C5G komunikuje się ze swym panelem programowania drogą radiową, co wydatnie ułatwia operatorowi uczenie robota. Poszczególne zmienne mogą być dostępne dla wielu programów, jeżeli zostaną zaimportowane do programu (IMPORT/EXPORTED FROM) i ich zasięg będzie zdefiniowany jako globalny (GLOBAL). Dla wszystkich typów danych, prócz XTNDPOS, zdefiniowano operatory i funkcje umożliwiające budowanie wyrażeń matematycznych.
Podstawową instrukcją ruchu jest MOVE posiadająca szereg argumentów. W szczególności należy wskazać ramię, którego dotyczy instrukcja, rodzaj interpolacji (LINEAR – interpolacja liniowa ruchu końcówki manipulatora w przestrzeni operacyjnej – kartezjańskiej, CIRCULAR – interpolacja kołowa w przestrzeni operacyjnej, JOINT – powoduje jednoczesne rozpoczęcie i zakończenie ruchu wszystkich osi), cel ruchu, który może być wyrażony względem globalnego układu odniesienia lub względnie, a ponadto zawierać informacje o pozycjach pośrednich (VIA) oraz takie parametry jak prędkość czy przyspieszenie (WITH). Można również wskazać listę warunków, których spełnienie spowoduje przerwanie ruchu (TIL). Jeżeli któryś z argumentów nie jest bezpośrednio wymieniony w treści instrukcji, to sterownik korzysta z wartości zdefiniowanych globalnie. Zastosowanie mutacji instrukcji ruchu MOVE – MOVEFLY powoduje, że po osiągnięciu celu ruch jest płynnie kontynuowany aż do punktu wskazanego kolejną instrukcją MOVE. Podobnie działa instrukcja MOVE ALONG z parametrem typu PATH, która powoduje ruch wzdłuż zdefiniowanej ścieżki. Instrukcje OPEN i CLOSE służą do sterowania chwytakami. Ponadto istnieją instrukcje obsługujące wejścia i wyjścia cyfrowe i analogowe. Klauzula SYNCMOVE umożliwia synchroniczny ruch dwóch manipulatorów.
Język PDL2 posiada standardowy zestaw instrukcji przeznaczonych do sterowania wykonaniem programu (IF, SELECT, WHILE, REPEAT, FOR, GOTO) oraz możliwość wywoływania procedur i funkcji z parametrami. Ponadto istnieje zestaw instrukcji wpływających na działanie współbieżnych programów (ACTIVATE, PAUSE, UNPAUSE, DEACTIVATE, CYCLE, EXIT CYCLE, WAIT, DELAY, BYPASS). Ich działanie zależne jest od tego, czy dotyczą programów wstrzymywalnych czy niewstrzymywalnych. Synchronizację pracy programów uzyskuje się za pomocą semaforów oraz pary instrukcji: SIGNAL i WAIT. Z programami związany jest priorytet. Dodatkowo zdefiniowano programy obsługi warunków (Condition Handlers), które działają współbieżnie i przeznaczone są do obsługi zdarzeń wyjątkowych. Warunki mogą być zdefiniowane systemowo albo przez użytkownika. Sterownik C5G może komunikować się ze standardowymi komputerowymi urządzeniami wejścia/wyjścia wytwarzającymi i odbierającymi dane traktowane w postaci plików znakowych lub potoków danych. W szczególności instrukcję języka PDL2 można przesłać do sterownika jako e-mail.
Język programowania robotów Mitsubishi – MELFA-BASIC
Roboty firmy Mitsubishi programowane są w języku MELFA-BASIC. W sterownikach starszych typów stosowany jest on najczęściej w wersji IV, zaś w nowszych w wersji V, która jedynie w nieznaczny sposób różni się od poprzedniej. Składnia języka wzorowana jest na języku BASIC. Obsługiwane są cztery typy danych: wielkości liczbowe (całkowite oraz zmiennoprzecinkowe), pozycje robota wyrażone we współrzędnych zewnętrznych (przestrzeń operacyjna) i złączowych (przestrzeń konfiguracyjna) oraz ciągi znaków. Dla nazw zmiennych poszczególnych typów stosuje się różne przedrostki.
Język zawiera typowe instrukcje związane ze sterowaniem wykonaniem programu (Goto, For, While, If/Then/Else), wywoływaniem procedur (GoSub, CallP), wstrzymania oraz zakończenia programu (Dly, Hlt). Komunikacja z prostymi urządzeniami zewnętrznymi odbywa się za pomocą wejść i wyjść binarnych, które w kodzie programu obsługiwane są podobnie jak zmienne. Istnieje przy tym możliwość wstrzymania wykonania programu w oczekiwaniu na określony stan na wejściu (Wait) oraz przypisania sygnałom wejściowym procedur i priorytetów obsługi (Def Act/Act). Komunikacja z bardziej skomplikowanymi urządzeniami odbywa się za pomocą instrukcji obsługi interfejsu RS-232 (Open, Close, Print, Input itd.). Możliwe jest współbieżne działanie maksymalnie 32 programów, które wymieniają między sobą dane przez zmienne globalne.
Instrukcje języka pozwalają zadawać ruch robota z interpolacją we współrzędnych złączowych (Mov), zewnętrznych z interpolacją linową (Mvs) i kilkoma wariantami ruchu po okręgu (Mvr, Mvr2, Mvr3, Mvc). Możliwe jest ustalenie precyzji interpolacji (Prec), jak również prędkości oraz przyspieszeń w stosunku do ich maksymalnych wartości (Accel, Ovdr). Wskazanie początku oraz końca ścieżki pozwala wykonać ruch bez zatrzymywania w punktach pośrednich (Cnt). Osobne instrukcje służą do określenia parametrów narzędzia (Tool) oraz sterowania chwytakiem (Hopen, Hclose).
Cechą szczególną języka są instrukcje, które pozwalają zdefiniować przy użyciu kilku prostych parametrów typowe zadanie paletowania (Def Plt), a następnie odwoływać się do współrzędnych kolejnych detali umieszczonych na palecie (Plt). Tworzenie programów ułatwia także możliwość podawania współrzędnych jako punktów wraz z względnymi przesunięciami w milimetrach (np. P1,-50) oraz wywoływania kilku instrukcji w jednej linii kodu (Wth, WthIf).
W języku zdefiniowano kilkanaście funkcji związanych z operacjami na współrzędnych, np. obliczanie odległości między punktami (Dist), przejście między współrzędnymi złączowymi i zewnętrznymi (PtoJ, JtoP), a ponadto standardowe funkcje matematyczne (Sin, Cos itp.) oraz operacje konwersji zapisu liczbowego i tekstowego (Bin$, Hex$ itp.).
Język programowania robotów Kawasaki – AS
Podstawowym językiem programowania sterowników robotów Kawasaki jest język proceduralny AS. Programowanie w języku AS jest możliwe zarówno za pomocą ręcznego programatora, jak i komputera PC połączonego z sterownikiem robota. Połączenie to może być zestawione za pomocą łącza szeregowego RS-232 lub sieci Ethernet. Wyróżnia się trzy tryby pracy sterownika: wydawanie poleceń robotowi (Monitor Command Mode), tryb tworzenia i edycji programu (Edit Mode) oraz tryb odtwarzania (Playback Mode). Podobnie jak w większości uniwersalnych języków programowania dane mają postać: stałych, zmiennych globalnych i zmiennych lokalnych. Standardowe są również typy danych: dane numeryczne (liczby całkowite i rzeczywiste), ciągi znaków alfanumerycznych w kodzie ASCII oraz wartości logiczne. Oprócz typów skalarnych jest również typ tablicowy do każdego z powyższych typów danych oraz typ pozycja (złącz lub kartezjańska). Typy zmiennych są rozróżniane przez pierwszy znak w nazwie zmiennej. Nazwy zmiennych lokalnych są poprzedzone kropką. W języku AS nie deklaruje się zmiennych, wystarczy ich definicja. Na zmiennych i stałych odpowiednich typów można wykonywać operacje arytmetyczne, porównania, logiczne i binarne.
Instrukcje języka AS obejmują polecenia sterujące wykonaniem programu, definiowania pozycji robota, ruchowe, sterujące prędkością i dokładnością osiągania pozycji docelowej oraz narzędziem. Definiowanie pozycji robota odbywa się z wykorzystaniem poleceń: HERE – wczytuje pozycję bieżącą do zmiennej pozycyjnej, POINT – definiuje zmienną pozycyjną w postaci bezwzględnej lub względnej (przesunięcia), SETHOME – konfiguruje ustawienie pozycji bazowej (HOME). Instrukcje ruchu są typu PTP, czyli ruch od bieżącej pozycji do zadanej argumentem pozycji docelowej, przy określonym sposobie interpolacji. Możliwe są następujące rodzaje interpolacji: liniowa (LMOVE) i kołowa (C1MOVE), w przestrzeni operacyjnej oraz liniowa w przestrzeni konfiguracyjnej manipulatora (JMOVE). Ruchy mogą być zadawane w postaci przyrostowej z interpolacją liniową w przestrzeni operacyjnej (LDEPART) i w przestrzeni konfiguracyjnej (JDEPART). Instrukcje sterujące prędkością i dokładnością umożliwiają ustawienie prędkości (SPEED), przyspieszenia (ACCEL) hamowania (DECEL), dokładności (ACCURACY) osiągania pozycji. Sterowanie narzędziem odbywa się za pomocą instrukcji otwarcia (OPEN) i zamknięcia (CLOSE) narzędzia. Do sterowania wykonaniem programu wykorzystuje się standardowe instrukcje wyboru (IF, THEN, ELSE), pętle (FOR, DO, WHILE) i instrukcję skoku (GOTO).
Język programowania robotów Fanuc – Karel
Język programowania robotów Karel, używany w sterowniku R-J3 firmy Fanuc, wzorowany jest na języku Pascal – ma jego składnię oraz wiele wspólnych słów kluczowych. Korzysta z podobnych strukturalnych typów danych, pętli i instrukcji warunkowych. Ponadto wprowadzono możliwość programowania współbieżnego. Dodano operacje wejścia i wyjścia analogowego i cyfrowego oraz instrukcje ruchu robota. Program dzieli się na sekcję z deklaracjami oraz sekcję z kodem programu. Deklaracje dotyczą stałych, zmiennych i typów danych określonych przez użytkownika, funkcji i procedur, które mogą być zdefiniowane w danym programie, lub wskazywać funkcje zdefiniowane w innych programach. Zmienne mogą być albo typów prostych (BOOLEAN, FILE, INTEGER, REAL, STRING), albo złożonych, a w szczególności typów związanych bezpośrednio ze sterowaniem robotów (JOINTPOS – wektor pozycji złącz; XYZWPR – pozycja, czyli położenie i orientacja końcówki manipulatora; POSITION – położenie wraz ze zdefiniowanymi kierunkami jego osiągnięcia, tj. approach, orient oraz normal; PATH – wektor wartości o typie określonym przez programistę, np. POSITION bądź XYZWPR). W języku istnieje możliwość przechowywania wartości początkowych zmiennych w pliku zewnętrznym względem programu, dzięki czemu wiele programów może korzystać z tych samych danych. Pliki tego typu mogą być tworzone za pomocą albo edytora tekstu, albo panelu programowania stosowanego do uczenia robota.
Ruch może być zlecany robotowi w jednym z trzech dostępnych układów odniesienia: świata (globalny układ odniesienia), narzędzia (zdefiniowany względem nadgarstka) oraz użytkowy (zdefiniowany względem układu świata). W języku Karel zdefiniowano bogaty zestaw instrukcji ruchu. Podstawową jest MOVE TO, która realizuje ruch do zadanej pozycji z parametrami zdefiniowanymi globalnie lub przez klauzulę WITH. Ponadto wprowadzono instrukcję MOVE ALONG, która realizuje ruch wzdłuż zdefiniowanej ścieżki, także z parametrami zdefiniowanymi globalnie lub przez klauzulę WITH. Wprowadzono również instrukcje specjalizowane, takie jak MOVE NEAR oraz MOVE AWAY (zbliżenie i oddalenie się od obiektu na zadaną odległość), a także MOVE ABOUT (obrót wokół zadanej osi) oraz MOVE AXIS (ruch pojedynczej osi ramienia). Klauzula WITH może określać wartości zmiennych systemowych na czas trwania ruchu, np. sposób interpolacji, profil prędkości i/lub przyspieszenia. Ponadto można wykorzystywać dodatkowe klauzule, np. VIA (określenie dodatkowego punktu, przez który należy wykonać ruch zlecony przez MOVE TO) czy NOWAIT (wykonanie kolejnej instrukcji programu zostanie rozpoczęte przed zakończeniem zleconego ruchu). W przypadku, gdy wiele zadań uruchomionych jest jednocześnie, konieczne jest określenie w ich kodzie miejsc, w których zlecany jest ruch. Tylko jeden program może sterować ruchem danej osi w danym momencie. Przy użyciu instrukcji LOCK_GROUP dany program zajmuje zdefiniowaną grupę osi i może wysyłać do nich komendy ruchu, aż do czasu jej odblokowania instrukcją UNLOCK_GROUP bądź do momentu zakończenia swojego działania. W przypadku, kiedy dana grupa jest już zablokowana przez inne zadanie, program zawiesza się w oczekiwaniu na jej zwolnienie.
Język programowania robotów Stäubli – VAL3
Obecnie roboty Stäubli programowane są za pomocą języka VAL3, który jest efektem udoskonalenia jego protoplastów, a więc języków VAL i VAL2. Oprogramowanie niezbędne do realizacji celu postawionego przed robotem wraz z urządzeniami z nim współpracującymi składa się z zestawu współbieżnie działających programów (zadań), zbioru zmiennych globalnych oraz podprogramów zestawionych w biblioteki. Każdy program ma swoje lokalne zmienne, instrukcje, które operują tymi zmiennymi, oraz parametry, które są dostarczane, gdy ten program jest wywoływany. Podstawowymi zmiennymi globalnymi są definicje: globalnego układu odniesienia oraz narzędzia zamontowanego na manipulatorze (typu tool). Programy operują zmiennymi typu logicznego (bool), numerycznego (num), ciągami znaków alfanumerycznych (string), wejściami/wyjściami binarnymi (dio), wejściami/wyjściami numerycznymi (aio – analogowymi lub cyfrowymi) oraz wejściami/wyjściami szeregowymi (sio – porty szeregowe lub gniazda ethernetowe). Deklaracje dio, aio, sio łączą nazwy zmiennych z konkretnymi wejściami lub wyjściami sterownika. Ponadto w języku VAL3 istnieją typy złożone: układ współrzędnych (frame – współrzędne kartezjańskie XYZ oraz kąty Eulera XYZ), transformacja stanowiąca złożenie translacji i obrotu (trsf – współrzędne kartezjańskie XYZ oraz kąty Eulera XYZ), definicja narzędzia zamontowanego na manipulatorze (tool – zawiera trsf oraz dane dotyczące sposobu aktywacji narzędzia), punkt (point – zawiera trsf oraz config), wektor pozycji złącz manipulatora (joint), wartość umożliwiająca wybór alternatywnych konfiguracji ramienia (config – związany z wyborem właściwego rozwiązania odwrotnego zagadnienia kinematyki dla manipulatora) oraz zestaw parametrów ruchu (mDesc). Te typy można wykorzystywać do tworzenia tablic. Zmienne mogą mieć zasięg globalny – dla zestawu programów tworzących oprogramowanie realizujące zadanie lub lokalny – ograniczony do pojedynczego programu.
W języku VAL3 występują standardowe instrukcje sterujące wykonaniem programu (if, switch, do, while, for). Język zapewnia wielozadaniowość, przy czym programom przyporządkowuje się priorytety. Zadania działają w podziale czasu na jednym procesorze sterownika. Synchronizację pracy programów można zapewnić np. przez instrukcje synchronizujące (synchro) lub wzajemne wykluczanie (mutex). Istnieją również instrukcje umożliwiające wyświetlanie komunikatów na panelu programowania oraz wczytywanie danych z tego panelu, co ułatwia kontakt z operatorem w trakcie autonomicznej pracy robota.
W języku VAL3 zdefiniowano trzy podstawowe typy ruchów: ruch w przestrzeni konfiguracyjnej optymalizowany ze względu na prędkość ruchu (movej), ruch wzdłuż linii prostej w przestrzeni operacyjnej (movel), ruch po łuku kołowym wyznaczonym przez trzy pozycje w przestrzeni operacyjnej: aktualną, pośrednią i końcową (movec). Przy ruchach w przestrzeni operacyjnej interpolowana jest zarówno pozycja, jak i orientacja narzędzia. Ruch nie musi być zatrzymywany na końcu segmentu ruchu – istnieje możliwość sklejania segmentów w dłuższe trajektorie wykonywane w sposób ciągły. Ponieważ argumentem instrukcji ruchu są dane zawarte w deskryptorze typu mDesc, programista ma wpływ na prędkość ruchu i jego przyspieszenie oraz to, czy segmenty ruchu definiowane kolejnymi instrukcjami ruchu mają być zrealizowane w sposób ciągły czy z zatrzymywaniem się w punktach pośrednich. Opisane instrukcje zakładają, że ruch narzędzia będzie odtwarzany dokładnie tak, jak to wyspecyfikowano przez argumenty rozkazów. Czasami jest to jednak niemożliwe, ponieważ fizyczne ograniczenia związane ze środowiskiem wymagają odchylenie ruchu od zadanej trajektorii. W tym przypadku należy wprowadzić podatność do sterowania manipulatorem. Do tego celu służą rozkazy umożliwiające zachowanie podatne (movelf, movejf), za pomocą których można sterować wywieraniem siły przez manipulator. Kierunek siły wyznaczany jest przez pozycje początkową i końcową ruchu, natomiast jej wartość określa sposób zachowania manipulatora. Zero powoduje, że ramię staje się podatne, wartość dodatnia pcha manipulator w kierunku pozycji końcowej, natomiast wartość ujemna spycha manipulator do pozycji startowej. Zewnętrzna siła przyłożona do końcówki może przeciwdziałać lub wspomagać te ruchy w zależności od jej zwrotu. Ponadto można wykorzystać informacje uzyskane z czujnika do modyfikacji wyspecyfikowanej trajektorii (alterMovel, alterMovej, alterMovec).
Język programowania robotów Universal Robots – URScript
Wraz z robotami firmy Universal Robots dostarczane jest graficzne środowisko programowania, umożliwiające tworzenie programów sterujących zapisywanych w postaci drzewa kolejno wykonywanych operacji. Dodawane są też biblioteki sterowników oraz niskopoziomowych poleceń, które również mogą być wykorzystane do jego programowania. Dodatkowo istnieje język skryptowy URScript, który stanowi warstwę pośrednią (tzw. warstwę skryptów – Script Level) pomiędzy programowaniem graficznym (Graphical User-Interface Level) a programowaniem niskopoziomowym (C-API Level). W dalszej części artykułu skupiono się na tym języku skryptowym.
Programy napisane w języku URScript uruchamiane są pod kontrolą systemu URControl Runtime Machine (RTMachine), który komunikuje się z robotem z częstotliwością 125 Hz. W języku tym wyróżniono szereg prostych typów danych: none, wartości logiczne, liczbowe, ciągi znaków alfanumerycznych bądź pozycje kartezjańskie (do określenia orientacji wykorzystywana jest reprezentacja oś–kąt). Język umożliwia tworzenie i wywoływanie funkcji. Sterowanie wykonaniem programu w języku URScript realizowane jest w klasyczny sposób przez instrukcje warunkowe (IF, ELIF, ELSE) oraz pętle (WHILE). W ramach programu możliwe jest również zadeklarowanie zmiennych globalnych, do których mają dostęp wszystkie zdefiniowane funkcje. URScript umożliwia także tworzenie programów wielowątkowych, a w związku z tym ma proste mechanizmy do synchronizacji wątków (oczekiwanie na zakończenie działania wątku, synchronizacja dostępu do danych przez mechanizm sekcji krytycznej).
Funkcje języka URScript zostały podzielone na cztery grupy. Grupa Motion składa się z szeregu instrukcji umożliwiających zmianę położenia robota zarówno w przestrzeni konfiguracyjnej (movej, servoj), jak i przemieszczenie układu współrzędnych związanych z narzędziem w przestrzeni kartezjańskiej (movec, movep, servoc). Dodatkowo istnieje również szereg instrukcji związanych z ruchem z zadaną prędkością, zarówno poszczególnych stawów (speedj_init, speedj, stopj), jak i narzędzia (speedl, stopl). Grupa Internals zawiera instrukcje związane z rozwiązaniem zagadnień kinematyki (get_forward_kin, get_inverse_kin), monitorowaniem stanu robota (get_joint_positions, get_joint_speeds, get_joint_torques), jego temperatury (get_controller_temp, get_joint_temp) czy określania wartości parametrów (set_gravity, set_payload, set_tcp). Grupa Urmath obejmuje funkcje matematyczne: trygonometryczne lub zaokrąglające, a ponadto przydatne przy przeliczaniu pozycji robota (np. interpolacja interpolate_pose czy translacja pozycji pose_add). Grupa Interfaces gromadzi funkcje odczytujące oraz ustawiające stan wejść zarówno cyfrowych, jak i analogowych. W szczególności URSCript zawiera szereg funkcji obsługi i generacji sygnałów na magistrali Modbus oraz zgodnych ze standardem Euromap 67. W grupie tej znajdują się również funkcje związane z komunikacją za pomocą mechanizmu gniazdek.
Język programowania robotów Toshiba – SCOL
Językiem programowania robotów z serii TS jest SCOL (Symbolic COde Language for robots). Język ten jest ściśle związany z typem sterowanego robota, a więc niektóre typy danych uzależnione są od struktury kinematycznej robotów. Dotyczy to tych danych, które określają cel ruchu manipulatora. Język dla sterownika TS-3000 (związanego z robotem typu SCARA) ma standardowe skalarne typy danych, takie jak: liczby całkowite, liczby rzeczywiste, wartości logiczne bądź ciągi znaków alfanumerycznych, ale również typy wektorowe, takie jak: pozycje (position – mające pięć współrzędnych odnoszących się do osi ruchu oraz do informacji o pożądanej konfiguracji ramienia), współrzędne (coordinates – mające cztery współrzędne: trzy współrzędne kartezjańskie oraz obrót wokół osi pionowej; najczęściej wykorzystywane do zmiany definicji narzędzia oraz określenia roboczego układu odniesienia) oraz obciążenie (load), określające środek ciężkości oraz masę przemieszczanego przedmiotu. Ponadto każdy z tych typów danych może posłużyć jako element konstrukcyjny tablicy. Zmienne mogą mieć zasięg globalny lub lokalny.
Lista instrukcji języka SCOL została podzielona na kilka kategorii: instrukcje ruchowe odpowiedzialne za przemieszczanie manipulatora, instrukcje determinujące sposób wykonania ruchu, a więc określające parametry ruchu (ACCEL – dodatnie przyspieszenie, DECEL – ujemne przyspieszenie, czyli hamowanie, ACCUR – dokładność pozycjonowania, CONFIG – konfigurację ramienia, GAIN – określa, czy serwomechanizm osi ma być aktywny czy oś ma być swobodna, PAYLOAD – obciążenie/udźwig, SPEED – prędkość ruchu, TORQUE – maksymalny moment siły dla danej osi, PASS – pozwolenie na rozpoczęcie kolejnego ruchu przed zakończeniem poprzedniego), instrukcje związane z sygnałami wejścia i wyjścia sterownika (BCDIN, BCDOUT, DIN, DOUT, HEXIN, HEXOUT, PULOUT, INPUT, PRINT), instrukcje sterujące wykonaniem programu (GOTO, IF, FOR, SWITCH – przełączenie zadań, RECYCLE, TASK – wykonanie zadania/programu), instrukcje obliczające wartość wyrażeń matematycznych oraz instrukcje określające fazę ruchu. Te ostatnie określają, w jakiej fazie ruchu manipulatora powinien być uruchomiony program wykonywany współbieżnie. Wielozadaniowość oznacza, że kilka programów może działać w podziale czasu, ale tylko jeden z nich może sterować bezpośrednio manipulatorem. Często używane programy i podprogramy mogą być przekształcane w biblioteki, z których potem można skorzystać przy tworzeniu kolejnego programu.
Instrukcjami ruchowymi języka SCOL są: MOVEI (przyrostowy ruch pojedynczej osi manipulatora), MOVEA (ruch pojedynczej osi manipulatora do położenia zadanego bezwzględnie), MOVE (synchroniczny ruch wszystkich osi manipulatora – rozpoczęcie ruchu wszystkich osi jest jednoczesne i również jego zakończenie jest skoordynowane), MOVES (ruch z interpolacją linową w przestrzeni konfiguracyjnej), MOVEC (ruch z interpolacją kołową, gdzie łuk okręgu definiowany jest przez aktualną pozycję ramienia oraz pozycje pośrednią i docelową), MOVEJ (ruch po łuku w przestrzeni konfiguracyjnej z wyróżnieniem segmentów ruchu pionowego wznoszącego się i opadającego), MOVEPLT (ruch do wskazanego miejsca na palecie). Wykonanie wszystkich wymienionych instrukcji ruchowych może być modyfikowane poprzez dodatkowe warunki zapisywane po słowie kluczowym WITH. Warunki mogą dotyczyć parametrów ruchu bądź wskazywać narzędzie, które ma być wykorzystane. Wyspecyfikowane warunki dotyczą jedynie rozkazu, w którym wystąpią i chwilowo dominują nad tymi określonymi globalnie, przez instrukcje determinujące sposób wykonania ruchu. Dla niektórych ruchów istnieje możliwość zmiany układu odniesienia, natomiast parametry ruchu dotyczą końcówki manipulatora. Ponadto lista instrukcji języka zawiera rozkazy sterujące chwytakami (OPEN, CLOSE) oraz odmierzające czas, takie jak DELAY (opóźnienie o określony czas). Można też określić warunki, które powinny być monitorowane lub czasowo ignorowane w trakcie realizacji ruchu (ON, IGNORE). Wykrycie spełnienia warunku spowoduje wykonanie związanej z nim instrukcji. Możliwe jest też oczekiwanie na spełnienie warunku (WAIT).
Język programowania robotów Festo – FTL
Układ sterowania CMXR-C2 robota programowany jest za pomocą języka FTL (Festo Teach Language). Przed stworzeniem programu sterownik CMXR-C2 musi zostać skonfigurowany za pomocą FCT (Festo Configuration Tool). Konfiguracja jest niezbędna, ponieważ roboty Festo składane są z oddzielnych modułów mechanicznych. FTL jest tekstowym językiem interpretowanym, a jego lista instrukcji obejmuje rozkazy ruchowe, rozkazy określające parametry ruchu (prędkość, przyspieszenie, przyrost przyspieszenia), instrukcję podstawienia wartości obliczonego wyrażenia matematycznego, komendy wykonania programu (IF, WHILE, LOOP, GOTO) oraz sterujące urządzeniami peryferyjnymi dołączonymi do sterownika. Do utworzenia programu robota potrzebny jest też panel programowania umożliwiający uczenie. Programy sterujące robotem i urządzeniami współpracującymi oraz dokonujące obliczeń grupowane są w tzw. projekty, które są związane ze strukturą katalogów i plików zawierających algorytmy i struktury danych. Dane mogą być lokalne dla programu, widoczne w projekcie bądź globalne dla całości systemu.
W języku zdefiniowano następujące elementarne typy danych: liczby całkowite, liczby rzeczywiste, wartości logiczne, maski bitowe, ciągi znaków alfanumerycznych. Z tych elementarnych typów danych można tworzyć typy strukturalne, takie jak tablice. Do języka wprowadzono też wskaźniki na zmienne. Do specyfikacji ruchu używane są współrzędne konfiguracyjne (AXISPOS – sześć osi robota oraz trzy napędy zewnętrzne) oraz kartezjańskie (CARTPOS – trzy współrzędne kartezjańskie położenia, trzy współrzędne określające orientację oraz pozycja trzech osi zewnętrznych).
Jednocześnie może być wykonywanych kilka programów, które z kolei mogą wywoływać podprogramy. Programy mogą się wzajemnie uruchamiać i przerywać wykonanie. Tylko jeden z równolegle działających programów może sterować manipulatorem. Synchronizacja pracy tych programów organizowana jest poprzez zmienne globalne. Istnieje również opcja oczekiwania przez określony czas lub na zdarzenie.
Ruch robota może być zdefiniowany zarówno we współrzędnych konfiguracyjnych (AXISPOS), jak i kartezjańskich (CARTPOS). W tym drugim przypadku orientacja wyrażana jest za pomocą kątów Eulera ZYZ. Parametry ruchu, takie jak prędkość czy przyspieszenie, ustawiane są niezależnie od instrukcji ruchu i mają zasięg globalny. W języku zdefiniowano następujące instrukcje ruchu: synchroniczny ruch do pozycji określonej bezwzględnie (Ptp), synchroniczny ruch do pozycji określonej względnie (PtpRel), ruch pojedynczej osi (MoveAxisPtp lub MoveCartPtp), ruch wzdłuż prostej w przestrzeni kartezjańskiej (Lin, LinRel), ruch z interpolacją kołową przez pozycję pośrednią (Circlp, PtpToCirclp, LinToCirclp). Argumentem tych rozkazów może być pozycja określona w przestrzeni kartezjańskiej lub konfiguracyjnej. Synchroniczność ruchu odnosi się do jednoczesnego rozpoczęcia i jednoczesności zakończenia ruchu wszystkich osi manipulatora oraz napędów zewnętrznych. W przypadku ruchu w przestrzeni kartezjańskiej jego argument dotyczy końcówki manipulatora. Można zezwolić na wcześniejsze przejście do realizacji kolejnego segmentu ruchu zanim zakończy się poprzedni (Skip).
Podsumowanie
Tak skrótowy przegląd możliwości oferowanych przez poszczególne języki programowania robotów przemysłowych z oczywistych powodów nie obejmuje wszystkich ich cech. Celem tego zestawienia było wydobycie cech wspólnych oraz ewentualnie pewnych szczególnych możliwości, istotnych dla realizacji zadań. Pominięto natomiast opis dość bogatych zestawów funkcji matematycznych – tym bogatszy, im szerszy jest zestaw typów danych zdefiniowanych w języku. Wszystkie języki mają możliwość wywoływania podprogramów z argumentami, czego również nie podkreślano w tym przeglądzie zbyt dobitnie. To, co wyraźnie rozróżnia te języki, to typy danych przeznaczone do modelowania geometrii środowiska oraz sposoby realizacji ruchu manipulatora.
Języki przeznaczone do sterowania różnorodnymi typami robotów cechuje bardziej uniwersalne podejście do definicji tych typów. Te języki, które są przeznaczone do sterowania zaledwie kilkoma rodzajami robotów, zazwyczaj mają typy danych bardziej szczegółowo odzwierciedlające właściwości tych robotów. Wyraźnie dominuje tendencja do korzystania ze zmiennych globalnych. Bardzo widoczna jest duża różnorodność instrukcji ruchu oraz to, że parametry ruchu definiowane są globalnie, z możliwością ich lokalnej modyfikacji. To bogactwo typów instrukcji ruchu ma zapewnić programiście duże możliwości kształtowania trajektorii ruchu manipulatora.
Ciekawe jest to, że żaden z producentów nie zdecydował się wprowadzić pojedynczej instrukcji ruchu parametryzowanej generatorem ruchu, co likwiduje wszelkie ograniczenia narzucone na sposób definiowania trajektorii ruchu. Generatorem ruchu nazywamy procedurę wyznaczającą kolejne punkty trajektorii, a więc jest to rodzaj interpolatora uwzględniającego informację o aktualnym stanie systemu oraz dane uzyskiwane z czujników. Wykorzystanie generatorów ruchu umożliwia odejście od globalnych definicji parametrów tego ruchu. Oczywiście globalna parametryzacja ruchu została wprowadzona, aby zwolnić programistę ze żmudnego powtarzania tych samych parametrów w kolejnych instrukcjach, ale wprowadza niebezpieczeństwo, iż do wykonania ruchu zostaną użyte niewłaściwe parametry.
Cezary Zieliński
Przemysłowy Instytut Automatyki i Pomiarów PIAP
Tomasz Kornuta, Maciej Stefańczyk, Wojciech Szynkiewicz, Piotr Trojanek, Michał Walęcki
Instytut Automatyki i Informatyki Stosowanej, Politechnika Warszawska
Słowa kluczowe
BASIC, języki programowania robotów, program, RAPID, sterowanie robotami
Komentarze
blog comments powered by Disqus