Metody programowania robotów przemysłowych, cz.1
Cezary Zieliński (Łukasiewicz – PIAP) drukuj
Współczesne roboty przemysłowe oraz koboty, czyli roboty bezpośrednio współpracujące z ludźmi, programowane są metodą hybrydową. Oznacza to stosowanie zarówno elementów programowania on-line, jak i off-line. Artykuł ten prezentuje języki obecnie stosowane przez producentów robotów Universal Robots oraz pokazuje kontekst, w jakim były one tworzone.
Metoda programowania on-line wymaga udziału robota podczas tego procesu, natomiast metoda off-line nie wymaga spełnienia takiego warunku. W trakcie programowania robota metodą on-line, często nazywaną uczeniem, operator/programista przemieszcza końcówkę robota do kolejnych pozycji i zapamiętuje je. W trakcie wykonywania programu sterownik robota, a dokładniej serwomechanizmy złącz manipulatora, przemieszczają ramię robota do tych pozycji. Programowanie off-line polega na zapisaniu zadania, które ma wykonać robot. Zapis ten może być tekstowy lub ikoniczny. W tym drugim przypadku program tworzony jest przez klikanie na ikony reprezentujące instrukcje, natomiast ich parametry wprowadzane są do odpowiednich okienek za pomocą klawiatury.
Należy zwrócić uwagę, że języki programowania robotów przemysłowych i kobotów, niezależnie od sposobu zapisu tekstowego czy ikonicznego, czerpią zasady z języka Basic (Beginners’ All-purpose Symbolic Instruction Code), opracowanego w 1963 r. Język ten charakteryzuje się tym, że nie rozróżnia poleceń programu użytkowego (oprogramowania aplikacyjnego) i komend przeznaczonych dla systemu operacyjnego (oprogramowania systemowego). Był przeznaczony dla użytkowników, którzy mieli ograniczoną wiedzę o ówczesnych komputerach, a dzięki jego prostocie zyskał szczególną popularność, gdy pojawiły się mikrokomputery zbudowane na bazie pierwszych mikroprocesorów. Ta prostota użycia, niewymagająca długotrwałej nauki i wysokich kwalifikacji wstępnych, przyciągnęła uwagę twórców robotów przemysłowych. Stąd języki programowania robotów wzorowane są na języku Basic.
Zanim robot będzie mógł wykonać jakiekolwiek zadanie użytkowe trzeba wykonać dwie czynności. Po pierwsze, trzeba urządzenie skonfigurować, a więc przygotować do pracy, a po drugie utworzyć program realizujący zaplanowane zadanie. Każdą z tych czynności może wykonywać inna osoba: operator lub programista, ale często obie są tożsame, więc dalej nie będziemy rozróżniać funkcji tych pracowników.
Z dokładnością do drobnych szczegółów, struktury układów sterowania robotów przemysłowych są bardzo podobne (jak na schemacie). Podstawowym blokiem jest sterownik robota, który zawiera panel operatora. Do sterownika dołączane są:
- panel programowania, który jest podstawowym narzędziem programowania robota,
- manipulator oraz ewentualnie osie dodatkowych urządzeń wyposażonych w silniki, np. osie napędzające podajniki,
- zestaw bloków wejściowych i wyjściowych, do których dołączane są urządzenia generujące lub akceptujące sygnały cyfrowe lub analogowe,
- komputer zewnętrzny, który może być nadrzędnym układem sterowania robota albo może służyć do tworzenia programu w trybie off-line – jest to element opcjonalny.
Do wykonania programu wystarczy sterownik oraz manipulator i urządzenia wejścia/wyjścia. Do programowania niezbędny jest albo panel programowania albo komputer zewnętrzny, a niekiedy oba te urządzenia.
Sposoby tworzenia programów współczesnych robotów przemysłowych zostały przedstawione w tym trzyczęściowym artykule na przykładach możliwości sterowników i narzędzi kilku znanych globalnych firm produkujących takie roboty. Sterowniki odpowiedzialne są zarówno za wykonywanie ruchów przez robota, jak i interpretację instrukcji programu, który definiuje, co konkretnie robot ma zrobić. Ten artykuł koncentruje się na sposobie tworzenia programów z użyciem narzędzi dostarczanych przez poszczególne firmy oraz znaczeniu instrukcji interpretowanych przez sterowniki czterech producentów robotów.
W prezentowanym przeglądzie uwaga czytelników została skupiona na metodach programowania robotów czterech firm: Universal Robots, ABB Ltd, Stäubli International AG oraz Fanuc Robotics Ltd. Ze względu na objętość tekstu przegląd został podzielony na trzy części, które ukażą się w kolejnych numerach miesięcznika „Automatyka”.
Język programowania Universal Robots
Do programowania robotów firmy Universal Robots służy oprogramowanie PolyScope. By ułatwić korzystanie z tego narzędzia, utworzono ikoniczny interfejs użytkownika (interfejs graficzny). Przy tworzeniu PolyScope założeniem było, że proste zadania będą mogły być programowane szybko i bez większego wysiłku, ale tworzenie programów realizujących zadania złożone będzie nadal możliwe. Możliwości tego oprogramowania zostały skrojone pod potrzeby użytkowników bezpośrednio uczestniczących w procesie produkcyjnym, a nie profesjonalnych programistów. Ponadto stworzono PolyScope X – uproszczoną wersję PolyScope, a przez to mniej wszechstronną.
Interfejs graficzny, konfiguracja robota
Interfejs graficzny ma strukturę okienkową. Okno główne składa się z szeregu pól, które zawierają ikony. Pole główne umożliwia wybór trybu pracy środowiska programistyczno-operatorskiego:
- wykonanie programu (Run),
- utworzenie programu (Program),
- konfiguracja robota (Installation),
- wykonanie ruchów ręcznych robotem (Move),
- ustalenie wartości wejść/wyjść pomocniczych sterownika (I/O),
- podgląd diagnostyki robota (Log).
Pozostałe pola zależą od wyboru jednej z tych opcji.
Po włączeniu zasilania robota konieczne jest wybranie lub utworzenie pliku konfiguracyjnego robota. Należy to zrobić przed uruchomieniem programu realizującego zadanie. Plik instalacyjny można zdefiniować także za pomocą oprogramowania PolyScope, które uruchamia się na panelu programowania (teach pendant) automatycznie po włączeniu zasilania. Plik ten zawiera m.in. informacje o położeniu i orientacji narzędzia względem kołnierza manipulatora (TCP), sposobie zamontowania bazy robota względem pola grawitacyjnego, przenoszonego ciężaru (Payload) oraz jego środka ciężkości (CoG).
Sposób zamontowania manipulatora wpływa zarówno na sterowanie urządzeniem, jak i na odczyty uzyskiwane z czujnika siły, umieszczonego w nadgarstku manipulatora. Jeżeli parametry montowanego chwytaka nie są znane precyzyjnie, to można skorzystać z funkcji wyznaczającej te parametry przez wielokrotne doprowadzenie narzędzia do określonego punktu z różnymi orientacjami. Maksymalny przenoszony ciężar nie może być większy niż maksymalny udźwig robota pomniejszony o masę chwytaka. Dodatkowo położenie środka ciężkości obiektu względem kołnierza ma wpływ na całkowity udźwig. W różnych fazach wykonywania zadania chwytak będzie nieobciążony bądź będzie trzymał obiekty o różnych masach. Istotne jest też położenie środka ciężkości przemieszczanego obiektu. Warto za pomocą instrukcji Set każdorazowo informować sterownik o zmianie parametrów dynamicznych obciążonego robota. Ponieważ ustalenie wartości tych parametrów może być trudne, można skorzystać z wbudowanego w nadgarstek czujnika sił i momentów sił i za pomocą instrukcji estymacji obciążenia (Payload Estimation) ustalić ich wartość. W tym celu końcówkę robota wraz z przemieszczanym obiektem trzeba ustawić w kilku orientacjach, tak aby czujnik siły zarejestrował zmiany oddziaływania pola grawitacyjnego na obiekt. Następnie używając instrukcji Set_Paylod_CoG można informować sterownik o ich zmianach. Weryfikację poprawności definicji powyższych parametrów przeprowadza się za pomocą polecenia FreeDrive – jeżeli po jego wydaniu końcówka się nie porusza, to znaczy, że serwomechanizmy prawidłowo kompensują wpływ grawitacji na chwytak i uchwycony obiekt.
Funkcje PolyScope
Interfejs PolyScope na ekranie panelu programowania prezentuje operatorowi okno podzielone na pola. Po wybraniu programowania robota dalej można wybrać kilka opcji. W szczególności można zlecić stworzenie: instrukcji (Command), prezentacji graficznej robota (Graphics) lub wartości zmiennej wykorzystywanej w programie (Variable). Jedno z pól zawiera ikony wspomagające uruchomienie testowe programu: start lub stop, redukcję prędkości wykonania ruchów przez robota etc. Z punktu widzenia tematu artykułu istotne są pola pojawiające się na ekranie panelu programowania przy wyborze ikony Program. W tym trybie wybierając odpowiednie ikony można stworzyć, załadować lub zapamiętać plik zawierający program użytkowy lub konfigurację robota. Ponadto pojawia się pole z dostępnymi instrukcjami, z których można stworzyć program użytkowy realizujący konkretne zadanie.
Zestaw instrukcji
Instrukcje są podzielone na trzy kategorie: podstawowe (Basic), zaawansowane (Advanced) oraz funkcje biblioteczne (wzorce) stworzone przez producenta (Templates).
Instrukcjami kategorii podstawowej są:
- definicja ruchu wzdłuż ścieżki (Move w trzech odmianach: MoveJ, MoveL i MoveP),
- określenie pozycji pośredniej ruchu końcówki manipulatora (Waypoint),
- oczekiwanie (Wait),
- ustawianie wyjścia (Set),
- tworzenie wyskakujących okienek z komunikatami dla operatora procesu produkcyjnego (Popup),
- zatrzymanie (Halt),
- komentarz (Comment) zwiększający czytelność programu, ale nie wpływający na jego wykonanie,
- operacje na systemie plików przechowujących programy (Folder).
Instrukcja Wait powoduje oczekiwanie na pojawienie się sygnału na wejściu sterownika, np. z czujnika. Instrukcja Set używana jest do ustawiania wartości sygnałów wyjściowych ze sterownika robota dołączonych do urządzeń zewnętrznych. Dzięki niej można m.in. włączać lub wyłączać urządzenia współpracujące z robotem albo określać wartość podawanego napięcia. Ustawiana wartość może być zdefiniowana za pomocą wyrażenia matematycznego. Sterownik robota może się również komunikować z innymi urządzeniami korzystającymi z protokołów: Modbus, Fieldnet lub EtherNet/IP.
Do instrukcji zaawansowanych zaliczane są:
- pętle (Loop) – zarówno wykonywane określoną liczbę razy, jak i dopóki pewien warunek nie zostanie spełniony,
- warunkowe (if else/elseif),
- wielokrotnego wyboru (Switch),
- umożliwiające utworzenie podprogramu (SubProgram),
- wywołania podprogramu (Call Subroutine),
- przypisania (Assignment), która nadaje wynik obliczenia wyrażenia matematycznego określonej zmiennej,
- monitorujące zdarzenia (Event), np. zmianę wartości sygnału wejściowego,
- wykonujące równoległe wątki (Thread), np. sterującego urządzeniem współpracującym – wątki komunikują się z programem robota albo za pomocą sygnałów wejściowo-wyjściowych albo współdzieląc zmienne globalne,
- odmierzające czas (Timer),
- zjazd ramienia do pozycji początkowej (Home).
Wzorce programów (szablony) tworzone są dla często wykonywanych w przemyśle operacji, np. do paletyzacji bądź wkręcania śrub. Istnieje szablon synchronizujący ruch narzędzia z ruchem taśmociągu (Conveyor Tracking). W tym przypadku program robota wykonywany jest względem ruchomego układu odniesienia.
Struktura programu
Programy tworzone są strukturalnie. Program składa się z tzw. węzłów (poleceń), które trzeba skonfigurować. Węzły tworzą strukturę drzewiastą. Wykonanie programu może być uruchomione od dowolnego węzła, co ułatwia testowanie.
Wyróżniono kilka typów zmiennych: logiczne, całkowite, zmiennoprzecinkowe, ciągi znaków, pozycje oraz listy zmiennych.
Pozycje reprezentowane są jako dwa wektory: położenia kartezjańskiego oraz wektora osi obrotu. Zmiennej nadaje się nazwę, wartość początkową oraz wyrażenie, którego wartość ma być jej przypisana. Wyrażenia budowane są ze stałych, zmiennych, funkcji oraz operatorów.
Programowanie ruchu
Zdefiniowano trzy rodzaje ruchu:
- z interpolacją w przestrzeni konfiguracyjnej czyli złącz manipulatora (MoveJ),
- z interpolacją liniową w przestrzeni operacyjnej (MoveL),
- ruch ograniczony wymaganiami procesu realizowanego przez robota (MoveP), np. spawanie.
Pozycje, do których końcówka manipulatora ma dojść, mogą być zadawane w trzech trybach:
- operator ręcznie przemieszcza końcówkę,
- operator korzysta ze strzałek wyświetlonych na panelu programowania,
- przez wprowadzenie wartości liczbowych do odpowiednich okienek pojawiających się na panelu programowania.
Pozycje stanowiące argumenty poszczególnych instrukcji Move mogą być wyznaczane względem globalnego układu odniesienia albo względem poprzednio wprowadzonej pozycji. Argumentem może być zmienna, której wartość może być określona przez urządzenie zewnętrzne, np. przez system wizyjny. Ponadto określany jest sposób zachowania końcówki manipulatora po dojściu do tej pozycji, czyli: czy ma się tam zatrzymać, czy kontynuować ruch. Nadto określane są parametry wpływające na prędkość ruchu manipulatora. Pozycje definiujące ścieżkę ruchu mogą być wprowadzane numerycznie albo przez ustawienie manipulatora we właściwej konfiguracji – wtedy pozycja odczytywana jest z enkoderów złączowych i przeliczana do odpowiedniej przestrzeni (FreeDrive).
MoveJ interpoluje ruch między kolejnymi pozycjami ścieżki w przestrzeni konfiguracyjnej ramienia, więc dla obserwatora wynikową ścieżką jest pewna krzywa wynikająca z geometrii łańcucha kinematycznego stanowiącego manipulator. Ten rodzaj ruchu stosowany jest przede wszystkim wtedy, gdy końcówka ma być przemieszczona szybko na dużych odległościach i nie ma zagrożenia ewentualnymi kolizjami z obiektami znajdującymi się w otoczeniu robota.
MoveL dokonuje interpolacji w przestrzeni operacyjnej, więc dla obserwatora zewnętrznego powstaną odcinki proste. Tego typu ruchy wykonywane są, gdy końcówka porusza się w pobliżu innych obiektów i musimy mieć precyzyjną kontrolę nad realizowaną trajektorią.
MoveP umożliwia ruch wzdłuż złożonej ścieżki ze stałą prędkością (bez zwalniania lub zatrzymywania się w pozycjach pośrednich). Gwarantuje to, że stopiony metal spawu lub klej nie będzie się nadmiernie gromadził w pozycjach pośrednich. Ten rodzaj instrukcji Move wymaga dodatkowego parametru, jakim jest promień łuku, po którym będzie przeprowadzone narzędzie pomiędzy kolejnymi prostymi segmentami ścieżki w pobliżu zadanej pozycji pośredniej. MoveP może także wykonywać ruch po okręgu zdefiniowanym za pomocą trzech pozycji (początkowej, pośredniej oraz końcowej). Pozycje pośrednie każdego ruchu mogą być określone za pomocą nazwanych zmiennych. Istnieją odmiany instrukcji ruchu, które pozwalają zatrzymać ramię, gdy spełnione są pewne warunki zależne od sygnałów zewnętrznych, np. uzyskiwanych z czujników (Until). Zazwyczaj ta możliwość wykorzystywana jest wspólnie z instrukcją ruchu w zadanym kierunku (Direction), zamiast do określonej pozycji.
Ramię robota, oprócz przemieszczania się, może wywierać siłę lub moment siły na otoczenie. Służy do tego instrukcja Force. Ma ona kilka odmian. Jedna z nich czyni ramię podatnym lub umożliwia mu wywieranie siły lub momentu siły wzdłuż lub wokół wektora względem wybranego układu współrzędnych (Frame). Układ ten może być nieruchomy lub zmieniać swoją pozycję w trakcie ruchu robota. Wzdłuż osi prostopadłych do wyznaczonego wektora siły wykonywany jest ruch pozycyjny – ramię jest sztywne w tych kierunkach. W kierunku wywierania siły można ograniczyć prędkość ruchu, zapobiegając nadmiernemu przyspieszeniu w przypadku braku kontaktu narzędzia z otoczeniem.
Programowanie
W trakcie programowania robota można wynik wykonania dowolnej instrukcji programu obejrzeć korzystając z graficznej reprezentacji manipulatora. Ponadto do programu można dodać jego globalną konfigurację, która określa zestaw instrukcji, jakie mają być wykonane przed jego rozpoczęciem (np. ustawienie ramienia w pozycji początkowej), lub ustawia wartości zmiennych w nim użytych oraz to, czy ma być wykonany jednokrotnie, czy jego wykonanie ma być powtarzane automatycznie po jego zakończeniu. Jeżeli program ma być automatycznie powtarzany, to zawartość jego globalnej konfiguracji nie jest ponownie wykonywana.
Niektóre węzły programu mogą być wskazane jako punkty wstrzymania. Wykonanie programu jest zawieszane po dojściu do takiego węzła. Operator może wznowić wykonanie programu od tego węzła. Programy mogą być również wykonywane krokowo, po jednym węźle.
Programy mogą korzystać z dwóch rodzajów zmiennych: instalacyjnych i zwykłych. Te pierwsze istnieją niezależnie od programu, więc ich wartości są zachowywane po jego zakończeniu, czyli mogą być użyte przy ponownym wykonaniu tego programu lub w innym programie. Te drugie istnieją jedynie tak długo, jak długo aktywny jest program, w którym zostały zdefiniowane.
Bezpieczna współpraca
Roboty UR traktowane są jak koboty. Szczególny nacisk położono na kwestie bezpieczeństwa współpracy robotów z ludźmi. Dlatego roboty UR mają stosunkowo niewielką masę i obłe kształty.
Bezpieczeństwo zapewniane jest za pomocą konfigurowalnych funkcji bezpieczeństwa. Dla danego programu można ustawić:
- dopuszczalne limity położenia w złączach,
- limity prędkości w złączach,
- płaszczyzny, których nie powinno przekraczać narzędzie oraz łokieć manipulatora (można zdefiniować do ośmiu takich płaszczyzn),
- graniczną orientację narzędzia,
- dopuszczalne prędkości poszczególnych fragmentów manipulatora,
- graniczną siłę wywieraną przez narzędzie lub łokieć,
- limit pędu osiąganego przez ramię,
- limit mocy mechanicznej rozwijanej przez obciążone ramię,
- maksymalną odległość, którą przebędzie ramię po zainicjowaniu zatrzymania ochronnego,
- maksymalny czas, po którym ramię się zatrzyma, np. po wciśnięciu przycisku stopu awaryjnego.
Po przekroczeniu ograniczeń, robota trzeba ponownie uruchomić, w szczególności można go wpierw manualnie przemieścić do strefy bezpiecznej. Istotnym jest, że wymienione ograniczenia działają nie tylko w trybie odtwarzania programu, ale również przy ruchach ręcznych wykonywanych w trakcie programowania. Wtedy zbliżanie się do ograniczenia powoduje wzrost oporów ruchu, który wyczuwa programista. Można też przy ruchach ręcznych zablokować przemieszczanie się narzędzia w wybranych kierunkach.
Urządzenia współpracujące
Roboty przemysłowe wyposażane są w różnorodne narzędzia, współpracują także z innymi urządzeniami montowanymi na liniach produkcyjnych. Często to sterownik robota nadzoruje ich pracę. Platforma UR+ umożliwia dobranie dodatkowego osprzętu dla robota (np. chwytaki: elektryczne, pneumatyczne lub podciśnieniowe; spawarki; szlifierki; kamery) oraz wybór oprogramowania URCap umożliwiającego współpracę tych urządzeń ze sterownikiem robota. Oprogramowanie to wgrywane jest do sterownika robota, rozszerzając jego możliwości o instrukcje dedykowane wybranemu osprzętowi.
Język programowania URScript
Roboty UR mogą być programowane całkowicie off-line. Taki sposób działania może być w szczególności przydatny, jeżeli robot używany jest do celów badawczych, np. przez uczelnie.
Do programowania off-line służy język programowania URScript. Sterownik robota URControl działa na wbudowanym komputerze PC w szafie sterowniczej. Program stworzony za pomocą PolyScope działa następująco. Graficzny interfejs PolyScope pracujący w panelu programowania łączy się z URControl, jako klient, przy użyciu lokalnego połączenia TCP/IP. Interpretacja programu stworzonego za pomocą PolyScope polega na wysyłaniu z panelu programowania poleceń, które są interpretowane przez URControl. Natomiast programowanie robota za pomocą skryptu napisanego w URScript odbywa się poprzez napisanie programu, który będzie działał na innym komputerze PC połączonym z URControl za pomocą gniazda (socket) TCP/IP. Wtedy ów komputer przejmuje rolę PolyScope.
Polecenia zapisane za pomocą URScript są interpretowane przez URControl. Jeżeli będą nadsyłane szybciej niż możliwa jest ich interpretacja, zostaną ustawione w kolejce do wykonania. Wykonanie każdego polecenia potwierdzane jest przez URControl. Dzięki odpowiednim poleceniom można uzyskać informacje dotyczące stanu robota i jego czujników. Wszakże, aby program zapisany za pomocą URScript mógł być wykonany przez URControl, sterownik robota musi być wprowadzony w interpretacyjny tryb pracy. Po zakończeniu programu należy wyłączyć ten tryb w sterowniku robota. Czyni się to odpowiednimi poleceniami URScript.
URScript działa na tych samych typach danych, co PolyScope, a więc: logicznych, liczbach całkowitych i zmiennoprzecinkowych, pozycjach i ciągach znaków (string). Pozycje zapisywane są jako wektory sześcioelementowe zawierające trzy współrzędne kartezjańskie oraz wersor wyznaczający oś obrotu przeskalowany za pomocą kąta rotacji. Można tworzyć tablice jednowymiarowe i macierze dwuwymiarowe. Zmienne mogą mieć zasięg globalny lub lokalny (ograniczony do wnętrza funkcji). Definiowanie funkcji (def) ułatwia tworzenie wyrażeń matematycznych. Dostępna jest pełna biblioteka funkcji matematycznych.
Przewidziano konieczność zdalnego wykonywania procedur (RPC), co ułatwia korzystanie z usług serwerów XMLRPC i pewnych czujników. Ponadto można tworzyć wątki bezparametrowe. Harmonogramowanie wątków bazuje na zegarze sterownika robota, który pracuje z taktem 2 ms. Podstawowy program zawiera instrukcje ruchu robota, ale można również przekazać sterownikowi URControl program podrzędny do wykonania. Wszakże nie może on zawierać instrukcji ruchu i musi się wykonywać w bardzo krótkim czasie.
URScript udostępnia polecenia ruchu odpowiadające tym tworzonym przez PolyScope. Dodatkowo umożliwia korzystanie z wielu funkcji sterownika niskiego poziomu, np. korzystających z enkoderów, czujników siły. Można korzystać zarówno ze sterowania pozycyjnego, jak i siłowego. Można także uczyć robota, czyli wprowadzać jego aktualną pozycję przesuwając jego ramię ręcznie. Bogactwo poleceń jest o wiele większe niż w przypadku PolyScope.
Podsumowanie
W pierwszej części cyklu artykułów poświęconego metodom programowania robotów przemysłowych zostały przedstawione ogólne zagadnienia wprowadzające oraz sposób programowania robotów firmy Universal Robots. W kolejnym numerze miesięcznika opisane zostaną metody programowania robotów firm ABB Ltd oraz Stäubli International AG. Ostatnia część cyklu poświęcona będzie programowaniu robotów firmy Fanuc Ltd.
źródło: Automatyka 6/2024
Słowa kluczowe
automatyka, programowanie robotów przemysłowych, roboty przemysłowe, Łukasiewicz – PIAP
Komentarze
blog comments powered by Disqus