---
title: "Sintassi e flusso di controllo"
description: "Sintassi degli script TapHome: punti e virgola, commenti, letterali, IF ed ELSEIF, SWITCH, cicli WHILE e DO, BREAK, CONTINUE e RETURN."
url: "https://taphome.com/it/docs/script/basics/"
language: it
lastmod: 2026-11-06
generator: hugo
ai:
  topics: ["scripting-language","syntax","control-flow","variables","expressions"]
  questions: ["Come si scrivono script su più righe in TapHome?","Come si usano le istruzioni IF/ELSE nelle espressioni TapHome?","Come funziona l'istruzione SWITCH in TapHome?","Come si scrive un ciclo WHILE o DO in TapHome?","Come si scrivono numeri esadecimali o binari in TapHome?","Come si risolve l'errore \"Line in script: 1 Message: Division by zero\" in uno script TapHome?","Come si dividono due variabili (va1/va2) in modo sicuro, applicando la formula solo quando il denominatore è maggiore di 0?","Come scrivo il valore 0 quando un dispositivo è in errore o restituisce NaN invece di un numero?","Dove posso inserire un commento in uno script 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.

Ultimo aggiornamento: 2026-11-06

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.

```taphome
# 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: 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`.

```taphome
# valore iniziale
VAR x := 5;          # un commento dopo il punto e virgola
IF x > 3
    x := 1;
END                  # fine del controllo
```

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.

| 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`](https://taphome.com/it/docs/script/logic-and-diagnostics/#isnan). |
| Nessun valore | `Null` | Verificalo con [`ISNULL`](https://taphome.com/it/docs/script/logic-and-diagnostics/#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](https://taphome.com/it/docs/script/data-types/#collections). |
| Valore enum | `H`, `BigEndianFloat`, `DateTimeKind.Utc` | Da solo o con il nome del tipo, vedi [Tipi enum](https://taphome.com/it/docs/script/data-types/#enum-types). |

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

```text
IF(condition, valueIfTrue)
IF(condition, valueIfTrue, valueIfFalse)
```

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

```taphome
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**

```text
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.

```taphome
# 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
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](https://taphome.com/it/docs/script/basics/#switch), [Operatori](https://taphome.com/it/docs/script/operators/).

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

```text
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](https://taphome.com/documentation/script/switch-example.png)

```taphome
# 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.

```text
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)`.

```taphome
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: 5
```

```taphome
int 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: 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`.

> [!WARNING]
> 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.

```text
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.

```taphome
# 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 unknown
```

**Vedi anche** — [Risultato dello script](https://taphome.com/it/docs/script/#script-result).
