Skip to content

modbus-write

Opis

Bloczek modbus-write służy do wysyłania wartości do urządzenia Modbus RTU przez port RS485. Po każdej zmianie odebranej na wejściu bloczek próbuje zapisać wartość do wskazanego adresu urządzenia, używając wybranej funkcji Modbus.

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

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

  • 5: zapis pojedynczej cewki
  • 6: zapis pojedynczego rejestru
  • 15: zapis wielu cewek
  • 16: zapis wielu rejestrów

Parametry konfiguracyjne

Nazwa parametru Wartość
Kod funkcji Modbus (functionCode) Parametr obowiązkowy. Określa typ zapisu: 5 dla pojedynczej cewki, 6 dla pojedynczego rejestru, 15 dla wielu cewek, 16 dla wielu rejestrów.
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 albo pierwszego rejestru z zakresu od 0 do 65535.
Liczba bitów (bitCount) Parametr wymagany tylko dla funkcji 15. Określa liczbę bitów do zapisania. Dozwolony zakres to 1-32.
Typ wartości rejestrowej (valueType) Parametr wymagany tylko dla funkcji 16. Dozwolone wartości to NUMBER16, NUMBER32 oraz FLOAT.
Limit czasu odpowiedzi (responseTimeout) Parametr obowiązkowy. Maksymalny czas oczekiwania na odpowiedź urządzenia w milisekundach. Dozwolony zakres to 10-60000 ms.
Mnożnik (multiplier) Parametr obowiązkowy. Wartość wejściowa jest przed zapisem mnożona przez ten parametr. Dozwolony zakres to 1-4294967295.
Kolejność bajtów (endianess) Parametr wymagany wtedy, gdy zapisywana wartość zajmuje więcej niż 1 bajt, czyli dla funkcji 6, 16 oraz dla funkcji 15, gdy bitCount > 8. Dozwolone wartości to LittleEndian, BigEndian, SwapBytes, SwapWords.
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. Wystarczy, że wejście będzie podłączone do co najmniej jednego źródła danych. Każda odebrana zmiana uruchamia osobną próbę zapisu do urządzenia Modbus.

Bloczek nie ma wejść oznaczanych jako tag1, tag2 i tak dalej.

Zasady działania dla poszczególnych funkcji:

  • dla funkcji 5 wejście musi dawać się odczytać jako wartość całkowita 0 albo 1
  • dla funkcji 6 wejście musi być wartością liczbową, po zastosowaniu mnożnika część ułamkowa jest odrzucana, a wynik musi mieścić się w jednym rejestrze 16-bitowym
  • dla funkcji 15 wejście musi być wartością liczbową nieujemną, po zastosowaniu mnożnika część ułamkowa jest odrzucana, a wynik musi mieścić się w liczbie bitów określonej przez bitCount
  • dla funkcji 16 wejście musi być wartością liczbową; sposób zapisu zależy od valueType

Szczegóły działania dla funkcji 16:

  • NUMBER16: po zastosowaniu mnożnika część ułamkowa jest odrzucana i wynik jest zapisywany jako 16-bitowa liczba rejestrowa
  • NUMBER32: po zastosowaniu mnożnika część ułamkowa jest odrzucana i wynik jest zapisywany jako 32-bitowa liczba rejestrowa
  • FLOAT: po zastosowaniu mnożnika wartość jest zapisywana jako 32-bitowa liczba zmiennoprzecinkowa

Kolejność bajtów jest stosowana tylko wtedy, gdy zapis obejmuje więcej niż jeden bajt danych. Dla funkcji 15 parametr endianess nie ma znaczenia, jeśli bitCount <= 8.

Nieprawidłowa wartość wejściowa nie jest ignorowana. Powoduje ustawienie stanu błędu i zwrócenie na wyjściu wartości false.

Wyjścia bloczka

Bloczek posiada jedno wyjście.

Na wyjściu pojawia się wartość logiczna:

  • true po poprawnym potwierdzonym zapisie do urządzenia Modbus
  • false po błędzie zapisu, błędzie komunikacji albo odrzuceniu żądania przez urządzenie

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

  • dla funkcji 5 będzie to 0 albo 1
  • dla pozostałych funkcji będzie to tekstowa reprezentacja ostatniej odebranej wartości wejściowej
  • w przypadku błędu pod bloczkiem widoczny jest 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 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 15, ale nie został poprawnie ustawiony.
Invalid value type configuration. Parametr valueType jest niepoprawny albo wymagany dla funkcji 16, ale nie został poprawnie ustawiony.
Invalid response timeout configuration. Parametr responseTimeout jest niepoprawny albo poza zakresem 10-60000 ms.
Invalid multiplier configuration. Parametr multiplier jest niepoprawny albo poza dozwolonym zakresem.
Invalid endianess configuration. Parametr endianess jest wymagany dla danego trybu zapisu, ale nie został poprawnie ustawiony.
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.
Input disconnected. Wejście bloczka nie jest podłączone do żadnego źródła danych.
RS485 port missing. W runtime nie ma dostępnego portu RS485 do wykonania operacji.
Expected 0 or 1 on input. Dla funkcji 5 na wejście podano wartość inną niż 0 albo 1.
Failed to parse value. Bloczek nie mógł odczytać wartości wejściowej jako liczby.
Negative value. Dla funkcji 15 podano wartość ujemną.
Value too large for bit count. Dla funkcji 15 wartość po przeliczeniu nie mieści się w liczbie bitów określonej przez bitCount.
Value exceeds 16-bits. Wartość po przeliczeniu nie mieści się w 16 bitach dla funkcji 6 albo dla typu NUMBER16.
Value exceeds 32-bits. Wartość po przeliczeniu nie mieści się w 32 bitach dla typu NUMBER32.
Value exceeds 32-bit float. Wartość po przeliczeniu nie mieści się w zakresie 32-bitowej liczby zmiennoprzecinkowej dla typu FLOAT.
Failed to create request data. Bloczek nie mógł przygotować bufora danych do wysłania.
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 albo rejestru.
Invalid quantity Urządzenie Modbus zgłosiło niepoprawną liczbę zapisywanych 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.

Przykłady działania

  • Jeśli functionCode = 5 i na wejściu pojawi się wartość 1, bloczek wyśle zapis pojedynczej cewki ustawiający ją na stan aktywny. Po poprawnym potwierdzeniu na wyjściu pojawi się true, a opis bloczka zmieni się na 1.
  • Jeśli functionCode = 6, multiplier = 10, a na wejściu pojawi się wartość 12.3, to do rejestru zostanie zapisana wartość całkowita 123.
  • Jeśli functionCode = 15, bitCount = 8, a na wejściu pojawi się wartość 13, to bloczek zapisze osiem bitów reprezentujących tę wartość. Jeśli zamiast tego pojawi się wartość 300, bloczek zwróci błąd Value too large for bit count..
  • Jeśli functionCode = 16, valueType = FLOAT, multiplier = 10, a na wejściu pojawi się wartość 21.5, to do dwóch rejestrów zostanie wysłana wartość 215.0 zapisana jako liczba zmiennoprzecinkowa 32-bitowa.