Strona główna ASTOR
Automatyka w praktyce

Przesyłanie danych robota (typ, numer seryjny, godziny pracy i zużyta energia)
Wymiana danych pomiędzy robotem Kawasaki a sterownikiem PLC, odc. 2

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

Z tego odcinka dowiesz się, jak wysłać z robota jego nazwę, numer seryjny i liczbę przepracowanych godzin oraz licznik użycia E-stop i ilość energii elektrycznej zużytej podczas pracy. Dane te pozwolą szybko określić, kiedy należy przeprowadzić kolejny serwis. A nazwa będzie bardzo przydatna, gdy przygotujesz uniwersalną aplikację i szybko sprawdzisz, który robot jest podłączony do urządzenia.

Odczytanie nazwy i numeru seryjnego robota

Komenda $SYSDATA() pozwala odczytać pełny model robota, a następnie użyć go w kolejnych częściach programu. Zwraca nazwę robota do zmiennej tekstowej typu string.

Komenda $str_id() zwraca numer seryjny do wartości typu string.

Dzięki tym dwóm funkcjom podczas przygotowywania uniwersalnej aplikacji dla większej liczby stanowisk można łatwo rozpoznać, który robot lub inne urządzenie jest już podłączone do sterownika PLC.

Przykład użycia:

$name_rob=$SYSDATA(ZROB.NAME) ;Zmienna typu string $name_rob przechowuje pełną nazwę robota, np. RS007L-B001

$serial_num=$str_id(1) ;Zmienna typu string $serial_num przechowuje numer seryjny robota.

Udostępnianie danych diagnostycznych

Wykorzystując komunikację między urządzeniami można również wysyłać dane diagnostyczne, takie jak godziny pracy, użycie licznika E-stop, zużycie energii i godziny pracy dla każdej osi. Poniżej znajduje się tabela z danymi, które możemy uzyskać z prostego polecenia systemowego OPEINFO(). Wszystkie te dane operacyjne są zwracane jako wartość całkowita.

Numer danejOpisNumer robotaNumer osijednostka
1Licznik godzinNie używaneNie używaneGodzina
2Czas włączenia zasilania sterownika1-Nie używaneGodzina
3Czas włączenia motorów1-Nie używaneGodzina
4Częstotliwość włączenia silnika1-Nie używaneIlość całkowita
5Częstotliwość włączenia serwomechanizmu1-Nie używaneIlość całkowita
6Częstotliwość zatrzymania awaryjnego (w ruchu)1-Nie używaneIlość całkowita
7Całkowita moc zużyta1-Nie używanekWh
8Całkowita moc zasilania1-Nie używanekWh
9Całkowita moc regeneracji1-Nie używanekWh
10Całkowity czas ruchu1-1-Godzina
11Całkowite przemieszczenie danej osi1-1-X1000deg or mm
12Przemieszczenie całkowite danej osi w kierunku „-„1-1-X1000deg or mm
13Przemieszczenie całkowite danej osi w kierunku „+”1-1-X1000deg or mm

Definicję funkcji OPEINFO można znaleźć w dokumentacji AS language manual. Poniżej znajduje się opis parametrów dla tej funkcji:

OPEINFO (Data number, robot number, joint number)

Data number – określa numer danej (z tabeli powyżej), która jest odczytywana z robota.

Robot number – numer niewymagany, domyślnie 1. Używany tylko wtedy, gdy jeden kontroler steruje więcej niż jednym robotem.

Joint number – określa numer osi/złącza, domyślnie 1.  

Przykład odczytu liczby godzin pracy:

;reading hourmeter to variable "workinghours"
workinghours = opeinfo (1)
; type the hour meter value on the screen:
type "Hour meter: ", workinghours, " h"

 Konfiguracja robota

1. Do kodu przedstawionego w poprzedniej części naszego cyklu, w którym przysłany był kod błędu oraz status połączenia, dodamy teraz kolejne polecenia do przesłania do sterownika PLC liczby godzin pracy, czasu włączenia serwomechanizmu, liczby użyć E-stop i zużycia energii.

Definicja zmiennych w programie PC:

Work_Hours_16=49 ; Liczba pierwszego bitu z godzinami pracy kontrolera, 16 bits
Servo_OnTime_16=65 ; Liczba pierwszego bitu z godzinami pracy motorów, 16 bits
E_STOP_count_8=81; Liczba pierwszego bitu z licznikiem wciśnięcia E-stop, 8 bits <max 128>
Energy_comsum_16=89 ;Liczba pierwszego bitu z ilością zużytej energii elektrycznej, 16 bits

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

