TapHome

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: 4

Il 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 check

Un # 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.

LetteraleEsempioNote
Numero5, 21.5, -3Separatore decimale .. Un letterale numerico è un double, quindi 5 / 2 è 2.5. Niente esponente (1e3), niente punto iniziale (.5).
Esadecimale0xA0A0, 0xffUn int, le cifre non distinguono tra maiuscole e minuscole: 0xA0A0 è 41120.
Binario0b10101010Un int: 170.
BooleanoTRUE, FALSE
Numero sconosciutoNaNNon è mai uguale a nulla; verificalo con ISNAN.
Nessun valoreNullVerificalo 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 enumH, BigEndianFloat, DateTimeKind.UtcDa 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).

1
2
IF(condition, valueIfTrue)
IF(condition, valueIfTrue, valueIfFalse)

Parametri

NomeTipoDescrizione
conditionboolUn numero diverso da zero è TRUE, Null è FALSE.
valueIfTruequalsiasiRestituito quando la condizione è TRUE.
valueIfFalsequalsiasiFacoltativo, 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 NaN

Forma di blocco

1
2
3
4
5
6
7
IF condition
    statements;
ELSEIF condition
    statements;
ELSE
    statements;
END

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);
END

Errori — 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.

1
SWITCH(value, case1, result1, case2, result2, ..., defaultResult)

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:

Esempio di SWITCH
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.

1
2
3
4
5
6
7
WHILE condition
    statements;
LOOP

DO
    statements;
LOOP WHILE condition

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: 5
int n := 1;
DO
    n := n * 2;
LOOP WHILE n < 100
n;
# Result: 128

Errori — 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 Do o While nasconde la parola chiave e il ciclo fallisce con Missing operator between 'DO' and ….

RETURN

RETURN termina immediatamente lo script e rende il valore indicato il suo risultato.

1
RETURN(value)

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 unknown

Vedi anche — Risultato dello script.