Strona główna ASTOR
Automatyka w praktyce

Przesyłanie statusu połączenia i kodu błędów w czasie rzeczywistym
Wymiana danych pomiędzy robotem Kawasaki a sterownikiem PLC, odc. 1

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

W tym cyklu artykułów dowiesz się, jak w robocie Kawasaki Robotics przygotować dane i wymieniać je z dowolnym sterownikiem PLC, który obsługuje protokół komunikacyjny Ethernet/IP.

W części pierwszej dowiesz się, jak przygotować program dla kontrolera robota i sterownika PLC, aby sprawdzić stan połączenia urządzeń i przesłać kod błędu pojawiający się na robocie.

Ważne: W tym cyklu artykułów wykorzystane jest połączenie w którym robot jest Scanerem, a sterownik PLC adapterem. Podczas konfigurowania komunikacji należy ustawić odpowiednią wartość liczby bitów wymiany. Użyjemy 64 bajtów do komunikacji (czyli 512 bitów) i zaczniemy od 33 bitu.

W artykule znajduje się link do pliku konfiguracyjnego komunikacji. Dzięki temu w razie problemów konfiguracji połączenia można skorzystać z gotowego pliku, który wystarczy wgrać do kontrolera.

Wysyłanie kodu błędu – konfiguracja robota

W pierwszym kroku, należy utworzyć nowy program PC w KIDE, nadając mu nazwę „AUTOSTART.PC”. W rezultacie program ten będzie uruchamiany automatycznie po włączeniu zasilania, a jego działanie nie będzie zakłócać pracy głównego programu ruchu robota. Dostępnych jest 5 wątków/programów równoległych (.PC). Poniżej znajduje się struktura programu, umożliwiająca przygotowanie i wysłanie kodu błędu:

.PROGRAM AUTOSTART.pc()
	WHILE 1 DO
	;Part for sending error code via communication protocol
	CODE = ERROR*(-1)  ;multiplication error code by -1
	BITS 33,16 = CODE
	;BITS x,y = z - it is conversion ‘z’ number to binary system, parameter; ‘y’- output number of bits; starting from ‘x’ number  according to conversion
	END
.END

BITS 33,16 = CODE <- Ta część kodu przypisuje kod błędu w postaci 16 bitów do sygnałów wymienianych w protokole komunikacyjnym, od bitu 33 do 48 – czyli 16 bitów.

Bardzo ważne jest, aby całość kodu znajdowała się w pętli WHILE, w przeciwnym razie zostanie on wykonany tylko raz. Należy również pamiętać o zaznaczeniu opcji AUTOSTART.PC w AUX->5. Advanced Setting->2. System Switch, aby umożliwić włączenie go automatycznie przy włączeniu zasilania.

To wystarczy, aby robot wysłał kod błędu do określonego obszaru bitów w pamięci robota.

Odczytywanie kodu błędu na sterowniku PLC – konfiguracja CODESYS

Krok 1. Korzystając z domyślnego programu stworzonego na etapie konfiguracji połączenia – Dodaj odpowiednie podprogramy do przetwarzania błędów w projekcie CODESYS, kliknij prawym przyciskiem myszy na Application->Add Object->POU:

Dodaj nowy program tak jak poniżej o nazwie „Error_Prog”:

Krok 2. W programie „Error_Prog” utwórz zmienne:

VAR
	error_number: UINT;
	error_low: UINT;
	error_high: UINT;
	LEFT_DIGIT_ERROR: STRING(255);
	STRING_ERROR: STRING(255);
	RIGHT_DIGITS_ERROR: UINT;
	ERROR_CODE_STRING: STRING;
	i: INT;
END_VAR
	
VAR RETAIN
	ERROR_ARRAY: ARRAY[1..2,1..200] OF STRING;
END_VAR

Wykorzystaj sekwencję kodu poniżej, pozwala ona odczytać właściwy znak oraz numer błędu wysyłanego z robota:

//machining error code to receive one sign and 4 digits
error_number := error_low + (256*error_high);
//LEFT() function returns sign on the left side (second variable of the function is number of signs) 
LEFT_DIGIT_ERROR:=LEFT(UINT_TO_STRING(error_number), 1);

