Skip to content

modbus-read

Opis

Bloczek modbus-read służy do odczytywania danych z urządzenia Modbus RTU przez port RS485. Może wykonywać odczyt cyklicznie, po zdarzeniu na wejściu głównym albo jednocześnie w obu tych trybach.

Bloczek posiada jedno wejście główne i dwa wyjścia. Nie korzysta z wejść oznaczanych bloczkiem tag.

Obsługiwany sposób odczytu zależy od parametru functionCode:

  • 1: odczyt cewek
  • 2: odczyt wejść dyskretnych
  • 3: odczyt rejestrów holding
  • 4: odczyt rejestrów input

Parametry konfiguracyjne

Nazwa parametru Wartość
Zbocze wyzwalające (input_edge) Parametr obowiązkowy określający, jakie zdarzenie na wejściu głównym ma uruchamiać odczyt. Obsługiwane są wartości: rising, falling, both, true, false, null, none.
Kod funkcji Modbus (functionCode) Parametr obowiązkowy. Określa typ odczytu: 1 dla cewek, 2 dla wejść dyskretnych, 3 dla rejestrów holding, 4 dla rejestrów input.
Adres urządzenia (deviceAddress) Parametr obowiązkowy. Adres slave urządzenia Modbus z zakresu od 1 do 255.
Adres początkowy (registerAddress) Parametr obowiązkowy. Adres pierwszej cewki, wejścia albo rejestru z zakresu od 0 do 65535.
Liczba bitów (bitCount) Parametr wymagany dla funkcji 1 i 2. Określa liczbę odczytywanych bitów. Dozwolony zakres to 1-32.
Typ wartości rejestrowej (valueType) Parametr wymagany dla funkcji 3 i 4. Dozwolone wartości to SIGNED_NUMBER16, SIGNED_NUMBER32, UNSIGNED_NUMBER16, UNSIGNED_NUMBER32 oraz FLOAT.
Dzielnik (divisor) Parametr obowiązkowy. Odczytana wartość jest po przetworzeniu dzielona przez ten parametr. Dozwolony zakres to 1-4294967295. Bloczek nie zaokrągla wyniku po dzieleniu.
Precyzja (precision) Parametr obowiązkowy z zakresem 0-3. Określa docelową precyzję wartości po zastosowaniu divisor. Bloczek obcina mniej znaczące cyfry, a nie zaokrągla wyniku.
Kolejność bajtów (endianess) Parametr wymagany wtedy, gdy odczyt obejmuje więcej niż 1 bajt danych, czyli dla funkcji 3 i 4 oraz dla funkcji 1 i 2, gdy bitCount > 8. Dozwolone wartości to LittleEndian, BigEndian, SwapBytes, SwapWords.
Interwał odświeżania (refreshInterval) Parametr obowiązkowy. Określa czas pomiędzy kolejnymi cyklicznymi odczytami w milisekundach. Dozwolony zakres to 0-3600000 ms. Wartość 0 wyłącza odczyt cykliczny.
Limit czasu odpowiedzi (responseTimeout) Parametr obowiązkowy. Maksymalny czas oczekiwania na odpowiedź urządzenia w milisekundach. Dozwolony zakres to 10-60000 ms.
Konfiguracja RS485 (server) Parametr obowiązkowy. Identyfikator bloczka modbus-client, z którego mają zostać pobrane ustawienia portu RS485.

Obsługa wejścia

Bloczek ma jedno wejście główne. Wartość pojawiająca się na tym wejściu nie jest interpretowana jako dana do odczytu z Modbusa. Służy wyłącznie do wyzwalania operacji odczytu zgodnie z parametrem input_edge.

Znaczenie parametru input_edge:

  • rising: odczyt po zmianie interpretowanej jako false -> true
  • falling: odczyt po zmianie interpretowanej jako true -> false
  • both: odczyt przy każdej zmianie stanu logicznego
  • true: odczyt po każdej wartości wejściowej interpretowanej jako true
  • false: odczyt po każdej wartości wejściowej interpretowanej jako false
  • null: odczyt tylko po odebraniu wartości null
  • none: wyłączenie wyzwalania odczytu zwykłymi zdarzeniami wejściowymi

