TapHome

Tipovi podataka

Tipovi podataka skriptnog jezika TapHome: brojevi, tekst, strukturirani i enum tipovi, zbirke, svojstvo .Type, proširenje tipa u aritmetici te ponašanje vrijednosti Null i NaN.

Skalarni tipovi

Svaka vrijednost u skripti ima konkretan tip. Nazivi tipova u nastavku koriste se u deklaracijama s tipom (vidi Lokalne varijable), a vraća ih svojstvo .Type.

TipVrijednostiNapomene
boolTRUE, FALSESvaki broj različit od nule pretvara se u TRUE, nula u FALSE.
int8, uint8, int16, uint16, int, uint, int64, uint64Cijeli brojevi od 8, 16, 32 i 64 bitaint i uint su 32-bitni tipovi. uint8 je bajt zbirki bajtova.
float, doubleBrojevi s pomičnim zarezomBrojčani literali i većina aritmetike daju double.
charJedan znak, 'A'U aritmetici sudjeluje svojim kodom znaka.
stringTekst, "abc"+ s nizom znakova na bilo kojoj strani spaja tekst.

Int32 x := 4; završava pogreškom Unknown variable or constant 'Int32'. Nazivi kao Int32 i UInt32 postoje samo među tipovima podataka Modbus funkcija MODBUSR i MODBUSW.

Strukturirani tipovi

Strukturirani tipovi sadrže više vrijednosti, dostupnih kao svojstva:

TipSadržiSvojstva
datetimeDatum i vrijeme s vrstom (Local, Utc, Unspecified)Vidi Datum i vrijeme
timespanVremenski intervalDays, Hours, Minutes, Seconds, Milliseconds, TotalDays, TotalHours, TotalMinutes, TotalSeconds, TotalMilliseconds (samo za čitanje)
httprequestPripremljeni HTTP zahtjev iz HTTPREQUESTPath, Method, Body, Headers (čitanje i pisanje)
httpresponseOdgovor funkcije SENDHTTPREQUESTContent, Headers, IsSuccess, StatusCode, ReasonPhrase (samo za čitanje)
receivedmessageDolazna poruka RECEIVEDMSG listener skripteProtocol, Payload, Length, Topic, ContentType, PayloadFormat, ClientId, Expiry, Dup (samo za čitanje)
blobNeobrađeni bajtovi, na primjer RECEIVEDMSG.PAYLOADLength (samo za čitanje)
rgbcolor, hsvcolorBoje, vidi BojeRed, Green, Blue i Hue, Saturation, Value (čitanje i pisanje)
groupvalueVrijednost skupine uređajaCalculated, Values (samo za čitanje)
currentvalueinfo, historyvaluesDijelovi varijable Info vrijednostiVidi Info vrijednosti

Enum tipovi

Enum tip je fiksni skup imenovanih vrijednosti koje neke funkcije primaju kao parametar:

TipVrijednostiKoristi ga
ModbusRegisterTypeC, H, D, AFunkcije Modbus
ModbusDataTypeInt16, Uint16, Int32, UInt32, Float, Bool, String, Int64, UInt64, Double i njihove varijante redoslijeda bajtova, vidi Tipovi podataka ModbusFunkcije Modbus, PACKVALUE, UNPACKVALUE
LinearTypeDEFAULT, BOUNDS, STRICT, INFINITELINEAR
DateTimeKindLocal, Utc, UnspecifiedNOW, DATETIME
DayOfWeekMonday … SundaySvojstva tipa datetime
CompareOptionsNone, IgnoreCase, IgnoreNonSpace, IgnoreSymbols, IgnoreKanaType, IgnoreWidth, OrdinalIgnoreCase, StringSort, OrdinalCOMPARE

Vrijednost enuma piše se sama (Utc) ili sa svojim tipom (DateTimeKind.Utc). Enum tipovi rade i kao ključne riječi deklaracije:

DateTimeKind kind := Utc;
VAR t := NOW(kind);

Zbirke

collection<T> je popis vrijednosti jednog tipa elementa T.

