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.
| Typ | Hodnoty | Poznámky |
|---|---|---|
bool | TRUE, FALSE | Každé nenulové číslo sa prevedie na TRUE, nula na FALSE. |
int8, uint8, int16, uint16, int, uint, int64, uint64 | Celé čísla s 8, 16, 32 a 64 bitmi | int 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. |
char | Jeden znak, 'A' | V aritmetike vystupuje ako kód znaku. |
string | Text, "abc" | + so stringom na ktorejkoľvek strane spája text. |
Štruktúrované typy
Štruktúrované typy obsahujú viac hodnôt, dostupných ako vlastnosti:
| Typ | Obsahuje | Vlastnosti |
|---|---|---|
datetime | Dátum a čas s druhom (Local, Utc, Unspecified) | Pozrite Dátum a čas |
timespan | Časový interval | Days, Hours, Minutes, Seconds, Milliseconds, TotalDays, TotalHours, TotalMinutes, TotalSeconds, TotalMilliseconds (iba na čítanie) |
httprequest | Pripravená HTTP požiadavka z funkcie HTTPREQUEST | Path, Method, Body, Headers (na čítanie aj zápis) |
httpresponse | Odpoveď funkcie SENDHTTPREQUEST | Content, Headers, IsSuccess, StatusCode, ReasonPhrase (iba na čítanie) |
receivedmessage | Prichádzajúca správa RECEIVEDMSG v listener skripte | Protocol, Payload, Length, Topic, ContentType, PayloadFormat, ClientId, Expiry, Dup (iba na čítanie) |
blob | Surové bajty, napríklad RECEIVEDMSG.PAYLOAD | Length (iba na čítanie) |
rgbcolor, hsvcolor | Farby, pozrite Farby | Red, Green, Blue a Hue, Saturation, Value (na čítanie aj zápis) |
groupvalue | Hodnota skupiny zariadení | Calculated, Values (iba na čítanie) |
currentvalueinfo, historyvalues | Časti premennej typu Info o hodnote | Pozrite Info o hodnote |
Enum typy
Enum typ je pevná množina pomenovaných hodnôt, ktorú niektoré funkcie berú ako parameter:
| Typ | Hodnoty | Používa ho |
|---|---|---|
ModbusRegisterType | C, H, D, A | Funkcie Modbus |
ModbusDataType | Int16, Uint16, Int32, UInt32, Float, Bool, String, Int64, UInt64, Double a ich varianty poradia bajtov, pozrite Dátové typy Modbus | Funkcie Modbus, PACKVALUE, UNPACKVALUE |
LinearType | DEFAULT, BOUNDS, STRICT, INFINITE | LINEAR |
DateTimeKind | Local, Utc, Unspecified | NOW, DATETIME |
DayOfWeek | Monday … Sunday | Vlastnosti typu datetime |
CompareOptions | None, IgnoreCase, IgnoreNonSpace, IgnoreSymbols, IgnoreKanaType, IgnoreWidth, OrdinalIgnoreCase, StringSort, Ordinal | COMPARE |
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čí chybouUnable to determine collection type. - Vnorené kolekcie nie sú podporované:
Collection<Collection<>> is not supported. - Kolekcie sú referenčné hodnoty.
APPEND,INSERT,REMOVEAT,SETATaREPLACEmenia kolekciu na mieste a vracajú tú istú kolekciu. BYTECOLLECTION,UINT16COLLECTIONaBOOLCOLLECTIONvytvoria najviac 2048 prvkov; väčší počet hlási každý tvar vlastnou správou (pozri Chyby pri vykonávaní).LENGTH(c)aleboc.Lengthvrá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í:
- Jeden z operandov je
double(alebo hodnota skupiny):double. - Jeden z operandov je
float:float. - Jeden z operandov je
int64:int64. - Jeden z operandov je
uint64:uint64. - Jeden z operandov je
uint:uint, keď je aj druhý bez znamienka, inakint64. - 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
doublesa najprv prevedie naint64. +so stringom na ktorejkoľvek strane spája text:"T=" + 21.5je"T=21.5".datetime+ číslo pripočíta milisekundy,datetime+timespanpripočíta interval atimespan±timespanfunguje podľa očakávania.- Delenie nulou zastaví skript chybou
Division by zero. Deliteľ ošetrite pomocouIF. - 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žiteISNAN. <,>,<=a>=s operandomNulldávajúFALSE.Null = Null,Null <= NullaNull >= NullsúTRUE,Null = 5jeFALSE.&,|a^s operandomNulldávajúNull;<<a>>dávajúNullpri hodnoteNullvľavo, kýmNullako počet posunu zastaví skript chybouCannot cast DataType.Null to number.- Aritmetika a logika s
Null(Null + 5,!Null) zastaví skript chybouOperator '+' not defined for 'Null' and 'Double'. Hodnotu najprv skontrolujte funkciouISNULL. - Podmienka
IFs hodnotouNullsa počíta akoFALSE. MIN,MAX,AVGaORDERpreskakujúNullaNaN; varianty…STRICTich prenášajú ďalej.EQUALS(NaN, NaN)jeTRUE.
IF(ISNULL(value) OR ISNAN(value), 0, value);
# Result: the value, or 0 when it is missing or unknown