Typy danych Modbus
Typy danych Modbus w skryptach TapHome — Int16, Uint16, Int32, UInt32, Float, Bool, String oraz 64-bitowe Int64, UInt64 i Double — w wariantach big-endian, little-endian i z zamianą bajtów.
Typ danych jest trzecim argumentem funkcji MODBUSR, MODBUSW i MODBUSWNE oraz UNPACKVALUE i PACKVALUE. Decyduje, ile 16-bitowych rejestrów zajmuje wartość i w jakiej kolejności zapisane są jej bajty. W nazwach typów danych wielkość liter nie ma znaczenia.
Podstawowe typy danych
Każdy podstawowy typ danych zajmuje stałą liczbę 16-bitowych rejestrów i daje skryptowi wartość stałego typu.
| Typ | Rejestry | Zakres | Wartość w skrypcie |
|---|---|---|---|
Bool | 1 | 0 = FALSE, cokolwiek innego TRUE | bool |
Int16 | 1 | −32 768 … 32 767 | liczba |
Uint16 | 1 | 0 … 65 535 | liczba |
Int32 | 2 | −2 147 483 648 … 2 147 483 647 | liczba |
UInt32 | 2 | 0 … 4 294 967 295 | liczba |
Float | 2 | IEEE 754 pojedyncza precyzja | liczba |
Int64, UInt64 | 4 | 64-bitowe liczby całkowite | int64, uint64 |
Double | 4 | IEEE 754 podwójna precyzja | liczba |
String | 1 – 123 | 2 znaki na rejestr | tekst |
Wiele urządzeń przechowuje wartość dziesiętną jako liczbę całkowitą ze stałą skalą — po odczycie ją podziel, na przykład MODBUSR(H, 20, Int16) / 10. Wartości kodowane w BCD konwertuje FROMBCD.
Warianty kolejności bajtów
Każdy typ istnieje w wariancie big-endian i little-endian; typy 32- i 64-bitowe także w wariantach z zamianą bajtów.
| |
| Flaga | Znaczenie dla rejestrów |
|---|---|
BigEndian | Najbardziej znaczący rejestr jest pierwszy. To wartość domyślna: Int32 to BigEndianInt32. |
LittleEndian | Kolejność rejestrów jest odwrócona (zamiana słów). Dla typu 16-bitowego, który ma jeden rejestr, zamieniane są dwa bajty w jego wnętrzu. |
ByteSwap | Zamieniane są dwa bajty wewnątrz każdego rejestru. |
Uwagi
- Odczyt i zapis stosują wszystkie flagi tak samo, więc zapis wartości i jej odczyt z tym samym typem daje tę samą wartość. Na Core starszym niż 2026.1
MODBUSWiMODBUSWNEignorowałyByteSwapdlaInt32iUInt32. - Gdy wartość odczytuje się jako bezsensowna, wypróbuj warianty w ręcznych operacjach Modbus w aplikacji, które przełączają typ danych nad tymi samymi rejestrami.
- W kolekcji bajtów flagi oznaczają zamiast tego kolejność bajtów — zobacz Kolejność bajtów w kolekcjach.
Przykład
MODBUSR(H, 0x0100, LittleEndianFloat);
MODBUSR(A, 30, BigEndianUint32ByteSwap);Typy danych 64-bitowe
Int64, UInt64 i Double zajmują cztery rejestry; Int64 i UInt64 są odczytywane jako 64-bitowe liczby całkowite, dokładne w całym zakresie, ponieważ double przechowuje liczby całkowite dokładnie tylko do 2^53.
Uwagi — Wartość 64-bitowa zachowuje wszystkie 64 bity w funkcjach bitowych, więc bity 32 do 63 słowa alarmów są osiągalne.
Przykład — licznik energii w Wh, wyświetlany w kWh
VAR energy := MODBUSR(H, 100, UInt64);
energy / 1000;Błędy — Modbus data type ‘X’ not supported. Please update your core unit to be able to use this feature. — gdy skrypt jest zapisywany dla starszego Core.
Dostępność — Core 2026.1, kompilacja 40595 lub nowsza.
String
String odczytuje tekst zapisany po dwa znaki na rejestr, najpierw starszy bajt; liczba rejestrów jest czwartym argumentem.
Uwagi
MODBUSRodczytuje od 0 do 123 rejestrów; tekst kończy się na pierwszym bajcie zerowym. Każdy bajt to jeden znak.Stringmożna tylko odczytywać.MODBUSWiPACKVALUEgo nie zapisują.
Przykład
MODBUSR(H, 14, String, 4);
# Result: text of up to 8 characters, for example a serial numberZapis wartości
MODBUSW, MODBUSWNE i PACKVALUE konwertują wartość na typ danych przed zapisem.
- Typy całkowite zaokrąglają do najbliższej liczby całkowitej; wartość dokładnie w połowie idzie do liczby parzystej, więc
2.5zapisuje się jako2, a3.5jako4. - Wartość spoza zakresu
Int16,Uint16lubFloatzatrzymuje skrypt: Overflow when writing X as UInt16. NaNmożna zapisać tylko doFloatiDouble. Do typu całkowitego zatrzymuje skrypt: RegisterValueToWrites: Can’t write double.NaN to modbus register (MODBUSW,MODBUSWNE) lub PACKVALUE: Can’t write double.NaN to modbus register.Boolzapisuje 1 dla każdej wartości innej niż 0.TRUEiFALSEmożna także zapisać do typów liczbowych jako 1 i 0.
Przykład — wartość zadana z jednym miejscem po przecinku
MODBUSW(H, 20, Int16, ROUND(Te * 10));Zobacz też — Funkcje Modbus, Skrypty Modbus i prefetch, Dane binarne.