CASE STRING_TO_INT(LEFT_DIGIT_ERROR)  OF  //assigning letter to the first digit of error code
	1: LEFT_DIGIT_ERROR := 'P';
	2: LEFT_DIGIT_ERROR := 'W';
	3: LEFT_DIGIT_ERROR := 'E';
	4: LEFT_DIGIT_ERROR := 'D';
	
ELSE
	LEFT_DIGIT_ERROR := '0';
END_CASE

//merging together letter and other digits
//RIGHT() function returns signs on the right side (second variable of the function is number of signs)
IF error_number >0 THEN
	STRING_ERROR := concat(left_digit_error, RIGHT(UINT_TO_STRING(error_number), 4));
	RIGHT_DIGITS_ERROR := STRING_TO_UINT(RIGHT(UINT_TO_STRING(error_number), 4));
ELSE
	STRING_ERROR := 'RESET';  //when there are no errors or the previous ones were reset
END_IF

//This part of code was additional until launching software update by CODESYS
//2x200 array for storing timestamp and error code
//new error appears in the first place and the others move one level below
	IF ERROR_ARRAY[2,1] <> STRING_ERROR THEN //cascading transfer
		FOR i := 200  TO 2 BY -1 DO
			ERROR_ARRAY[1,i] := ERROR_ARRAY[1,i-1];
			ERROR_ARRAY[2,i] := ERROR_ARRAY[2,i-1];	
		END_FOR
		ERROR_ARRAY[1,1] := DT_TO_STRING(SysRtcGetTime(1));			
		ERROR_ARRAY[2,1] := STRING_ERROR;
		
	END_IF

Krok 3. Po utworzeniu programu i zdefiniowaniu zmiennych zmiennych należy skompilować program i sprawdzić, czy nie żadnych błędów. Jeśli pojawi się błąd o braku biblioteki dotyczącej RTC – funkcji SysRtcGetTime – należy dodać odpowiednią bibliotekę do projektu. Można to zrobić na dwa sposoby:

1) Dodać bibliotekę sysrtc: należy wejść do „Library manager”, a następnie kliknąć „Add library”:

i wyszukać bibliotekę SysRtc, po czym dwukrotnie na nią kliknąć, aby dodać:

2) Jeżeli nie można znaleźć biblioteki, należy wgrać bibliotekę SysTimeRtc. Dodaj definicję nowej lokalnej zmiennej:

pRtcErr: SysTimeRtc.RTS_IEC_RESULT;

Dodatkowo należy zmodyfikować program zapisujący czas wystąpienia błędu. Zamiast:

IF ERROR_ARRAY[2,1] <> STRING_ERROR THEN //cascading transfer
	FOR i := 200  TO 2 BY -1 DO
		ERROR_ARRAY[1,i] := ERROR_ARRAY[1,i-1];
		ERROR_ARRAY[2,i] := ERROR_ARRAY[2,i-1];	
	END_FOR
	ERROR_ARRAY[1,1] := DT_TO_STRING(SysRtcGetTime(1));			
	ERROR_ARRAY[2,1] := STRING_ERROR;	
END_IF

należy wykorzystać nowo utworzoną zmienną:

IF ERROR_ARRAY[2,1] <> STRING_ERROR THEN //cascading transfer 
	FOR i := 200  TO 2 BY -1 DO 
		ERROR_ARRAY[1,i] := ERROR_ARRAY[1,i-1]; 
		ERROR_ARRAY[2,i] := ERROR_ARRAY[2,i-1];	 
	END_FOR 
	ERROR_ARRAY[1,1] := DT_TO_STRING(TO_DT(SysTimeRtcGet(pResult:= pRtcErr)));
	ERROR_ARRAY[2,1] := STRING_ERROR; 
END_IF

Krok 4. Przypisanie zmiennych do protokołu komunikacyjnego

Przejdź do zakładki Ethernet/IP I/O Mapping, gdzie możesz przypisać zmienne do sygnałów wymienianych przez protokół komunikacyjny. Najpierw przypisz zmienną, która zbiera kod błędu. Ponieważ kod jest przesyłany na 16 bitach, musimy przypisać dwa bajty. Dlatego użyjemy zmiennej „Error_low” i „Error_high”. Po kliknięciu trzech kropek otworzy się asystent przypisywania zmiennych:

