Przesyłanie do sterownika PLC historii ostatnich błędów z robota
Wymiana danych pomiędzy robotem Kawasaki a sterownikiem PLC, odc. 10
Kontakt w sprawie artykułu: Konrad Sendrowicz - 2025-03-07

Ostatnie odcinki poradnika będą uzupełnieniem poprzednich artykułów, dotyczących przesyłania znaków. W tej części przygotowana zostanie procedura przesłania 50 ostatnich błędów z robota oraz dodatkowo gdy wystąpi błąd, zostanie wyświetlony jego kod oraz opis.
Wymiana danych pomiędzy robotem Kawasaki Robotics a sterownikiem PLC
Zagadnienia podstawowe:
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.
Zagadnienia zaawansowane:
6. Ogólna modyfikacja komunikacji i zmiana typu danych.7. Przesyłanie dużych ilości danych przy użyciu ograniczonej liczby zajętych bitów – zwielokrotnianie danych.
8. Wysyłanie zmiennej tekstowej za pośrednictwem standardowego protokołu komunikacyjnego.
9. Odbieranie zmiennej tekstowej za pośrednictwem standardowego protokołu komunikacyjnego.
10. Przesyłanie do sterownika PLC historii ostatnich błędów z robota.
11. Przesyłanie ze sterownika PLC do robota pełnej nazwy programu do wykonania.
Wstęp
W tej części poradnika zostanie przedstawiona możliwość przesyłania pełnej informacji o błędach, a także historii błędów z robota do sterownika PLC. Całość zostanie podzielona na dwie części. W pierwszej opiszę przesyłanie dokładnych opisów błędów, a w drugiej – przesłanie historii błędów z kontrolera robota, w tym przypadku będzie to ostatnie 50 błędów, które wystąpiły od czasu wyzwolenia pobierania błędów.
Do przesyłania informacji wykorzystamy funkcje, które zostały przygotowane w poprzednich częściach tego poradnika. Rozszerzone natomiast zostaną funkcje przygotowania danych oraz liczba identyfikatorów informacji.
Konfiguracja PLC – obsługa bieżących błędów
Do przesłania opisu aktualnych błędów dodany zostanie nowy identyfikator (ID – nr 4) przesyłanych ciągów znaków, z aktualnym opisem błędu z robota. Należy dodać nową zmienną w globalnej liście zmiennych(GVL) Error_description, do niej zostanie przypisany aktualny błąd. W programie String_manage w sterowniku PLC, należy dodać nowy indeks 4 w którym odczytana wiadomość zostanie przypisana do nowej zmiennej.

Następnym krokiem jest przypisanie tego opisu do tabeli z błędami, rozpoczynamy od rozszerzenia tablicy i dodania dodatkowej kolumny z opisem – należy rozszerzyć w pierwszym wymiarze z dwóch na trzy kolumny. Dodatkowo ponieważ przekroczy ona dostępną pamięć zmiennych nieulotnych, należy zmienić typ zmiennej na VAR:

Następnie należy przypisać w dodatkowej kolumnie nr 3 opis błędu przysłany od robota. W tym etapie należy dodać dodatkowy opis do akcji gdy nie ma błędów i kod jest błędu jest równy zero (1). W drugiej części, gdzie aktualny błąd przesuwany jest do góry listy, dodany został warunek sprawdzania opisu błędu (2) aby w momencie opóźnienia wysłania opisu błędu, ta część kodu poczekała na przesłanie pełnego opisu. W pętli dodany został dodatkowy parametr trzeciej kolumny, aby wartość była przesuwana w momencie wystąpienia nowego błędu i do nowej wartości przypisywany był nowy opis (3).

Ostatnią modyfikacją jest rozszerzenie wyświetlanej tabeli w oknie części pierwszej. Należy odświeżyć zmienną, aby pojawiła się trzecia kolumna, którą należy zmodyfikować jak na obrazie poniżej:

