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 cewki6: zapis pojedynczego rejestru15: zapis wielu cewek16: 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
5wejście musi dawać się odczytać jako wartość całkowita 0 albo 1 - dla funkcji
6wejś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
15wejś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 przezbitCount - dla funkcji
16wejście musi być wartością liczbową; sposób zapisu zależy odvalueType
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 rejestrowaNUMBER32: po zastosowaniu mnożnika część ułamkowa jest odrzucana i wynik jest zapisywany jako 32-bitowa liczba rejestrowaFLOAT: 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
5będzie to0albo1 - 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 = 5i 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ę na1. - Jeśli
functionCode = 6,multiplier = 10, a na wejściu pojawi się wartość12.3, to do rejestru zostanie zapisana wartość całkowita123. - 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łądValue 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.0zapisana jako liczba zmiennoprzecinkowa 32-bitowa.