---
title: "Syntaxe a řízení toku"
description: "Syntaxe skriptu TapHome: středníky, komentáře, číselné a textové literály, bloky IF a ELSEIF, SWITCH, cykly WHILE a DO, BREAK, CONTINUE, RETURN a bezpečné dělení pomocí IF."
url: "https://taphome.com/cs/docs/script/basics/"
language: cs
lastmod: 2026-11-06
generator: hugo
ai:
  topics: ["scripting-language","syntax","control-flow","variables","expressions"]
  questions: ["Jak v TapHome napsat víceřádkový skript?","Jak ve výrazech TapHome použít podmínky IF/ELSE?","Jak v TapHome funguje příkaz SWITCH?","Jak v TapHome napsat cyklus WHILE nebo DO?","Jak v TapHome zapsat šestnáctkové nebo binární číslo?","Jak opravit chybu „Line in script: 1 Message: Division by zero“ ve skriptu TapHome?","Jak bezpečně vydělit dvě proměnné (va1/va2) a použít vzorec jen tehdy, když je jmenovatel větší než 0?","Jak zapsat hodnotu 0, když je zařízení v chybě nebo místo čísla vrací NaN?","Kam mohu ve skriptu TapHome napsat komentář?"]
---

# Syntaxe a řízení toku

Syntaxe skriptovacího jazyka TapHome: příkazy a středníky, komentáře, literály, IF ve formě funkce a bloku, SWITCH, cykly WHILE a DO, BREAK, CONTINUE a RETURN.

Poslední aktualizace: 2026-11-06

Skript TapHome je posloupnost příkazů, každý zakončený středníkem, která se může větvit pomocí `IF` a `SWITCH` a opakovat cykly `WHILE` a `DO`. Stránka popisuje komentáře, literály (čísla, šestnáctkové a binární hodnoty, text, kolekce), zápis `IF` ve formě funkce a bloku, `SWITCH`, cykly s `BREAK` a `CONTINUE` a `RETURN`. Klíčová slova a názvy nerozlišují velká a malá písmena a skript vrátí hodnotu posledního příkazu, pokud jej dříve neukončí `RETURN`. Například `IF(va2 > 0, va1/va2, 0)` dělí bezpečně a zabrání chybě `Division by zero`.

## Příkazy a středníky

Skript je posloupnost příkazů a každý příkaz končí středníkem `;`. Blokové příkazy (`IF … END`, `WHILE … LOOP`, `DO … LOOP WHILE …`) a komentáře středníkem nekončí. Klíčová slova a názvy nerozlišují velká a malá písmena: `IF`, `if` a `If` jsou totéž.

```taphome
# x začíná na 5
VAR x := 5;
IF x > 3
    x := x - 1;   # provede se, jen když x je větší než 3
END
# poslední výraz je výsledek
x;
# Result: 4
```

Středník smí chybět jen za posledním příkazem skriptu; uvnitř bloku ho potřebuje každý příkaz, i ten poslední před `END` nebo `LOOP`. Když uvnitř bloku chybí středník před `END` nebo `LOOP`, skript se zastaví s hlášením `Unexpected character 'E' at the end of statement. Expected ';'` (`'L'` před `LOOP`).

## Komentáře

Komentář začíná znakem `#` a pokračuje do konce řádku. Může stát na samostatném řádku nebo následovat za úplným příkazem: za jeho středníkem nebo za `END`, `ELSE` či `LOOP`.

```taphome
# počáteční hodnota
VAR x := 5;          # komentář za středníkem
IF x > 3
    x := 1;
END                  # konec podmínky
```

Znak `#` uvnitř příkazu (před jeho středníkem nebo za podmínkou `IF` či `WHILE`) skončí chybou `Comment must start on a new line and inline comments are not supported`.

## Literály

Literál je hodnota zapsaná přímo ve skriptu.

