Metody programowania robotów przemysłowych, cz. 3
prof. dr hab. inż. Cezary Zieliński (Łukasiewicz – PIAP) print
W artykule prezentujemy dalej problematykę związaną z metodami programowania robotów przemysłowych oraz konkretne przykłady ich zastosowania. Tę część cyklu artykułów poświęcono programowaniu robotów firmy Stäubli International A.G.
Pierwsza część cyklu artykułów dotyczących metod programowania robotów przemysłowych zawierała podstawowe informacje na temat programowania on-line i off-line, układu sterowania robota przemysłowego oraz sposoby programowania robotów firmy Universal Robots. W kolejnej części cyklu przybliżono metody programowania robotów firmy ABB Ltd.
Roboty firmy Stäubli International AG
Robot Stäubli może pracować w jednym z trzech trybów: ręcznym, lokalnym oraz zdalnym. Tryb ręczny stosowany jest podczas uczenia robota oraz testowania jego programów. Tryb lokalny umożliwia autonomiczną pracę robota, a więc realizację zaprogramowanego zadania. W trybie zdalnym robot pracuje pod nadzorem oprogramowania załadowanego do sterownika, tak jak w trybie lokalnym, ale w odróżnieniu od tego drugiego oprogramowanie to uruchamiane jest z urządzenia zewnętrznego, a nie z panelu programowania MCP (Manual Control Panel). Ruch robota może być przerwany przez operatora w każdym z trybów za pomocą przycisku E-STOP (emergency stop) zamontowanego na panelu MCP.
Podstawy języka VAL3
Roboty Stäubli programowane są za pomocą języka VAL3. Oprogramowanie sterujące robotem, w dokumentacji zwane aplikacją, tworzy pakiet składający się z:
- zestawu programów zapisanych w języku VAL3,
- zbioru globalnych danych współdzielonych przez wszystkie te programy,
- zestawu wykorzystywanych bibliotek składających się z funkcji i procedur,
- typów danych użytkownika oraz
- stron wyświetlanych na panelu MCP tworzących interfejs użytkownika.
Za pomocą panelu MCP można tworzyć wszystkie wymienione elementy pakietu. W tym celu stosuje się przyciski umieszczone na panelu przez wybieranie odpowiednich pól z menu wyświetlanego na ekranie zintegrowanym z tym panelem.
Roboty przemysłowe działają w gniazdach roboczych, gdzie współpracują z innymi urządzeniami. Sterownik robota może pełnić rolę sterownika nadrzędnego dla całego gniazda. W pewnych sytuacjach sterownik musi współpracować z operatorem procesu. Do tego potrzebny jest odpowiedni interfejs z użytkownikiem. Programista może stworzyć taki interfejs opracowując własne strony, przeznaczone do wyświetlania na panelu programowania. W ten sposób operator systemu może się kontaktować z aplikacją w trakcie jej wykonania. Strony mogą zawierać tekst, elementy graficzne, widgety, suwaki, możliwość wyboru z menu, a także wprowadzanie wartości liczbowych w odpowiednie pola. Fragmenty strony mogą być powiększane na ekranie panelu. Strony zapisywane są w formacie HTML.
Typy i zmienne w VAL3
Programy wchodzące w skład oprogramowania robota Stäubli działają na danych typów prostych i złożonych. Te pierwsze to: bool (logiczne, czyli true/false), num (liczby całkowite i rzeczywiste), string (ciągi znaków), dio (wejścia/wyjścia binarne), aio (wejścia wyjścia numeryczne – cyfrowe lub analogowe) i sio (wejścia/wyjścia portów szeregowych bądź gniazd ethernetowych wykorzystujących protokoły UDP lub TCP/IP). Zmienne typu dio, aio i sio muszą być skojarzone z odpowiednimi portami urządzeń.
Dane złożone konstruowane są z tych prostych. Między innymi są to predefiniowane typy danych: trsf (kartezjańska transformacja geometryczna), frame (kartezjański układ odniesienia), tool (narzędzie manipulatora), point (pozycja określająca położenie i orientację narzędzia wraz z konfiguracją ramienia – stanowi to odstępstwo od matematycznej definicji punktu), joint (pozycja złącz manipulatora), config (konfiguracja manipulatora: ustawienie barku, łokcia i nadgarstka) oraz mdesc (zestaw parametrów ruchu manipulatora).
Układy odniesienia (frame) tworzone są za pomocą instrukcji setFrame() przez podanie ich punktu początkowego O, punktu wskazującego dodatni kierunek osi X oraz punktu leżącego na płaszczyźnie OXY. Orientacja transformacji (trsf) wyrażana jest za pomocą kątów Eulera w konwencji XYZ (ruchomy układ odniesienia z obrotami kolejno wokół osi X, Y’ i Z’’).
Punkt (point) określany jest jako transformacja (trsf) uzupełniona o konfigurację (config) wskazującą, w jakiej konfiguracji powinno znajdować się ramię przy dojściu do tej pozycji. Dla tej samej transformacji rozwiązując odwrotne zagadnienie kinematyki dla manipulatora można uzyskać wiele rozwiązań, a więc wiele konfiguracji ramienia. Stąd podanie pożądanej konfiguracji wskazuje, które z rozwiązań należy przyjąć, jako właściwe. Dla różnych typów robotów Stäubli konfiguracje definiowane są w różny sposób. Wynika to z różnej struktury kinematycznej tych manipulatorów.
W skład definicji narzędzia (tool) wchodzi transformacja (trsf), zazwyczaj wyznaczana względem kołnierza końca manipulatora, wyjście aktywujące narzędzie (dio) oraz dwa czasy: otwierania i zamykania narzędzia. Narzędzie, domyślnie chwytak, otwierane jest za pomocą instrukcji open(), a zamykane za pomocą close(). Instrukcje te czekają na zakończenie ruchu manipulatora, by rozpocząć swe działanie.
Programista może tworzyć swoje typy danych korzystając z kontenerów. Podstawowym kontenerem jest element (ELEMENT), który przechowuje pojedynczą wartość prostą. Kontenerem złożonym jest tablica (ARRAY), której składowe tworzy się z pojedynczego typu prostego bądź złożonego. Dostęp do elementów tablicy odbywa się przez numeryczne indeksy. Tablice mogą mieć maksymalnie trzy wymiary. Drugim rodzajem kontenera jest kolekcja (COLLECTION) stanowiąca strukturę (rekord), której składowe mają własne nazwy i mogą być różnych typów. Do poszczególnych elementów kolekcji odwołuje się przez podanie nazwy danej składowej. Stworzenie kontenera ma tę zaletę, że kontener w całości może być przekazany jako parametr procedury, co ułatwia programowanie. Zmienne typów, zdefiniowanych przez użytkownika, w trakcie wykonania programu mogą zmieniać nie tylko wartości, ale również wymiary kontenera. Jeżeli zmienna strukturalna zawiera tablicę, to wymiar tej tablicy może ulegać zmianie. Do tego celu służą instrukcje: insert(), delete(), append() oraz resize().
Język VAL3 umożliwia budowanie dowolnie skomplikowanych wyrażeń z zastosowaniem standardowych operatorów, włączając w to działania na bitach zmiennych, oraz dysponuje olbrzymią liczbą funkcji, które operują na zmiennych różnych typów.
Programowanie ruchów robota
Sterowanie ruchem robota odbywa się za pomocą licznych instrukcji. Należy zacząć od włączenia zasilania – enablePower(). Na zakończenie pracy robota należy odłączyć zasilanie – instrukcja disablePower(). Istnieją instrukcje określające aktualny status robota. W szczególności instrukcja workingMode() wskazuje aktualny tryb pracy robota: manualny, testowy, lokalny czy zdalny. Jeżeli robot się nie porusza, to można go wprowadzić w tryb oszczędzający energię za pomocą instrukcji hibernateRobot(). Wyprowadza się go z tego stanu instrukcją wakeUpRobot(). Istnieją też instrukcje ustawiające i odczytujące ograniczenia narzucone na ruch poszczególnych złącz manipulatora.
Instrukcje ruchu języka VAL3 różnią się przestrzenią, w której zdefiniowany jest ruch, oraz rodzajem wykorzystywanej interpolacji. Ruch definiowany jest albo w przestrzeni złącz (joint space), często zwanej przestrzenią konfiguracyjną, albo w przestrzeni operacyjnej, w której określa się transformacje definiowane przez podanie gdzie znajduje się początek wybranego układu odniesienia oraz jaka jest jego orientacja. Podstawową instrukcją ruchu w przestrzeni konfiguracyjnej jest movej(), natomiast w przestrzeni operacyjnej są dwie takie instrukcje: movel() i movec(). Instrukcja movej() stosowana jest do przemieszczania ramienia do zadanego punktu docelowego określonego w przestrzeni konfiguracyjnej lub operacyjnej, natomiast interpolacja odbywa się w przestrzeni konfiguracyjnej. W tym przypadku zakłada się, że programista nie może dokładnie przewidzieć, jaka będzie ścieżka ruchu narzędzia, taki rodzaj ruchu nazywany jest: od punktu do punktu (point to point). W przypadku instrukcji movel() ruch początku kładu odniesienia związanego z narzędziem porusza się po ścieżce stanowiącej prostą w przestrzeni operacyjnej, natomiast orientacja narzędzia zmieniana jest dzięki liniowej zmianie kąta obrotu wokół wynikowej osi, powodując zmianę orientacji narzędzia od aktualnej do docelowej. Instrukcja movec() powoduje ruch po okręgu przechodzącym przez pozycję aktualną ramienia, pośrednią i końcową. W trakcie tego ruchu orientacja interpolowana jest podobnie, jak w przypadku ruchu movel(), przy czym wpierw zmieniana jest od aktualnej do pośredniej, a następnie do końcowej. Jeżeli orientacja układu związanego z narzędziem w pozycji aktualnej, pośredniej i końcowej jest taka sama, to orientacja nie będzie się zmieniała w trakcie ruchu – zmieni się jedynie położenie początku układu.
Ruchy wywoływane przez instrukcję movej() zazwyczaj wykorzystywane są z dala od przeszkód. Służy ona do globalnych przemieszczeń. Natomiast tam, gdzie wymagana jest ostrożność, czyli do wykonywania ruchów precyzyjnych, np. przy dochodzeniu i odchodzeniu od chwytanych przedmiotów, wykorzystuje się instrukcję movel(). Podstawowymi parametrami wymienionych instrukcji są docelowa pozycja, rodzaj stosowanego narzędzia oraz wskazanie, czy w pozycji docelowej ruch ma być zatrzymany czy nie. Jeżeli nie, to określa się parametry łuku, po którym ma się przemieścić narzędzie przy przełączeniu z bieżącej na kolejna instrukcję ruchu, co odpowiada przejściu z aktualnego na następny segment ruchu. Oznacza to, że pozycja docelowa, znajdująca się na połączeniu segmentów ruchu, nie będzie osiągnięta precyzyjnie. Narzędzie przemknie w pobliżu bez zatrzymywania. W ten sposób trajektoria ruchu zostanie wygładzona, a sam ruch będzie szybszy. W przypadku sklejania segmentów ruchu wytwarzanych za pomocą instrukcji movej() łuk łączący wyznaczany jest w przestrzeni konfiguracyjnej, natomiast w przypadku instrukcji movel() oraz movec() w przestrzeni operacyjnej, więc w tych dwóch ostatnich przypadkach jego kształt jest bardziej przewidywalny. W trakcie realizacji instrukcji movel() oraz movec() nie powinna zachodzić konieczność zmiany konfiguracji ramienia. W pobliżu osobliwości kinematycznej powinno się korzystać z instrukcji movej().
Ponieważ łączenie segmentów w trakcie ruchu wymaga antycypacji, jakie są kolejne fragmenty ścieżki, dochodzi do desynchronizacji wykonania programu i interpretacji sekwencji rozkazów programu robota. Aby przywrócić synchronizację, między instrukcjami ruchu należy wstawić instrukcję waitEndMove(), która wstrzymuje we wskazanym miejscu dalszą interpretację instrukcji programu. Ponieważ realizacja ruchu nie jest tożsama z realizacją instrukcji programu, sterownik tworzy kolejkę pozycji, do których narzędzie ma być przemieszczone – kolejka ta jest rodzajem listy przewidywanych punktów docelowych. Może zachodzić potrzeba wykasowania tej listy, gdy w otoczeniu robota zajdą nieoczekiwane zmiany, które uczynią antycypowaną ścieżkę ruchu niezdatną do przejścia. Wtedy można skorzystać z instrukcji z zestawu: resetMotion(), restartMove() i stopMove(), by uzyskać pożądany wynik.
Pozycje stanowiące argumenty instrukcji ruchu wyznaczają ścieżkę ruchu. Istotnym jest, jak narzędzie ma się zachowywać na tej ścieżce, czyli z jaką prędkością i jakim przyspieszeniem ma się odbywać ruch wzdłuż niej. Generalną zasadą jest ruch z maksymalnymi wartościami prędkości i przyspieszenia, natomiast programista może narzucać dodatkowe ograniczenia na te parametry. Po pierwsze, można narzucać ograniczenia na dopuszczalną prędkość i przyspieszenie złącz manipulatora. Mówiąc tu o przyspieszeniu mamy na myśli zarówno zwiększanie prędkości jak i jej zmniejszanie, a więc przyspieszenie ujemne. Po drugie, można ograniczać prędkość i przyspieszenie układu związanego z narzędziem. W tym przypadku ograniczenia dotyczą przestrzeni operacyjnej. W trakcie realizacji ruchu jego parametry mogą być monitorowane dzięki użyciu instrukcji getMoveId(), która określa pozycję na ścieżce, w której aktualnie znajduje się narzędzie. Można też sprawdzić, czy ruch się zakończył. Czyni się to za pomocą instrukcji isSettled(). Do sprawdzenia aktualnie zadanej prędkości służy getSpeed(), aktualnego uchybu złączowego getPositionErr(), aktualnie wytwarzanego momentu siły przez silnik getJointForce() – ten moment siły wyznaczany jest na podstawie prądu płynącego w uzwojeniach silników.
Ponieważ zachowanie ramienia robota, traktowanego jako obiekt sterowania, zależy od tego, co zamontowano na jego końcu, a w szczególności, jeżeli jest to chwytak – od parametrów dynamicznych uchwyconego przedmiotu, to dobrą praktyką programistyczną jest poinformowanie sterownika, z czym będzie miał do czynienia. Służy do tego instrukcja setPayload(), która określa przyłączoną masę, pozycję jej środka względem układu odniesienia związanego z narzędziem oraz składowe macierzy inercji względem układu związanego ze środkiem masy. Układ sterowania korzysta z parametrów inercjalnych samego ramienia, zamontowanego narzędzia oraz dodatkowego obciążenia wywoływanego przez uchwycone przedmioty.
Prócz trajektorii realizowanych wzdłuż niezmiennych ścieżek, zdarza się że trasa ruchu powinna być zmodyfikowana wskutek wykrycia nieprzewidzianej przeszkody w otoczeniu robota. Sytuacje takie wykrywane są przez czujniki. W tym przypadku do modyfikacji ruchu służą instrukcje alterMovej(), alterMovel() oraz alterMovec(). Argumenty każdej z tych instrukcji określają ścieżkę nominalną, a instrukcja alter()określa tryb, w jakim dewiacja od nominalnej ścieżki ma się odbywać. Tryb modyfikacji trajektorii jest zdefiniowany za pomocą instrukcji alterBegin(), która zezwala na modyfikację trajektorii oraz alterEnd(), która odwołuje to zezwolenie. Parametrami instrukcji alterBegin() są: układ odniesienia, względem którego wyznaczana jest modyfikacja oraz ograniczenia, które mają uczynić ruch korygujący bezpiecznym. Instrukcja alter() określa transformację, definiującą sposób modyfikacji ścieżki względem układu odniesienia będącego parametrem instrukcji alterBegin(). Modyfikacja jest realizowana przez sterownik w każdym takcie jego pracy, a więc co 4 ms. Instrukcje z modyfikacją ścieżki oraz te bez niej mogą być wymieszane w sekwencji programu. Reguły sklejania segmentów modyfikowanych i niemodyfikowanych są takie, jak opisano powyżej dla sekwencji instrukcji niemodyfikowanych. Należy mieć na względzie, że trzeba zachować ostrożność w modyfikowaniu trajektorii ruchu, by nie spowodowało to trudności w realizacji kolejnego segmentu ruchu. Niemniej jednak, niezależnie od rodzaju ruchu, system sterujący zatrzyma wykonanie programu, gdy wykryje nierealizowalne żądanie, tzn. np. konieczność wytworzenia nadmiernego przyspieszenia bądź żądanie wyjścia narzędzia poza przestrzeń roboczą.
W trakcie swej pracy sterownik rejestruje zachodzące zdarzenia. Informacje o nich kolejkuje. Kolejka ma ograniczoną pojemność, więc starsze zapisy są kasowane, gdy pojawiają się nowe. Można poznać listę co najwyżej 20 ostatnich zarejestrowanych zdarzeń. Czyni się to za pomocą instrukcji getIds() oraz getEvents().
Programowanie w języku VAL3
VAL3 dysponuje standardowymi instrukcjami sterującymi wykonaniem programu, umożliwiającymi warunkowe rozgałęzianie oraz konstrukcje pętli: if elseIf else endIf, switch case default endSwitch, while endWhile, do until, for endFor. Instrukcje te umożliwiają programowanie strukturalne.
Tworzenie elementów oprogramowania użytkowego (aplikacji) wspomagane jest użyciem wzorców. Wykonalne aplikacje muszą zawierać programy start() i stop(), które wykonywane są przy inicjacji i zakończeniu pracy robota. Każdy program stanowi sekwencję instrukcji języka VAL3, a ponadto zawiera zbiór danych lokalnych oraz parametrów, które przekazywane są gdy program jest wywoływany. Programy mogą być wywoływane rekursywnie oraz jednocześnie przez wiele innych programów. W tym drugim przypadków tworzone są kopie danych lokalnych, więc każde z wywołań traktowane jest osobno. Programy wywoływane są instrukcją call, a powrót z programu realizowany jest za pomocą instrukcji return lub po osiągnięciu instrukcji end. Parametry do programu mogą być przekazywane albo przez wartość albo przez referencję. Zmienne złożone (kontenery złożone) mogą być przekazywane do programu jedynie przez referencję.
Programy aktualnie działające na sterowniku nazwano zadaniami (task). Zazwyczaj na sterowniku w danej chwili realizowanych jest kilka zadań, np. zadanie sterujące ruchem manipulatora, zadanie sterujące urządzeniami współpracującymi, zadanie zarządzające interfejsem z użytkownikiem, zadanie monitorujące bezpieczeństwo systemu, zadania obsługujące komunikację. Ponieważ zadania wykonywane są przez pojedynczy procesor ich realizacja odbywa się w podziale czasu, co zewnętrznie daje odczucie pracy równoległej. Z każdym zadaniem związane są jego: nazwa, priorytet oraz status (wykonywane/zatrzymane). Zadanie jest widoczne (można się do niego odwołać) jedynie z programu bądź biblioteki, w której zostało utworzone. W każdym cyklu działania zadania dysponują procesorem według priorytetu i kolejności utworzenia. Długość cyklu jest tak dobrana, by zadania o niskim priorytecie też miały szansę na wykonanie. Zadania synchroniczne dominują nad zadaniami asynchronicznymi. Te pierwsze służą do sterowania sprzętem w czasie rzeczywistym, np. sterowanie silnikami. Istnieją mechanizmy synchronizacji wykonania zadań. Jeżeli zadania korzystają z tych samych zasobów zachodzi konieczność wykluczenia ich jednoczesnego użycia, wtedy stosowany jest mechanizm wzajemnego wykluczania mutex. Zadania mogą być: tworzone, zawieszane, wznawiane, likwidowane, mogą czekać na spełnienie warunku, w szczególności na upłynięcie zadanego czasu.
Biblioteki stanowią zestawy programów i zmiennych, które mogą być wykorzystane przez aplikacje bądź inne biblioteki. Globalne zmienne i programy biblioteki mogą być albo publiczne albo prywatne. Tylko te publiczne mogą być stosowane przez programy zewnętrzne względem biblioteki. Globalne publiczne programy i zmienne stanowią interfejs do biblioteki. Interfejsy mogą być współdzielone przez różne biblioteki. Uruchomienie biblioteki wiąże się z powołaniem do życia odpowiednich zadań. Takie zadania są prywatne, w związku z czym mogą być używane jedynie przez bibliotekę, która je utworzyła. Biblioteki z atrybutem zachowaj (retain) przechowują swoje zmienne w pamięci nieulotnej, co oznacza, że nawet zanik napięcia nie spowoduje utraty ich wartości. Biblioteki mają postać plików. W związku z tym mogą być przechowywane w postaci skompresowanej (ZIP), a dostęp do nich może być chroniony hasłem. Uruchomienie aplikacji powoduje załadowanie i uruchomienie programów zawartych w stowarzyszonych bibliotekach. Wtedy programy stają się zadaniami.
Sterowniki Stäubli mogą być dodatkowo wyposażone w możliwość obsługi protokołów OPC UA (Open Platform Communications Foundation Unified Architecture), co umożliwia porozumiewanie się z dodatkowym sprzętem wytwarzanym przez różnych producentów. Protokoły te bazują na TCP/IP, HTTP oraz SOAP. Serwer umożliwia szyfrowanie komunikacji za pomocą protokołu SSL (Secure Sockets Layer), co zwiększa jej bezpieczeństwo. Zmienne w trakcie wykonania programu zapisanego za pomocą języka VAL3 mogą być widoczne i modyfikowane przez klientów OPC UA. Procedury OPC UA mogą przyjmować rolę zarówno publikatorów jak i subskrybentów danych. Taka komunikacja polega na przesyłaniu wiadomości. Wiadomości te przesyłane są do pośredników, więc kontakt między publikatorem a subskrybentem nie wymaga, by obie strony były obecne, a w szczególności, by w ogóle istniały.
Oprogramowanie narzędziowe Stäubli Robotics Suite
Tworzenie oprogramowania wymaga odpowiednich narzędzi programistycznych. W tym celu stworzono Stäubli Robotics Suite (SRS). SRS służy do tworzenia aplikacji (zestawów programów) metodą off-line, czyli na komputerze niepołączonym bezpośrednio z robotem, ich symulacji, wykonania oraz debugowania. W trakcie tworzenia programów SRS sprawdza ich poprawność syntaktyczną. Stworzone oprogramowanie może być skopiowane na sterownik robota i odwrotnie ze sterownika można pobrać oprogramowanie, by zasymulować jego wykonanie. Symulacja odbywa się w środowisku graficznym dość precyzyjnie obrazującym zarówno samego robota, jak i gniazdo, w którym pracuje. SRS uruchamiane jest pod nadzorem systemu operacyjnego Windows 10 w odpowiedniej wersji, a ponadto ma okienkowy interfejs użytkownika.
SRS umożliwia stworzenie graficznej trójwymiarowej wersji obrazującej rzeczywiste gniazdo obróbcze. Gniazdo może zawierać wiele robotów, a tym samym wiele sterowników z uruchomionym oprogramowaniem napisanym w języku VAL3. Roboty mogą być dodawane i usuwane z gniazda. Istnieje możliwość konwersji sterownika robota z wcześniejszej wersji do aktualnej. W ten sposób starsze instalacje mogą być łączone z nowszymi. W szczególności wejścia i wyjścia różnych sterowników mogą być ze sobą połączone. W trakcie konfiguracji gniazda trzeba podać typ manipulatora oraz zestaw kart wejścia/wyjścia, z których korzysta sterownik danego robota. Symulacje wykonania programów mogą korzystać z fizycznych (PHYSICAL) wejść i wyjść rzeczywistego sterownika, jak i symulowanych. Sterowniki mogą korzystać z takich protokołów komunikacyjnych jak: Ethercat, Powerlink, Modbus, TCP/IP oraz UDP. Tę komunikację należy skonfigurować podając: rodzaj protokołu, typ urządzenia i specyfikację konkretnie wykorzystywanego sprzętu. Wcześniejsze wersje sterowników wymagają ręcznego uruchomienia ich emulatorów, natomiast nowsze uruchamiane są automatycznie. Sterowniki są konfigurowalne, więc SRS umożliwia przeprowadzenie takiej operacji przez podanie odpowiednich parametrów.
W gnieździe z natury rzeczy zamontowane są różne urządzenia współpracujące i egzystują liczne obiekty, np. obrabiany materiał. SRS umożliwia zobrazowanie ich w gnieździe reprezentowanym graficznie. Do tego celu można skorzystać z modeli CAD zapisanych w jednym z dostępnych formatów (np. XCGM, STEP, IGES, STL, 3DXML, HSF, SAT, CADPART). Można też samodzielnie tworzyć modele graficzne z elementarnych brył geometrycznych: kul (SPHERE), prostopadłościanów (BOX) i walców (CYLINDER). Istniejące modele obiektów są edytowane. Prócz kształtu obiektowi można przypisać jego masę, jak i gęstość. Obiektowi przypisuje się też lokalny układ odniesienia. Dzięki temu można go przemieszczać w gnieździe określając, gdzie powinien się znajdować względem globalnego układu odniesienia. Komponent zbudowany z kształtów składowych może mieć wewnętrzne stopnie swobody, np. chwytak. Z komponentem można skojarzyć jego zachowanie (BEHAVIOR), którym można sterować. Zachowanie jest wyrażone jako automat skończony, którego stan można zmieniać. Komponent musi być skojarzony z wyjściem sterownika, które będzie go uaktywniać. Należy również zdefiniować czas, który jest potrzebny, by wykonać ruch sterowanym fragmentem komponentu. Komponenty mogą tworzyć lub kasować inne komponenty. W ten sposób w gnieździe mogą pojawiać się nowe obiekty lub z niego znikać, a całość będzie obrazować działanie podajników lub taśmociągów. Właściwości zachowań podlegają edycji. W efekcie powstaje dość wierny trójwymiarowy obraz gniazda oraz jego działania.
SRS potrafi zobrazować przestrzeń roboczą danego robota, co ułatwia określenie potencjalnych kolizji z obiektami znajdującymi się w gnieździe. Robot przemieszcza narzędzie. Narzędzie określane jest przez podanie jednego uchwytu (HANDLE) oraz jednej bądź więcej chwytni (HANDLER). Chwytnia może być przyłączona tylko do jednego uchwytu, ale uchwyt może być połączony z wieloma chwytniami. Relacja połączenia między uchwytami i chwytniami może być stała lub chwilowa. Uchwyty i chwytnie stanowią elementy samego robota, obiektów oraz narzędzi, czyli chwytaków i przyssawek. Narzędzie dołączane jest do końcówki manipulatora, a dokładniej jego chwytni, za pomocą swego uchwytu. Narzędzia chwytają obiekty za pomocą swych chwytni. Przykładowo, uchwyt chwytaka przytwierdzany jest do chwytni robota, która znajduje się na końcu manipulatora. Aby uchwycić obiekt za pomocą chwytaka, trzeba skorzystać z jego chwytni. Chwytnia chwytaka przemieszczana jest do uchwytu obiektu, by go uchwycić. Ponadto z narzędziami przytwierdzonymi do manipulatora skojarzony jest układ odniesienia TCP (Tool Center Point). TCP należy przypisać do chwytni narzędzia. Ponieważ SRS tworzy obraz zarówno robota jak i narzędzia, połączenie obu tych urządzeń odbywa się poprzez przesunięcie jednego obrazu w pobliże drugiego. Wtedy następuje ich automatyczne połączenie. Istnieje komenda rozłączająca takie powiązanie, więc w trakcie pracy robota jego narzędzia mogą być wymieniane.
W gnieździe można umieścić producentów (FEEDER) i konsumentów (CONSUMER) obiektów. W ten sposób materiał, który jest przetwarzany w gnieździe, pojawia się w nim w odpowiednim momencie, a po obróbce znika z niego, tak jak to się dzieje w rzeczywistości. W gnieździe można stworzyć graficzne układy odniesienia, które w rzeczywistym gnieździe nie istnieją, ale mogą stanowić dodatkowe układy odniesienia ułatwiające planowanie ścieżek. Przy tworzeniu modelu gniazda wszystkie obiekty w nim się znajdujące mogą być swobodnie przemieszczane. Można zmieniać ich położenie oraz orientację. Można to robić korzystając z kursora na ekranie albo za pomocą wielu operatorów ułatwiających pozycjonowanie względem innych obiektów. Ponieważ obiekty o złożonych kształtach komponowane są z obiektów prostszych, SRS udostępnia komendy grupowania i rozgrupowywania do tworzenia obiektu złożonego lub jego dekompozycji. Obiekty mogą być powielane i kasowane. Samo gniazdo może być obserwowane z różnych punktów oraz w różnej skali (CAMERA). Co więcej, prócz obiektów znajdujących się w gnieździe, można obrazować stworzone strefy bezpieczeństwa (SAFETY).
Obrazem robota można też sterować ręcznie. Korzystając ze środowiska SRS można zmieniać położenie poszczególnych stopni swobody łańcucha kinematycznego manipulatora. Taki efekt można osiągnąć poruszając kursorem na ekranie komputera lub wprowadzając odpowiednie wartości liczbowe kątów w złączach. Można też wykorzystać suwaki wyświetlone w okienku. Kolejny sposób to sterowanie końcówką w przestrzeni operacyjnej (kartezjańskiej) przez wprowadzanie w pola interfejsu zadanych położeń wzdłuż osi X, Y i Z oraz obroty wokół tych osi. Można też zażądać ustawienia ramienia w odpowiedniej relacji do obiektów lub ścieżki, np. w środku łuku. Oczywiście to samo można zrealizować stosując instrukcje języka VAL3 do przestawiania obrazu robota. Na ekranie można wyświetlić pozycje zadane. W tych miejscach rysowane są układy odniesienia. Ich kolor określa, czy do danej pozycji robot jest w stanie dojechać utrzymując zadaną konfigurację ramienia, czy mieści się w przestrzeni roboczej etc. SRS dysponuje optymalizatorem, który podpowiada programiście, jak zmodyfikować ścieżkę, by wszystkie jej pozycje składowe były osiągalne. W trakcie ruchu obrazu ramienia kreślony jest jego ślad oraz wykrywane są kolizje z obiektami w otoczeniu. Wykrycie kolizji sygnalizowane jest zmianą koloru obiektów, które się zderzyły, na czerwony. Niektóre obiekty można wykluczyć z procedury wykrywania kolizji. Można też ustawić, na ile robot może się zbliżyć do obiektu. Nadmierna jego bliskość jest wtedy sygnalizowana. Otwarcie chwytaka lub wyłączenie podciśnienia spowoduje uwolnienie trzymanego obiektu. Jeżeli pod obiektem tym nie ma innego, opadnie on w dół aż do zderzenia z przedmiotami znajdującymi się poniżej. SRS umożliwi zarejestrowanie filmu obrazującego symulację pracy gniazda.
Realizacja symulacji programu robota może być wynikiem działania emulatora sterownika bądź rzeczywistego sterownika (SYNCHRONIZATION MODE). Należy tu określić, czy wykonanie programu ma być połączone z uruchomieniem debuggera. Można też włączyć lub wyłączyć rysowanie śladu ruchu robota. Do symulatora można wczytać wcześniej zarejestrowaną ścieżkę. Można obejrzeć ruch manipulator po niej zarówno w przód, jak i w tył.
SRS nie tylko może symulować wykonanie programu stworzonego w języku VAL3 wykorzystując trójwymiarowy obraz gniazda obróbczego, ale również sugerować optymalizację miejsca zamontowania robota, by wszystkie pozycje zapisane w programie, do których ma się przemieścić manipulator, znajdowały się w jego przestrzeni roboczej. Aby wykonać tę funkcję, należy wskazać dopuszczalny obszar, w którym musi się znaleźć baza robota. Po przemieszczeniu bazy symulator za pomocą kolorów wskaże fragmenty ścieżek, gdzie narzędzie będzie poddane różnym przyspieszeniom. W ten sposób można wykryć potencjalne przeciążenia.
Obecnie roboty Stäubli korzystają ze sterowników CS9. Sterowniki te wyposażono w dodatkowy układ bezpieczeństwa. Wymaga on podania szeregu parametrów. Są to: bezpieczna ograniczona prędkość (Safe Limited Speed), bezpieczne zatrzymanie (Safe Stop), bezpieczna strefa (Safe Zone), bezpieczne narzędzie (Safe Tool) i bezpieczny dotyk (Safe Touch). Jedynie koboty TX2touch firmy Stäubli mogą korzystać z funkcji Safe Touch, ponieważ tylko one wyposażone są w grubą elastyczną powłokę wykrywającą zderzenie z dowolnym obiektem, a w szczególności z człowiekiem. Ze strefami bezpieczeństwa związane są ograniczenia narzucane na prędkość ruchu ramienia. Wykrycie naruszenia odległej strefy bezpieczeństwa powoduje redukcję prędkości ruchu ramienia, natomiast wejście człowieka w strefę bliską robotowi skutkuje zatrzymaniem ramienia. Naruszenie stref wykrywane jest odpowiednimi czujnikami zamontowanymi w gnieździe. Czujniki te muszą być podłączone poprzez kartę wejść/wyjść do sterownika CS9. SRS umożliwia konfigurację parametrów bezpieczeństwa robotów korzystających ze sterowników CS9.
Podsumowanie
W tej części cyklu artykułów poświęconego metodom programowania robotów przemysłowych przedstawiono sposoby programowania robotów firmy Stäubli International AG. Ostatnia część cyklu, która ukaże się w kolejnym numerze Automatyki, zawierać będzie opis metod programowania robotów firmy Fanuc Ltd.
source: Automatyka 9/2024