TapHome

Dátové typy

Dátové typy skriptovacieho jazyka TapHome: čísla, text, štruktúrované a enum typy, kolekcie, vlastnosť .Type, povýšenie typov v aritmetike a správanie Null a NaN.

Skalárne typy

Každá hodnota v skripte nesie konkrétny typ. Názvy typov nižšie sa používajú v typovaných deklaráciách (pozrite Lokálne premenné) a vracia ich vlastnosť .Type.

TypHodnotyPoznámky
boolTRUE, FALSEKaždé nenulové číslo sa prevedie na TRUE, nula na FALSE.
int8, uint8, int16, uint16, int, uint, int64, uint64Celé čísla s 8, 16, 32 a 64 bitmiint a uint sú 32-bitové typy. uint8 je bajt bajtových kolekcií.
float, doubleČísla s pohyblivou desatinnou čiarkouČíselné literály a väčšina aritmetiky dávajú double.
charJeden znak, 'A'V aritmetike vystupuje ako kód znaku.
stringText, "abc"+ so stringom na ktorejkoľvek strane spája text.

Int32 x := 4; skončí chybou Unknown variable or constant 'Int32'. Názvy ako Int32 a UInt32 existujú iba medzi dátovými typmi Modbus vo funkciách MODBUSR a MODBUSW.

Štruktúrované typy

Štruktúrované typy obsahujú viac hodnôt, dostupných ako vlastnosti:

TypObsahujeVlastnosti
datetimeDátum a čas s druhom (Local, Utc, Unspecified)Pozrite Dátum a čas
timespanČasový intervalDays, Hours, Minutes, Seconds, Milliseconds, TotalDays, TotalHours, TotalMinutes, TotalSeconds, TotalMilliseconds (iba na čítanie)
httprequestPripravená HTTP požiadavka z funkcie HTTPREQUESTPath, Method, Body, Headers (na čítanie aj zápis)
httpresponseOdpoveď funkcie SENDHTTPREQUESTContent, Headers, IsSuccess, StatusCode, ReasonPhrase (iba na čítanie)
receivedmessagePrichádzajúca správa RECEIVEDMSG v listener skripteProtocol, Payload, Length, Topic, ContentType, PayloadFormat, ClientId, Expiry, Dup (iba na čítanie)
blobSurové bajty, napríklad RECEIVEDMSG.PAYLOADLength (iba na čítanie)
rgbcolor, hsvcolorFarby, pozrite FarbyRed, Green, Blue a Hue, Saturation, Value (na čítanie aj zápis)
groupvalueHodnota skupiny zariadeníCalculated, Values (iba na čítanie)
currentvalueinfo, historyvaluesČasti premennej typu Info o hodnotePozrite Info o hodnote

Enum typy

Enum typ je pevná množina pomenovaných hodnôt, ktorú niektoré funkcie berú ako parameter:

TypHodnotyPoužíva ho
ModbusRegisterTypeC, H, D, AFunkcie Modbus
ModbusDataTypeInt16, Uint16, Int32, UInt32, Float, Bool, String, Int64, UInt64, Double a ich varianty poradia bajtov, pozrite Dátové typy ModbusFunkcie Modbus, PACKVALUE, UNPACKVALUE
LinearTypeDEFAULT, BOUNDS, STRICT, INFINITELINEAR
DateTimeKindLocal, Utc, UnspecifiedNOW, DATETIME
DayOfWeekMonday … SundayVlastnosti typu datetime
CompareOptionsNone, IgnoreCase, IgnoreNonSpace, IgnoreSymbols, IgnoreKanaType, IgnoreWidth, OrdinalIgnoreCase, StringSort, OrdinalCOMPARE

Hodnota enumu sa píše samostatne (Utc) alebo s názvom svojho typu (DateTimeKind.Utc). Enum typy fungujú aj ako kľúčové slová deklarácie:

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

Kolekcie

collection<T> je zoznam hodnôt jedného typu prvku T.

