TapHome

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.

TypRejestryZakresWartość w skrypcie
Bool10 = FALSE, cokolwiek innego TRUEbool
Int161−32 768 … 32 767liczba
Uint1610 … 65 535liczba
Int322−2 147 483 648 … 2 147 483 647liczba
UInt3220 … 4 294 967 295liczba
Float2IEEE 754 pojedyncza precyzjaliczba
Int64, UInt64464-bitowe liczby całkowiteint64, uint64
Double4IEEE 754 podwójna precyzjaliczba
String1 – 1232 znaki na rejestrtekst

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.

1
2
3
4
5
6
7
8
BigEndianInt16      LittleEndianInt16
BigEndianUint16     LittleEndianUint16
BigEndianInt32      LittleEndianInt32       BigEndianInt32ByteSwap      LittleEndianInt32ByteSwap
BigEndianUint32     LittleEndianUint32      BigEndianUint32ByteSwap     LittleEndianUint32ByteSwap
BigEndianFloat      LittleEndianFloat       BigEndianFloatByteSwap      LittleEndianFloatByteSwap
BigEndianInt64      LittleEndianInt64       BigEndianInt64ByteSwap      LittleEndianInt64ByteSwap
BigEndianUint64     LittleEndianUint64      BigEndianUint64ByteSwap     LittleEndianUint64ByteSwap
BigEndianDouble     LittleEndianDouble      BigEndianDoubleByteSwap     LittleEndianDoubleByteSwap
FlagaZnaczenie dla rejestrów
BigEndianNajbardziej znaczący rejestr jest pierwszy. To wartość domyślna: Int32 to BigEndianInt32.
LittleEndianKolejność 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.
ByteSwapZamieniane 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 MODBUSW i MODBUSWNE ignorowały ByteSwap dla Int32 i UInt32.
  • 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

  • MODBUSR odczytuje od 0 do 123 rejestrów; tekst kończy się na pierwszym bajcie zerowym. Każdy bajt to jeden znak.
  • String można tylko odczytywać. MODBUSW i PACKVALUE go nie zapisują.

Przykład

MODBUSR(H, 14, String, 4);
# Result: text of up to 8 characters, for example a serial number

Zapis 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.5 zapisuje się jako 2, a 3.5 jako 4.
  • Wartość spoza zakresu Int16, Uint16 lub Float zatrzymuje skrypt: Overflow when writing X as UInt16.
  • NaN można zapisać tylko do Float i Double. 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.
  • Bool zapisuje 1 dla każdej wartości innej niż 0. TRUE i FALSE moż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.