TapHome

Tipovi podataka Modbus

Tipovi podataka Modbus u skriptama TapHome — Int16, Uint16, Int32, UInt32, Float, Bool, String i 64-bitni Int64, UInt64 i Double — s inačicama big-endian, little-endian i zamjenom bajtova.

Tip podataka treći je argument funkcija MODBUSR, MODBUSW i MODBUSWNE te funkcija UNPACKVALUE i PACKVALUE. Određuje koliko 16-bitnih registara vrijednost zauzima i kojim su redoslijedom spremljeni njezini bajtovi. Nazivi tipova podataka ne razlikuju velika i mala slova.

Osnovni tipovi podataka

Svaki osnovni tip podataka zauzima fiksan broj 16-bitnih registara i skripti daje vrijednost fiksnog tipa.

TipRegistriRasponVrijednost u skripti
Bool10 = FALSE, sve ostalo TRUEbool
Int161−32 768 … 32 767broj
Uint1610 … 65 535broj
Int322−2 147 483 648 … 2 147 483 647broj
UInt3220 … 4 294 967 295broj
Float2IEEE 754 jednostruka preciznostbroj
Int64, UInt64464-bitni cijeli brojeviint64, uint64
Double4IEEE 754 dvostruka preciznostbroj
String1 – 1232 znaka po registrustring

Mnogi uređaji spremaju decimalnu vrijednost kao cijeli broj s fiksnim mjerilom — nakon čitanja je podijelite, na primjer MODBUSR(H, 20, Int16) / 10. Vrijednosti kodirane u BCD-u pretvaraju se funkcijom FROMBCD.

Inačice redoslijeda bajtova

Svaki tip postoji u inačici big-endian i little-endian; 32- i 64-bitni tipovi i u inačicama sa zamjenom bajtova.

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
ZastavicaZnačenje za registre
BigEndianNajznačajniji registar dolazi prvi. To je zadano: Int32 je BigEndianInt32.
LittleEndianRedoslijed registara je obrnut (zamjena riječi). Kod 16-bitnog tipa, koji ima jedan registar, zamijenjena su dva bajta unutar njega.
ByteSwapZamijenjena su dva bajta unutar svakog registra.

Napomene

  • Čitanje i zapis primjenjuju sve zastavice na isti način, pa zapis vrijednosti i ponovno čitanje istim tipom daje istu vrijednost. Na centralnim jedinicama starijim od 2026.1 MODBUSW i MODBUSWNE zanemarivali su ByteSwap za Int32 i UInt32.
  • Kada se vrijednost čita kao besmislica, isprobajte inačice u ručnim operacijama Modbus u aplikaciji, koje mijenjaju tip podataka nad istim registrima.
  • U zbirci bajtova zastavice umjesto toga znače redoslijed bajtova — vidi Redoslijed bajtova u zbirkama.

Primjer

MODBUSR(H, 0x0100, LittleEndianFloat);
MODBUSR(A, 30, BigEndianUint32ByteSwap);

64-bitni tipovi podataka

Int64, UInt64 i Double zauzimaju četiri registra; Int64 i UInt64 čitaju se kao 64-bitni cijeli brojevi, točni u cijelom rasponu, jer double cijele brojeve drži točno samo do 2^53.

Napomene — 64-bitna vrijednost u funkcijama za bitove zadržava svih 64 bita, pa su dostupni i bitovi 32 do 63 riječi alarma.

Primjer — brojač energije u Wh, prikazan u kWh

VAR energy := MODBUSR(H, 100, UInt64);
energy / 1000;

Pogreške — Modbus data type ‘X’ not supported. Please update your core unit to be able to use this feature. — kada se skripta sprema za stariju centralnu jedinicu.

Dostupno — Core 2026.1, build 40595 ili noviji.

String

String čita tekst spremljen po dva znaka u registru, najprije viši bajt; broj registara četvrti je argument.

Napomene

  • MODBUSR čita 0 do 123 registra; tekst završava na prvom nultom bajtu. Svaki bajt je jedan znak.
  • String se može samo čitati. MODBUSW i PACKVALUE ga ne zapisuju.

Primjer

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

Zapis vrijednosti

MODBUSW, MODBUSWNE i PACKVALUE prije zapisa pretvaraju vrijednost u tip podataka.

  • Cjelobrojni tipovi zaokružuju na najbliži cijeli broj; vrijednost točno na polovici ide na paran broj, pa se 2.5 zapisuje kao 2, a 3.5 kao 4.
  • Vrijednost izvan raspona tipa Int16, Uint16 ili Float zaustavlja skriptu: Overflow when writing X as UInt16.
  • NaN se može upisati samo u Float i Double. U cjelobrojni tip zaustavlja skriptu: RegisterValueToWrites: Can’t write double.NaN to modbus register (MODBUSW, MODBUSWNE) ili PACKVALUE: Can’t write double.NaN to modbus register.
  • Bool za svaku vrijednost osim 0 upisuje 1. TRUE i FALSE mogu se upisati i u brojčane tipove kao 1 i 0.

Primjer — zadana vrijednost s jednim decimalnim mjestom

MODBUSW(H, 20, Int16, ROUND(Te * 10));

Vidi također — Funkcije Modbus, Skripte Modbus i prefetch, Binarni podaci.