TapHome

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.

TipoValoriNote
boolTRUE, FALSEQualsiasi numero diverso da zero viene convertito in TRUE, lo zero in FALSE.
int8, uint8, int16, uint16, int, uint, int64, uint64Numeri interi a 8, 16, 32 e 64 bitint e uint sono i tipi a 32 bit. uint8 è il byte delle collezioni di byte.
float, doubleNumeri in virgola mobileI letterali numerici e la maggior parte dei calcoli danno un double.
charUn carattere, 'A'Nei calcoli partecipa con il suo codice di carattere.
stringTesto, "abc"+ con una stringa su uno dei due lati unisce il testo.

Int32 x := 4; fallisce con Unknown variable or constant 'Int32'. Nomi come Int32 e UInt32 esistono solo tra i tipi di dati Modbus di MODBUSR e MODBUSW.

Tipi strutturati

I tipi strutturati contengono più valori, disponibili come proprietà:

TipoContieneProprietà
datetimeData e ora con un tipo (Local, Utc, Unspecified)Vedi Data e ora
timespanIntervallo di tempoDays, Hours, Minutes, Seconds, Milliseconds, TotalDays, TotalHours, TotalMinutes, TotalSeconds, TotalMilliseconds (sola lettura)
httprequestRichiesta HTTP preparata da HTTPREQUESTPath, Method, Body, Headers (lettura e scrittura)
httpresponseRisposta di SENDHTTPREQUESTContent, Headers, IsSuccess, StatusCode, ReasonPhrase (sola lettura)
receivedmessageMessaggio in arrivo RECEIVEDMSG di uno script listenerProtocol, Payload, Length, Topic, ContentType, PayloadFormat, ClientId, Expiry, Dup (sola lettura)
blobByte grezzi, per esempio RECEIVEDMSG.PAYLOADLength (sola lettura)
rgbcolor, hsvcolorColori, vedi ColoriRed, Green, Blue e Hue, Saturation, Value (lettura e scrittura)
groupvalueValore di un gruppo di dispositiviCalculated, Values (sola lettura)
currentvalueinfo, historyvaluesParti di una variabile Info valoreVedi Info valore

Tipi enum

Un tipo enum è un insieme fisso di valori con nome che alcune funzioni accettano come parametro:

TipoValoriUsato da
ModbusRegisterTypeC, H, D, AFunzioni Modbus
ModbusDataTypeInt16, Uint16, Int32, UInt32, Float, Bool, String, Int64, UInt64, Double e le loro varianti di ordine dei byte, vedi Tipi di dati ModbusFunzioni Modbus, PACKVALUE, UNPACKVALUE
LinearTypeDEFAULT, BOUNDS, STRICT, INFINITELINEAR
DateTimeKindLocal, Utc, UnspecifiedNOW, DATETIME
DayOfWeekMonday … SundayProprietà di datetime
CompareOptionsNone, IgnoreCase, IgnoreNonSpace, IgnoreSymbols, IgnoreKanaType, IgnoreWidth, OrdinalIgnoreCase, StringSort, OrdinalCOMPARE

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 con Unable to determine collection type.
  • Le collezioni annidate non sono supportate: Collection<Collection<>> is not supported.
  • Le collezioni sono valori per riferimento. APPEND, INSERT, REMOVEAT, SETAT e REPLACE modificano la collezione sul posto e restituiscono la stessa collezione.
  • BYTECOLLECTION, UINT16COLLECTION e BOOLCOLLECTION creano al massimo 2048 elementi; ogni forma segnala un numero maggiore con un proprio messaggio (vedi Errori di esecuzione).
  • LENGTH(c) o c.Length restituisce 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:

  1. Uno degli operandi è double (o un valore di gruppo): double.
  2. Uno degli operandi è float: float.
  3. Uno degli operandi è int64: int64.
  4. Uno degli operandi è uint64: uint64.
  5. Uno degli operandi è uint: uint se anche l’altro è senza segno, altrimenti int64.
  6. 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 double viene prima convertito in int64.
  • + con una stringa su uno dei due lati unisce il testo: "T=" + 21.5 è "T=21.5".
  • datetime + numero aggiunge millisecondi, datetime + timespan aggiunge l’intervallo e timespan ± timespan funziona come previsto.
  • La divisione per zero interrompe lo script con Division by zero. Proteggi il divisore con IF.
  • 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. Usa ISNAN.
  • <, >, <= e >= con un operando Null danno FALSE. Null = Null, Null <= Null e Null >= Null sono TRUE, Null = 5 è FALSE.
  • &, | e ^ con un operando Null danno Null; << e >> danno Null per un valore Null a sinistra, mentre un numero di posizioni di scorrimento Null interrompe lo script con Cannot cast DataType.Null to number.
  • I calcoli e la logica con Null (Null + 5, !Null) interrompono lo script con Operator '+' not defined for 'Null' and 'Double'. Controlla prima il valore con ISNULL.
  • Una condizione Null di IF vale come FALSE.
  • MIN, MAX, AVG e ORDER saltano Null e NaN; le varianti …STRICT li 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