BITS Work_Hours_,16 = opeinfo(1)
BITS Servo_OnTime_16,16 = opeinfo(3)
BITS E_STOP_count_8,8 = opeinfo(6,1)
BITS Energy_comsum_16,16= opeinfo(7)

2. Dodane zostanie też do programu polecenie wysłania nazwy robota i numeru seryjnego. Niestety jest ona zapisana w postaci ciągu znaków, więc wymagana jest konwersja ACSII. Tak więc każdy znak zostanie przekonwertowany na liczbę. Aby policzyć, ile bitów potrzebujemy do wysłania tej nazwy, musimy podzielić ją na poszczególne znaki i wartości: R-8b; S-8b; 20-16b; N-8b; A-8b; 001-16b – więc daje to w sumie 64 bity.

Definicja zmiennych w programie PC:

$name_rob=$SYSDATA(ZROB.NAME) ; $name_rob is stored name eg. RS020N-A001
$serial_num=$str_id(1) ; in string variable $serial_num is stored serial number
Rob_name_firstBit= 105 ; it’s need a 64 bits in total to send whole name
Rob_serial_firstBit=169 ; it’s need a 24 bits. Total to send 5 digits eg. 24589

Przed główną pętlą while w programie PC należy dodać kod znajdujący się poniżej. Dzięki temu nazwa robota i numer seryjny będzie odczytany tylko za pierwszym razem wykonywania programu.

 ;Robot name
    BITS Rob_name_firstBit,8= ASC($name_rob,1) ; Send first letter/char eg. R – 82 
    BITS Rob_name_firstBit+8,8= ASC($name_rob,2) ; Send second letter/char S - 83 
    BITS Rob_name_firstBit+16,8= (ASC($name_rob,3)-48) ; first digit payload, It’s required to minus 48 because it’s zero as a char according to ACSII.
    BITS Rob_name_firstBit+24,8= (ASC($name_rob,4)-48)*10+(ASC($name_rob,5)-48) ; Send the rest of payload of robot, so 2 digits. 
    BITS Rob_name_firstBit+32,8 = ASC($name_rob,6) ; Send the type of arm, ex. N - 78
    BITS Rob_name_firstBit+40,8 = ASC($name_rob,8) ; Arm version, ex. A001; A- 65 
    BITS Rob_name_firstBit+48,16 = (ASC($name_rob,9)-48)*100+(ASC($name_rob,10)-48)*10+(ASC($name_rob,11)-48) ; Send last three digit 
    ;Serial number 
    IF (ASC($serial_rob,5)>0) THEN ; checking how long is serial number
      BITS Rob_serial_firstBit,16 =(ASC($serial_rob,1)-48)*100+(ASC($serial_rob,2)-48)*10+(ASC($serial_rob,3)-48) ; send first three digits
      BITS Rob_serial_firstBit+16,8 =(ASC($serial_rob,4)-48)*10+(ASC($serial_rob,5)-48)
    ELSE
      BITS Rob_serial_firstBit,16 =(ASC($serial_rob,1)-48)*10+(ASC($serial_rob,2)-48)
      BITS Rob_serial_firstBit+16,8 =(ASC($serial_rob,3)-48)*10+(ASC($serial_rob,4)-48)
    END

Konfiguracja sterownika PLC

1. Na początek należy zdefiniować zmienne w GVL – globalnej liście zmiennych. Dzięki temu zarządzanie zmiennymi będzie dużo łatwiejsze. Zmienna Rob_Name będzie przechowywać pełną nazwę robota, podczas gdy zmienne Rob_name_x są używane do odczytu poszczególnych bitów wysyłanych z robota. W ten sam sposób odczytywany będzie numer seryjny, godziny pracy czy zużyta energia. 