Dodatkowym nowym elementem jest wyświetlenie na ekranie sterownika aktualnego błędu zawsze na wierzchu i możliwość szybkiego resetu. W tym celu dodane zostanie nowe okno z powiadomieniem, które będzie się wyświetlać, gdy pojawi się błąd. Aby stworzyć nowe okno, klikamy prawym przyciskiem myszy na Application, a następnie wybieramy Add object -> Visualisation. Należy nadać nazwę, w przykładzie okno to zostanie nazwane „Current_err_view”.
Następnie klikając prawym przyciskiem myszy wybieramy Properties i w zakładce Visualisation zmieniamy typ wizualizacji na Dialog, jak na obrazie poniżej:

W stworzonym oknie należy dodać ramkę, w której zostaną umieszczone 4 elementy:
- Tytuł okna – stała informacja o oknie, w tym przypadku będzie to po prostu pole tekstowe z opisem „Error in robot controller!”
- Opis błędu z robota – pole testowe ze zmienną, która przechowuje aktualny błąd robota.
- Przycisk zamknięcia okna bez żadnej akcji.
- Przycisk zamknięcia okna wraz z resetem wszystkich aktualnych błędów.
Tak wygląd przykładowe okno:

Do pola tekstowego, w którym będzie wyświetlany opis błędu „%s”, zostanie przypisana zmienna GVL.Error_description, dzięki czemu zawsze najnowszy błąd będzie wyświetlany na ekranie.

Do przycisku „Close” należy przypisać akcję zamykania aktualnie wyświetlanego okna, jest do tego dedykowana funkcja:

Do przycisku „Reset and close” należy przypisać dwie akcje – jak poprzednio Close Dialog, oraz do funkcji Toggle przypisać sygnał resetowania błędu. Dzięki temu w momencie naciśnięcia błąd zostanie zresetowany i jednocześnie okno zamknięte, bez konieczności przechodzenia do dodatkowych zakładek ekranu.

Ostatnim elementem jest dodanie funkcji, która w odpowiednim momencie otworzy okno z błędem i wyświetli na środku ekranu sterownika, nad aktualnie wyświetlanym elementem wizualizacji. Korzystając z biblioteki Visu Utils można wykorzystać znajdującą się w niej gotową funkcję FbOpenDialog, która pozwala w łatwy sposób zarządzać oknami. Bibliotekę można dodać wchodząc do menagera bibliotek, a następnie klikając Add Library.
Następnie tworzona jest niezbędna zmienna do zarządzania oknem dialogowym, VU.FbOpenDialog – która jako parametry przyjmuje dane okna dialogowego do otwarcia oraz sposób w jaki ma się otworzyć. Ostatni parametr xExecute decydował będzie, czy okno ma zostać otwarte czy zamknięte.

W kodzie programu, po odebraniu całego błędu i przypisania do tabeli, zostanie dodana akcja otworzenia okna. Aby poprawnie nastąpiło otwarcie okna, do parametru xExecute zostanie przypisana wartość TRUE. Dodatkowo dodany został warunek, aby okno nie było otwierane, kiedy nastąpi reset błędu.

Dodatkowo przy zamykaniu okna dialogowego należy dodać wykonanie funkcji z parametrem xExecute równym FALSE, aby zwolnić funkcję i móc ponownie wywołać otwarcie okna w momencie wystąpienia błędu.
gvl.fbOpenDialog(sDialogName:='Current_err_view' ,itfClientFilter:=VU.Globals.AllClients, xModal:=TRUE, xExecute:=FALSE,);

