
Wprowadzenie
W tym artykule skupimy się na praktycznym wykorzystaniu czytnika BoxID/Clocker. Artykuł przeznaczony jest dla osób, które już zapoznały się z integracją czytnika ze sterownikiem PLC Mitsubishi, jeżeli jeszcze tego nie zrobiłeś zapraszamy do pierwszej części artykułu.
Projekt PLC z tego artykułu w GX Works3 jest dostępny do pobrania na naszym githubie:
https://github.com/Inveo-spzoo/BoxID-Clocker—Mitsubishi-GxWorks3—Sample-Poroject-
Lista zmiennych
Po skonfigurowaniu obydwu urządzeń nadszedł czas na stworzenie pierwszej aplikacji wykorzystując pełną moc możliwości czytnika. Pamiętaj, że ilość bloków zależy od modelu czytnika.
Zanim jednak przejdziemy do programowania musimy zapoznać się z poszczególnymi blokami danych oraz ich funkcjonalnościami. Jednym z podstawowych bloków do obsługi czytników BoxID/Clocker jest blok “control” – umożliwia on sterowanie wyjściami, odczyt wejść, generowanie sygnałów dźwiękowych oraz podgląd danych logowania. Zmienne z prefiksem “Q” są danymi wyjściowymi sterownika PLC, a zmienne z prefiksem “I” jego danymi wejściowymi.

Opis funkcji poszczególnych zmiennych:
Q_resetNewIdFlag – ta flaga służy do potwierdzenia odbicia nowej karty użytkownika, ustawienie stanu wysokiego jest wymagane aby nastąpił reset flagi I_newIdFlag
I_newIdFlag – ta flaga przyjmuje stan wysoki po odbiciu nowej karty, flaga zostanie zresetowana poprzez ustawienie stanu wysokiego na Q_resetNewIdFlag
I_in1 – stan wejścia 1
I_in2 – stan wejścia 2
I_out1 – stan wyjścia 1
I_out2 – stan wyjścia 2
I_liveBit – bit sygnalizujący poprawną konfigurację obydwu urządzeń
I_uidLen – długość userID
I_uid – tablica danych userID
I_userId – zmienna informująca o tym czy użytkownik jest zarejestrowany w bazie jeżeli ID karty jest rozpoznane to wyświetli się id użytkownika w przeciwnym wypadku pojawi się wartość 64535.
I_group – grupa użytkownika
I_name1 – pierwszy człon nazwy użytkownika
I_name2 – drugi człon nazwy użytkownika
Q_out1_ctrl – wyjście przekaźnikowe 1 (sterowanie cewką)
Q_out2_ctrl – wyjście przekaźnikowe 2 (sterowanie cewką)
Q_soundAccept– sygnał dźwiękowy “accept”
Q_soundReject – sygnał dźwiękowy “reject”
Aby umożliwić zapis danych z poziomu PLC do czytnika należy wykonać poniższy handshake. Jest to potwierdzenie wprowadzenia nowego użytkownika.

Kolejnym podstawowym blokiem jest “User_editor”, który służy zarówno do odczytywania użytkowników oraz ich zapisu w pamięci czytnika. Każdy użytkownik ma swoją grupę oraz ID.

