Tipi di dati
Tipi di dati del linguaggio di script TapHome: numeri, testo, tipi strutturati ed enum, collezioni, la proprietà .Type, la promozione dei tipi nei calcoli e il comportamento di Null e NaN.
Tipi scalari
Ogni valore in uno script ha un tipo concreto. I nomi dei tipi qui sotto si usano nelle dichiarazioni tipizzate (vedi Variabili locali) e la proprietà .Type li restituisce.
| Tipo | Valori | Note |
|---|---|---|
bool | TRUE, FALSE | Qualsiasi numero diverso da zero viene convertito in TRUE, lo zero in FALSE. |
int8, uint8, int16, uint16, int, uint, int64, uint64 | Numeri interi a 8, 16, 32 e 64 bit | int e uint sono i tipi a 32 bit. uint8 è il byte delle collezioni di byte. |
float, double | Numeri in virgola mobile | I letterali numerici e la maggior parte dei calcoli danno un double. |
char | Un carattere, 'A' | Nei calcoli partecipa con il suo codice di carattere. |
string | Testo, "abc" | + con una stringa su uno dei due lati unisce il testo. |
Tipi strutturati
I tipi strutturati contengono più valori, disponibili come proprietà:
| Tipo | Contiene | Proprietà |
|---|---|---|
datetime | Data e ora con un tipo (Local, Utc, Unspecified) | Vedi Data e ora |
timespan | Intervallo di tempo | Days, Hours, Minutes, Seconds, Milliseconds, TotalDays, TotalHours, TotalMinutes, TotalSeconds, TotalMilliseconds (sola lettura) |
httprequest | Richiesta HTTP preparata da HTTPREQUEST | Path, Method, Body, Headers (lettura e scrittura) |
httpresponse | Risposta di SENDHTTPREQUEST | Content, Headers, IsSuccess, StatusCode, ReasonPhrase (sola lettura) |
receivedmessage | Messaggio in arrivo RECEIVEDMSG di uno script listener | Protocol, Payload, Length, Topic, ContentType, PayloadFormat, ClientId, Expiry, Dup (sola lettura) |
blob | Byte grezzi, per esempio RECEIVEDMSG.PAYLOAD | Length (sola lettura) |
rgbcolor, hsvcolor | Colori, vedi Colori | Red, Green, Blue e Hue, Saturation, Value (lettura e scrittura) |
groupvalue | Valore di un gruppo di dispositivi | Calculated, Values (sola lettura) |
currentvalueinfo, historyvalues | Parti di una variabile Info valore | Vedi Info valore |
Tipi enum
Un tipo enum è un insieme fisso di valori con nome che alcune funzioni accettano come parametro:
| Tipo | Valori | Usato da |
|---|---|---|
ModbusRegisterType | C, H, D, A | Funzioni Modbus |
ModbusDataType | Int16, Uint16, Int32, UInt32, Float, Bool, String, Int64, UInt64, Double e le loro varianti di ordine dei byte, vedi Tipi di dati Modbus | Funzioni Modbus, PACKVALUE, UNPACKVALUE |
LinearType | DEFAULT, BOUNDS, STRICT, INFINITE | LINEAR |
DateTimeKind | Local, Utc, Unspecified | NOW, DATETIME |
DayOfWeek | Monday … Sunday | Proprietà di datetime |
CompareOptions | None, IgnoreCase, IgnoreNonSpace, IgnoreSymbols, IgnoreKanaType, IgnoreWidth, OrdinalIgnoreCase, StringSort, Ordinal | COMPARE |
Un valore enum si scrive da solo (Utc) o con il suo tipo (DateTimeKind.Utc). I tipi enum funzionano anche come parole chiave di dichiarazione:
DateTimeKind kind := Utc;
VAR t := NOW(kind);Collezioni
collection<T> è un elenco di valori di un unico tipo di elemento T.
collection<uint16> registers := UINT16COLLECTION(4);
collection<string> names := {"a", "b", "c"};
collection<uint8> data := BYTECOLLECTION("0A0B0C");
LENGTH(names);
# Result: 3- Il tipo di elemento deriva dalla dichiarazione, altrimenti dal primo elemento che non è
Null.{Null}da solo fallisce conUnable to determine collection type. - Le collezioni annidate non sono supportate:
Collection<Collection<>> is not supported. - Le collezioni sono valori per riferimento.
APPEND,INSERT,REMOVEAT,SETATeREPLACEmodificano la collezione sul posto e restituiscono la stessa collezione. BYTECOLLECTION,UINT16COLLECTIONeBOOLCOLLECTIONcreano al massimo 2048 elementi; ogni forma segnala un numero maggiore con un proprio messaggio (vedi Errori di esecuzione).LENGTH(c)oc.Lengthrestituisce il numero di elementi.
Disponibile — collezioni tipizzate: Core 2022.2 o più recente; UINT16COLLECTION e BOOLCOLLECTION: TapHome Next 2026.1.39016+.
La proprietà .Type
Ogni valore ha la proprietà di sola lettura .Type, che restituisce come testo il nome del suo tipo. Per un valore enum è il tipo enum, per esempio "DateTimeKind".
VAR x := 5.5;
x.Type;
# Result: "Double"
VAR c := BYTECOLLECTION("0A0B");
c.Type;
# Result: "Collection<UInt8>"Le proprietà si possono leggere solo da una variabile con nome. AVG('a', 'c').Type fallisce con Unexpected character '.'; salva prima il valore in una variabile.
Regole di conversione dei tipi
Nei calcoli il tipo del risultato è deciso dalla prima regola che corrisponde ai due operandi:
- Uno degli operandi è
double(o un valore di gruppo):double. - Uno degli operandi è
float:float. - Uno degli operandi è
int64:int64. - Uno degli operandi è
uint64:uint64. - Uno degli operandi è
uint:uintse anche l’altro è senza segno, altrimentiint64. - Altrimenti (interi più piccoli,
bool,char):int.
La divisione di due interi tronca il risultato. Un letterale numerico è un double, quindi la divisione per esso non tronca:
int a := 5;
int b := 2;
a / b;
# Result: 2
a / 2;
# Result: 2.5- Gli operatori bit a bit lavorano sugli interi; un operando
doubleviene prima convertito inint64. +con una stringa su uno dei due lati unisce il testo:"T=" + 21.5è"T=21.5".datetime+ numero aggiunge millisecondi,datetime+timespanaggiunge l’intervallo etimespan±timespanfunziona come previsto.- La divisione per zero interrompe lo script con
Division by zero. Proteggi il divisore conIF. - L’assegnazione a una variabile tipizzata converte il valore nel suo tipo, vedi Variabili locali.
Null e NaN
NaN è un numero il cui valore è sconosciuto, per esempio un sensore non ancora letto o un dispositivo in errore. Null significa che non c’è alcun valore: un dispositivo eliminato o una funzione che non ha trovato nulla.
- Il confronto con il letterale
NaN(x = NaN,x < NaN) viene rifiutato durante l’analisi dello script:Comparison with NaN is always false. Use the IsNaN method to check for NaN value.UsaISNAN. <,>,<=e>=con un operandoNulldannoFALSE.Null = Null,Null <= NulleNull >= NullsonoTRUE,Null = 5èFALSE.&,|e^con un operandoNulldannoNull;<<e>>dannoNullper un valoreNulla sinistra, mentre un numero di posizioni di scorrimentoNullinterrompe lo script conCannot cast DataType.Null to number.- I calcoli e la logica con
Null(Null + 5,!Null) interrompono lo script conOperator '+' not defined for 'Null' and 'Double'. Controlla prima il valore conISNULL. - Una condizione
NulldiIFvale comeFALSE. MIN,MAX,AVGeORDERsaltanoNulleNaN; le varianti…STRICTli lasciano passare.EQUALS(NaN, NaN)èTRUE.
IF(ISNULL(value) OR ISNAN(value), 0, value);
# Result: the value, or 0 when it is missing or unknown