TapHome

Tipuri de date

Tipurile de date ale limbajului de scripting TapHome: numere, text, tipuri structurate și enumerări, colecții, proprietatea .Type, promovarea tipurilor în aritmetică și comportamentul lui Null și NaN.

Tipuri scalare

Fiecare valoare dintr-un script are un tip concret. Numele de tipuri de mai jos se folosesc în declarațiile cu tip (consultați Variabile locale), iar proprietatea .Type le returnează.

TipValoriObservații
boolTRUE, FALSEOrice număr diferit de zero se convertește în TRUE, zero în FALSE.
int8, uint8, int16, uint16, int, uint, int64, uint64Numere întregi pe 8, 16, 32 și 64 de bițiint și uint sunt tipurile pe 32 de biți. uint8 este octetul colecțiilor de octeți.
float, doubleNumere în virgulă mobilăLiteralii numerici și majoritatea operațiilor aritmetice dau un double.
charUn caracter, 'A'În aritmetică participă prin codul caracterului.
stringText, "abc"+ cu un șir de caractere pe oricare parte concatenează textul.

Int32 x := 4; eșuează cu Unknown variable or constant 'Int32'. Nume precum Int32 și UInt32 există doar printre tipurile de date Modbus ale funcțiilor MODBUSR și MODBUSW.

Tipuri structurate

Tipurile structurate conțin mai multe valori, disponibile ca proprietăți:

TipConțineProprietăți
datetimeData și ora, cu un tip (Local, Utc, Unspecified)Consultați Data și ora
timespanInterval de timpDays, Hours, Minutes, Seconds, Milliseconds, TotalDays, TotalHours, TotalMinutes, TotalSeconds, TotalMilliseconds (numai citire)
httprequestCerere HTTP pregătită cu HTTPREQUESTPath, Method, Body, Headers (citire și scriere)
httpresponseRăspunsul lui SENDHTTPREQUESTContent, Headers, IsSuccess, StatusCode, ReasonPhrase (numai citire)
receivedmessageMesajul primit RECEIVEDMSG al unui script listenerProtocol, Payload, Length, Topic, ContentType, PayloadFormat, ClientId, Expiry, Dup (numai citire)
blobOcteți bruți, de exemplu RECEIVEDMSG.PAYLOADLength (numai citire)
rgbcolor, hsvcolorCulori, consultați CuloriRed, Green, Blue și Hue, Saturation, Value (citire și scriere)
groupvalueValoarea unui grup de dispozitiveCalculated, Values (numai citire)
currentvalueinfo, historyvaluesPărți ale unei variabile Value infoConsultați Value info

Tipuri de enumerare

Un tip de enumerare este un set fix de valori cu nume, pe care unele funcții le primesc ca parametru:

TipValoriFolosit de
ModbusRegisterTypeC, H, D, AFuncții Modbus
ModbusDataTypeInt16, Uint16, Int32, UInt32, Float, Bool, String, Int64, UInt64, Double și variantele lor de ordine a octeților, consultați Tipuri de date ModbusFuncțiile Modbus, PACKVALUE, UNPACKVALUE
LinearTypeDEFAULT, BOUNDS, STRICT, INFINITELINEAR
DateTimeKindLocal, Utc, UnspecifiedNOW, DATETIME
DayOfWeekMonday … SundayProprietățile lui datetime
CompareOptionsNone, IgnoreCase, IgnoreNonSpace, IgnoreSymbols, IgnoreKanaType, IgnoreWidth, OrdinalIgnoreCase, StringSort, OrdinalCOMPARE

O valoare de enumerare se scrie simplu (Utc) sau cu tipul ei (DateTimeKind.Utc). Tipurile de enumerare funcționează și drept cuvinte cheie de declarare:

DateTimeKind kind := Utc;
VAR t := NOW(kind);

Colecții

collection<T> este o listă de valori cu un singur tip de element T.

