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: Core 2022.2 alebo novší; UINT16COLLECTION a BOOLCOLLECTION: TapHome Next 2026.1.39016+.

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