VAR_GLOBAL
	Rob_Name: STRING;
	Rob_name_1: INT; 
	Rob_name_2: INT;
	Rob_name_31: INT;
	Rob_name_32: INT;
	Rob_name_4: INT;
	Rob_name_5: INT;
	Rob_name_61:INT;
	Rob_name_62:INT;
	Rob_Serial: String;
	Rob_ser_1:INT;
	Rob_ser_2:INT;
	Rob_ser_3:INT;
	E_stop_count:INT;
	Working_Hours:INT; 
	Working_hour_L:INT;
	Working_hour_H:INT;
	ServoOn_Hours:INT;
	ServoOn_hour_L:INT;
	ServoOn_Hour_H:INT;
	Energy_consum_L:INT;
	Energy_consum_H:INT;
	Energy_consum :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. W tym przypadku należy połączyć odebrane znaki i połączyć je w pełną nazwę robota. Poniżej znajduje się pełna sekwencja łączenia znaków.

Główny program:

//Robot name  
GVL.Rob_Name:= CONCAT(WORD_AS_STRING(INT_TO_WORD(GVL.Rob_name_1),1), WORD_AS_STRING(INT_TO_WORD(GVL.Rob_name_2),1)); // First two chars of the name
GVL.Rob_Name:=CONCAT (GVL.Rob_Name, WORD_AS_STRING(INT_TO_WORD(GVL.Rob_name_31),1)); // first digit
IF (GVL.Rob_name_32)<10 THEN ;
	GVL.Rob_Name:= CONCAT (GVL.Rob_Name,'00'); 	
ELSIF (GVL.Rob_name_32)<100 THEN
	GVL.Rob_Name:= CONCAT (GVL.Rob_Name,'0'); 
END_IF
GVL.Rob_Name:=CONCAT (GVL.Rob_Name, INT_TO_STRING(GVL.Rob_name_32));
GVL.Rob_Name:=CONCAT (GVL.Rob_Name, WORD_AS_STRING( INT_TO_WORD(GVL.Rob_name_4),1));
GVL.Rob_Name:=CONCAT (GVL.Rob_Name,'-');
GVL.Rob_Name:=CONCAT (GVL.Rob_Name, WORD_AS_STRING( INT_TO_WORD(GVL.Rob_name_5),1));
IF (GVL.Rob_name_61+(GVL.Rob_name_62*256))<10 THEN 
	GVL. Rob_Name:=CONCAT (GVL. Rob_Name,'00');
ELSIF (GVL.Rob_name_61+(GVL.Rob_name_62*256))<100 THEN
	GVL.Rob_Name:=CONCAT(GVL.Rob_Name,'0'); 	
END_IF
GVL.Rob_Name:=CONCAT(GVL.Rob_Name, INT_TO_STRING(GVL.Rob_name_61+(GVL.Rob_name_62*256)));
//End of decoding the robot name
//Serial number  
GVL.Rob_Serial:=CONCAT(INT_TO_STRING(GVL.Rob_ser_1+GVL.Rob_ser_2*256), INT_TO_STRING(GVL.Rob_ser_3));
//End of decoding serial number

//Working hours
GVL.Working_Hours:=GVL.Working_hour_L+( GVL.Working_hour_H*256); 
GVL.ServoOn_Hours:=GVL.ServoOn_hour_L+( GVL.ServoOn_hour_H*256);
GVL.Energy_consum:= GVL.Energy_consum_L+( GVL.Energy_consum_H*256);
//E_stop counter is 8 byte, and this variable is ready to use, without any calculation. 
//End decoding working hours

4. Kolejnym krokiem jest zbudowanie projektu i sprawdzenie, czy nie ma błędów. Jeżeli  funkcja Word_as_String zgłosi błąd, należy dodać do projektu dodatkową bibliotekę. W tym celu należy otworzyć zakładkę Library manager, a następnie wybrać Add library, w pasku wyszukać i dodać bibliotekę Util, aby móc przekształcać liczby typu INT na znaki z tabeli ASCII:

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

W polu tekstowym %s- można wyświetlić zmienną tekstową. %d- pozwala wyświetlić wartość liczbową. W zakładce Properties definiujemy, jaką zmienną należy wyświetlić, a także jej typ.

Po dodaniu wszystkich zmiennych nasze okno powinno wyglądać następująco:

Po uruchomieniu okno wygląda następująco:

W następnej części dowiesz się, jak szybko udostępniać informacje o stanie dedykowanych sygnałów, a następnie wysyłać je za pośrednictwem protokołu komunikacyjnego. Dowiesz się też, jak mogą one ułatwić weryfikację stanu robota.

Następny odcinek: Przesyłanie dedykowanych sygnałów wejściowych i wyjściowych

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 *