collection<uint16> registers := UINT16COLLECTION(4);
collection<string> names := {"a", "b", "c"};
collection<uint8> data := BYTECOLLECTION("0A0B0C");
LENGTH(names);
# Result: 3
  • Tipul elementului provine din declarație, altfel din primul element care nu este Null. {Null} singur eșuează cu Unable to determine collection type.
  • Colecțiile imbricate nu sunt acceptate: Collection<Collection<>> is not supported.
  • Colecțiile sunt valori de tip referință. APPEND, INSERT, REMOVEAT, SETAT și REPLACE modifică colecția pe loc și returnează aceeași colecție.
  • BYTECOLLECTION, UINT16COLLECTION și BOOLCOLLECTION creează cel mult 2048 de elemente; fiecare formă semnalează un număr mai mare cu propriul mesaj (consultați Erori la rulare).
  • LENGTH(c) sau c.Length returnează numărul de elemente.

Disponibilitate — colecțiile cu tip din Core 2022.2; UINT16COLLECTION și BOOLCOLLECTION din Core 2026.1, build 39001.

Proprietatea .Type

Fiecare valoare are proprietatea numai în citire .Type, care returnează numele tipului ei ca text. Pentru o valoare de enumerare este tipul de enumerare, de exemplu "DateTimeKind".

VAR x := 5.5;
x.Type;
# Result: "Double"
VAR c := BYTECOLLECTION("0A0B");
c.Type;
# Result: "Collection<UInt8>"

Proprietățile se pot citi doar dintr-o variabilă cu nume. AVG('a', 'c').Type eșuează cu Unexpected character '.'; valoarea se stochează mai întâi într-o variabilă.

Reguli de conversie a tipurilor

În aritmetică, prima regulă care se potrivește celor doi operanzi decide tipul rezultatului:

  1. Oricare operand este double (sau o valoare de grup): double.
  2. Oricare operand este float: float.
  3. Oricare operand este int64: int64.
  4. Oricare operand este uint64: uint64.
  5. Oricare operand este uint: uint când și celălalt este fără semn, altfel int64.
  6. În rest (întregi mai mici, bool, char): int.

Împărțirea a doi întregi trunchiază rezultatul. Un literal numeric este de tip double, deci împărțirea la el nu trunchiază:

int a := 5;
int b := 2;
a / b;
# Result: 2
a / 2;
# Result: 2.5
  • Operatorii pe biți lucrează cu întregi; un operand double se convertește mai întâi în int64.
  • + cu un șir de caractere pe oricare parte concatenează textul: "T=" + 21.5 este "T=21.5".
  • datetime + număr adaugă milisecunde, datetime + timespan adaugă intervalul, iar timespan ± timespan funcționează conform așteptărilor.
  • Împărțirea la zero oprește scriptul cu Division by zero. Împărțitorul se protejează cu IF.
  • Atribuirea către o variabilă cu tip convertește valoarea în tipul ei, consultați Variabile locale.

Null și NaN

NaN este un număr a cărui valoare este necunoscută, de exemplu un senzor care încă nu a fost citit sau un dispozitiv în eroare. Null înseamnă că nu există deloc o valoare: un dispozitiv șters sau o funcție care nu a găsit nimic.

  • Compararea cu literalul NaN (x = NaN, x < NaN) este respinsă la parsarea scriptului: Comparison with NaN is always false. Use the IsNaN method to check for NaN value. Se folosește ISNAN.
  • <, >, <= și >= cu un operand Null dau FALSE. Null = Null, Null <= Null și Null >= Null sunt TRUE, Null = 5 este FALSE.
  • &, | și ^ cu un operand Null dau Null; << și >> dau Null pentru o valoare Null în stânga, în timp ce un număr de deplasări Null oprește scriptul cu Cannot cast DataType.Null to number.
  • Aritmetica și logica cu Null (Null + 5, !Null) opresc scriptul cu Operator '+' not defined for 'Null' and 'Double'. Valoarea se verifică mai întâi cu ISNULL.
  • O condiție Null a lui IF contează ca FALSE.
  • MIN, MAX, AVG și ORDER omit Null și NaN; variantele …STRICT le transmit mai departe. EQUALS(NaN, NaN) este TRUE.
IF(ISNULL(value) OR ISNAN(value), 0, value);
# Result: the value, or 0 when it is missing or unknown