Konfiguracja sterownika jest gotowa, w momencie wystąpienia błędu, zostanie mu przesłany opis z kontrolera robota, dodatkowo wyświetli się okno na ekranie sterownika, umożliwiając szybkie zareagowanie i zresetowanie błędu.
Konfiguracja robota
Aby opis był przesyłany do sterownika PLC za każdym razem, gdy wystąpi jakiś błąd, należy zmodyfikować kod programu autostart na robocie. Gdy wystąpi błąd, należy przygotować ciąg znaków według wcześniej przygotowanej procedury i wysłać do sterownika. Ponieważ coraz więcej informacji przesyłane jest w wątku równoległym (PC program), stworzony zostanie nowy program, w zakładce TASK, który będzie wykonywał dokładnie taką samą procedurę, jak program Send_string w zakładce Programs. W tym celu należy dodać nowy program:

Aby łatwo było rozpoznać, że jest to program z obsługi procesów, na końcu został dodany tekst „TASK”. Zmienne wchodzące do funkcji powinny nazywać się dokładnie jak samo, jak te w programie Send_string stworzonym w 8 części kursu.

Do tego programu należy skopiować całą zawartość programu Send_string. Otrzymany został gotowy program do przygotowania danych typu string w programie równoległym:

Teraz aby wysłać opis błędu wyświetlany na teach pendancie, należy dodać jedynie linię z wywołaniem przygotowanej procedury. Do odczytania opisu zostanie wykorzystana funkcja $ERROR, która jako parametr przyjmuje numer błędu, a zwraca opis błędu w postaci ciągu znaków. Funkcja $ERROR została użyta w pierwszej części tego poradnika i zwraca aktualny numer błędu. Przykład użycia wszystkich funkcji:
CALL Send_str_TAS.pc($ERROR(ERROR),4)
A więc całość procedury będzie wyglądać następująco:

CZEŚĆ DRUGA – Przesyłanie historii błędów z robota
Konfiguracja robota
W tej części zaczniemy od konfiguracji robota, teraz to sterownik PLC będzie wystawiał sygnał do robota, który rozpocznie proces wysyłania listy błędów. Domyślnie w programie robota ustawiony zostanie limit 50 ostatnich błędów, ale liczba ta może być łatwo modyfikowana.
W programie autostart robota, na początku zostaną zdefiniowane zmienne które będą potrzebne do tej części programu:
– Sygnał rozpoczęcia przesyłania od PLC, będzie to przycisk wyzwalany przez operatora: send_errorlog
– Sygnał wyjściowy z robota, informacja, że przesłał już wszystkie błędy, albo zadaną ich liczbę, lub trafił na koniec listy: all_errors_send
– Liczba rekordów error log do wysłania, domyślnie ustawiona na 50: Number_errorlog_to_send
– dodatkowa zmienna potrzebna do inkrementowania i przesyłania kolejnych rekordów.
W robocie pełna lista zmiennych będzie wyglądać następująco:

Aby przesłać listę błędów, które wystąpiły w sposób chronologiczny, należy wykorzystać funkcję $ERRLOG, funkcja ta jako parametr przyjmuje wartość całkowitą, określającą numer błędu na liście błędów. Czyli $ERRLOG(1) zwróci opis pierwszego błędu na liście. Błędy będą wysyłane od najnowszych do starszych.
Do wysłania opisów błędów, będzie wykorzystywana wcześniej zdefiniowana funkcja Send_str_TASK.PC z indeksem danych 5.
Poniżej znajduje się procedura przesłania całej listy błędów
;******************** PART 10 training **********************************
;******** send the error log to PLC - last 50 ***************************
;
IF SIG (send_errorlog) == TRUE AND Stat_sending_string == FALSE AND SIG (all_errors_send) == FALSE THEN
IF a < Number_errorlog_to_send THEN
a = a + 1
$code_to_skip = "(E0106)"
IF INSTR($ERRLOG(a),$code_to_skip)>0 THEN ;checking if there is next data
IF INSTR($ERRLOG(a+2),$code_to_skip)>0 THEN ;Checking two lines forward to confirm
;End list of error log
GOTO EndOfErrLog ; fininsh sending due to shorter list then number to send
ELSE
a = a + 2 ;send forward skipping two
END
END
CALL Send_str_TAS.pc ($ERRLOG (a), 5)
ELSE ; Fininsh sending data
EndOfErrLog:
a=0
SIGNAL all_errors_send
END
END
IF SIG(send_errorlog)==FALSE AND SIG(all_errors_send)==TRUE THEN
SIGNAL -all_errors_send
END
W pierwszej części został dodany warunek sprawdzenia czy na liście jest kolejny kod. Błąd „(E0106)” zostaje zwrócony, gdy zmienna przekracza limit i nie ma danych do odczytania. Może zdarzyć się sytuacja, że wysyłanie błędów zostanie przerwane lub użytkownik sam zdefiniuje zmienną, która będzie poza zakresem, dlatego sprawdzany jest jeszcze jeden błąd, dwa rekordy dalej, jeżeli nadal jest poza zakresem, kończone jest przesyłanie danych, a jeżeli są inne błędy, kontynuuje się przesłanie z pominięciem tych błędów. Całość kodu wygląda jak poniżej:

