Rozdział 12. MODBUS

Spis treści

12.1. Protokół komunikacyjny
12.2. Zaimplementowane funkcje
12.3. Wyjścia binarne COIL
12.4. Rejestry INPUT

12.1. Protokół komunikacyjny

Moduł LB-480 zapewnia obsługę protokołu MODBUS/TCP, zgodnie ze specyfikacją Modbus Organization.

TCP: Używany jest domyślnie przeznaczony dla tego protokołu port 502. W wersjach firmware < 3.5.2 akceptowane jest jednocześnie tylko jedno połączenie TCP, wszystkie kolejne próby połączenia są odrzucane. Począwszy od wersji 3.5.2 akceptowane są dwa połączenia TCP, na wypadek gdyby były problemy z pierwszym połączeniem (np. długi czas zamykania, z powodu niedopilnowania przez master'a prawidłowej procedury zamknięcia połączenia TCP - np. gdy program zostanie zamknięty "na siłę" lub się po prostu błędnie zachowuje. Pomimo obsługi dwóch połączeń, nadal jest wskazane używanie tylko jednego master'a.

UDP: Używany jest port 502, analogicznie jak dla TCP. Ilość master'ów odpytujących moduł o dane przy użyciu protokołu UDP jest nieograniczona i jest to wskazana metoda komunikacji, jeśli jest dostępna w używanym oprogramowaniu. Nie ma tu problemu z niedomkniętymi połączeniami TCP w przypadku problemów komunikacyjnych i z opóźnieniem otwierania nowego połączenia.

12.2. Zaimplementowane funkcje

Zaimplementowane są następujące funkcje:

  • 1 - Read Coils,

  • 3 - Read Holding Registers,

  • 4 - Read Input Registers,

  • 5 - Write Single Coil,

  • 6 - Write Single Register,

  • 15 - Write Multiple Coils,

  • 16 - Write Multiple Registers,

  • 43/14 - Read Device Identification

12.3. Wyjścia binarne COIL

Funkcje są dostępne począwszy od wersji firmware 5.1.

Sterowanie wyjściami binarnymi jest możliwe za pomocą następujących funkcji: 1 - Read Coils, 5 - Write Single Coil, 15 - Write Multiple Coils.

Aby była możliwość zdalnego sterowania wyjściem binarnym, musi zostać ustawiony w module odpowiedni tryb pracy tego wyjścia - sterowanie MODBUS/WWW lub suma wszystkich sygnałów.

W przypadku potencjalnej nieciągłości przestrzeni adresowej (np. zamontowany PORT1 i PORT3, brak PORT2) bity dla PORT2 są możliwe do zapisania i odczytania, żeby nie wymuszać dzielenia komend na nieciągłe zakresy adresów. Zapis stanu dla nieistniejących wyjść jest ignorowany, odczyt daje wynik = 0.

Poniższa tabela przedstawia dostępne do zdalnego sterowania wyjścia binarne w module LB-480.

adres funkcja
0 OUTPUT 1 (na płytce głównej)
1 OUTPUT 2 (na płytce głównej)
2 PORT 1 RELAY 1
3 PORT 1 RELAY 2
4 PORT 2 RELAY 1
5 PORT 2 RELAY 2
6 PORT 3 RELAY 1
7 PORT 3 RELAY 2

12.4. Rejestry INPUT

Poniższa tabela przedstawia dostępne rejestry typu INPUT (odczyt funkcją 04 – Read Input Registers).

Podane adresy to adresy protokołowe. Numer rejestru MODBUS typu INPUT oblicza się dodając do adresu protokołowego wartość 30001.

Wszystkie wartości są w kolejności bajtów big-endian (starszy-młodszy), high byte / low byte, high word / low word.

UWAGA: dotyczy wersji firmware począwszy od 4.6, dla LB-480 i LB-490. Starsze wersje firmware w LB-480 udostęniają tylko następujący podzbiór rejestrów: 0-10, 20-27, 28-35, 36-43, 64-191, 192-319. Starsze wersje firmware w LB-490 udostępniają taki sam podzbiór rejestrów jak LB-480, w związku z czym możliwy jest odczyt danych tylko dla wejść 1-8.

Tryby pracy wejść, typy czujników, zmiennych, wartości i jednostki zmiennych są opisane w rozdziale Tryby pracy, typy czujników, wyniki pomiarów i zmienne.

adres typ wartość
Informacje ogólne o urządzeniu
0 16-bit unsigned integer Typ urządzenia (stała wartość 480).
1 16-bit unsigned integer Numer seryjny urządzenia.
2–3 32-bit unsigned integer Wersja bootloader'a: bity 24–31: numer wersji główny, bity 16–23: numer wersji poboczny, bity 8–15: numer rewizji, bity 0–7: numer beta.
4-5 32-bit unsigned integer Data wydania bootloader'a: bity 16–31: rok, bity 8–15: miesiąc, bity 0–7: dzień.
6–7 32-bit unsigned integer Wersja firmware: bity 24–31: numer wersji główny, bity 16–23: numer wersji poboczny, bity 8–15: numer rewizji, bity 0–7: numer beta.
8–9 32-bit unsigned integer Data wydania firmware: bity 16–31: rok, bity 8–15: miesiąc, bity 0–7: dzień.
10 16-bit unsigned integer Numer wersji protokołu komunikacyjnego.
11 16-bit unsigned integer Numer najniższej kombatybilnej wersji protokołu komunikacyjnego.
12 16-bit unsigned integer Ilość wejść na płytce głównej.
13 16-bit unsigned integer Ilość portów do podłączenia modułów rozszerzeń.
Informacje o wejściach IN1-IN8
20–27 8× 16-bit unsigned integer

Tryb pracy wejścia IN1-IN8

28–35 8× 16-bit unsigned integer Typ czujnika S300 na wejściu IN1-IN8; 0 gdy wejście pracuje w innym trybie niż S300 albo brak jest dołączonego czujnika na wejściu
36–43 8× 16-bit unsigned integer Numer seryjny czujnika S300 na wejściu IN1-IN8; 0 gdy wejście pracuje w innym trybie niż S300 albo brak jest dołączonego czujnika na wejściu
44–51 8× 16-bit unsigned integer Ilość zmiennych zdefiniowanych dla danego wejścia IN1-IN8.
Informacje o modułach PORT1-PORT3
52–54 3× 16-bit unsigned integer Tryb pracy (typ) modułu PORT1-PORT3.
55–57 3× 16-bit unsigned integer Status modułu PORT1-PORT3.
58–60 3× 16-bit unsigned integer Numer seryjny modułu PORT1-PORT3, jeśli numer jest dostępny.
61–63 3× 16-bit unsigned integer Ilość zmiennych zdefiniowanych dla danego modułu PORT1-PORT3.
Wyniki pomiarów z wejść IN1-IN8
64–191 8× 8× 32-bit integer

numer_rejestru = początek_bloku + ((nr_wejścia - 1) * 8 + (nr_zmiennej - 1)) * 2

 

Wartość numeryczna w postaci stałoprzecinkowej określająca wynik pomiaru dla wielkości mierzonej na wejściu IN1-IN8; i dla danej kolejnej zmiennej 1-8.

Jeżeli wejście jest nieaktywne lub dana zmienna nie istnieje, to zwracana jest wartość specjalna 1000000000. Jeżeli wykryta została sytuacja awaryjna (np. zwarcie czujnika), to zwracana jest wartość specjalna -1000000000.

192–319 8× 8× 32-bit float

numer_rejestru = początek_bloku + ((nr_wejścia - 1) * 8 + (nr_zmiennej - 1)) * 2

 

Wartość numeryczna w postaci zmiennoprzecinkowej określająca wynik pomiaru dla wielkości mierzonej na wejściu IN1-IN8 i dla danej kolejnej zmiennej 1-8.

Jeżeli wejście jest nieaktywne, dana zmienna nie istnieje lub wykryta została sytuacja awaryjna (np. zwarcie czujnika) to zwracana jest wartość specjalna NaN.

320–383 8× 8× 16-bit unsigned integer

numer_rejestru = początek_bloku + (nr_wejścia - 1) * 8 + (nr_zmiennej - 1)

 

Ilość cyfr po przecinku w wyniku pomiaru. Ta wartość ma znaczenie dla wyników w postaci stało- i zmiennoprzecinkowej: dla wartości stałoprzecinkowej oznacza w którym miejscu należy postawić przecinek, dla wartości zmiennoprzecinkowej oznacza precyzję i ilość znaczących cyfr po przecinku w wyniku.

Jeżeli wejście jest nieaktywne, dana zmienna nie istnieje lub wykryta została sytuacja awaryjna (np. zwarcie czujnika) to zwracana jest wartość 0.

Wyniki pomiarów z modułów PORT1-PORT3

UWAGA: nie dotyczy wielowejściowych modułów LB-499-AIN, LB-499-GIN. Wyniki z czujników podłączonych do wejść tych modułów są w sekcji danych z wejść modułów wielowejściowych.

384-431 3× 8× 32-bit integer

numer_rejestru = początek_bloku + ((nr_wejścia - 1) * 8 + (nr_zmiennej - 1)) * 2

 

Wartość numeryczna w postaci stałoprzecinkowej określająca wynik pomiaru dla wielkości mierzonej na porcie PORT1-PORT3; i dla danej kolejnej zmiennej 1-8.

Jeżeli wejście jest nieaktywne lub dana zmienna nie istnieje, to zwracana jest wartość specjalna 1000000000. Jeżeli wykryta została sytuacja awaryjna (np. zwarcie czujnika), to zwracana jest wartość specjalna -1000000000.

432-479 3× 8× 32-bit float

numer_rejestru = początek_bloku + ((nr_wejścia - 1) * 8 + (nr_zmiennej - 1)) * 2

 

Wartość numeryczna w postaci zmiennoprzecinkowej określająca wynik pomiaru dla wielkości mierzonej na wejściu IN1-IN8 i dla danej kolejnej zmiennej 1-8.

Jeżeli wejście jest nieaktywne, dana zmienna nie istnieje lub wykryta została sytuacja awaryjna (np. zwarcie czujnika) to zwracana jest wartość specjalna NaN.

480-503 3× 8× 16-bit unsigned integer

numer_rejestru = początek_bloku + (nr_wejścia - 1) * 8 + (nr_zmiennej - 1)

 

Ilość cyfr po przecinku w wyniku pomiaru. Ta wartość ma znaczenie dla wyników w postaci stało- i zmiennoprzecinkowej: dla wartości stałoprzecinkowej oznacza w którym miejscu należy postawić przecinek, dla wartości zmiennoprzecinkowej oznacza precyzję i ilość znaczących cyfr po przecinku w wyniku.

Jeżeli wejście jest nieaktywne, dana zmienna nie istnieje lub wykryta została sytuacja awaryjna (np. zwarcie czujnika) to zwracana jest wartość 0.

Informacje o wejściach modułów wielowejściowych (LB-499-AIN, LB-499-GIN)
504-511 536-543 568-575 3× 8× 16-bit unsigned integer

nr_rejestru = początek_bloku + (nr_portu - 1) × 32 + (nr_wejścia - 1)

 

Tryb pracy wejścia.

512-519 544-551 576-583 3× 8× 16-bit unsigned integer

nr_rejestru = początek_bloku + (nr_portu - 1) × 32 + 8 + (nr_wejścia - 1)

 

Typ czujnika S300 na wejściu modułu lub 0 gdy wejście pracuje w innym trybie niż S300 albo brak jest dołączonego czujnika na wejściu.

520-527 552-559 584-591 3× 8× 16-bit unsigned integer

nr_rejestru = początek_bloku + (nr_portu - 1) × 32 + 16 + (nr_wejścia - 1)

 

Numer seryjny czujnika S300 na wejściu lub 0 gdy wejście pracuje w innym trybie niż S300 albo brak jest dołączonego czujnika na wejściu.

528-535 560-567 592-599 3× 8× 16-bit unsigned integer

nr_rejestru = początek_bloku + (nr_portu - 1) × 32 + 24 + (nr_wejścia - 1)

 

Ilość zmiennych zdefiniowanych dla danego wejścia.

Wyniki pomiarów z wejść modułów wielowejściowych
600-983 3× 8× 8× 32-bit integer

numer_rejestru = początek_bloku + (((nr_portu - 1) × 8 + (nr_wejścia - 1)) × 8 + (nr_zmiennej - 1)) * 2

 

Wartość numeryczna w postaci stałoprzecinkowej określająca wynik pomiaru dla wielkości mierzonej na porcie PORT1-PORT3; i dla danej kolejnej zmiennej 1-8.

Jeżeli wejście jest nieaktywne lub dana zmienna nie istnieje, to zwracana jest wartość specjalna 1000000000. Jeżeli wykryta została sytuacja awaryjna (np. zwarcie czujnika), to zwracana jest wartość specjalna -1000000000.

984-1367 3× 8× 8× 32-bit float

numer_rejestru = początek_bloku + (((nr_portu - 1) × 8 + (nr_wejścia - 1)) × 8 + (nr_zmiennej - 1)) * 2

 

Wartość numeryczna w postaci zmiennoprzecinkowej określająca wynik pomiaru dla wielkości mierzonej na wejściu IN1-IN8 i dla danej kolejnej zmiennej 1-8.

Jeżeli wejście jest nieaktywne, dana zmienna nie istnieje lub wykryta została sytuacja awaryjna (np. zwarcie czujnika) to zwracana jest wartość specjalna NaN.

1368-1559 3× 8× 8× 16-bit unsigned integer

numer_rejestru = początek_bloku + ((nr_portu - 1) × 8 + (nr_wejścia - 1)) × 8 + (nr_zmiennej - 1)

 

Ilość cyfr po przecinku w wyniku pomiaru. Ta wartość ma znaczenie dla wyników w postaci stało- i zmiennoprzecinkowej: dla wartości stałoprzecinkowej oznacza w którym miejscu należy postawić przecinek, dla wartości zmiennoprzecinkowej oznacza precyzję i ilość znaczących cyfr po przecinku w wyniku.

Jeżeli wejście jest nieaktywne, dana zmienna nie istnieje lub wykryta została sytuacja awaryjna (np. zwarcie czujnika) to zwracana jest wartość 0.