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.
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.
VAR x := 5;
IF x > 3
x := x - 1;
END
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.
# starting value
VAR x := 5; # a comment after the semicolon
IF x > 3
x := 1;
END # end of the checkZnak # 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. |
| Brak wartości | Null | Sprawdzisz go funkcją 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. |
| Wartość wyliczeniowa | H, BigEndianFloat, DateTimeKind.Utc | Sama albo z nazwą typu, zobacz Typy wyliczeniowe. |
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).
| |
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:
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 bloku
| |
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.
IF Te < 5
RETURN(1);
ELSEIF Te > 10
RETURN(3);
ELSE
RETURN(0);
ENDBłę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, Operatory.
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.
| |
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(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.
| |
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).
int i := 10;
WHILE i > 0
i := i - 1;
IF i > 5
CONTINUE;
END
BREAK;
LOOP
i;
# Result: 5int n := 1;
DO
n := n * 2;
LOOP WHILE n < 100
n;
# Result: 128Błę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.
Nazwy są rozwiązywane przed słowami kluczowymi pętli. Zmienna lub skrót urządzenia o nazwie
DoalboWhileprzesłania słowo kluczowe i pętla kończy się błędemMissing operator between 'DO' and ….
RETURN
RETURN natychmiast kończy skrypt, a podana wartość staje się jego wynikiem.
| |
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.
IF ISNAN(Te)
RETURN(0);
END
Te * 1.8 + 32;
# Result: the temperature in °F, or 0 when it is unknownZobacz też — Wynik skryptu.