collection<uint16> registers := UINT16COLLECTION(4);
collection<string> names := {"a", "b", "c"};
collection<uint8> data := BYTECOLLECTION("0A0B0C");
LENGTH(names);
# Result: 3
  • Tip elementa dolazi iz deklaracije, inače iz prvog elementa koji nije Null. Sam {Null} završava pogreškom Unable to determine collection type.
  • Ugniježđene zbirke nisu podržane: Collection<Collection<>> is not supported.
  • Zbirke su referentne vrijednosti. APPEND, INSERT, REMOVEAT, SETAT i REPLACE mijenjaju zbirku na mjestu i vraćaju istu zbirku.
  • BYTECOLLECTION, UINT16COLLECTION i BOOLCOLLECTION stvaraju najviše 2048 elemenata; svaki oblik veći broj prijavljuje vlastitom porukom (vidi Pogreške pri izvršavanju).
  • LENGTH(c) ili c.Length vraća broj elemenata.

Dostupno — zbirke s tipom od verzije Core 2022.2; UINT16COLLECTION i BOOLCOLLECTION od verzije Core 2026.1, build 39001.

Svojstvo .Type

Svaka vrijednost ima svojstvo samo za čitanje .Type, koje vraća naziv njezina tipa kao tekst. Za vrijednost enuma to je enum tip, na primjer "DateTimeKind".

VAR x := 5.5;
x.Type;
# Result: "Double"
VAR c := BYTECOLLECTION("0A0B");
c.Type;
# Result: "Collection<UInt8>"

Svojstva se mogu čitati samo iz imenovane varijable. AVG('a', 'c').Type završava pogreškom Unexpected character '.'; vrijednost najprije spremite u varijablu.

Pravila pretvorbe tipova

U aritmetici tip rezultata određuje prvo pravilo koje odgovara dvama operandima:

  1. Bilo koji operand je double (ili vrijednost skupine): double.
  2. Bilo koji operand je float: float.
  3. Bilo koji operand je int64: int64.
  4. Bilo koji operand je uint64: uint64.
  5. Bilo koji operand je uint: uint kada je i drugi bez predznaka, inače int64.
  6. Inače (manji cijeli brojevi, bool, char): int.

Dijeljenje dvaju cijelih brojeva odbacuje decimalni dio. Brojčani literal je double, pa dijeljenje njime to ne radi:

int a := 5;
int b := 2;
a / b;
# Result: 2
a / 2;
# Result: 2.5
  • Operatori nad bitovima rade s cijelim brojevima; operand double najprije se pretvara u int64.
  • + s nizom znakova na bilo kojoj strani spaja tekst: "T=" + 21.5 je "T=21.5".
  • datetime + broj dodaje milisekunde, datetime + timespan dodaje interval, a timespan ± timespan radi kako se i očekuje.
  • Dijeljenje nulom zaustavlja skriptu pogreškom Division by zero. Djelitelj zaštitite funkcijom IF.
  • Dodjela varijabli s tipom pretvara vrijednost u njezin tip, vidi Lokalne varijable.

Null i NaN

NaN je broj čija je vrijednost nepoznata, na primjer senzor koji još nije očitan ili uređaj u pogrešci. Null znači da vrijednost uopće ne postoji: obrisani uređaj ili funkcija koja nije ništa pronašla.

  • Usporedba s literalom NaN (x = NaN, x < NaN) odbija se već pri raščlambi skripte: Comparison with NaN is always false. Use the IsNaN method to check for NaN value. Koristite ISNAN.
  • <, >, <= i >= s operandom Null daju FALSE. Null = Null, Null <= Null i Null >= Null su TRUE, Null = 5 je FALSE.
  • &, | i ^ s operandom Null daju Null; << i >> daju Null za vrijednost Null s lijeve strane, dok broj pomaka Null zaustavlja skriptu pogreškom Cannot cast DataType.Null to number.
  • Aritmetika i logika s Null (Null + 5, !Null) zaustavlja skriptu pogreškom Operator '+' not defined for 'Null' and 'Double'. Vrijednost najprije provjerite funkcijom ISNULL.
  • Uvjet Null u IF vrijedi kao FALSE.
  • MIN, MAX, AVG i ORDER preskaču Null i NaN; varijante …STRICT ih prosljeđuju dalje. EQUALS(NaN, NaN) je TRUE.
IF(ISNULL(value) OR ISNAN(value), 0, value);
# Result: the value, or 0 when it is missing or unknown