TapHome

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.

TypHodnotyPoznámky
boolTRUE, FALSEKaždé nenulové číslo se převede na TRUE, nula na FALSE.
int8, uint8, int16, uint16, int, uint, int64, uint64Celá čísla o 8, 16, 32 a 64 bitechint 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.
charJeden znak, 'A'V aritmetice vystupuje jako kód znaku.
stringText, "abc"+ s řetězcem na kterékoli straně spojuje text.

Int32 x := 4; skončí chybou Unknown variable or constant 'Int32'. Názvy jako Int32 a UInt32 existují jen mezi datovými typy Modbus funkcí MODBUSR a MODBUSW.

Strukturované typy

Strukturované typy obsahují několik hodnot, dostupných jako vlastnosti:

TypObsahujeVlastnosti
datetimeDatum a čas s druhem (Local, Utc, Unspecified)Viz Datum a čas
timespanČasový intervalDays, Hours, Minutes, Seconds, Milliseconds, TotalDays, TotalHours, TotalMinutes, TotalSeconds, TotalMilliseconds (jen pro čtení)
httprequestPřipravený požadavek HTTP z HTTPREQUESTPath, Method, Body, Headers (čtení i zápis)
httpresponseOdpověď z SENDHTTPREQUESTContent, Headers, IsSuccess, StatusCode, ReasonPhrase (jen pro čtení)
receivedmessagePříchozí zpráva RECEIVEDMSG listener skriptuProtocol, Payload, Length, Topic, ContentType, PayloadFormat, ClientId, Expiry, Dup (jen pro čtení)
blobSurové bajty, například RECEIVEDMSG.PAYLOADLength (jen pro čtení)
rgbcolor, hsvcolorBarvy, viz BarvyRed, Green, Blue a Hue, Saturation, Value (čtení i zápis)
groupvalueHodnota 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:

TypHodnotyPoužívá
ModbusRegisterTypeC, H, D, AFunkce Modbus
ModbusDataTypeInt16, Uint16, Int32, UInt32, Float, Bool, String, Int64, UInt64, Double a jejich varianty pořadí bajtů, viz Datové typy ModbusFunkce Modbus, PACKVALUE, UNPACKVALUE
LinearTypeDEFAULT, BOUNDS, STRICT, INFINITELINEAR
DateTimeKindLocal, Utc, UnspecifiedNOW, DATETIME
DayOfWeekMonday … SundayVlastnosti datetime
CompareOptionsNone, IgnoreCase, IgnoreNonSpace, IgnoreSymbols, IgnoreKanaType, IgnoreWidth, OrdinalIgnoreCase, StringSort, OrdinalCOMPARE

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čí chybou Unable to determine collection type.
  • Vnořené kolekce nejsou podporovány: Collection<Collection<>> is not supported.
  • Kolekce jsou referenční hodnoty. APPEND, INSERT, REMOVEAT, SETAT a REPLACE mění kolekci na místě a vracejí tutéž kolekci.
  • BYTECOLLECTION, UINT16COLLECTION a BOOLCOLLECTION vytvoří 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) nebo c.Length vrá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:

  1. Některý operand je double (nebo hodnota skupiny): double.
  2. Některý operand je float: float.
  3. Některý operand je int64: int64.
  4. Některý operand je uint64: uint64.
  5. Některý operand je uint: uint, když je i druhý bez znaménka, jinak int64.
  6. 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 double se nejprve převede na int64.
  • + s řetězcem na kterékoli straně spojuje text: "T=" + 21.5 je "T=21.5".
  • datetime + číslo přičte milisekundy, datetime + timespan přičte interval a timespan ± timespan funguje 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žijte ISNAN.
  • <, >, <= a >= s operandem Null dávají FALSE. Null = Null, Null <= Null a Null >= Null jsou TRUE, Null = 5 je FALSE.
  • &, | a ^ s operandem Null dávají Null; << a >> dávají Null pro hodnotu Null vlevo, kdežto počet posunů Null zastaví skript s hlášením Cannot cast DataType.Null to number.
  • Aritmetika a logika s Null (Null + 5, !Null) zastaví skript s hlášením Operator '+' not defined for 'Null' and 'Double'. Hodnotu nejprve ověřte funkcí ISNULL.
  • Podmínka IF s hodnotou Null se počítá jako FALSE.
  • MIN, MAX, AVG a ORDER přeskakují Null a NaN; varianty …STRICT je předávají dál. EQUALS(NaN, NaN) je TRUE.
IF(ISNULL(value) OR ISNAN(value), 0, value);
# Result: the value, or 0 when it is missing or unknown