Rozdział 10. MODBUS

Spis treści

10.1. Protokół komunikacyjny
10.2. Zaimplementowane funkcje
10.3. Rejestry INPUT

10.1. Protokół komunikacyjny

Moduł LB-856 zapewnia obsługę protokołu MODBUS/TCP, zgodnie ze specyfikacją Modbus Organization. Używany jest domyślnie przeznaczony dla tego protokołu port 502. Akceptowane jest jednocześnie tylko jedno połączenie TCP, wszystkie kolejne próby połączenia są odrzucane. Dodatkowo, jako rozszerzenie, obsługiwana jest również komunikacja za pomocą protokołu UDP - protokół jest identyczny jak dla TCP, również używany jest port 502.

10.2. Zaimplementowane funkcje

Zaimplementowane są następujące funkcje:

  • 4 - Read Input Registers,

  • 43/14 - Read Device Identification

10.3. Rejestry INPUT

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

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

adres protokołowy numer rejestru typ wartość
0 30001 16-bit unsigned integer, high byte / low byte Typ urządzenia (stała wartość 856).
1 30002 16-bit unsigned integer Numer seryjny urządzenia.
2+3 30003+30004 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 30005+30006 32-bit unsigned integer Data wydania bootloader'a: bity 16..31: rok, bity 8..15: miesiąc, bity 0..7: dzień.
6+7 30007+30008 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 30009+30010 32-bit unsigned integer Data wydania firmware: bity 16..31: rok, bity 8..15: miesiąc, bity 0..7: dzień.
10 30011 16-bit unsigned integer Numer wersji protokołu komunikacyjnego.
11 30012 16-bit unsigned integer Numer najniższej kompatybilnej wersji protokołu komunikacyjnego.
12..19 30013..20 16-bit unsigned integer Bezpośredni wynik pomiaru z przetwornika A/C (przeznaczenie serwisowe).
20 30021 16-bit unsigned integer Tryb pracy wejścia CO2: 0 - wejście wyłączone, 1 - wejście włączone
21 30022 16-bit unsigned integer Tryb pracy wejścia O2: 0 - wejście wyłączone, 2 - wejście włączone
22 30023 16-bit unsigned integer Tryb pracy wejścia temperatury: 0 - wejście wyłączone, 3 - wejście włączone
23 30024 16-bit unsigned integer Tryb pracy wejścia 0-10V: 0 - wejście wyłączone, 4 - wejście włączone
24 30025 16-bit unsigned integer Tryb pracy wejścia S300: 0 - wejście wyłączone, 5 - wejście włączone
25 30026 16-bit unsigned integer Typ czujnika S300 na wejściu S300; 0 gdy brak jest dołączonego czujnika na wejściu
26 30027 16-bit unsigned integer Numer seryjny czujnika S300 na wejściu S300; 0 gdy brak jest dołączonego czujnika na wejściu
27 30028 16-bit unsigned integer Okres odbioru danych S300 w milisekundach.
28+29 30029+30030 32-bit unsigned integer Numer kolejny rekordu danych S300, zwiększany o 1 po odebraniu kolejnego rekordu.
30+31 30031+30032 32-bit unsigned integer Ilość błędów transmisji danych S300.
32 30033 32-bit unsigned integer Wynik pomiaru CO2 w postaci stałoprzecinkowej. Jeżeli wejście jest nieaktywne, to zwracana jest wartość specjalna 1000000000.
34 30035 32-bit unsigned integer Wynik pomiaru O2 w postaci liczby stałoprzecinkowej. Jeżeli wejście jest nieaktywne, to zwracana jest wartość specjalna 1000000000.
36 30037 32-bit unsigned integer Wynik pomiaru temperatury w postaci liczby stałoprzecinkowej. Jeżeli wejście jest nieaktywne lub brak pomiaru, to zwracana jest wartość specjalna 1000000000. Jeżeli wykryta została sytuacja awaryjna (np. zwarcie czujnika), to zwracana jest wartość specjalna -1000000000.
38 30039 32-bit signed integer Wynik pomiaru napięcia w postaci liczby stałoprzecinkowej. Jeżeli wejście jest nieaktywne, to zwracana jest wartość specjalna 1000000000.

40+41

42+43

44+45

46+47

48+49

50+51

52+53

54+55

30041..30055 32-bit signed integer Wartość numeryczna w postaci stałoprzecinkowej określająca wynik pomiaru dla wejścia S300. Kolejne rejestry zawierają wartości odpowiadające kolejnym wynikom z czujnika S300. to zwracana jest wartość specjalna 1000000000. Jeżeli wykryta została sytuacja awaryjna (np. zwarcie czujnika), to zwracana jest wartość specjalna -1000000000.
56 30057 32-bit unsigned integer Wynik pomiaru CO2 w postaci zmiennoprzecinkowej.

Jeżeli wejście jest nieaktywne to zwracana jest wartość specjalna NaN.

58 30059 32-bit unsigned integer Wynik pomiaru O2 w postaci zmiennoprzecinkowej.

Jeżeli wejście jest nieaktywne to zwracana jest wartość specjalna NaN.

60 30061 32-bit unsigned integer Wynik pomiaru temperatury w postaci zmiennoprzecinkowej.

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

62 30063 32-bit signed integer Wynik pomiaru napięcia w postaci zmiennoprzecinkowej.

Jeżeli wejście jest nieaktywne to zwracana jest wartość specjalna NaN.

64+65

66+67

68+69

70+71

72+73

74+75

76+77

78+79

30065..30079 32-bit signed integer Wartość numeryczna w postaci zmiennoprzecinkowej określająca wynik pomiaru dla wejścia S300. Kolejne rejestry zawierają wartości odpowiadające kolejnym wynikom z czujnika S300.

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.

128..207 300129..208 32-bit integer

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

Przesunięcie danego rejestru względem początku bloku można obliczyć następująco:

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

np. dla wejścia nr 4 i zmiennej nr 2:

adres = 64 + ((4 - 1) * 8 + (2 - 1)) * 2 = 114

Ze względu na 2 słowa zajmowane przez każdą wartość int32_t, adresy poszczególnych zmiennych rosną kolejno o 2.

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.

256..335 30257..336 32-bit float

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

Przesunięcie danego rejestru względem początku bloku można obliczyć następująco:

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

np. dla wejścia nr 4 i zmiennej nr 2:

adres = 192 + ((4 - 1) * 8 + (2 - 1)) * 2 = 242

Ze względu na 2 słowa zajmowane przez każdą wartość int32_t, adresy poszczególnych zmiennych rosną kolejno o 2.

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.