Dodatkowe zasady działania:

  • Dla rising, falling, both, true i false wejście musi dać się zinterpretować logicznie. Pozostałe wartości są ignorowane.
  • Jeśli refreshInterval > 0, bloczek wykonuje również odczyt cykliczny. Pierwsza próba odczytu następuje około 2 sekund po zakończeniu inicjalizacji projektu.
  • Kolejny odczyt cykliczny jest planowany po zakończeniu poprzedniej operacji.
  • Jeśli w danej chwili trwa już oczekiwanie na odpowiedź z urządzenia Modbus, następne wyzwolenia wejściowe i kolejne próby odczytu są ignorowane do czasu zakończenia bieżącej operacji.

Interpretacja odczytanej wartości

Sposób interpretacji odpowiedzi zależy od wybranego functionCode.

Dla funkcji 1 i 2:

  • bloczek odczytuje od 1 do 32 bitów
  • odebrane bity są interpretowane jako jedna nieujemna wartość liczbowa
  • parametr endianess ma znaczenie tylko wtedy, gdy bitCount > 8

Dla funkcji 3 i 4:

  • SIGNED_NUMBER16: odczyt jednego rejestru jako liczby 16-bitowej ze znakiem
  • SIGNED_NUMBER32: odczyt dwóch rejestrów jako liczby 32-bitowej ze znakiem
  • UNSIGNED_NUMBER16: odczyt jednego rejestru jako liczby 16-bitowej bez znaku
  • UNSIGNED_NUMBER32: odczyt dwóch rejestrów jako liczby 32-bitowej bez znaku
  • FLOAT: odczyt dwóch rejestrów jako 32-bitowej liczby zmiennoprzecinkowej

Po odczycie i zinterpretowaniu danych bloczek:

  • dzieli wartość przez divisor, jeśli divisor > 1
  • obcina część ułamkową zgodnie z precision
  • wysyła na wyjście wynik jako wartość numeryczną

Wyjścia bloczka

Numer i nazwa wyjścia Opis wyjścia
1. Odczytana wartość. Zwraca ostatnią poprawnie odczytaną i przetworzoną wartość numeryczną z urządzenia Modbus. Wyjście aktualizuje się tylko po udanym odczycie i poprawnym zinterpretowaniu odpowiedzi.
2. Status podłączenia danych. Zwraca wartość true, gdy ostatni odczyt zakończył się powodzeniem i bloczek dysponuje aktualną wartością. Zwraca wartość false, gdy wystąpił błąd komunikacji, błąd odpowiedzi albo błąd przetwarzania odczytanych danych. W razie błędu pierwsze wyjście zachowuje ostatnią poprawnie odczytaną wartość.

Opis statusu bloczka

Opis widoczny pod bloczkiem pokazuje wynik ostatniej zakończonej operacji:

  • po poprawnym odczycie jest to tekstowa reprezentacja odczytanej wartości
  • po błędzie jest to komunikat błędu

Błędy widoczne dla użytkownika

Bloczek może pokazywać następujące komunikaty błędów:

