Sintassi e flusso di controllo
Sintassi del linguaggio di script TapHome: istruzioni e punti e virgola, commenti, letterali, IF in forma di funzione e di blocco, SWITCH, cicli WHILE e DO, BREAK, CONTINUE e RETURN.
Istruzioni e punti e virgola
Uno script è una sequenza di istruzioni e ogni istruzione termina con un punto e virgola ;. Le istruzioni di blocco (IF … END, WHILE … LOOP, DO … LOOP WHILE …) e i commenti non terminano con un punto e virgola. Le parole chiave e i nomi non distinguono tra maiuscole e minuscole: IF, if e If sono la stessa cosa.
VAR x := 5;
IF x > 3
x := x - 1;
END
x;
# Result: 4Il punto e virgola si può omettere solo dopo l’ultima istruzione dello script; all’interno di un blocco ogni istruzione ne ha bisogno, compresa l’ultima prima di END o LOOP. All’interno di un blocco un punto e virgola mancante prima di END o LOOP interrompe lo script con Unexpected character 'E' at the end of statement. Expected ';' ('L' prima di LOOP).
Commenti
Un commento inizia con # e prosegue fino alla fine della riga. Può stare su una riga a sé oppure seguire un’istruzione completa: dopo il suo punto e virgola, oppure dopo END, ELSE o LOOP.
# starting value
VAR x := 5; # a comment after the semicolon
IF x > 3
x := 1;
END # end of the checkUn # all’interno di un’istruzione (prima del suo punto e virgola, oppure dopo una condizione IF o WHILE) fallisce con Comment must start on a new line and inline comments are not supported.
Letterali
Un letterale è un valore scritto direttamente nello script.
| Letterale | Esempio | Note |
|---|---|---|
| Numero | 5, 21.5, -3 | Separatore decimale .. Un letterale numerico è un double, quindi 5 / 2 è 2.5. Niente esponente (1e3), niente punto iniziale (.5). |
| Esadecimale | 0xA0A0, 0xff | Un int, le cifre non distinguono tra maiuscole e minuscole: 0xA0A0 è 41120. |
| Binario | 0b10101010 | Un int: 170. |
| Booleano | TRUE, FALSE | |
| Numero sconosciuto | NaN | Non è mai uguale a nulla; verificalo con ISNAN. |
| Nessun valore | Null | Verificalo con ISNULL. |
| Stringa | "°C", "a\nb", "C:\\data" | Sequenze di escape \n, \r, \t, \", \\, \xHH, \uXXXX. Una sequenza di escape non valida fallisce con Couldn't unescape …. |
| Carattere | 'A', '\n' | Esattamente un carattere. |
| Collezione | {1, 2, 3}, {"a", "b"} | Almeno un elemento, vedi Collezioni. |
| Valore enum | H, BigEndianFloat, DateTimeKind.Utc | Da solo o con il nome del tipo, vedi Tipi enum. |
IF
IF restituisce uno di due valori in base a una condizione (forma di funzione), oppure esegue uno di più blocchi di istruzioni (forma di blocco).
| |
Parametri
| Nome | Tipo | Descrizione |
|---|---|---|
condition | bool | Un numero diverso da zero è TRUE, Null è FALSE. |
valueIfTrue | qualsiasi | Restituito quando la condizione è TRUE. |
valueIfFalse | qualsiasi | Facoltativo, restituito negli altri casi. |
Restituisce il valore selezionato, oppure Null quando la condizione non è TRUE e non c’è un terzo argomento. Viene valutato solo il ramo selezionato, quindi l’altro non può fallire.
Esempio — divisione sicura e sostituzione di NaN. La divisione per zero interrompe lo script con Line in script: 1 Message: Division by zero; la condizione lo impedisce:
IF(va2 > 0, va1/va2, 0);
# Result: va1/va2, or 0 when va2 is 0
IF(ISNAN(Te), 0, Te);
# Result: 0 when the device is in error or returns NaNForma di blocco
| |
La condizione può essere tra parentesi e deve stare su una riga; l’a capo la termina. ELSEIF si può ripetere, ELSE è facoltativo, END è obbligatorio. Il blocco in sé restituisce Null; usa RETURN per produrre un valore dal suo interno.
IF Te < 5
RETURN(1);
ELSEIF Te > 10
RETURN(3);
ELSE
RETURN(0);
ENDErrori — Function IF requires at least 2 parameters.; Unexpected keyword 'X' at the end of IF statement. quando un ; segue un END interno.
Vedi anche — SWITCH, Operatori.
SWITCH
SWITCH confronta un valore con un elenco di casi e restituisce il risultato del primo caso corrispondente, oppure un risultato predefinito quando nessun caso corrisponde.
| |
Note — SWITCH accetta da 4 a 100 argomenti, sempre in numero pari: il valore, le coppie di caso e risultato e il risultato predefinito. I casi vengono confrontati come con =: i numeri per valore, il testo esattamente; il confronto di un testo con un numero fallisce con Operator '==' not defined …. Viene valutato solo il risultato del caso corrispondente.
Esempio — il manuale del dispositivo indica la modalità attiva come valori di bit; lo script li trasforma nelle posizioni di un interruttore multivalore:

SWITCH(MODBUSR(H, 168, UInt16),
0, 0,
0x0002, 1,
0x0004, 2,
0x0008, 3,
0x0010, 4,
0x0040, 5,
0x0800, 6,
NaN);Errori — Function SWITCH requires at least 4 parameters.; Invalid arguments for SWITCH function. per un numero dispari di argomenti.
Cicli WHILE e DO
WHILE ripete le sue istruzioni finché la condizione è TRUE; DO … LOOP WHILE le esegue almeno una volta. CONTINUE; salta il resto del passaggio, BREAK; esce dal ciclo; entrambi si scrivono senza parentesi.
| |
Come per IF, la condizione termina con l’a capo. Quando inizia con (, termina alla ) corrispondente: WHILE (a > 0) AND (b > 0) prende come condizione solo (a > 0), quindi scrivi WHILE (a > 0 AND b > 0).
int i := 10;
WHILE i > 0
i := i - 1;
IF i > 5
CONTINUE;
END
BREAK;
LOOP
i;
# Result: 5int n := 1;
DO
n := n * 2;
LOOP WHILE n < 100
n;
# Result: 128Errori — un ciclo si interrompe con More than 1 000 000 loops, stopping loop. BREAK o CONTINUE fuori da un ciclo fallisce con Cannot use BREAK() outside of WHILE or DO-WHILE. Un ; dopo un LOOP o un END interno fallisce con Unexpected character ';' in WHILE statement.
I nomi vengono risolti prima delle parole chiave dei cicli. Una variabile o l’abbreviazione di un dispositivo chiamata
DooWhilenasconde la parola chiave e il ciclo fallisce conMissing operator between 'DO' and ….
RETURN
RETURN termina immediatamente lo script e rende il valore indicato il suo risultato.
| |
Note — senza RETURN il risultato è il valore dell’ultima istruzione. Usa RETURN per restituire un valore dall’interno di un blocco, oppure per interrompere in anticipo uno script listener per i messaggi che non gestisce.
IF ISNAN(Te)
RETURN(0);
END
Te * 1.8 + 32;
# Result: the temperature in °F, or 0 when it is unknownVedi anche — Risultato dello script.