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 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í:
- 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