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 dal Core 2022.2; UINT16COLLECTION e BOOLCOLLECTION dal Core 2026.1, build 39001.
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