Strona główna ASTOR
Automatyka w praktyce

Przesyłanie aktualnej pozycji i dystansu do kolejnego punktu
Wymiana danych pomiędzy robotem Kawasaki a sterownikiem PLC, odc. 5

Kontakt w sprawie artykułu: Konrad Sendrowicz - 2024-09-23

W tej części tego poradnika dowiesz się, jak wysyłać informacje o pozycji robota i odległości do następnego punktu.

Aktualna pozycja robota

Bieżącą pozycję można odczytać na kilka sposobów. Pierwszym i najczęściej używanym jest odczyt pozycji na kasecie uczącej. Z drugiej strony, jeśli istnieje połączenie terminalowe z kontrolerem, można użyć dedykowanego polecenia WHERE, które zwróci bieżącą pozycję robota.

W programie na PC należy użyć polecenia HERE, które zwraca aktualną pozycję robota we wszystkich osiach, czyli domyślnie wektor 6 danych. Można je przypisać do wektora danych, a następnie wysyłać pojedynczo.

Innym sposobem wykorzystywanym w tym szkoleniu jest funkcja DEXT, która umożliwia zwrócenie tylko jednej wartości wektora danych. W tym przypadku pierwszą wartością jest pozycja na osi X, drugą Y, trzecią Z, czwartą O itd.

Definicja zmiennych w programie PC:

Position_16=377; Number of first bit data with current position [mm or deg],16 bits for each, total 96

W głównej pętli programu PC należy dodać:

BITS position_16,16 = DEXT(HERE,1)*10; X [mm] 
BITS position_16+16,16 = DEXT(HERE,2)*10; Y [mm] 
BITS position_16+32,16 = DEXT(HERE,3)*10; Z [mm] 
BITS position_16+48,16 = DEXT(HERE,4)*10; O [deg] 
BITS position_16+64,16 = DEXT(HERE,5)*10; A [deg] 
BITS position_16+80,16 = DEXT(HERE,6)*10; T [deg] 

Każda zmienna z pozycją jest mnożona przez 10, aby wysłać wartość całkowitą, a następnie w PLC zostanie podzielona przez 10. Dzięki temu łatwiej jest zarządzać wysyłaniem wartości zmiennoprzecinkowej w tego typu komunikacji.

Dystans do kolejnego punktu  

Łatwo jest również wyświetlić odległość do następnego punktu lub dowolnego innego punktu. Przykładem może być wyświetlanie odległości do palety lub przenośnika, aby operator mógł zobaczyć, jak wysoko znajduje się robot. Funkcja DISTANCE wyświetla odległość liniową (w milimetrach) między dwoma punktami.

Ponadto używana jest funkcja DEST, która przechowuje współrzędne punktu, w kierunku którego aktualnie porusza się robot.

Definicja zmiennych w programie PC:

Distance_16=473; Number of first bit data with distance to next step [mm],16 bits

W głównej pętli programu PC należy dodać:

BITS Distance_16, 16 =DISTANCE(HERE, DEST) ; [mm] 

Konfiguracja PLC – Codesys

1. Pierwszym krokiem, jak poprzednio, jest zdefiniowanie zmiennych w GVL.

VAR_GLOBAL
	Rob_posX_L: INT;
	Rob_posX_H: INT; 
	Rob_posX: REAL;
	Rob_posY_L: INT;
	Rob_posY_H: INT; 
	Rob_posY: REAL;
	Rob_posZ_L: INT;
	Rob_posZ_H: INT; 
	Rob_posZ: REAL;
	Rob_posO_L: INT;
	Rob_posO_H: INT; 
	Rob_posO: REAL;
	Rob_posA_L: INT;
	Rob_posA_H: INT; 
	Rob_posA: REAL;
	Rob_posT_L: INT;
	Rob_posT_H: INT; 
	Rob_posT: REAL;
	Distance_L: INT;
	Distance_H: INT;
	Distance: INT; 