Kod błędu Opis błędu
Invalid input edge configuration. Parametr input_edge jest niepoprawny albo nie został ustawiony.
Invalid function code configuration. Parametr functionCode ma niepoprawną wartość.
Invalid device address configuration. Parametr deviceAddress jest niepoprawny albo poza zakresem 1-255.
Invalid register address configuration. Parametr registerAddress jest niepoprawny albo poza zakresem 0-65535.
Invalid bit count configuration. Parametr bitCount jest niepoprawny, poza zakresem albo wymagany dla funkcji 1 lub 2, ale nie został poprawnie ustawiony.
Invalid value type configuration. Parametr valueType jest niepoprawny albo wymagany dla funkcji 3 lub 4, ale nie został poprawnie ustawiony.
Invalid divisor configuration. Parametr divisor jest niepoprawny albo poza dozwolonym zakresem.
Invalid precision configuration. Parametr precision jest niepoprawny albo poza zakresem 0-3.
Invalid endianess configuration. Parametr endianess jest wymagany dla danego trybu odczytu, ale nie został poprawnie ustawiony.
Invalid refresh interval configuration. Parametr refreshInterval jest niepoprawny albo poza zakresem 0-3600000 ms.
Invalid response timeout configuration. Parametr responseTimeout jest niepoprawny albo poza zakresem 10-60000 ms.
Missing RS485 configuration. Nie wskazano poprawnego bloczka modbus-client w parametrze server.
Baudrate configuration mismatch. Różne bloczki Modbus w projekcie mają niespójne ustawienie prędkości RS485.
Parity configuration mismatch. Różne bloczki Modbus w projekcie mają niespójne ustawienie parzystości RS485.
Stop bits configuration mismatch. Różne bloczki Modbus w projekcie mają niespójne ustawienie liczby bitów stopu RS485.
Invalid baudrate configuration. Ustawienia RS485 dostarczone przez bloczek modbus-client są niepoprawne.
Invalid parity configuration. Ustawienia RS485 dostarczone przez bloczek modbus-client są niepoprawne.
Invalid stop bits configuration. Ustawienia RS485 dostarczone przez bloczek modbus-client są niepoprawne.
Invalid parity or stop bits configuration. Ustawiona kombinacja parzystości i bitów stopu jest niedozwolona.
RS485 setup incomplete. Konfiguracja RS485 nie została jeszcze poprawnie przygotowana w runtime.
RS485 port missing. W runtime nie ma dostępnego portu RS485 do wykonania operacji.
Function code not supported Urządzenie Modbus odrzuciło żądanie, ponieważ nie obsługuje wybranej funkcji.
Invalid address Urządzenie Modbus zgłosiło niepoprawny adres cewki, wejścia albo rejestru.
Invalid quantity Urządzenie Modbus zgłosiło niepoprawną liczbę odczytywanych elementów.
IO error Wystąpił błąd wejścia-wyjścia podczas komunikacji.
Unknown modbus exception code Urządzenie Modbus zwróciło nieznany kod wyjątku.
Master/RS485 timeout Upłynął czas operacji po stronie mastera albo magistrali RS485.
Slave timeout Urządzenie slave nie odpowiedziało w oczekiwanym czasie.
Invalid request Żądanie wysyłane do urządzenia zostało uznane za niepoprawne.
Internal error Wystąpił błąd wewnętrzny podczas przygotowania albo wykonania operacji.
RS485 busy Magistrala RS485 jest aktualnie zajęta.
RS485 RX overrun Wystąpiło przepełnienie odbioru na RS485.
RS485 frame error Wystąpił błąd ramki podczas transmisji RS485.
Value parse failed Odpowiedź urządzenia została odebrana, ale nie udało się z niej poprawnie odczytać wartości.
Unknown register value type Wystąpiła niespójność typu wartości rejestrowej podczas przetwarzania odpowiedzi.
Invalid register value type Wystąpił nieprawidłowy typ wartości rejestrowej podczas przetwarzania odpowiedzi.
Invalid precision W trakcie przetwarzania odpowiedzi wykryto nieprawidłową wartość precision.

Przykłady działania

  • Jeśli functionCode = 1, bitCount = 4, a urządzenie zwróci bity odpowiadające wartości 13, to na wyjściu nr 1 pojawi się liczba 13, a na wyjściu nr 2 wartość true.
  • Jeśli functionCode = 3, valueType = SIGNED_NUMBER16, divisor = 10, a urządzenie zwróci rejestr z wartością 215, to bloczek zwróci 21.5.
  • Jeśli functionCode = 4, valueType = FLOAT, divisor = 1, precision = 2, a urządzenie zwróci wartość 23.987, to wynik zostanie obcięty do precyzji wynikającej z konfiguracji i wysłany na wyjście nr 1.
  • Jeśli odczyt zakończy się błędem komunikacji, na wyjściu nr 2 pojawi się false, a opis bloczka zostanie zastąpiony komunikatem błędu.