W asystencie wprowadzania wybierz zmienną „Error_low” w pierwszym bajcie.

Powtórz czynność dla drugiej zmiennej „Error_high” na drugim bajcie. Finalnie zakładka powinna wyglądać następująco:

Krok 5. Wizualizacja parametrów na ekranie sterownika PLC.

Dodaj nowy ekran wizualizacji wraz z tabelą jak na obrazach poniżej.

Aby w tabeli wyświetlić listę błędów wraz z datą wystąpienia błędu należy ja skonfigurować zgodnie z ustawieniami poniżej:

Aby wizualizacja była widoczna na ekranie sterownika, należy wykonać poniższe kroki.

Można również dodać WebVisu, aby wyświetlać wizualizację na urządzeniach mobilnych lub komputerach znajdujących się w tej samej sieci.

Dodaj również program „Error_Prog” do wątku, który wykonuje program główny, tak aby był on automatycznie wywoływany w każdym cyklu PLC.

Poniżej znajduje się przykładowy widok błędów w PLC.

Weryfikacja stanu połączenia – program robota

W kontrolerze Kawasaki Robotics stan połączenia można zawsze sprawdzić w monitorze połączenia na ekranie głównym. Bieżący stan można również odczytać za pomocą poleceń języka AS w kontrolerze serii F. 

W poniższym przykładowym programie kontroler serii F robota sprawdza stan dwóch typów połączeń Slave oraz Master komunikacji i wyświetla bieżący stan w postaci komunikatu (Print) oraz sygnału wyjściowego 1 lub 2 (Signal). Ważne: należy wybrać tylko to połączenie, z którego korzystamy, w tym poradniku robot pracuje jako Scanner (master).

.PROGRAM AUTOSTART.pc()
		;Master/scanner / FB1
	IF FB_ONLINE(1)==TRUE THEN 
		Print “Connection with master device” 
SIGNAL 1 
	ELSE 
		Print “Disconnection with master device” 
SIGNAL -1
	END
 ;Slave/ adapter / FB2
	IF FB_ONLINE(2)==TRUE  
		Print “Connection with slave device” 
SIGNAL 2
	ELSE 
		Print “Disconnection with slave device” 
SIGNAL -2
END
.END

Weryfikacja statusu połączenia w sterowniku PLC Astraada One

Aby zweryfikować status połączenia w sterowniku PLC Astraada One, wystarczy skorzystać z poniższych instrukcji. Najpierw należy dodać zmienną „connection” typu bool, w której przechowywany będzie aktualny status, a następnie użyć odpowiedniej funkcji załączonej poniżej w zależności od typu połączenia i dodać do programu głównego PLC_PRG:

VAR
	connection: BOOL;
END_VAR


// Kiedy sterownik PLC pracuje jako adapter: 
//Checking connection state. Value '7' means RUNNING
IF 	EtherNet_IP_Adapter.eState = 7 THEN
	connection:=TRUE;
ELSE
connection:=FALSE;
END_IF


// Kiedy sterownik PLC pracuje jako scaner:
//Checking connection state. Value '8' means RUNNING
IF 	Kawasaki_E_controller.eState = 8 THEN
	connection:=TRUE;
ELSE
connection:=FALSE;
END_IF

Mając zweryfikowany status w programie głównym, można wyświetlić ten status na ekranie sterownika. Wystarczy dodać diodę i przypisać „PLC_PRG.connection” jako zmienną. W ten sposób, gdy połączenie zostanie nawiązane, zmienna będzie miała stan wysoki i dioda zaświeci się, w przeciwnym razie nie.

Działający program wygląda następująco, dioda LED świeci się i wyświetlane są błędy, które wystąpiły podczas pracy aplikacji.

W następnej części dowiesz się, jak odczytać model robota i numer seryjny za pomocą funkcji AS oraz jak wysłać je za pośrednictwem protokołu komunikacyjnego.

Następny odcinek: Przesyłanie danych robota (typ, numer seryjny, godziny pracy i zużyta energia)

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: 5 / 5. Ilość ocen: 1

Ten artykuł nie był jeszcze oceniony.

Zadaj pytanie

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