Po przesłaniu wszystkich błędów sygnał all_errors_send jest ustawiany w stan wysoki i procedura przesyłania błędów kończy się.
Konfiguracja PLC
W sterowniku PLC najpierw zostaną zdefiniowane potrzebne zmienne na globalnej liście zmiennych (gvl):
– Error_log_Array – jednowymiarowa tablica przechowująca listę pobranych błędów,
– ErrorLog_increment – przechowuje liczby całkowite, inkrementowana podczas zapisywania kolejnych rekordów listy błędów,
– Start_send_errorlog – zmienna statusowa, wyjście ze sterownika PLC, wyzwala przesyłanie listy błędów,
– All_errors_ware_send – zmienna statusowa, wejście sterownika, robot wystawia ten status po przesłaniu całej listy.
W tej części lista zmiennych globalnych powinna zawierać zmienne jak na ilustracji poniżej:

Następnie aby odczytać kolejne błędy, zostanie wykorzystana wcześniej napisana funkcja odczytywania ciągu znaków od robota, zostanie dodany nowy identyfikator „5”. Całość procedury będzie wyglądać następująco:

Aby wyświetlić dane na ekranie, należy dodać tabelę i przypisać zmienną GVL.Error_log_Array z jedną kolumną. Dodatkowo można skonfigurować nazwę kolumny np. Error code and Description.

Dodatkowo potrzebny jest przycisk, który uruchomi procedurę przesyłania logów błędów. Przycisk będzie miał jedno zadanie: wysłać do robota bit rozpoczęcia. Po kliknięciu w przycisk powinien zmienić się stan zmiennej start_send_errorlog na wysoki. Dodatkowo przycisk zostanie dezaktywowany aż do zakończenia przesyłania.

Na koniec należy zakończyć procedurę i zmienić stan sygnału na niski, dlatego do głównego programu zostaną dodane poniże linijki kodu:
IF gvl.Start_send_errorlog=1 AND gvl.All_errors_ware_send=1 THEN
gvl.Start_send_errorlog:=0;
END_IF
Ostatnim krokiem jest dodanie zmiennych statusowych do ramki komunikacyjnej. Jeden bit wyjściowy do rozpoczęcia przesyłania:

Oraz jeden wejściowy kończący sekwencję.

Działająca aplikacja
Aby przetestować zmodyfikowaną aplikację, wystarczy że wystąpi błąd na robocie, a od razu na ekranie pojawi się komunikat błędu z opisem oraz możliwością resetu błędu:

Dodatkowo po przejściu do okna z historią błędów należy kliknąć przycisk Download error log i lista zacznie się odświeżać. Na testowanym robocie przesłanie wszystkich 50 pozycji logów błędów zajęło 24 sekundy.

W ostatniej części przesłana będzie ze sterownika PLC nazwa programu, która najpierw będzie sprawdzona, a następnie – jeżeli taki program będzie w pamięci – zostanie wykonany.