---
title: "Składnia i sterowanie przebiegiem"
description: "Składnia skryptów TapHome: średniki, komentarze, literały liczbowe i tekstowe, bloki IF i ELSEIF, SWITCH, pętle WHILE i DO, BREAK, CONTINUE, RETURN i bezpieczne dzielenie z IF."
url: "https://taphome.com/pl/docs/script/basics/"
language: pl
lastmod: 2026-11-06
generator: hugo
ai:
  topics: ["scripting-language","syntax","control-flow","variables","expressions"]
  questions: ["Jak napisać skrypt wielowierszowy w TapHome?","Jak używać instrukcji IF/ELSE w wyrażeniach TapHome?","Jak działa instrukcja SWITCH w TapHome?","Jak napisać pętlę WHILE lub DO w TapHome?","Jak zapisać liczbę szesnastkową lub binarną w TapHome?","Jak naprawić błąd „Line in script: 1 Message: Division by zero” w skrypcie TapHome?","Jak bezpiecznie podzielić dwie zmienne (va1/va2), stosując formułę tylko wtedy, gdy mianownik jest większy od 0?","Jak zapisać wartość 0, gdy urządzenie jest w błędzie lub zamiast liczby zwraca NaN?","Gdzie mogę umieścić komentarz w skrypcie TapHome?"]
---

# Składnia i sterowanie przebiegiem

Składnia języka skryptowego TapHome: instrukcje i średniki, komentarze, literały, IF w formie funkcji i bloku, SWITCH, pętle WHILE i DO, BREAK, CONTINUE i RETURN.

Ostatnia aktualizacja: 2026-11-06

Skrypt TapHome to ciąg instrukcji, z których każda kończy się średnikiem, a który może się rozgałęziać za pomocą `IF` i `SWITCH` oraz powtarzać w pętlach `WHILE` i `DO`. Strona opisuje komentarze, literały (liczby, wartości szesnastkowe i binarne, tekst, kolekcje), formę funkcji i bloku instrukcji `IF`, `SWITCH`, pętle z `BREAK` i `CONTINUE` oraz `RETURN`. W słowach kluczowych i nazwach wielkość liter nie ma znaczenia, a skrypt zwraca wartość ostatniej instrukcji, chyba że wcześniej zakończy go `RETURN`. Na przykład `IF(va2 > 0, va1/va2, 0)` dzieli bezpiecznie i zapobiega błędowi `Division by zero`.

## Instrukcje i średniki

Skrypt to ciąg instrukcji, a każda instrukcja kończy się średnikiem `;`. Instrukcje blokowe (`IF … END`, `WHILE … LOOP`, `DO … LOOP WHILE …`) i komentarze nie kończą się średnikiem. W słowach kluczowych i nazwach wielkość liter nie ma znaczenia: `IF`, `if` i `If` to to samo.

```taphome
# x zaczyna od 5
VAR x := 5;
IF x > 3
    x := x - 1;   # wykonuje się tylko, gdy x jest większe niż 3
END
# ostatnie wyrażenie jest wynikiem
x;
# Result: 4
```

Średnik można pominąć tylko po ostatniej instrukcji skryptu; wewnątrz bloku każda instrukcja go potrzebuje, łącznie z ostatnią przed `END` lub `LOOP`. Brak średnika wewnątrz bloku przed `END` lub `LOOP` zatrzymuje skrypt komunikatem `Unexpected character 'E' at the end of statement. Expected ';'` (`'L'` przed `LOOP`).

## Komentarze

Komentarz zaczyna się znakiem `#` i trwa do końca wiersza. Może stać w osobnym wierszu albo po kompletnej instrukcji: po jej średniku albo po `END`, `ELSE` lub `LOOP`.

```taphome
# wartość początkowa
VAR x := 5;          # komentarz po średniku
IF x > 3
    x := 1;
END                  # koniec sprawdzenia
```

Znak `#` wewnątrz instrukcji (przed jej średnikiem albo po warunku `IF` lub `WHILE`) kończy się błędem `Comment must start on a new line and inline comments are not supported`.

## Literały

Literał to wartość zapisana bezpośrednio w skrypcie.