| Literál | Příklad | Poznámky |
|---|---|---|
| Číslo | `5`, `21.5`, `-3` | Desetinná tečka `.`. Číselný literál je `double`, takže `5 / 2` je `2.5`. Bez exponentu (`1e3`), bez úvodní tečky (`.5`). |
| Šestnáctkové číslo | `0xA0A0`, `0xff` | Typ `int`, u číslic nezáleží na velikosti písmen: `0xA0A0` je 41120. |
| Binární číslo | `0b10101010` | Typ `int`: 170. |
| Logická hodnota | `TRUE`, `FALSE` | |
| Neznámé číslo | `NaN` | Nikdy se ničemu nerovná; testujte ho funkcí [`ISNAN`](https://taphome.com/cs/docs/script/logic-and-diagnostics/#isnan). |
| Žádná hodnota | `Null` | Testujte ji funkcí [`ISNULL`](https://taphome.com/cs/docs/script/logic-and-diagnostics/#isnull). |
| Řetězec | `"°C"`, `"a\nb"`, `"C:\\data"` | Escape sekvence `\n`, `\r`, `\t`, `\"`, `\\`, `\xHH`, `\uXXXX`. Neplatná sekvence skončí chybou `Couldn't unescape …`. |
| Znak | `'A'`, `'\n'` | Právě jeden znak. |
| Kolekce | `{1, 2, 3}`, `{"a", "b"}` | Alespoň jeden prvek, viz [Kolekce](https://taphome.com/cs/docs/script/data-types/#collections). |
| Hodnota výčtu | `H`, `BigEndianFloat`, `DateTimeKind.Utc` | Samotná nebo s názvem typu, viz [Výčtové typy](https://taphome.com/cs/docs/script/data-types/#enum-types). |

## IF

`IF` vrátí jednu ze dvou hodnot podle podmínky (forma funkce), nebo vykoná jeden z několika bloků příkazů (forma bloku).

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

**Parametry**

| Název | Typ | Popis |
|---|---|---|
| `condition` | bool | Nenulové číslo je `TRUE`, `Null` je `FALSE`. |
| `valueIfTrue` | any | Vrátí se, když je podmínka `TRUE`. |
| `valueIfFalse` | any | Nepovinný, vrátí se v ostatních případech. |

**Vrací** vybranou hodnotu, nebo `Null`, když podmínka není `TRUE` a třetí argument chybí. Vyhodnotí se jen vybraná větev, takže ta druhá nemůže selhat.

**Příklad** — bezpečné dělení a náhrada za `NaN`. Dělení nulou zastaví skript s hlášením `Line in script: 1 Message: Division by zero`; podmínka mu zabrání:

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

Podmínka může být v závorkách a musí se vejít na jeden řádek; konec řádku ji ukončí. `ELSEIF` se může opakovat, `ELSE` je nepovinné, `END` je povinné. Samotný blok vrací `Null`; chcete-li z něj vrátit hodnotu, použijte `RETURN`.

```taphome
# vyber hodnotu podle teploty Te
IF Te < 5
    RETURN(1);   # pod 5
ELSEIF Te > 10
    RETURN(3);   # nad 10
ELSE
    RETURN(0);   # jinak
END
```

**Chyby** — `Function IF requires at least 2 parameters.`; `Unexpected keyword 'X' at the end of IF statement.`, když za vnořeným `END` následuje `;`.

**Viz také** — [SWITCH](https://taphome.com/cs/docs/script/basics/#switch), [Operátory](https://taphome.com/cs/docs/script/operators/).

## SWITCH

`SWITCH` porovná hodnotu se seznamem případů a vrátí výsledek prvního shodného případu, nebo výchozí výsledek, když se žádný případ neshoduje.

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

**Poznámky** — `SWITCH` přijímá nejméně 4 a nejvýše 100 argumentů, vždy sudý počet: hodnotu, dvojice případu a jeho výsledku a výchozí výsledek. Případy se porovnávají jako `=`: čísla podle hodnoty, text přesně; porovnání textu s číslem skončí chybou `Operator '==' not defined …`. Vyhodnotí se jen výsledek shodného případu.

**Příklad** — návod k zařízení uvádí aktivní režim jako hodnoty bitů; skript je převede na polohy vícehodnotového spínače:

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

```taphome
# přečte bity režimu z registru Modbus 168
# hodnota bitu se změní na polohu přepínače, jinak NaN
SWITCH(MODBUSR(H, 168, UInt16),
    0, 0,
    0x0002, 1,
    0x0004, 2,
    0x0008, 3,
    0x0010, 4,
    0x0040, 5,
    0x0800, 6,
    NaN);
```

**Chyby** — `Function SWITCH requires at least 4 parameters.`; `Invalid arguments for SWITCH function.` při lichém počtu argumentů.

## Cykly WHILE a DO

`WHILE` opakuje své příkazy, dokud je podmínka `TRUE`; `DO … LOOP WHILE` je vykoná alespoň jednou. `CONTINUE;` přeskočí zbytek průchodu, `BREAK;` cyklus opustí; oba se píší bez závorek.

```text
WHILE condition
    statements;
LOOP

DO
    statements;
LOOP WHILE condition
```

Stejně jako u `IF` podmínka končí koncem řádku. Když začíná znakem `(`, končí u odpovídající `)`: `WHILE (a > 0) AND (b > 0)` vezme jako podmínku jen `(a > 0)`, proto pište `WHILE (a > 0 AND b > 0)`.

```taphome
int i := 10;   # počítadlo začíná na 10
WHILE i > 0
    i := i - 1;   # odpočítávání
    IF i > 5
        CONTINUE;   # zbytek průchodu se přeskočí, dokud je i nad 5
    END
    BREAK;   # cyklus skončí, když je i nejvýše 5
LOOP
i;
# Result: 5
```

```taphome
int n := 1;   # počáteční hodnota
# tělo běží alespoň jednou, pak dokud n < 100
DO
    n := n * 2;   # n se při každém průchodu zdvojnásobí
LOOP WHILE n < 100
n;
# Result: 128
```

**Chyby** — cyklus se zastaví s hlášením `More than 1 000 000 loops, stopping loop`. `BREAK` nebo `CONTINUE` mimo cyklus skončí chybou `Cannot use BREAK() outside of WHILE or DO-WHILE`. Středník `;` za vnořeným `LOOP` nebo `END` skončí chybou `Unexpected character ';' in WHILE statement`.

> [!WARNING]
> Názvy se vyhodnocují dříve než klíčová slova cyklu. Proměnná nebo zkratka zařízení s názvem `Do` nebo `While` klíčové slovo zakryje a cyklus skončí chybou `Missing operator between 'DO' and …`.

## RETURN

`RETURN` okamžitě ukončí skript a zadanou hodnotu učiní jeho výsledkem.

```text
RETURN(value)
```

**Poznámky** — bez `RETURN` je výsledkem hodnota posledního příkazu. `RETURN` použijte, když chcete vrátit hodnotu zevnitř bloku, nebo když má listener skript předčasně skončit u zpráv, které nezpracovává.

```taphome
# skript skončí s 0, když Te není známá
IF ISNAN(Te)
    RETURN(0);
END
# přepočet teploty na °F
Te * 1.8 + 32;
# Result: the temperature in °F, or 0 when it is unknown
```

**Viz také** — [Výsledek skriptu](https://taphome.com/cs/docs/script/#script-result).
