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.
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.
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.
Podstawowe informacje o nawiązywaniu połączenia z robotem Kawasaki Robotics z wykorzystaniem protokołu komunikacyjnego Ethernet/IP można znaleźć w artykułach:
wchodzących w skład Kursu Ethernet IP w robotach Kawasaki.
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)