| Literał | Przykład | Uwagi |
|---|---|---|
| Liczba | `5`, `21.5`, `-3` | Separator dziesiętny `.`. Literał liczbowy jest typu `double`, więc `5 / 2` daje `2.5`. Bez wykładnika (`1e3`), bez kropki na początku (`.5`). |
| Szesnastkowy | `0xA0A0`, `0xff` | Typ `int`, wielkość liter cyfr nie ma znaczenia: `0xA0A0` to 41120. |
| Binarny | `0b10101010` | Typ `int`: 170. |
| Logiczny | `TRUE`, `FALSE` | |
| Nieznana liczba | `NaN` | Nigdy nie jest równa niczemu; sprawdzisz ją funkcją [`ISNAN`](https://taphome.com/pl/docs/script/logic-and-diagnostics/#isnan). |
| Brak wartości | `Null` | Sprawdzisz go funkcją [`ISNULL`](https://taphome.com/pl/docs/script/logic-and-diagnostics/#isnull). |
| Tekst | `"°C"`, `"a\nb"`, `"C:\\data"` | Sekwencje ucieczki `\n`, `\r`, `\t`, `\"`, `\\`, `\xHH`, `\uXXXX`. Nieprawidłowa sekwencja kończy się błędem `Couldn't unescape …`. |
| Znak | `'A'`, `'\n'` | Dokładnie jeden znak. |
| Kolekcja | `{1, 2, 3}`, `{"a", "b"}` | Co najmniej jeden element, zobacz [Kolekcje](https://taphome.com/pl/docs/script/data-types/#collections). |
| Wartość wyliczeniowa | `H`, `BigEndianFloat`, `DateTimeKind.Utc` | Sama albo z nazwą typu, zobacz [Typy wyliczeniowe](https://taphome.com/pl/docs/script/data-types/#enum-types). |

## IF

`IF` zwraca jedną z dwóch wartości w zależności od warunku (forma funkcji) albo wykonuje jeden z kilku bloków instrukcji (forma bloku).

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

**Parametry**

| Nazwa | Typ | Opis |
|---|---|---|
| `condition` | bool | Liczba różna od zera to `TRUE`, `Null` to `FALSE`. |
| `valueIfTrue` | any | Zwracana, gdy warunek jest `TRUE`. |
| `valueIfFalse` | any | Opcjonalna, zwracana w pozostałych przypadkach. |

**Zwraca** wybraną wartość albo `Null`, gdy warunek nie jest `TRUE` i nie ma trzeciego argumentu. Obliczana jest tylko wybrana gałąź, więc druga nie może skończyć się błędem.

**Przykład** — bezpieczne dzielenie i zamiennik dla `NaN`. Dzielenie przez zero zatrzymuje skrypt komunikatem `Line in script: 1 Message: Division by zero`; warunek temu zapobiega:

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

```text
IF condition
    statements;
ELSEIF condition
    statements;
ELSE
    statements;
END
```

Warunek może być w nawiasach i musi zmieścić się w jednym wierszu; koniec wiersza go kończy. `ELSEIF` może się powtarzać, `ELSE` jest opcjonalne, `END` jest obowiązkowe. Sam blok zwraca `Null`; aby uzyskać z niego wartość, użyj `RETURN`.

```taphome
# wybierz wartość według temperatury Te
IF Te < 5
    RETURN(1);   # poniżej 5
ELSEIF Te > 10
    RETURN(3);   # powyżej 10
ELSE
    RETURN(0);   # w przeciwnym razie
END
```

**Błędy** — `Function IF requires at least 2 parameters.`; `Unexpected keyword 'X' at the end of IF statement.`, gdy po wewnętrznym `END` stoi `;`.

**Zobacz też** — [SWITCH](https://taphome.com/pl/docs/script/basics/#switch), [Operatory](https://taphome.com/pl/docs/script/operators/).

## SWITCH

`SWITCH` porównuje wartość z listą przypadków i zwraca wynik pierwszego pasującego przypadku albo wynik domyślny, gdy żaden przypadek nie pasuje.

```text
SWITCH(value, case1, result1, case2, result2, ..., defaultResult)
```

**Uwagi** — `SWITCH` przyjmuje co najmniej 4 i co najwyżej 100 argumentów, zawsze parzystą liczbę: wartość, pary przypadku i jego wyniku oraz wynik domyślny. Przypadki są porównywane jak `=`: liczby według wartości, tekst dokładnie; porównanie tekstu z liczbą kończy się błędem `Operator '==' not defined …`. Obliczany jest tylko wynik pasującego przypadku.

**Przykład** — instrukcja urządzenia podaje aktywny tryb jako wartości bitów; skrypt zamienia je na pozycje przełącznika wielowartościowego:

![SWITCH Example](https://taphome.com/documentation/script/switch-example.png)

```taphome
# odczyt bitów trybu z rejestru Modbus 168
# wartość bitu zmienia się w pozycję przełącznika, inaczej NaN
SWITCH(MODBUSR(H, 168, UInt16),
    0, 0,
    0x0002, 1,
    0x0004, 2,
    0x0008, 3,
    0x0010, 4,
    0x0040, 5,
    0x0800, 6,
    NaN);
```

**Błędy** — `Function SWITCH requires at least 4 parameters.`; `Invalid arguments for SWITCH function.` przy nieparzystej liczbie argumentów.

## Pętle WHILE i DO

`WHILE` powtarza swoje instrukcje, dopóki warunek jest `TRUE`; `DO … LOOP WHILE` wykonuje je co najmniej raz. `CONTINUE;` pomija resztę przebiegu, `BREAK;` opuszcza pętlę; oba zapisuje się bez nawiasów.

```text
WHILE condition
    statements;
LOOP

DO
    statements;
LOOP WHILE condition
```

Podobnie jak w `IF` warunek kończy się wraz z końcem wiersza. Gdy zaczyna się od `(`, kończy się na odpowiadającym `)`: `WHILE (a > 0) AND (b > 0)` bierze jako warunek tylko `(a > 0)`, więc napisz `WHILE (a > 0 AND b > 0)`.

```taphome
int i := 10;   # licznik zaczyna od 10
WHILE i > 0
    i := i - 1;   # odliczanie
    IF i > 5
        CONTINUE;   # pomiń resztę przebiegu, gdy i jest powyżej 5
    END
    BREAK;   # wyjdź z pętli, gdy i wynosi najwyżej 5
LOOP
i;
# Result: 5
```

```taphome
int n := 1;   # wartość początkowa
# ciało pętli działa co najmniej raz, potem dopóki n < 100
DO
    n := n * 2;   # n podwaja się w każdym przebiegu
LOOP WHILE n < 100
n;
# Result: 128
```

**Błędy** — pętla zatrzymuje się komunikatem `More than 1 000 000 loops, stopping loop`. `BREAK` lub `CONTINUE` poza pętlą kończy się błędem `Cannot use BREAK() outside of WHILE or DO-WHILE`. Znak `;` po wewnętrznym `LOOP` lub `END` kończy się błędem `Unexpected character ';' in WHILE statement`.

> [!WARNING]
> Nazwy są rozwiązywane przed słowami kluczowymi pętli. Zmienna lub skrót urządzenia o nazwie `Do` albo `While` przesłania słowo kluczowe i pętla kończy się błędem `Missing operator between 'DO' and …`.

## RETURN

`RETURN` natychmiast kończy skrypt, a podana wartość staje się jego wynikiem.

```text
RETURN(value)
```

**Uwagi** — bez `RETURN` wynikiem jest wartość ostatniej instrukcji. Użyj `RETURN`, aby zwrócić wartość z wnętrza bloku albo wcześniej zakończyć skrypt listener dla wiadomości, których nie obsługuje.

```taphome
# zakończ skrypt z 0, gdy Te jest nieznana
IF ISNAN(Te)
    RETURN(0);
END
# przeliczenie temperatury na °F
Te * 1.8 + 32;
# Result: the temperature in °F, or 0 when it is unknown
```

**Zobacz też** — [Wynik skryptu](https://taphome.com/pl/docs/script/#script-result).
