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ă.
| Tip | Valori | Observații |
|---|---|---|
bool | TRUE, FALSE | Orice număr diferit de zero se convertește în TRUE, zero în FALSE. |
int8, uint8, int16, uint16, int, uint, int64, uint64 | Numere întregi pe 8, 16, 32 și 64 de biți | int și uint sunt tipurile pe 32 de biți. uint8 este octetul colecțiilor de octeți. |
float, double | Numere în virgulă mobilă | Literalii numerici și majoritatea operațiilor aritmetice dau un double. |
char | Un caracter, 'A' | În aritmetică participă prin codul caracterului. |
string | Text, "abc" | + cu un șir de caractere pe oricare parte concatenează textul. |
Tipuri structurate
Tipurile structurate conțin mai multe valori, disponibile ca proprietăți:
| Tip | Conține | Proprietăți |
|---|---|---|
datetime | Data și ora, cu un tip (Local, Utc, Unspecified) | Consultați Data și ora |
timespan | Interval de timp | Days, Hours, Minutes, Seconds, Milliseconds, TotalDays, TotalHours, TotalMinutes, TotalSeconds, TotalMilliseconds (numai citire) |
httprequest | Cerere HTTP pregătită cu HTTPREQUEST | Path, Method, Body, Headers (citire și scriere) |
httpresponse | Răspunsul lui SENDHTTPREQUEST | Content, Headers, IsSuccess, StatusCode, ReasonPhrase (numai citire) |
receivedmessage | Mesajul primit RECEIVEDMSG al unui script listener | Protocol, Payload, Length, Topic, ContentType, PayloadFormat, ClientId, Expiry, Dup (numai citire) |
blob | Octeți bruți, de exemplu RECEIVEDMSG.PAYLOAD | Length (numai citire) |
rgbcolor, hsvcolor | Culori, consultați Culori | Red, Green, Blue și Hue, Saturation, Value (citire și scriere) |
groupvalue | Valoarea unui grup de dispozitive | Calculated, Values (numai citire) |
currentvalueinfo, historyvalues | Părți ale unei variabile Value info | Consultaț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:
| Tip | Valori | Folosit de |
|---|---|---|
ModbusRegisterType | C, H, D, A | Funcții Modbus |
ModbusDataType | Int16, Uint16, Int32, UInt32, Float, Bool, String, Int64, UInt64, Double și variantele lor de ordine a octeților, consultați Tipuri de date Modbus | Funcțiile Modbus, PACKVALUE, UNPACKVALUE |
LinearType | DEFAULT, BOUNDS, STRICT, INFINITE | LINEAR |
DateTimeKind | Local, Utc, Unspecified | NOW, DATETIME |
DayOfWeek | Monday … Sunday | Proprietățile lui datetime |
CompareOptions | None, IgnoreCase, IgnoreNonSpace, IgnoreSymbols, IgnoreKanaType, IgnoreWidth, OrdinalIgnoreCase, StringSort, Ordinal | COMPARE |
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ă cuUnable 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șiREPLACEmodifică colecția pe loc și returnează aceeași colecție. BYTECOLLECTION,UINT16COLLECTIONșiBOOLCOLLECTIONcreează cel mult 2048 de elemente; fiecare formă semnalează un număr mai mare cu propriul mesaj (consultați Erori la rulare).LENGTH(c)sauc.Lengthreturnează 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:
- Oricare operand este
double(sau o valoare de grup):double. - Oricare operand este
float:float. - Oricare operand este
int64:int64. - Oricare operand este
uint64:uint64. - Oricare operand este
uint:uintcând și celălalt este fără semn, altfelint64. - Î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
doublese convertește mai întâi înint64. +cu un șir de caractere pe oricare parte concatenează textul:"T=" + 21.5este"T=21.5".datetime+ număr adaugă milisecunde,datetime+timespanadaugă intervalul, iartimespan±timespanfuncționează conform așteptărilor.- Împărțirea la zero oprește scriptul cu
Division by zero. Împărțitorul se protejează cuIF. - 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șteISNAN. <,>,<=și>=cu un operandNulldauFALSE.Null = Null,Null <= NullșiNull >= NullsuntTRUE,Null = 5esteFALSE.&,|și^cu un operandNulldauNull;<<și>>dauNullpentru o valoareNullîn stânga, în timp ce un număr de deplasăriNulloprește scriptul cuCannot cast DataType.Null to number.- Aritmetica și logica cu
Null(Null + 5,!Null) opresc scriptul cuOperator '+' not defined for 'Null' and 'Double'. Valoarea se verifică mai întâi cuISNULL. - O condiție
Nulla luiIFcontează caFALSE. MIN,MAX,AVGșiORDERomitNullșiNaN; variantele…STRICTle transmit mai departe.EQUALS(NaN, NaN)esteTRUE.
IF(ISNULL(value) OR ISNAN(value), 0, value);
# Result: the value, or 0 when it is missing or unknown