Istnieją dwa sposoby na dodawanie użytkowników. Możemy dodawać ich z poziomu wbudowanego web serwera czytnika lub z poziomu PLC wykonując odpowiednie operacje na data bloku.
Uwaga! Zmienne bloku “user_editor” służą zarówno do odczytu jak i do zapisu, nie ma tutaj podziału na parametry wejściowe oraz wyjściowe.
Opis funkcji poszczególnych zmiennych:
readUserid – numer użytkownika, którego dane chcemy odczytać
writeUserId – numer użytkownika, którego dane chcemy zapisać
addNewUser – musimy ustawić wartość na 1 za każdym razem przed dodaniem nowego użytkownika, ustawi to indeks w najbliższym wolnym miejscu – wartość automatycznie zostanie ustawiona na 0 przez czytnik więc nie trzeba jej kasować
currentUserId – indeks id użytkownika, którego chcemy zapisać bądź odczytać
uid – numer id karty użytkownika
name1 – pierwszy człon nazwy użytkownika
name2 – drugi człon nazwy użytkownika
group – grupa/poziom dostępu danego użytkownika
active – bit, który umożliwia dezaktywację dostępu danego użytkownika bez usuwania go z pamięci
Następnym istotnym blokiem jest “lcd”. Blok pozwala na pełną kontrolę nad wbudowanym wyświetlaczem, mamy do dyspozycji 4 wiersze po 20 znaków. Co umożliwia nam stworzenie prostego menu oraz wyświetlania rezultatu logowania.

Opis funkcji poszczególnych zmiennych:
useLcd – ustawienie stanu wysokiego pozwala na przejęcie kontroli nad wyświetlaczem, stan niski wyświetli adres IP czytnika
showTime – ustawienie stanu wysokiego wyświetli aktualną datę i godzinę w pierwszym wierszu
clearLcd – czyszczenie wyświetlacza
backlight – podświetlenie wyświetlacza ON/OFF
line1 – pierwszy wiersz
line2 – drugi wiersz
line3 – trzeci wiersz
line4 – czwarty wiersz
Ostatnim blokiem jest keypad, używamy go tylko w czytnikach z klawiaturą.

character – znak wciśnięty na klawiaturze
Po zapoznaniu się z blokami danych oraz ich zawartością czas na stworzenie pierwszej praktycznej aplikacji. Będzie to prosty system do zarządzania użytkownikami. Tak naprawdę czytnik BoxID ma wbudowany system do zarządzania użytkownikami – naszym zadaniem będzie obsłużenie go przy użyciu kilku prostych instrukcji.
Kontrola dostępu
Jak już wspomniałem na początku, do poprawnej pracy czytnika wymagany jest tak zwany handshake czyli reset flagi newID:

Możemy zacząć od ręcznego prowadzenia dwóch użytkowników do systemu, następnie przejdziemy do stworzenia prostego programu, który będzie wyzwalał wbudowane wyjście przekaźnikowe czytnika na czas 3s w przypadku poprawnej autoryzacji.


Jak widać dodałem dwóch użytkowników. Po zbliżeniu karty do czytnika oraz po naciśnięciu “Get last read UID” do pola Card UID zostanie wprowadzony ostatni odczytany kod.
Poniżej realizacja prostego programu kontroli dostępu w języku ST:

Działanie programu:
Jeśli identyfikator jest nieprawidłowy, użytkownik nie zostaje zalogowany. W przypadku pozytywnej weryfikacji system aktywuje wyjście przekaźnikowe na 3 sekundy.
Po upływie zadanego czasu wyjście zostaje automatycznie zresetowane, a system wraca do stanu oczekiwania na kolejnego użytkownika.
Poprawne logowanie:

Niepoprawne logowanie:

W przypadku poprawnego logowania wartość I_userId przyjmuje wartość indeksu użytkownika, w przeciwnym wypadku przyjmuje wartość 65535.
Zarządzanie użytkownikami
Zanim przejdziemy do zarzadzania użytkownikami stworzymy blok zmiennych pomocniczych User_help_var:

Wiemy już w jaki sposób weryfikować użytkowników, następnym krokiem jest opanowanie odczytywania istniejących użytkowników z wbudowanej bazy czytnika.
Obecnie nasza baza użytkowników wygląda w ten sposób:

Spróbujmy w takim razie odczytać użytkownika z indeksem 1:

