Datové typy
Datové typy skriptovacího jazyka TapHome: čísla, text, strukturované a výčtové typy, kolekce, vlastnost .Type, povýšení typu v aritmetice a chování Null a NaN.
Skalární typy
Každá hodnota ve skriptu má konkrétní typ. Níže uvedené názvy typů se používají v typovaných deklaracích (viz Lokální proměnné) a vrací je vlastnost .Type.
| Typ | Hodnoty | Poznámky |
|---|---|---|
bool | TRUE, FALSE | Každé nenulové číslo se převede na TRUE, nula na FALSE. |
int8, uint8, int16, uint16, int, uint, int64, uint64 | Celá čísla o 8, 16, 32 a 64 bitech | int a uint jsou 32bitové typy. uint8 je bajt kolekcí bajtů. |
float, double | Čísla s plovoucí desetinnou čárkou | Číselné literály a většina aritmetiky dávají double. |
char | Jeden znak, 'A' | V aritmetice vystupuje jako kód znaku. |
string | Text, "abc" | + s řetězcem na kterékoli straně spojuje text. |
Strukturované typy
Strukturované typy obsahují několik hodnot, dostupných jako vlastnosti:
| Typ | Obsahuje | Vlastnosti |
|---|---|---|
datetime | Datum a čas s druhem (Local, Utc, Unspecified) | Viz Datum a čas |
timespan | Časový interval | Days, Hours, Minutes, Seconds, Milliseconds, TotalDays, TotalHours, TotalMinutes, TotalSeconds, TotalMilliseconds (jen pro čtení) |
httprequest | Připravený požadavek HTTP z HTTPREQUEST | Path, Method, Body, Headers (čtení i zápis) |
httpresponse | Odpověď z SENDHTTPREQUEST | Content, Headers, IsSuccess, StatusCode, ReasonPhrase (jen pro čtení) |
receivedmessage | Příchozí zpráva RECEIVEDMSG listener skriptu | Protocol, Payload, Length, Topic, ContentType, PayloadFormat, ClientId, Expiry, Dup (jen pro čtení) |
blob | Surové bajty, například RECEIVEDMSG.PAYLOAD | Length (jen pro čtení) |
rgbcolor, hsvcolor | Barvy, viz Barvy | Red, Green, Blue a Hue, Saturation, Value (čtení i zápis) |
groupvalue | Hodnota skupiny zařízení | Calculated, Values (jen pro čtení) |
currentvalueinfo, historyvalues | Části proměnné Info o hodnotě | Viz Info o hodnotě |
Výčtové typy
Výčtový typ je pevná množina pojmenovaných hodnot, kterou některé funkce přijímají jako parametr:
| Typ | Hodnoty | Používá |
|---|---|---|
ModbusRegisterType | C, H, D, A | Funkce Modbus |
ModbusDataType | Int16, Uint16, Int32, UInt32, Float, Bool, String, Int64, UInt64, Double a jejich varianty pořadí bajtů, viz Datové typy Modbus | Funkce Modbus, PACKVALUE, UNPACKVALUE |
LinearType | DEFAULT, BOUNDS, STRICT, INFINITE | LINEAR |
DateTimeKind | Local, Utc, Unspecified | NOW, DATETIME |
DayOfWeek | Monday … Sunday | Vlastnosti datetime |
CompareOptions | None, IgnoreCase, IgnoreNonSpace, IgnoreSymbols, IgnoreKanaType, IgnoreWidth, OrdinalIgnoreCase, StringSort, Ordinal | COMPARE |
Hodnota výčtu se píše samotná (Utc) nebo s typem (DateTimeKind.Utc). Výčtové typy fungují i jako klíčová slova deklarace:
DateTimeKind kind := Utc;
VAR t := NOW(kind);Kolekce
collection<T> je seznam hodnot jednoho 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 určuje deklarace, jinak první prvek, který není
Null. Samotné{Null}skončí chybouUnable to determine collection type. - Vnořené kolekce nejsou podporovány:
Collection<Collection<>> is not supported. - Kolekce jsou referenční hodnoty.
APPEND,INSERT,REMOVEAT,SETATaREPLACEmění kolekci na místě a vracejí tutéž kolekci. BYTECOLLECTION,UINT16COLLECTIONaBOOLCOLLECTIONvytvoří nejvýše 2048 prvků; větší počet ohlásí každá forma vlastním hlášením (viz Chyby za běhu).LENGTH(c)neboc.Lengthvrátí počet prvků.
Dostupnost — typované kolekce od Core 2022.2; UINT16COLLECTION a BOOLCOLLECTION od Core 2026.1, sestavení 39001.
Vlastnost .Type
Každá hodnota má vlastnost .Type jen pro čtení, která vrátí název jejího typu jako text. U hodnoty výčtu je to výčtový typ, například "DateTimeKind".
VAR x := 5.5;
x.Type;
# Result: "Double"
VAR c := BYTECOLLECTION("0A0B");
c.Type;
# Result: "Collection<UInt8>"Vlastnosti lze číst jen z pojmenované proměnné. AVG('a', 'c').Type skončí chybou Unexpected character '.'; hodnotu nejdříve uložte do proměnné.
Pravidla převodu typů
V aritmetice rozhoduje o typu výsledku první pravidlo, které odpovídá oběma operandům:
- Některý operand je
double(nebo hodnota skupiny):double. - Některý operand je
float:float. - Některý operand je
int64:int64. - Některý operand je
uint64:uint64. - Některý operand je
uint:uint, když je i druhý bez znaménka, jinakint64. - Jinak (menší celá čísla,
bool,char):int.
Dělení dvou celých čísel desetinnou část usekne. Číselný literál je double, takže dělení jím ji neusekne:
int a := 5;
int b := 2;
a / b;
# Result: 2
a / 2;
# Result: 2.5- Bitové operátory pracují s celými čísly; operand
doublese nejprve převede naint64. +s řetězcem na kterékoli straně spojuje text:"T=" + 21.5je"T=21.5".datetime+ číslo přičte milisekundy,datetime+timespanpřičte interval atimespan±timespanfunguje podle očekávání.- Dělení nulou zastaví skript s hlášením
Division by zero. Dělitel ošetřete pomocíIF. - Přiřazení do typované proměnné převede hodnotu na její typ, viz Lokální proměnné.
Null a NaN
NaN je číslo, jehož hodnota je neznámá, například senzor, který ještě nebyl přečten, nebo zařízení v chybě. Null znamená, že hodnota vůbec neexistuje: smazané zařízení nebo funkce, která nic nenašla.
- Porovnání s literálem
NaN(x = NaN,x < NaN) je odmítnuto už při parsování skriptu:Comparison with NaN is always false. Use the IsNaN method to check for NaN value.PoužijteISNAN. <,>,<=a>=s operandemNulldávajíFALSE.Null = Null,Null <= NullaNull >= NulljsouTRUE,Null = 5jeFALSE.&,|a^s operandemNulldávajíNull;<<a>>dávajíNullpro hodnotuNullvlevo, kdežto počet posunůNullzastaví skript s hlášenímCannot cast DataType.Null to number.- Aritmetika a logika s
Null(Null + 5,!Null) zastaví skript s hlášenímOperator '+' not defined for 'Null' and 'Double'. Hodnotu nejprve ověřte funkcíISNULL. - Podmínka
IFs hodnotouNullse počítá jakoFALSE. MIN,MAX,AVGaORDERpřeskakujíNullaNaN; varianty…STRICTje předávají dál.EQUALS(NaN, NaN)jeTRUE.
IF(ISNULL(value) OR ISNAN(value), 0, value);
# Result: the value, or 0 when it is missing or unknown