Testo e collezioni
Funzioni degli script TapHome per stringhe, collezioni e array di byte — LENGTH, GETAT, SETAT, APPEND, INSERT, REMOVEAT, COPY, INDEXOF, REPLACE, SPLIT, COMPARE, BYTECOLLECTION, UINT16COLLECTION, BOOLCOLLECTION.
Ultimo aggiornamento:
Queste funzioni accettano come primo argomento una stringa o una collezione e lavorano con i caratteri o gli elementi tramite un indice che parte da zero.
- Una collezione viene modificata sul posto da
APPEND,INSERT,REMOVEAT,SETATeREPLACE, che restituiscono la stessa collezione. Per una stringa restituiscono una nuova stringa. - Un blob, come
RECEIVEDMSG.PAYLOAD, è accettato solo daLENGTH,GETAT,COPYeINDEXOF. - Un primo argomento
Nullinterrompe lo script con Parameter 1 is null, tranne inLENGTH(0),INDEXOF(-1) eSPLIT(una collezione vuota);COMPAREsegnala COMPARE arguments 1 and 2 must be strings.
ENCODE e DECODE (XML, Base64) sono nella pagina Conversioni tra tipi di dati, EQUALS nella pagina Logica e diagnostica. I tipi di collezione sono descritti in Tipi di dati.
LENGTH
LENGTH restituisce il numero di caratteri di una stringa, di elementi di una collezione o di byte di un blob; per un numero restituisce la dimensione del suo tipo in byte e per Null 0.
# caratteri in una stringa
LENGTH("Hello World");
# Result: 11
# lunghezza di un numero
LENGTH(40);
# Result: 8 (a decimal literal is a double)
# byte in una collezione di byte
LENGTH(BYTECOLLECTION("010203"));
# Result: 3GETAT
GETAT restituisce l’elemento in una posizione: un char di una stringa, un elemento di una collezione o un byte di un blob.
| |
Valore restituito — per una stringa un char, non una stringa di una lettera; confrontalo con un letterale di carattere come 'l'.
GETAT("Hello", 2);
# Result: 'l' (Char)
GETAT({1, 2, 4}, 2);
# Result: 4SETAT
SETAT sostituisce l’elemento in una posizione; una collezione viene modificata sul posto, per una stringa il carattere nella posizione viene sostituito dal testo di newValue.
| |
# sostituisce un carattere
SETAT("Hello", 1, "a");
# Result: "Hallo"
# sostituisce un carattere con un testo più lungo
SETAT("Hello", 4, "o World");
# Result: "Hello World"
# una collezione da modificare
VAR c := {1, 2, 4};
# sostituisce un elemento sul posto
SETAT(c, 2, 3);
# Result: {1, 2, 3}, and c is now {1, 2, 3}APPEND
APPEND aggiunge un valore alla fine di una stringa o di una collezione; una collezione viene modificata sul posto e restituita, non copiata.
| |
Note — L’aggiunta di una collezione con lo stesso tipo di elemento aggiunge tutti i suoi elementi. Un singolo valore viene aggiunto come un elemento. Una collezione con un altro tipo di elemento è un errore (Cannot append ‘UInt8’ collection to ‘Double’ collection).
# una collezione da estendere
VAR c := {1, 2};
# aggiunge un elemento sul posto
APPEND(c, 3);
# Result: {1, 2, 3}, and c is now {1, 2, 3}
# aggiunge più elementi sul posto
APPEND(c, {4, 5});
# Result: {1, 2, 3, 4, 5}
# accoda testo a una stringa
APPEND("abc", "def");
# Result: "abcdef"INSERT
INSERT inserisce un valore in una posizione: una sottostringa in una stringa, oppure un elemento in una collezione, sul posto.
| |
# inserisce una sottostringa
INSERT("Hello", 5, " World");
# Result: "Hello World"
# inserisce un carattere
INSERT("Hello", 1, "i");
# Result: "Hiello"
# inserisce un elemento in una collezione
INSERT({1, 2, 4}, 2, 3);
# Result: {1, 2, 3, 4}REMOVEAT
REMOVEAT rimuove count caratteri o elementi, 1 per impostazione predefinita, a partire da una posizione.
| |
# rimuove un carattere
REMOVEAT("Hello", 1);
# Result: "Hllo"
# rimuove 2 caratteri dall'indice 3
REMOVEAT("Hello", 3, 2);
# Result: "Hel"
# rimuove 2 elementi da una collezione
REMOVEAT({1, 2, 3, 4}, 2, 2);
# Result: {1, 2}COPY
COPY restituisce una nuova stringa, collezione o blob con length elementi a partire da from; senza length copia fino alla fine, senza from l’intero valore.
| |
# copia dall'indice 2 alla fine
COPY("Hello World", 2);
# Result: "llo World"
# copia 4 caratteri dall'indice 2
COPY("Hello World", 2, 4);
# Result: "llo "
# copia 1 byte da un blob
COPY(BYTECOLLECTION("01020304"), 2, 1);
# Result: {0x03}Errori — Parameter 1 must be a non-empty string quando si copia da una stringa vuota.
INDEXOF
INDEXOF restituisce la posizione della prima occorrenza di un valore in una stringa, in una collezione o in un blob, oppure -1 se non viene trovato.
| |
# posizione di una sottostringa
INDEXOF("Hello World", "Wor");
# Result: 6
# se non trovato dà -1
INDEXOF("Hello World", "or12");
# Result: -1
# posizione di un elemento in un blob
INDEXOF(BYTECOLLECTION("ab cd ee ff 01 02"), 2);
# Result: 5Errori — Parameter 2 must be a non-empty string quando in una stringa si cerca una stringa vuota.
REPLACE
REPLACE sostituisce ogni occorrenza di un valore: da una stringa si ottiene una nuova stringa, in una collezione gli elementi corrispondenti vengono sostituiti sul posto.
| |
# rimuove ogni l
REPLACE("Hello", "l", "");
# Result: "Heo"
# sostituisce una sottostringa
REPLACE("Hello", "lo", "22");
# Result: "Hel22"
# sostituisce un elemento in un blob
REPLACE(BYTECOLLECTION("050607"), 5, 9);
# Result: {0x09, 0x06, 0x07}Errori — Empty string to replace quando what è una stringa vuota.
SPLIT
SPLIT divide una stringa a ogni separatore e restituisce una collection<string>; le parti vuote vengono mantenute.
| |
Parametri — separator è un char, una stringa, una collection<char> o una collection<string>.
# divide a ogni separatore
SPLIT("1;2;3;4", ";");
# Result: {"1", "2", "3", "4"}
# separatore più lungo di un carattere
SPLIT("1;2;3.4", "2;");
# Result: {"1;", "3.4"}
# più separatori insieme
SPLIT("1;2;3.4", {"2", "3."});
# Result: {"1;", ";", "4"}COMPARE
COMPARE confronta due stringhe e restituisce un numero negativo quando la prima viene prima della seconda nell’ordinamento, 0 quando sono uguali e un numero positivo quando viene dopo; considera solo il segno, non la grandezza.
| |
Note — Senza opzioni un’unità di controllo restituisce la differenza dei codici di carattere dei primi caratteri diversi, quindi le lettere maiuscole vengono prima delle minuscole. Con CompareOptions (IgnoreCase, IgnoreNonSpace, IgnoreSymbols, IgnoreKanaType, IgnoreWidth, OrdinalIgnoreCase, StringSort, Ordinal, None) le stringhe vengono confrontate secondo le regole linguistiche della cultura invariante, uguali su ogni unità di controllo, adattate da quelle opzioni.
# stringhe uguali danno 0
COMPARE("abc", "abc");
# Result: 0
# maiuscole diverse danno un numero positivo
COMPARE("abc", "ABC");
# Result: 32
# la prima stringa viene prima della seconda
COMPARE("a", "c");
# Result: -2
# ignorare le maiuscole dà 0
COMPARE("abc", "ABC", CompareOptions.IgnoreCase);
# Result: 0Errori — COMPARE arguments 1 and 2 must be strings.
BYTECOLLECTION
BYTECOLLECTION crea una collection<uint8>, da una stringa di cifre esadecimali oppure riempita con un dato numero di byte a zero (1 – 2048).
| |
Note — I caratteri della stringa che non sono cifre esadecimali vengono ignorati, quindi spazi, virgole e trattini possono separare i byte; il numero di cifre rimanenti deve essere pari.
# byte da testo esadecimale
BYTECOLLECTION("00 0A FF");
# Result: {0x00, 0x0A, 0xFF}
# testo esadecimale con separatori misti
BYTECOLLECTION("aa, be1-1,fe");
# Result: {0xAA, 0xBE, 0x11, 0xFE}
# un numero dà tanti byte a zero
BYTECOLLECTION(6);
# Result: 6 zero bytesErrori — Parameter must be a non-empty string; Length must be a multiple of 2; Maximum array length is 2048; Invalid array length. Must be greater than 0 and less than or equal 2048.
UINT16COLLECTION
UINT16COLLECTION crea una collection<uint16> di 1 – 2048 zeri, di solito riempita con PACKVALUE e scritta nei registri Modbus con MODBUSWBLOCK.
collection<uint16> regs := UINT16COLLECTION(4);
PACKVALUE(regs, 0, BigEndianFloat, 21.5);
PACKVALUE(regs, 2, Uint16, 100);
MODBUSWBLOCK(H, 200, regs);Disponibile — TapHome Next 2026.1.39016+.
Vedi anche — Dati binari, Funzioni Modbus.
BOOLCOLLECTION
BOOLCOLLECTION crea una collection<bool> di 1 – 2048 valori FALSE, di solito per scrivere coil Modbus con MODBUSWBLOCK.
collection<bool> coils := BOOLCOLLECTION(8);
SETAT(coils, 0, TRUE);
MODBUSWBLOCK(C, 0, coils);Disponibile — TapHome Next 2026.1.39016+.