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 cewek2: odczyt wejść dyskretnych3: odczyt rejestrów holding4: 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 jakofalse -> truefalling: odczyt po zmianie interpretowanej jakotrue -> falseboth: odczyt przy każdej zmianie stanu logicznegotrue: odczyt po każdej wartości wejściowej interpretowanej jako truefalse: odczyt po każdej wartości wejściowej interpretowanej jako falsenull: odczyt tylko po odebraniu wartościnullnone: wyłączenie wyzwalania odczytu zwykłymi zdarzeniami wejściowymi
Dodatkowe zasady działania:
- Dla
rising,falling,both,trueifalsewejś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
endianessma znaczenie tylko wtedy, gdybitCount > 8
Dla funkcji 3 i 4:
SIGNED_NUMBER16: odczyt jednego rejestru jako liczby 16-bitowej ze znakiemSIGNED_NUMBER32: odczyt dwóch rejestrów jako liczby 32-bitowej ze znakiemUNSIGNED_NUMBER16: odczyt jednego rejestru jako liczby 16-bitowej bez znakuUNSIGNED_NUMBER32: odczyt dwóch rejestrów jako liczby 32-bitowej bez znakuFLOAT: odczyt dwóch rejestrów jako 32-bitowej liczby zmiennoprzecinkowej
Po odczycie i zinterpretowaniu danych bloczek:
- dzieli wartość przez
divisor, jeślidivisor > 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ści13, to na wyjściu nr 1 pojawi się liczba13, 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óci21.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.