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.
Ultimo aggiornamento:
Uno script TapHome è una sequenza di istruzioni, ciascuna terminata da un punto e virgola, che può ramificarsi con IF e SWITCH e ripetersi con i cicli WHILE e DO. Questa pagina descrive i commenti, i letterali (numeri, valori esadecimali e binari, testo, collezioni), la forma di funzione e di blocco di IF, SWITCH, i cicli con BREAK e CONTINUE e RETURN. Le parole chiave e i nomi non distinguono tra maiuscole e minuscole, e uno script restituisce il valore dell’ultima istruzione, a meno che RETURN non lo termini prima. Per esempio, IF(va2 > 0, va1/va2, 0) divide in modo sicuro ed evita l’errore Division by zero.
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.
# x parte da 5
VAR x := 5;
IF x > 3
x := x - 1; # viene eseguito solo se x è maggiore di 3
END
# ultima espressione come risultato
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.
# valore iniziale
VAR x := 5; # un commento dopo il punto e virgola
IF x > 3
x := 1;
END # fine del controlloUn # 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.
# sceglie un valore in base alla temperatura Te
IF Te < 5
RETURN(1); # sotto 5
ELSEIF Te > 10
RETURN(3); # sopra 10
ELSE
RETURN(0); # altrimenti
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:

# legge i bit della modalità dal registro Modbus 168
# il valore del bit diventa una posizione, altrimenti NaN
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; # il contatore parte da 10
WHILE i > 0
i := i - 1; # conto alla rovescia
IF i > 5
CONTINUE; # salta il resto del passaggio finché i è sopra 5
END
BREAK; # esce dal ciclo quando i è al massimo 5
LOOP
i;
# Result: 5int n := 1; # valore iniziale
# il corpo gira almeno una volta, poi finché n < 100
DO
n := n * 2; # n raddoppia a ogni passaggio
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.
# termina lo script con 0 se Te è sconosciuta
IF ISNAN(Te)
RETURN(0);
END
# converte la temperatura in °F
Te * 1.8 + 32;
# Result: the temperature in °F, or 0 when it is unknownVedi anche — Risultato dello script.