1. Konfiguracja portu komunikacyjnego:
Dokonuje się tego w oprogramowaniu narzędziowym WinProladder, z menu PLC->Setting->Port Parameter:
– należy zmienić protokół (czerwona ramka poniżej) z domyślnego Fatek Communication Protocol na ModBus RTU Slave
– należy ustalić parametry komunikacji na porcie (niebieska ramka poniżej) na takie same, jakie ustawione są na urządzeniu/ach slave, które będą odpytywane przez sterownik. Obowiązuje tu zasada, którą można streścić jednym zdaniem: parametry komunikacji na wszystkich urządzeniach, komunikujących się na jednej sieci szeregowej, muszą być takie same:
2. Wstawienie w programie głównym funkcję nr 150 – ModBus Master. Funkcja ta przyjmuje trzy argumenty:
gdzie:
– Pt – numer portu komunikacyjnego sterownika, na którym ma odbywać się komunikacja (w przykładzie port nr 2)
– SR – rejestr początkowy tabeli komunikacji ModBus Master. Do tej pory jeszcze jej nie omówiono. Istotne jest to, że w dalszym etapie, tworząc ją, należy nadać jej adres początkowy taki sam jak wpisano w to pole. Natomiast co do tego jaki musi być to adres: musi być z zakresu zmiennych podtrzymywanych (bo inaczej sterownik utraci zapisy w tej tabeli po każdym uruchomieniu) i nie mogą rejestry tej tabeli pokrywać się z użytymi już w programie, ku innym celom, adresami rejestrów (tak, żeby uniknąć nadpisywania wartości w tabeli, co prowadziłoby do jej “zniszczenia” poprzez przekłamanie)
– WR – rejestry robocze funkcji – tu należy wpisać adres nieużywanego ku innym celom zakresu rejestrów (funkcja używa 8śmiu kolejnych rejestrów roboczych). Nie muszą już być podtrzymywane.W pierwszym rejestrze roboczym zapisywane są:
– na młodszym bajcie numer wykonywanego wpisu z tabeli komunikacyjnej (o tym później)
– na starszym bajcie zapisywany będzie ewentualny kod błędu (brak błędu to wartość 0)
3. Wywoływanie funkcji:
– optymalnie jest to wykonywać od markera systemowego wskazującego na to czy używany do komunikacji port komunikacyjny jest wolny, czy też zajęty. Każdy port ma przypisany taki marker, a odnaleźć ten marker można w helpie do systemowych zmiennych w WinProladderze (skrót F2). W przykładzie, gdzie stosuje się port nr 2, odpowiednim wierszem w helpie jest:
i ten marker zastosowano, jako wywołanie funkcji nr 150 – ModBus Master:
Uzasadnienie takiego wywołania funkcji:
– w tabeli komunikacyjne będzie wprowadzane wiele wpisów – będą to odpytania różnych zmiennych w obrębie jednej stacji slave lub wielu stacji slave – funkcja przy pojedynczym jej wywołaniu stanem narastającym na wejściu, wykonuje tylko jeden z tych wpisów
– żeby wykonała kolejny, musi pojawić się na jej wejściu ponownie stan narastający (czyli każde wywołanie to wykonanie kolejnego wpisu w tabeli wpisu [gdy wykona się ostatni, w następnym
wywołaniu wykona pierwszy – „zapętlenie”])
Z tego powodu trzeba tą funkcję cyklicznie wyzwalać, aby wykonywały się wszystkie wpisy z tabeli i żeby w ogóle się wykonywały.
Zastosowanie markera wskazującego na to, że używany przez funkcję port komunikacyjny jest wolny, kiedy tak właśnie będzie:
– funkcja zacznie wykonywać odpytanie na port – marker przejdzie w stan niski, gdyż port stanie się zajęty
– gdy funkcja skończy pojedyncze odpytanie, port się zwolni, czyli marker przejdzie w stan wysoki. Zatem pojawi się na wejściu funkcji ponownie stan narastający i funkcja rozpocznie wykonywanie
kolejnego wpisu.
Summa summarum uzyskuje się efekt, że kiedy tylko port jest wolny, wykonywana jest funkcja – nowe odpytanie odbywa się najszybciej, jak to jest możliwe.
4. Tworzenie tabeli ModBus Master Table:
– dokonuje się tego w drzewku projektu, w odnodze Table Edit. Klikamy prawym przyciskiem myszy na pozycji ModBus Master Table i wybieramy utworzenie nowej tabeli:
– wpisujemy dowolną, naszą nazwę tabeli
– adres początkowy wpisujemy taki sam, jaki wpisaliśmy w polu SR funkcji 150:
– po kliknięciu OK, otwiera się edytor tabli:
5. Dodawanie wpisów (deklaracji poszczególnych odpytań w protokole ModBus) do tabeli ModBus Master Table.
Kreator wpisu wygląda następująco:
gdzie:
– w polu Slave Station wpisujemy adres stacji slave na sieci ModBus, do której adresujemy zapytanie
– pole Command ma trzy opcje:
– zapis
– zapis pojedynczej zmiennej
– odczyt
Czym różni się komenda zapis i zapis pojedynczej zmiennej: w ModBusie, do zapisu wartości, istnieją po dwa kody funkcji, odpowiednio dla zapisu do zmiennych dyskretnych (typu coils) i zmiennych rejestrowych (typu holding register). Poniżej wypisano parami te komendy (cytaty z dokumentacji protokołu ModBus):
* zmienne coils (coils to zmienne dyskretne zapis/odczyt)
Force Single Coil (05)
Force Multiple Coils (15, 0x0F)
* zmienne holding register (zmienne rejestrowe zapis/odczyt):
Preset Single Register (06)
Preset Multiple Registers (16, 0X10)
I teraz, w zależności od implementacji protokołu ModBus przez producenta urządzenia, które chcemy odpytywać, wybierzemy z listy w kreatorze pozycję Write lub Single Write. Czasami wspierane są obie funkcje, czasami tylko jedna z nich.
– w pole Data size wpisujemy ile kolejnych zmiennych od wskazanego w ostatnim polu adresu początkowego, chcemy odczytać lub zapisać (nie dotyczy komendy single write, gdzie w polu tym winna znaleźć się wartość 1)
– pole Master Data Start Address – wpisujemy tu adres początkowy zmiennych sterownika Fatek:
– do których mają być zapisane odczytane z urządzenia slave wartości, w przypadku komendy odczytu
– których wartości mają zostać wysłane do urządzenia slave, w przypadku komendy zapisu
– pole Slave Data Start Address – wpisujemy tu adres początkowy zmiennych w urządzeniu slave:
– które chcemy pobrać, w przypadku komendy odczytu
– do których chcemy wysłać wartości, w przypadku komendy zapisu
W polu tym, adres w urządzeniu slave, rządzi się następującymi zasadami:
– ostatnia cyfra po lewej stronie wskazuje na typ zmiennej, do której chcemy się odwołać. W ModBusie występują cztery typy zmiennych, oznaczane cyframi:
0 – coils – zmienna dyskretna zapis/odczyt
1- input – zmienna dyskretna tylko do odczytu
3 – input register – zmienna rejestrowa tylko do odczytu
4 – holding register – zmienna rejestrowa zapis/odczyt
I tymi cyframi, na ostatniej po lewej stronie pozycji będziemy wskazywać typ zmiennej. W dokumentacji urządzenia winno być napisane, jakiego typu jest dana zmienna.
– prawą stronę pola Slave Data Address, uzupełniamy adresem zmiennej w formacie dziesiętnym (często w dokumentacji urządzeń adresy są podawane w kodzie heksadecymalnym – trzeba je przeliczyć na kod dziesiętny).
UWAGA: Bardzo często, w dokumentacjach urządzeń, adresy zmiennych są poprzesuwane o jeden adres w dół. Można to stwierdzić doświadczalnie lub wydedukować z tego, że w dokumentacji
urządzenia adresy rozpoczynają się od 0 – wtedy na pewno do wszystkich adresów trzeba będzie dodać 1.
Przykładowo, wpis jakiego dokonano na powyższym screenie, można by odczytać następująco:
Odczytaj ze stacji slave o numerze 3, cztery kolejne zmienne typu holding register, od adresu 1200, a odczytane wartości wpisz do rejestrów od R0 do R3 w sterowniku Fatek.
I w ten sposób dodajemy na listę wpisy odczytu różnych zmiennych, z różnych stacji.