collection<uint16> registers := UINT16COLLECTION(4);
collection<string> names := {"a", "b", "c"};
collection<uint8> data := BYTECOLLECTION("0A0B0C");
LENGTH(names);
# Result: 3
  • Typ prvku sa preberá z deklarácie, inak z prvého prvku, ktorý nie je Null. Samotné {Null} skončí chybou Unable to determine collection type.
  • Vnorené kolekcie nie sú podporované: Collection<Collection<>> is not supported.
  • Kolekcie sú referenčné hodnoty. APPEND, INSERT, REMOVEAT, SETAT a REPLACE menia kolekciu na mieste a vracajú tú istú kolekciu.
  • BYTECOLLECTION, UINT16COLLECTION a BOOLCOLLECTION vytvoria najviac 2048 prvkov; väčší počet hlási každý tvar vlastnou správou (pozri Chyby pri vykonávaní).
  • LENGTH(c) alebo c.Length vráti počet prvkov.

Dostupnosť — typované kolekcie od Core 2022.2; UINT16COLLECTION a BOOLCOLLECTION od Core 2026.1, build 39001.

Vlastnosť .Type

Každá hodnota má vlastnosť .Type iba na čítanie, ktorá vracia názov jej typu ako text. Pri hodnote enumu je to názov enum typu, napríklad "DateTimeKind".

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

Vlastnosti sa dajú čítať iba z pomenovanej premennej. AVG('a', 'c').Type skončí chybou Unexpected character '.'; hodnotu si najprv uložte do premennej.

Pravidlá konverzie typov

V aritmetike o type výsledku rozhoduje prvé pravidlo, ktoré pre dva operandy platí:

  1. Jeden z operandov je double (alebo hodnota skupiny): double.
  2. Jeden z operandov je float: float.
  3. Jeden z operandov je int64: int64.
  4. Jeden z operandov je uint64: uint64.
  5. Jeden z operandov je uint: uint, keď je aj druhý bez znamienka, inak int64.
  6. Inak (menšie celé čísla, bool, char): int.

Delenie dvoch celých čísel desatinnú časť odrezáva. Číselný literál je double, takže delenie ním ju neodrezáva:

int a := 5;
int b := 2;
a / b;
# Result: 2
a / 2;
# Result: 2.5
  • Bitové operátory pracujú s celými číslami; operand typu double sa najprv prevedie na int64.
  • + so stringom na ktorejkoľvek strane spája text: "T=" + 21.5 je "T=21.5".
  • datetime + číslo pripočíta milisekundy, datetime + timespan pripočíta interval a timespan ± timespan funguje podľa očakávania.
  • Delenie nulou zastaví skript chybou Division by zero. Deliteľ ošetrite pomocou IF.
  • Priradenie do typovanej premennej prevedie hodnotu na typ premennej, pozrite Lokálne premenné.

Null a NaN

NaN je číslo, ktorého hodnota je neznáma, napríklad zo senzora, ktorý ešte nebol prečítaný, alebo zo zariadenia v chybe. Null znamená, že hodnota vôbec neexistuje: zmazané zariadenie alebo funkcia, ktorá nič nenašla.

  • Porovnanie s literálom NaN (x = NaN, x < NaN) sa odmietne už pri parsovaní skriptu: Comparison with NaN is always false. Use the IsNaN method to check for NaN value. Použite ISNAN.
  • <, >, <= a >= s operandom Null dávajú FALSE. Null = Null, Null <= Null a Null >= Null sú TRUE, Null = 5 je FALSE.
  • &, | a ^ s operandom Null dávajú Null; << a >> dávajú Null pri hodnote Null vľavo, kým Null ako počet posunu zastaví skript chybou Cannot cast DataType.Null to number.
  • Aritmetika a logika s Null (Null + 5, !Null) zastaví skript chybou Operator '+' not defined for 'Null' and 'Double'. Hodnotu najprv skontrolujte funkciou ISNULL.
  • Podmienka IF s hodnotou Null sa počíta ako FALSE.
  • MIN, MAX, AVG a ORDER preskakujú Null a NaN; varianty …STRICT ich prenášajú ďalej. EQUALS(NaN, NaN) je TRUE.
IF(ISNULL(value) OR ISNAN(value), 0, value);
# Result: the value, or 0 when it is missing or unknown