Powyższy kod pozwala zarówno na odczyt jak i zapis użytkowników. Został tak przygotowany aby przy użyciu wpisywania wartości do zmiennych pomocniczych z postfiksami “Button” oraz “Set” można było zarządzać bazą np. z poziomu HMI. Aby odczytać użytkownika o indeksie 1 należy ustawić na 1 zmienną “currentUserId” oraz ustawić zmienną pomocniczą “readUserIDButton” na 1. Jak widać na podglądzie powyżej ukazały się dane użytkownika o indeksie 1.
Opanowaliśmy już odczyt użytkownika, następnym i ostatnim krokiem jest opanowanie zapisu nowych użytkowników z poziomu PLC. Podobnie jak w przypadku ręcznego dodawania użytkownika należy wprowadzić imię i nazwisko oraz zbliżyć nową kartę do czytnika.

Po prowadzeniu tych danych należy tylko zbliżyć do czytnika kartę, którą chcemy przypisać do tego użytkownika, następnie ustawić stan wysoki zmiennej “writeUserIDButton”.

Użytkownik zostanie wprowadzony na najbliższy wolny indeks w pamięci. W ten właśnie sposób pomyślenie wprowadziliśmy Adama Nowaka do bazy użytkowników.
Wyświetlacz LCD
Domyślnie na wyświetlaczu powinien wyświetlać się adres IP

Poniżej widzimy zawartość bloku “lcd”:

Ustawienie zmiennej “useLcd” na stan “true” pozwala na przejęcie pełnej kontroli nad wyświetlaczem.

Zmienna “showTime” pozwala na wyświetlenie aktualnego czasu w pierwszym wierszu, a “backlight” na podświetlenie wyświetlacza.
Efekt:

Spróbujmy teraz połączyć program z kontrolą dostępu, który napisaliśmy wcześniej z obsługą wyświetlacza. Poza wysterowaniem wyjścia przekaźnikowego na 3 sekundy przywitamy naszego użytkownika i wyświetlimy na ekranie jego imię i nazwisko:


Na sam koniec może wzbogacić nasz system o sygnał dźwiękowy w przypadku pomyślnej autoryzacji dodając obsługę stanu zmiennej “Q_soundAccept”.

Klawiatura
Ostatnim programowalnym elementem czytnika w zależności od wersji może być również klawiatura i właśnie na jej obsługę nadszedł czas. W przypadku czytników z klawiaturą poza blokami: “Control”, “User_editor” oraz “Lcd” mamy jeszcze blok “Keypad” lecz do wygodnej obsługi klawiatury będziemy nam potrzebny blok funkcyjny “Keypad”.
W projekcie należy dodać nowy blok funkcyjny w języku ST oraz nazwać go “Keypad”


Blok zmiennych należy zaimportować z pliku Local Label -> “Keypad.csv”, a kod źródłowy bloku funkcyjnego przekopiować z pliku tekstowego Local Label -> “Keypad_script”.
Po wykonaniu powyższych czynności można wywołać blok funkcyjny w pliku głównym przypisując w odpowiednie miejsca zmienne: “clearLcd”, “line1” oraz “character”.
Zmienna “character” pochodzi z bloku “Keypad”, zmienna “number” to string wyjściowy z klawiatury, w tym wypadku przypisaliśmy pierwszy wiersz wyświetlacza Lcd jako miejsce do wyświetlania treści wpisywanej z klawiatury.

Po wywołaniu funkcji i przypisaniu stringa do pierwszego wiersza wyświetlacza możemy wprowadzić dowolny ciąg cyfr:

Zakończenie
Dziękujemy, że poświęciliście czas na zapoznanie się z naszym manualem dotyczącym integracji czytników BoxID/Clocker ze sterownikami PLC Mitsubishi! Mamy nadzieję, że informacje zawarte w manualu ułatwią Wam wdrożenie tego rozwiązania w Waszych projektach. Jeśli będziecie mieli jakiekolwiek pytania, nie wahajcie się skontaktować z naszym zespołem wsparcia.
Powodzenia w integracji!