Ogólna modyfikacja komunikacji i zmiana typu danych
Wymiana danych pomiędzy robotem Kawasaki a sterownikiem PLC, odc. 6
Kontakt w sprawie artykułu: Konrad Sendrowicz - 2024-12-28
Z tej części poradnika dowiesz się, jak modyfikować parametry komunikacji, liczbę bajtów oraz wysyłać zmienne różnego typu. Dodatkowo poznasz propozycję alokacji zmiennych w komunikacji, co ułatwia tworzenie uniwersalnych aplikacji i ułatwi zmianę ramki komunikacyjnej.
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.
6. Ogólna modyfikacja komunikacji i zmiana typu danych.
Wstęp
Ta część poradnika wraz z kolejną skupią się na modyfikacjach poprzednich części oraz optymalizacji kodu i komunikacji. W poprzednich częściach prawie wszystkie bity zaplanowanej ramki komunikacyjnej zostały wykorzystane do komunikacji. Gdyby zaistniała potrzeba dodania większej ilości informacji lub zmiennych, ramka musiałaby zostać rozszerzona, co nie zawsze jest możliwe.
Dlatego w tej części zmienione zostaną typy przesyłanych danych, aby uprościć odczyty danych, a tym samym uporządkować ramkę komunikacyjną. Ostatecznie nie zostanie zmienione nic w wymienianych informacjach. W następnej części zajmiemy się skróceniem ramki danych.
Modyfikacja typu zmiennej PLC
Zacznijmy od modyfikacji mapowanych zmiennych w komunikacji. Do tej pory używany był tylko najprostszy typ danych: bajt, czyli 8 bitów – BYTE. Jak widać na poniższym zrzucie ekranu, dane zapisywane na większej ilości bitów były wysyłane w dwóch częściach, jako LOW i HIGH. Zredukujemy te dane do jednego typu INT, który zajmuje 16 bitów. Na obrazku poniżej zmienne zaznaczone w ramce i wszystkie pozostałe elementy, które są wysyłane w dwóch częściach jako LOW i HIGH – takie jak prędkość, pozycja, temperatura, moment obrotowy, zostaną zastąpione jedną zmienną typu INT.
1. W pierwszym kroku należy przejść do modułu Ethernet/IP, do zakładki Assemblies. Można tu wybrać typ każdej zmiennej w komunikacji. W tym przypadku wybierzemy zmienne typu INT dla wszystkich zmiennych, które wymagają 16 bitów. Co ważne, w Kawasaki używając funkcji BITS nie można wysłać zmiennej typu FLOAT lub REAL, więc nadal niektóre zmienne muszą być mnożone przez 10 lub 100 i odbierane jako INT.
Gdy typ zostanie zmieniony na INT, liczba bitów zmiennej automatycznie zmieni się na 16 – jak na ekranie poniżej. Należy zmienić wszystkie miejsca, w których zmienna z LOW i HIGH pojawia się w komunikacji.
Ważne: zmiana typu zmiennej zmienia liczbę bitów dla zmiennej, ale nie zmniejsza liczby zmiennych w całej ramce. Oznacza to, że gdy zmieniamy BYTE na INT, za każdym razem w naszej ramce komunikacyjnej pojawia się 8 dodatkowych bitów. Liczba ta jest niezwykle ważna, więc aby komunikacja działała poprawnie, konieczne jest sprawdzenie liczby bitów na końcu, aby nadal było 64, i usunięcie dodatkowych bitów – tak jak na ekranie poniżej.
2. Drugim krokiem jest zmiana listy zmiennych, ponieważ teraz nie będą potrzebne żadne zmienne z dopiskiem „_L” i „_H”. Można je wszystkie usunąć.
Jednak dla zmiennych, które ostatecznie będziemy przechowywać jako „rzeczywiste”, potrzebujemy zmiennej INT, aby następnie przekonwertować je do formatu zmiennoprzecinkowego. Tak więc zmienne takie, jak pozycja i prędkość, muszą mieć dodatkowe zmienne. Tylko do celów szkoleniowych ta zmienna ma dodatkowy opis „_INT”. Ostatecznie lista zmiennych powinna się zmienić następująco:
3. Trzecim krokiem jest zmiana mapowanych zmiennych. Po przejściu do zakładki Mapping typ zmiennych został automatycznie zaktualizowany. Konieczna jest zmiana wszystkich zmiennych, które wcześniej miały wartości LOW i HIGH na pojedyncze zmienne, które zostały zdefiniowane wcześniej. Przykład pierwszej zmiennej, kodu błędu należy usunąć dwie zmienne:
Zastąp jedną zmienną używaną w programie:
Po zmianie wszystkich zmiennych w ten sam sposób lista powinna wyglądać dokładnie tak, jak poniżej:
Ważne jest, aby ponownie sprawdzić listę przesyłanych bitów, aby liczba na liście nie była większa niż ta zdefiniowana w kontrolerze robota.
Gdy używamy sterownika jako skaner, przypisywanie jest znacznie prostsze, bo całkowita liczba przesyłanych bajtów jest na bieżąco aktualizowana i wyświetlana, przykład znajduje się poniżej:
4. Kolejną zmianą jest wyczyszczenie kodu głównego w sterowniku PLC. Nie są już potrzebne ponowne obliczenia i łączenie zmiennych. Wystarczy więc pozostawić tylko część nazwy robota związaną z połączeniem i transferem, a resztę można bezpośrednio wykorzystać w wizualizacji lub innych częściach programu.
//PART 4
//GVL.STEP_NUM; GVL.Rob_SPEED; GVL.TCP_SPEED; GVL.Torq_JT1; GVL.Torq_JT2; GVL.Torq_JT3
//GVL.Torq_JT4; GVL.Torq_JT5; GVL.Torq_JT6; GVL.Temp_JT2; GVL.Monitor_SPEED; GVL.Memory_Free;
GVL.TCP_SPEED:=INT_TO_REAL(GVL.TCP_SPEED_int)/100;
//PART 5
//Current Robot Position
GVL.Rob_posX:=INT_TO_REAL(GVL.Rob_posX_int)/10;
GVL.Rob_posY:=INT_TO_REAL(GVL.Rob_posY_int)/10;
GVL.Rob_posZ:=INT_TO_REAL(GVL.Rob_posZ_int)/10;
GVL.Rob_posO:=INT_TO_REAL(GVL.Rob_posO_int)/10;
GVL.Rob_posA:=INT_TO_REAL(GVL.Rob_posA_int)/10;
GVL.Rob_posT:=INT_TO_REAL(GVL.Rob_posT_int)/10;
//GVL.Distance
5. Ostatnia drobna zmiana: ponieważ teraz wysyłamy również kod błędu do jednej zmiennej, należy też zmodyfikować program „Error_Prog” i usunąć linię kodu, która łączyła dwie zmienne, więc musimy usunąć te dwie linie:
//machining error code to receive one sign and 4 digits
error_number := error_low + (256*error_high);
Część modyfikacji w robocie – offset zmiennych zmiast stałej listy
W części programu robota dodany zostanie dodatkowy offset, nie zmieni się kolejność ani ilość przesyłanych danych. Pozwoli to na łatwe przenoszenie zmiennych przypisanych do komunikacji w pamięci.
Zmienna „First_bit_Out” będzie przechowywać numer pierwszego bitu komunikacji, od tego numeru będą obliczane wszystkie pozostałe zmienne.
First_bit_Out=33 ; first bit of communication – offset
Każdy adres zmiennej będzie zależał od pierwszego bitu, do opisu użyty zostanie przedstawiony schemat:
Zmienna = First_bit_Out+8*”numer w sekwencji”
gdzie:
First_bit_Out – pierwszy numer bitu, zdefiniowany przez użytkownika
“numer w sekwencji” – muszą być liczone według pozycji w sekwencji komunikacyjnej, w oparciu o wymiar bajt (8 bitów) – czyli wskazuje który bajt danych jest przypisany do zmiennej. Poniżej znajduje się pełna lista zmiennych, które zapisane są według schematu:
;Variable definition
First_bit_Out=33 ; first bit of communication - offset
Error_code_16=First_bit_Out+8*0; Number of first bit data with error code, 16 bits
work_hours_16 = First_bit_Out+8*2 ; Number of first bit data with working hours, 16 bits
servo_ontime_16 = First_bit_Out+8*4 ; Number of first bit data with servo on time, 16 bits
e_stop_count_8 = First_bit_Out+8*6; Number of first bit data with e-stop counter, 8 bits <max 128>
energy_comsum_16 = First_bit_Out+8*7 ;
rob_name_firstb = First_bit_Out+8*9 ; it’s need a 64 bits (8 byte) in total to send whole name
rob_serial_firs = First_bit_Out+8*17 ; it’s need a 24 bits (3 byte). Total to send 5 digits eg. 24589
;2 byte with dedicated signals
monitor_speed_8 = First_bit_Out+8*22 ; Number of first bit data with monitor speed [%],8 bits
step_numb_16 = First_bit_Out+8*23;217 ; Number of first bit data with step program number, 16 bits
speed_robot_16 = First_bit_Out+8*25; Number of first bit data with Speed robot [mm/s], 16 bits
speed_tcp_16 = First_bit_Out+8*27; Number of first bit data with Speed TCP [mm/s], 16 bits
memory_free_8 = First_bit_Out+8*29; Number of first bit data with Free memory [%],8 bits
temp_jt2_8 = First_bit_Out+8*30; Number of first bit data with temperature axis 2 [Celsius],8 bits
torq_jt1_16 = First_bit_Out+8*31; Number of first bit data with Torque axis 1 [Nm],16 bits
torq_jt2_16 = First_bit_Out+8*33; Number of first bit data with Torque axis 2 [Nm],16 bits
torq_jt3_16 = First_bit_Out+8*35; Number of first bit data with Torque axis 3 [Nm],16 bits
torq_jt4_16 = First_bit_Out+8*37; Number of first bit data with Torque axis 4 [Nm],16 bits
torq_jt5_16 = First_bit_Out+8*39; Number of first bit data with Torque axis 5 [Nm],16 bits
torq_jt6_16 = First_bit_Out+8*41; Number of first bit data with Torque axis 6 [Nm],16 bits
position_16 = First_bit_Out+8*43; Number of first bit data with current position [mm or deg],16 bits for each, total 96
distance_16 = First_bit_Out+8*55; Number of first bit data with distance to next step [mm],16 bits
W kontrolerze robota będzie to wyglądać dokładnie w taki sposób:
Działająca aplikacja
W tej części poradnika nic nie zmieniło się w samej aplikacji, ta sama część informacji jest przesyłana w tej samej kolejności. Komunikacja jest jednak bardziej usystematyzowana i pozwoli na łatwiejsze wprowadzanie zmian, edycję i tym samym zarządzanie tymi danymi. Szczególnie ułatwia to proces przesuwania danych w pamięci robota, łatwo można dostosować ramkę danych gdy robot komunikuje się również z innymi urządzeniami.
W kolejnej części dowiesz się jak skrócić rozmiar przesyłanej ramki bez zmniejszania ilości danych i wykorzystać zwielokrotnianie danych przez standardowy protokół komunikacyjny.