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.
Wymiana danych pomiędzy robotem Kawasaki Robotics a sterownikiem PLC
Wstęp: Integracja robota przemysłowego ze sterownikiem PLC i panelem HMI – dlaczego warto?1. Przesyłanie statusu połączenia i kodu błędów w czasie rzeczywistym.
2. Przesyłanie danych robota (typ, numer seryjny, godziny pracy i zużyta energia).
3. Przesyłanie dedykowanych sygnałów wejściowych i wyjściowych.
4. Przesyłanie parametrów ruchu w czasie rzeczywistym i informacji o wykonanym programie.
5. Przesyłanie aktualnej pozycji i dystansu do kolejnego 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.