Rutynowe postępowanie przed wykonaniem ruchu – definiowanie parametrów osi
Dobrą praktyką przed wykonywaniem ruchów daną osią jest zdefiniowanie dla niej takich parametrów jak: prędkość (SPEED), przyspieszenie (ACCEL) oraz opóźnienie (DECEL). Powinniśmy stosować się do tego nawet w sytuacji w której parametry ruchu są zgodne z tymi, które zdefiniowaliśmy w programie STARTUP – wynika to z niezerowego prawdopodobieństwa, że w danej chwili wartości te różnią się od domyślnych (np. przed wykonaniem interesującego nas programu mogliśmy uruchomić inny program redefiniujący wspomniane parametry, inna osoba mogła dokonać zmian w programie bez naszej wiedzy czy też sami mogliśmy zmienić parametry dla danej osi i przez nieuwagę uruchomić program z nieodpowiednimi ich wartościami. Nie stosowanie tej zasady może nieść za sobą wiele konsekwencji. Istnieją dwie możliwości modyfikowania parametrów osi:
‘ opcja nr 1
BASE(x)
SPEED = 200 ‘ definicja prędkości dla osi x
ACCEL = 500 ‘ definicja przyspieszenia dla osi x
DECEL = 500 ‘ definicja opóźnienia dla osi x
‘ opcja nr 2
SPEED AXIS(x) = 200 ‘ definicja prędkości dla osi x
ACCEL AXIS(x) = 500 ‘ definicja przyspieszenia dla osi x
DECEL AXIS(x) = 500 ‘ definicja opóźnienia dla osi x
Jednostki użytkownika
UNITS jest istotnym parametrem, który również mógłby się pojawić w powyższym kodzie. Stanowi on współczynnik konwersji który pozwala skalować użytkownikowi sygnał sterujący kontrolera do wygodniejszej skali. Parametry prędkości przyspieszenia czy opóźnienia uwzględniają współczynnik UNITS w celu wykonywania ruchu o parametrach w przyjaznej jednostce np. [mm] dla przemieszczenia, [mm / s] dla prędkości. Ważnym jest aby w kodzie UNITS znajdowało się przed parametrami SPEED, ACCEL, DECEL czy CREEP ponieważ wprowadzenie jego wartości po nich będzie skutkowało zmianą ich wartości. Należy również podkreślić, że aby wszelkie ruchy interpolowane były wykonywane poprawnie na wszystkich osiach biorących udział w ruchu parametr UNITS musi mieć taką samą wartość.
Komenda BASE / tablica BASE
W powyższym kodzie pojawiła się komenda BASE stanowiąca istotny koncept w języku TrioBASIC. Wywołanie tej komendy ma postać
BASE(1_numer_osi, 2_numer_osi, 3_numer_osi, …)
i określa to do jakich osi będą trafiały komendy ruchu. W poleceniu uszeregowujemy za pomocą parametrów numery osi do których odwoływała będzie się dalsza część naszego kodu. Należy tu jednak zaznaczyć, że tablica BASE przechowująca uszeregowane osie ma wielkość równą liczbie osi obsługiwanych przez nasz kontroler i brakująca ich liczba w komendzie BASE w tablicy BASE jest uzupełniana automatycznie (np. jeśli mamy kontroler obsługujący 8 osi, efektem komendy BASE(1, 2) może być tablica BASE = (1,2,3,4,5,6,7,0), aczkolwiek niedefiniowana część tabeli zależna jest od naszego wcześniejszego postępowania co oznacza, że nie możemy być pewni tego jak wygląda niedefiniowana przez nas część tabeli, choć postać jej możemy w każdej chwili sprawdzić wpisując w terminalu polecenie BASE bez żadnych parametrów). Należy również podkreślić, że każdy proces oraz wiersz poleceń posiadają osobne tablice BASE. Nawiązując do poprzedniego zagadnienia chciałbym zaznaczyć, że efektem kodu:
BASE(x, y, z)
UNITS = 10 ‘ definicja przelicznika jednostek dla osi x
SPEED = 200 ‘ definicja prędkości tylko dla osi x
ACCEL = 500 ‘ definicja przyspieszenia tylko dla osi x
DECEL = 500 ‘ definicja opóźnienia tylko dla osi x
nie jest definicja parametrów UNITS, SPEED, ACCEL oraz DECEL dla osi x, y, z podanych jako parametry polecenia BASE, a jedynie dla pierwszej osi aktualnie znajdującej się w tabeli BASE tzn. x.
Zezwolenie na wykonywanie ruchów
Przed wykonaniem ruchu musimy również użyć komendy WDOG = ON – odpowiada ona za załączenie osi zewnętrznych poprzez przekaźnik watchdog. W przypadku wystąpienia jakiegokolwiek błędu na którejś z obsługiwanych osi styk przekaźnika zostaje otwarty (WDOG = OFF) co w konsekwencji prowadzi do ustawienia napięcia na wyjściach analogowych równego 0V, wyjścia krok / kierunek oraz wszelkie inne sposoby sterowania napędami zostają wyłączone. Parametr WDOG możemy kontrolować również za pomocą przycisku drive enable w okienku Controller.
Definiowanie pracy w otwartej lub zamkniętej pętli sterowania
Kolejnym parametrem o którym warto wspomnieć jest SERVO poprzez który definiujemy pracę w zamkniętej lub otwartej pętli sterowania.
- SERVO = OFF – praca w otwartej pętli sterowania
- SERVO = ON – praca w zamkniętej pętli sterowania
Ruchy ciągłe
Najprostszym typem ruchów są ruchy ciągłe. Odpowiedzialne są za nie dwie komendy:
- FORWARD – ciągły ruch do przodu
- REVERSE – ciągły ruch do tyłu
Ruchy te nie posiadają zdefiniowanego końca co nasuwa pytanie jak nasze napędy zatrzymać. Z pomocą przychodzą dwie komendy – CANCEL oraz RAPIDSTOP, których użycie bez żadnych parametrów doprowadzi do zatrzymania ruchów ciągłych. Natomiast w świetle omawianego tematu należałoby powiedzieć więcej o procedurach zatrzymywania ruchów. Zanim do tego przejdziemy istotnym wydaje się nakreślenie sposobu egzekucji przez kontroler komend ruchu.
Bufory ruchów
Komendy ruchu w kontrolerze wysyłane są do buforów w których oczekują na swoją egzekucję. Każdy program BASIC posiada swój proces w którym jest wykonywany. Z każdym procesem związany jest bufor PMOVE gdzie początkowo ładowane jest polecenie ruchu. Bufor PMOVE sprawdza które osie są zaangażowane w to polecenie, a następnie przypisuje polecenie do buforów odpowiednich osi. Jeśli bufory osi są pełne, komenda będzie oczekiwać w buforze procesowym dopóki w buforze osi nie zwolni się miejsce. Jeśli bufor PMOVE jest pełen wykonywanie programu zatrzyma się na komendzie ruchu do czasu aż bufor zostanie zwolniony. Każda oś posiada MTYPE, który przechowuje aktualnie wykonywany ruch oraz NTYPE, który przechowuje pierwsze polecenie bufora ruchów. Liczbę buforów możemy modyfikować poleceniem LIMIT_BUFFERED = x, gdzie x = 1 : 64 (domyślnie x = 1 – jedynym buforem jest NTYPE).
Pełny system buforowy pokazano na poniższym rysunku, NTYPE jest buforem nr 1, więc wszelkie inne bufory włączone przez LIMIT_BUFFERED zaczynają się od indeksu 2.
Procedury zatrzymywania ruchów
Po opisie powyższego zagadnienia możemy powrócić do tematu procedur zatrzymywania oraz poleceń z nimi związanych. Jak zostało wspomniane powyżej istnieją dwie takie komendy – CANCEL, RAPIDSTOP. Różnicą w ich działaniu jest liczba osi na jakie oddziałują ponieważ polecenie CANCEL wpływa tylko na jedną oś natomiast RAPIDSTOP wpływa na wszystkie osie. Polecenia te prowadzą do zatrzymania ruchów o profilowanej prędkości tj. np. FORWARD, REVERSE, MOVE, MOVEABS, MOVECIRC, MHELICAL, MOVEMODIFY z opóźnieniem określanym przez DECEL lub FASTDEC natomiast ruchy innego typu zatrzymywane są natychmiastowo. Z obiema komendami związany jest parametr definiujący ich działanie:
- 0 / brak parametru – zatrzymywanie ruchów z buforów MTYPE
- 1 – zatrzymuje wszystkie aktywne i buforowane ruchy z pominięciem PMOVE
- 2 – zatrzymuje wszystkie aktywne i buforowane ruchy włącznie z PMOVE
Zwykle program wymaga jakiejś formy funkcji „pełnego zatrzymania”, która zatrzymuje cały ruch na jednej lub wszystkich osiach. Myślenie o takiej procedurze wymaga uświadomienie sobie, że powyższe polecenia zatrzymują ruchy aktualnie wykonywane i aktualnie znajdujące się w buforach. Dlatego pierwszym zadaniem któremu trzeba sprostać w takiej sytuacji jest zatrzymanie programów generujących komendy ruchu. Rekomendowanym najprostszym i najbardziej bezpiecznym jest następujące postępowanie:
STOP “ruch1” ‘ zatrzymanie programu „ruch1” generującego komendy ruchu
‘ zatrzymanie wszystkich aktywnych ruchów oraz ruchów aktualnie znajdujących się w buforach ‘ wraz z PMOVE
RAPIDSTOP(2)
Ruchy o interpolacji liniowej
Wyróżniamy dwa typy ruchu o interpolacji liniowej: ruch inkrementalny (MOVE) oraz ruch absolutny (MOVEABS). Ruch inkrementalny charakteryzuje fakt, że w kolejnych parametrach polecenia:
MOVE(dystans0, dystans1, dystans2, …)
podajemy „odległości”, dla kolejnych osi zdefiniowanych w tabeli BASE, na które powinny się przemieścić (licząc od pozycji osi przed wykonaniem komendy). W ruchu absolutnym natomiast w kolejnych parametrach polecenia:
MOVEABS(pozycja_0, pozycja_1, pozycja_2, …)
definiujemy pozycje absolutną w przestrzeni roboczej do której powinien przemieścić się układ. Cechami wspólnymi obu ruchów są:
- początkowa definicja osi których będzie dotyczyło dane polecenie poprzez wykorzystanie komendy BASE
- parametry UNITS, SPEED, ACCEL, DECEL ruchu definiowane są przez odpowiednie ich wartości dla pierwszej osi w tablicy BASE
- prędkości osi wyznaczane są automatycznie aby wektor ruchu odpowiadał zdefiniowanemu w komendzie ruchu i odbywał się z odpowiednią prędkością (punkt powyżej)
Istotnym wydaje się podkreślenie faktu, że oba powyższe polecenia opierają się na tablicy BASE (która zawiera numery osi w liczbie równej ilości osi obsługiwanych przez dany kontroler, domyślnie BASE = (0, 1, 2, 3, …, liczba_obsługiwanych_osi)) natomiast poprzedzające komende ruchu polecenie BASE jedynie modyfikuje tą tablice. W związku z tym użycie polecenia BASE(1, 2) i kolejnie MOVE(1000, 2000, 3000, 4000) doprowadzi do wykonania ruchu inkrementalnego o interpolacji liniowej na osiach 1, 2, x, y, gdzie x oraz y są kolejnymi (nieokreślonymi przez nas w danej chwili) numerami osi w tabeli BASE = (1, 2, x, y, …).
Przykład użycia komendy MOVE poprzez narysowanie litery „M” za pomocą plotera XY:
MOVE; rozpoczęcie rysowania litery „M” od aktualnej pozycji | MOVEABS; rysowanie litery „M” z uwzględnieniem współrzędnych punktu A = (0,0) |
(0, 1) MOVE(0, 12) ‘ruch A -> B | (0, 1) MOVEABS(0, 0) ‘ruch do punktu a |
Ruch o interpolacji kołowej:
Ruch o interpolacji kołowej związany jest z poleceniem:
MOVECIRC(koniec1, koniec2, srodek1, srodek2, kierunek [, ta [, ta_info]])
Długość łuku oraz jego promień wyznaczane są przez pięć argumentów, a parametry krzywej (koniec ruchu, środek krzywizny) mają charakter relatywny i określane są względem pozycji osi przed wykonaniem danej komendy.
W sytuacji w której podany przez nas koniec łuku nie będzie leżał na okręgu (o promieniu zdefiniowanym przez odległość pomiędzy punktem startowym i środkiem krzywizny), zostanie on redefiniowany przez program w taki sposób aby znajdował się w punkcie przecięcia łuku oraz prostej przechodzącej przez środek i zdefiniowany przez nas koniec krzywizny.
Parametry UNITS, SPEED, ACCEL, DECEL ruchu definiowane są przez odpowiednie ich wartości dla pierwszej osi w tabeli BASE.
Opis parametrów:
- koniec1 – pozycja zakończenia ruchu na pierwszej osi w tablicy BASE
- koniec2 – pozycja zakończenia ruchu na drugiej osi w tablicy BASE
- srodek1 – pozycja środka łuku na pierwszej osi w tablicy BASE
- srodek2 – pozycja środka łuku na drugiej osi w tablicy BASE
- kierunek – sposób definiowania kierunku wykonywania ruchu (0 – kierunek przeciwny do ruchu wskazówek zegara, 1 – kierunek zgodny z ruchem wskazówek zegara, 2 – kierunek ruchu wyznaczany w taki sposób aby ruch odbywał się po krótszej ścieżce, 3 – kierunek ruchu wyznaczany w taki sposób aby ruch odbywał się po dłuższej ścieżce)
- ta [ parametr opcjonalny ] – transition angle; kąt przejścia w radianach
- ta_info [ parametr opcjonalny ] – indeks pierwszej komórki w tabeli do której zostaną wysłane informacje o wyznaczonej krzywej przejścia (ta_info + 0 – zmieniona względna pozycja środka łuku na drugiej osi w tabeli BASE, ta_info + 1 – zmieniona względna pozycja środka łuku na pierwszej osi w tabeli BASE, ta_info + 2 – współczynnik skali z obliczeń krzywej przejściowej, ta_info + 3 – promień zmienionego łuku, ta_info + 4 – długość krzywej przejścia, ta_info + 5 – całkowita długość, ta_info + 6 – Zastosowany kąt przejścia (może być mniejszy niż wprowadzony, jeśli kąt łuku jest niewystarczający); podawany w radianach).
Przykład użycia podstawowej wersji polecenia MOVECIRC (bez krzywych przejścia). Narysowanie litery „O” za pomocą plotera XY:
BASE(0, 1)
SPEED = 20
ACCEL = 200
DECEL = 200
MOVEABS(0,40) ‘ruch A -> B
MOVECIRC(30,30,30,0,1) ‘ruch B -> C
MOVE(20,0) ‘ruch C -> D
MOVECIRC(30,-30,0,-30,1) ‘ruch D -> E
MOVE(0,-40) ‘ruch E -> F
MOVECIRC(-30,-30,-30,0,1) ‘ruch F -> G
MOVE(-20,0) ‘ruch G -> H
MOVECIRC(-30,30,0,30,1) ‘ruch H -> A
Krzywe przejścia znajdują zastosowanie w sytuacjach takich jak np. poruszanie się maszyny po linii prostej ze stałą prędkością i nagłe przejście do ruchu po łuku kołowym – wiąże się to z nagłą skokową zmianą przyspieszenia mogącą powodować wibracje na maszynie. Funkcja krzywej przejściowej pozwala na wprowadzenie w takiej sytuacji krzywej wejściowej oraz wyjściowej, których krzywizna zmienia się stopniowo od zera do krzywizny łuku powodując stopniową zmianę przyspieszenia.
Z ruchem po łuku krzywoliniowym (ze stałą prędkością) wiąże się przyspieszenie chwilowe
a = v²/ ρ
z czego wynika, że skok przyspieszenia jest proporcjonalny do kwadratu prędkości i odwrotnie proporcjonalny do promienia krzywizny w danym punkcie ruchu (na czym opiera się działanie krzywych przejścia) . Na poniższym rysunku została przedstawiona idea zagadnienia:
Powyższy rysunek przedstawia sytuację w której wprowadzony został duży kąt przejścia (czerwonym kolorem została oznaczona krzywa przejścia) jednak już niewielka jego wartość może przynieść bardzo pozytywne efekty.
Powyższy rysunek przedstawia wykres przyspieszenia osi na urządzeniu XY poruszającym się po zaokrąglonym prostokącie. Po lewej wykresy bez zastosowania krzywych przejścia, a po prawej wykresy po ich zastosowaniu.
Należy jednak zwrócić uwagę na zmianę parametrów łuku podczas wykorzystywania krzywych przejścia – początek oraz koniec łuku pozostają niezmienne natomiast zmianie ulega położenie środka oraz promień łuku. Z deformacją wiążą się dwie zależności:
- zmiana pierwotnego promienia staje się tym wyraźniejsza im większy kąt całego łuku – w związku z tym producent zaleca aby łuki do których stosujemy krzywe przejścia nie przekraczały 180º
- wraz ze wzrostem kąta przejścia maleje końcowy promień łuku co wiąże się ze wzrostem przyspieszenia szczytowego
Powyższy rysunek przedstawia wpływ kąta przejścia na zmianę parametrów łuku:
- niebieska ścieżka – łuk podstawowy
- żółta ścieżka – kąt przejścia równy 5º
- czerwona ścieżka – kąt przejścia równy 10º
Zapraszamy do kolejnej części kursu.
Autor: Artur SobasŚwieżo upieczony Inżynier, student II stopnia Inżynierii Mechatronicznej na Akademii Górniczo – Hutniczej im. Stanisława Staszica w Krakowie. Związany z firmą od czasów szkoły średniej poprzez uczestnictwo w szkoleniach i późniejsze praktyki. Obecnie Doradca Techniczny na co dzień zajmujący się projektowaniem stanowisk szkoleniowych oraz demonstracyjnych. Od wielu lat w kręgu jego zainteresowań miejsce znajduje szeroko pojęta automatyka. |