END_VAR

2. Następnie zdefiniowane zmienne należy przypisać do modułu komunikacyjnego (Mapping), aby dane odbierane zostały wpisane do właściwej zmiennej. Po przypisaniu wszystkich wartości okno powinno wyglądać jak poniżej:

3. Kolejnym krokiem jest dodanie do głównego programu procedury obsługi danych odebranych od robota. Ponieważ dane są wysyłane w innym formacie, poniżej pokazano, jak przekonwertować wartość całkowitą na zmiennoprzecinkową, niestety wymaga to dodatkowych kroków.

Główny program, zmienne lokalne:

VAR 
	Up_value: UINT := 65535; 
END_VAR 

Główny program:

//Current Robot  Position  
IF GVL.Rob_posX_H.7=1 THEN  
	GVL.Rob_posX:=(INT_TO_REAL(GVL.Rob_posX_L+(GVL.Rob_posX_H*256)-Up_value-1))/10; 
ELSE 
	GVL.Rob_posX:=(GVL.Rob_posX_L+(GVL.Rob_posX_H*256))/10; 
END_IF 
IF GVL.Rob_posY_H.7=1 THEN  
	GVL.Rob_posY:=(INT_TO_REAL(GVL.Rob_posY_L+(GVL.Rob_posY_H*256)- Up_value-1))/10; 
ELSE  
	GVL.Rob_posY:=(GVL.Rob_posY_L+(GVL.Rob_posY_H*256))/10; 
END_IF 
IF GVL.Rob_posZ_H.7=1 THEN  
	GVL.Rob_posZ:=(INT_TO_REAL(GVL.Rob_posZ_L+(GVL.Rob_posZ_H*256)- Up_value-1))/10; 
ELSE  
	GVL.Rob_posZ:=(GVL.Rob_posZ_L+(GVL.Rob_posZ_H*256))/10; 
END_IF 
IF GVL.Rob_posO_H.7=1 THEN  
	GVL.Rob_posO:=(INT_TO_REAL(GVL.Rob_posO_L+(GVL.Rob_posO_H*256)- Up_value-1))/10; 
ELSE  
	GVL.Rob_posO:=(GVL.Rob_posO_L+(GVL.Rob_posO_H*256))/10; 
END_IF 
IF GVL.Rob_posA_H.7=1 THEN  
	GVL.Rob_posA:=(INT_TO_REAL(GVL.Rob_posA_L+(GVL.Rob_posA_H*256)- Up_value-1))/10; 
ELSE  
	GVL.Rob_posA:=(GVL.Rob_posA_L+(GVL.Rob_posA_H*256))/10; 
END_IF 
IF GVL.Rob_posT_H.7=1 THEN  
	GVL.Rob_posT:=(INT_TO_REAL(GVL.Rob_posT_L+(GVL.Rob_posT_H*256)- Up_value-1))/10; 
ELSE  
	GVL.Rob_posT:=(GVL.Rob_posT_L+(GVL.Rob_posT_H*256))/10; 
END_IF 
//End of decoding the robot position  
//Distance to next point 
GVL.Distance:=GVL.Distance_L +( GVL.Distance_H *256);  
//End decoding distance   

4. Ostatnią operacją jest wyświetlenie odebranych danych. Pola, na których będą wyświetlane dane, zostaną dodane do ekranu wizualizacji.

Aplikacja

W następnej części dowiesz się, jak wysyłać i odbierać więcej informacji na mniejszej ilości bitów – wymiana informacji w sekwencji – optymalizacja komunikacji.

Newsletter Poradnika Automatyka

Czytaj trendy i inspiracje, podstawy automatyki, automatykę w praktyce

Please wait...

Dziękujemy za zapis do newslettera!

Czy ten artykuł był dla Ciebie przydatny?

Średnia ocena artykułu: 0 / 5. Ilość ocen: 0

Ten artykuł nie był jeszcze oceniony.

Zadaj pytanie

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *